Optimization Topics/Exercise 03

From Wiki**3

< Optimization Topics

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.
int fun(int a, int b) {
  int i = 10, c;
  c = 20 * 1024 + i;
  while (++i < a + b) {
    if (a + b < 3 * i + 5) c += 2 * 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   ; i@-4 c@-8 a@+8 b@+12

INT 10
LOCA -4 ; i=10

INT 20
INT 1024
MUL
LOCAL -4
LDINT
ADD
DUP32
LOCAL -8
STINT ; c = ...
TRASH 4
;;---- BB1 END ----

;;---- BB2 START ----
ALIGN
LABEL while_test
LOCAL -4
LDINT
INT 1
ADD
DUP32
LOCAL -4
STINT  ; ++i

LOCAL +8
LDINT
LOCAL +12
LDINT
ADD  ; a + b

LT
JZ while_end
;;---- BB2 END ----

;;---- BB3 START ----
LOCAL +8
LDINT
LOCAL +12
LDINT
ADD  ; a + b

INT 3
LOCAL -4
LDINT
MUL
INT 5
ADD

LT
JZ ifend
;;---- BB3 END ----

;;---- BB4 START ----
LOCAL -8
LDINT ; c
INT 2
LOCAL -4
LDINT
MUL ; 2 * i
ADD
DUP32
LOCAL -8  ; &c
STINT
TRASH 4
;;---- BB4 END ----

;;---- BB5 START ----
ALIGN
LABEL ifend

JMP while_test
;;---- BB5 END ----

;;---- BB6 START ----
ALIGN 
LABEL while_end

LOCAL -8
LDINT  ; c
STFVAL32
LEAVE
RET
;;---- BB6 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