AVISO: contenido matemáticoAún podemos afinar más el análisis. Si realmente cada instrucción lleva asociado un ciclo extra por refresco de memoria tendríamos:
La solución con suma de 16 bits = 25 ciclos (22 + 3 instrucciones)
La solución con el salto =
21 ciclos (18 ciclos + 3 instrucciones) en el caso mejor.
26 ciclos (22 ciclos + 4 instrucciones) en el caso peor.
En este caso el caso peor supondría un ciclo extra con respecto a la solución con suma de 16 bits, pero sólo sucedería si A+L activa el flag de acarreo. Para ello habría que calcular cual es la probabilidad de que A+L active el flag de acarreo, hagámoslo:
Supongamos que la probabilidad de que un registro tome un valor cualquiera entre 0 y 255 es uniforme, de tal forma que la probabilidad de que A = V sea 1/256 (de igual manera la probabilidad de que L = W es 1/256). Supongamos, además, que los valores que tomen A y L son totalmente independientes, por lo que la probabilidad de que A = V y L = W es 1/65536 (el producto de ambas probabilidades).
Ahora viene lo farragoso: calcular la probabilidad de que A+L active el flag de acarreo, es decir: conocer todos los valores V y W que sumados sean 256 o más. Vayamos paso a paso:
-Si A = 0, la suma será como mucho 255, luego la probabilidad de activación del flag (en adelante PAF) es 0.
-Si A = 1, para L = 255 la suma será 256, luego PAF = 1/65536 (sólo un par de valores activan el flag).
-Si A = 2, para L = 254 ó L = 255 la suma será superior a 255, luego PAF = 2/65536 (así que ya tenemos 3 pares de valores)
...
Si continuamos para todos los valores de A (0..255) podremos sacar como conclusión que la probabilidad de que un par de valores concretos sumen más que 256 es
Sumatorio en A perteneciente a {0..255}. ( A / 65536 )
que es igual a
( Sumatorio en A perteneciente a {0..255}. ( A ) ) / 65536
Ahora recordemos las clases de matemáticas cuando nos enseñaban a sumar una serie de números consecutivos (nota histórica: al parecer la idea se le ocurrió a Gauss cuando tenía 5 añitos): el primero más el último multiplicado por el número de términos y dividido por dos. Por lo tanto:
( Sumatorio en A perteneciente a {0..255}. ( A ) ) = ( ( 0 + 255 ) * 256 ) / 2 = 32640
Así pues la probabilidad de que la suma de dos bytes cualesquiera active el flag de acarreo es
32640/65536 = 0'4980...
Algo menos de la mitad. Y la probabilidad de que la suma no active el flag de acarreo (con lo que nos saltaríamos la instrucción INC H) es:
32896/65536 = 0'5019...
Un poquito más de la mitad. Así que es más probable (por poco) que la suma de dos bytes cualesquiera no active el flag de acarreo. Por lo tanto el coste en media de la rutina con el salto es:
21 * ( 32896 / 65536 ) + 26 * ( 32640 / 65536 ) = 23'49 ciclos
un ciclo y medio menor que los 25 ciclos que cuesta siempre la otra rutina.
Si es una rutina crítica que se vaya a usar a menudo un ciclo y medio siempre es importante
Saludos
--
SapphiRe