$ perl -de 0 DB<1> $a = "MUL R2, 16" DB<2> $a =~ s/MUL R(\d), (\d+)/($2 == 16)?"SHL R$1, 4":$&/e DB<3> p $a SHL R2, 4 DB<5> $a = "MUL R2, 7" DB<6> $a =~ s/MUL R(\d), (\d+)/($2 == 16)?"SHL R$1, 4":$&/e DB<7> p $a MUL R2, 7 DB<8>
a = a * 2 * 3
no será plegada, ya que produce
un árbol de la forma
Dado que el algoritmo no puede plegar tampoco plegará . Busque en el código objeto secuencias de multiplicaciones por constantes y abrévielas en una. Haga lo mismo para las restantes operaciones.
$ cat test14.tutu int a,b; a = 2; b = a*a+1El código producido por el traductor para la máquina de registros es:
1 LOADC R0, 2 2 STORE 0, R0 # a 3 LOADM R0, 0 # a 4 MULTM R0, 0 # a 5 PLUSC R0, 1 # 1 6 STORE 1, R0 # bSe ve que la instrucción de carga
LOADM R0, 0
de la
línea 3 es innecesaria por cuanto
el contenido de la variable a
ya está en el registro R0
,
ya que fué cargada en el registro en la línea 2.
Nótese que esta hipótesis no es necesariamente cierta
si la línea 3 fuera el objetivo de un salto desde
otro punto del programa. Esta condición se cumple
cuando nos movemos dentro de un bloque básico:
una secuencia de instrucciones que no contiene instrucciones
de salto ni es el objetivo de instrucciones de salto, con la excepción
de las instrucciones inicial y final.
Mejore el código generado
intentando detectar patrones
de este tipo, eliminando la operación de carga correspondiente.