Difference between revisions of "Code Generation/Exercise 10"

From Wiki**3

< Code Generation
(Código Postfix (não optimizado))
(Código Postfix (não optimizado))
Line 32: Line 32:
 
ALIGN
 
ALIGN
 
LABEL limit ; not really this name
 
LABEL limit ; not really this name
CONST 1024
+
SINT 1024
 
; done - go back to code segment
 
; done - go back to code segment
 
TEXT
 
TEXT
Line 40: Line 40:
 
INT 0
 
INT 0
 
LOCAL -4
 
LOCAL -4
STORE ; i = 0
+
STINT ; i = 0
  
 
; for-loop test
 
; for-loop test
 
LABEL fortest
 
LABEL fortest
 
LOCAL -4
 
LOCAL -4
LOAD ; i
+
LDINT ; i
 
ADDR limit
 
ADDR limit
LOAD ; limit
+
LDINT ; limit
 
LT ; i<limit
 
LT ; i<limit
 
JZ forend
 
JZ forend
Line 58: Line 58:
 
INT 3
 
INT 3
 
LOCAL -4 ; &i
 
LOCAL -4 ; &i
LOAD ; i
+
LDINT ; i
 
MUL
 
MUL
 
I2D
 
I2D
Line 66: Line 66:
 
; compute &v[i] == v+i*sizeof(double)
 
; compute &v[i] == v+i*sizeof(double)
 
LOCAL +8 ; &v
 
LOCAL +8 ; &v
LOAD ; v
+
LDINT ; v
 
LOCAL -4 ; &i
 
LOCAL -4 ; &i
LOAD ; i
+
LDINT ; i
 
INT 8 ; sizeof(double)
 
INT 8 ; sizeof(double)
 
MUL
 
MUL
 
ADD ; &v[i]
 
ADD ; &v[i]
  
DSTORE ; do assignment of double value
+
STDOUBLE ; do assignment of double value
  
 
TRASH 8 ; discard value of assignment
 
TRASH 8 ; discard value of assignment
Line 82: Line 82:
 
; compute &v[i] == v+i*sizeof(double)
 
; compute &v[i] == v+i*sizeof(double)
 
LOCAL +8 ; &v
 
LOCAL +8 ; &v
LOAD ; v
+
LDINT ; v
 
LOCAL -4 ; &i
 
LOCAL -4 ; &i
LOAD ; i
+
LDINT ; i
 
INT 8 ; sizeof(double)
 
INT 8 ; sizeof(double)
 
MUL
 
MUL
 
ADD ; &v[i]
 
ADD ; &v[i]
DLOAD ; v[i]
+
LDDOUBLE ; v[i]
  
 
; compute and promote 2*i
 
; compute and promote 2*i
 
INT 2
 
INT 2
 
LOCAL -4 ; &i
 
LOCAL -4 ; &i
LOAD ; i
+
LDINT ; i
 
MUL
 
MUL
 
I2D
 
I2D
Line 110: Line 110:
 
; load and promote "limit"
 
; load and promote "limit"
 
ADDR limit
 
ADDR limit
LOAD
+
LDINT
 
I2D
 
I2D
  
DDUP ; implement assignment value
+
DUP64 ; implement assignment value
  
 
; compute &v[i] == v+i*sizeof(double)
 
; compute &v[i] == v+i*sizeof(double)
 
LOCAL +8 ; &v
 
LOCAL +8 ; &v
LOAD ; v
+
LDINT ; v
 
LOCAL -4 ; &i
 
LOCAL -4 ; &i
LOAD ; i
+
LDINT ; i
 
INT 8 ; sizeof(double)
 
INT 8 ; sizeof(double)
 
MUL
 
MUL
 
ADD ; &v[i]
 
ADD ; &v[i]
  
DSTORE ; do  assignment of double value
+
STDOUBLE ; do  assignment of double value
  
 
TRASH 8 ; discard value of assignment
 
TRASH 8 ; discard value of assignment
Line 136: Line 136:
 
; increment expression
 
; increment expression
 
LOCAL -4 ; &i
 
LOCAL -4 ; &i
LOAD ; i
+
LDINT ; i
DUP
+
DUP32
 
INT 1
 
INT 1
 
ADD
 
ADD
 
LOCAL -4 ; &i
 
LOCAL -4 ; &i
STORE
+
STINT
 
TRASH 4
 
TRASH 4
  
Line 150: Line 150:
 
; return *v
 
; return *v
 
LOCAL +8 ; &v
 
LOCAL +8 ; &v
LOAD ; v
+
LDINT ; v
DLOAD ; *v
+
LDDOUBLE ; *v
DPOP
+
STFVAL64
 
LEAVE
 
LEAVE
 
RET
 
RET

Revision as of 00:49, 2 May 2018

Problema

Considere o seguinte código C++ (assuma que ponteiros e int ocupam 32 bits e que double ocupa 64 bits).

<cpp> double forall(double *v) {

 const static int limit = 1024;
 for (int i = 0; i < limit; i++) {
   v[i] = 3 * i;
   if (v[i] > 2 * i) v[i] = limit;
 }
 return *v;

} </cpp>

Código Postfix (não optimizado)

O código Postfix correspondente à função é 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".

Postfix code
{{{2}}}

Compiling and Running

Para compilar o código Postfix directamente, pode ser utilizada a ferramenta pf2asm (assumindo uma arquitectura de 32 bits):

pf2asm forall.pf
yasm -felf forall.asm