Ejercicios varios Itanium (Organización del Computador II)

De Cuba-Wiki
Revisión del 12:50 4 oct 2006 de 200.61.8.44 (discusión)
(difs.) ← Revisión anterior | Revisión actual (difs.) | Revisión siguiente → (difs.)

Fibonacci

Codigo en IA64 para calcular el kesimo numero de Fibonacci. Es iterativa, no recursiva. Recibe como parametro el kesimo numero a calcular y lo devuelve en r8.

.text
.align 64
.global fibo
.proc fibo


fibo:

alloc loc0=ar.pfs, 1, 4, 0, 0;; add in0= -2, in0;; mov ar.LC= in0;;

mov loc1= r0;; mov loc2= 1;;

ciclo1:	

add loc3= loc1, loc2;; mov loc1= loc2;; mov loc2= loc3;; br.cloop.dptk.few ciclo1;;

//FinCiclo1

mov ar.pfs=loc0;; mov r8 = loc2; br.ret.sptk.many b0;;

.endp fibo

Collatz

Verifica la conjetura de collatz para todos los numeros de 2 a n. El parametro es n. No calcula de a varios al mismo tiempo.

.text .align 64 .global coll .proc coll

//loc2 es i, loc1 es r

coll: alloc loc0=ar.pfs, 1, 3, 1, 0;; mov loc2= 2;;

ciclo1: mov loc1= loc2;; //Meto el i en r

ciclo2: br.call.sptk.few b2=oper;; mov loc1= r8;;

cmp.ge p2, p1 = loc1, loc2;; //Comparo r con i, salto mientras no r<i (p2)br.cond.dptk.many ciclo2;; //Salto a ciclo2

//FinCiclo2

add loc2= 1, loc2;; //Incremento el i cmp.eq p2, p1= loc2, in0;; //Comparo (p1) br.cond.dptk.many ciclo1;; //Salto si el i todavia no llego a n

//FinCiclo1

mov ar.pfs=loc0;; mov r8 = 1; br.ret.sptk.many b0;;

.endp coll


.proc oper

oper: alloc loc0=ar.pfs, 1, 3, 0, 0;; and loc1= 1, in0;; cmp.eq p1,p2 = 0, loc1;; //Levanta p1 si es par, p2 si impar

//Si es par (p1)shl in0= in0, 1;;

//Si es impar (p2)add loc2= in0, in0;; (p2)add in0= loc2, in0, 1;;

mov r8= loc0;;

mov ar.pfs= loc0;; br.ret.sptk.many b2;;

.endp oper