Difference between revisions of "Optimization Topics/Exercise 08"

From Wiki**3

< Optimization Topics
(Problema)
(Código Postfix (não optimizado))
 
(One intermediate revision by the same user not shown)
Line 22: Line 22:
 
{{CollapsedCode|Código Postfix|
 
{{CollapsedCode|Código Postfix|
 
<source lang="asm">
 
<source lang="asm">
 +
;; 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
 +
STFVAL32
 +
LEAVE
 +
RET
 +
;; BB9 END
 
</source>
 
</source>
 
}}
 
}}

Latest revision as of 15:51, 12 June 2023

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(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
STFVAL32
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