Optimization Topics/Exercise 09: Difference between revisions

From Wiki**3

Root (talk | contribs)
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..."
 
Root (talk | contribs)
No edit summary
 
(One intermediate revision by the same user not shown)
Line 6: Line 6:
# Traduza-a para Postfix optimizado.
# Traduza-a para Postfix optimizado.


<source lang="c">
<syntaxhighlight lang="c">
double *fun(double *a, double *b) {
double *fun(double *a, double *b) {
   double *c = (double *)malloc(160 * 4);
   double *c = (double *)malloc(160 * 4);
Line 15: Line 15:
   return c;
   return c;
}
}
</source>
</syntaxhighlight>


== Código Postfix (não optimizado) ==
== Código Postfix (não optimizado) ==
Line 22: Line 22:


{{CollapsedCode|Código Postfix|
{{CollapsedCode|Código Postfix|
<source lang="asm">
<syntaxhighlight lang="asm">
;; BB1 START
TEXT
ALIGN
GLOBAL fun, FUNC
LABEL fun
ENTER 12 ; c@-4 i@-8 j@-12 a@+8 b@+12


</source>
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
STFVAL32I
LEAVE
RET
;; BB9 END
</syntaxhighlight>
}}
}}



Latest revision as of 21:06, 1 June 2026

Problema

Considere a seguinte função em C:

  1. Que optimizações independentes da máquina são possíveis?
  2. 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
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