Diferencia entre revisiones de «Ejercicios varios Itanium (Organización del Computador II)»
De Cuba-Wiki
Sin resumen de edición |
(Ejercicios de Martin y Palla) |
||
Línea 8: | Línea 8: | ||
.proc fibo | .proc fibo | ||
fibo: | fibo: | ||
alloc loc0=ar.pfs, 1, 4, 0, 0;; | alloc loc0=ar.pfs, 1, 4, 0, 0;; | ||
Línea 14: | Línea 15: | ||
mov loc1= r0;; | mov loc1= r0;; | ||
mov loc2= 1;; | mov loc2= 1;; | ||
ciclo1: | ciclo1: | ||
add loc3= loc1, loc2;; | add loc3= loc1, loc2;; | ||
Línea 20: | Línea 22: | ||
br.cloop.dptk.few ciclo1;; | br.cloop.dptk.few ciclo1;; | ||
//FinCiclo1 | //FinCiclo1 | ||
mov ar.pfs=loc0;; | mov ar.pfs=loc0;; | ||
mov r8 = loc2; | mov r8 = loc2; | ||
br.ret.sptk.many b0;; | br.ret.sptk.many b0;; | ||
.endp fibo | .endp fibo | ||
Línea 34: | Línea 38: | ||
.proc coll | .proc coll | ||
coll: | coll: | ||
alloc loc0=ar.pfs, 1, 3, 1, 0;; | alloc loc0=ar.pfs, 1, 3, 1, 0;; | ||
mov loc2= 2;; | mov loc2= 2;; | ||
ciclo1: | ciclo1: | ||
mov loc1= loc2;; //Meto el i en r | mov loc1= loc2;; //Meto el i en r | ||
ciclo2: | ciclo2: | ||
br.call.sptk.few b2=oper;; | br.call.sptk.few b2=oper;; | ||
Línea 45: | Línea 52: | ||
(p2)br.cond.dptk.many ciclo2;; //Salto a ciclo2 | (p2)br.cond.dptk.many ciclo2;; //Salto a ciclo2 | ||
//FinCiclo2 | //FinCiclo2 | ||
add loc2= 1, loc2;; //Incremento el i | add loc2= 1, loc2;; //Incremento el i | ||
cmp.eq p2, p1= loc2, in0;; //Comparo | cmp.eq p2, p1= loc2, in0;; //Comparo | ||
(p1) br.cond.dptk.many ciclo1;; //Salto si el i todavia no llego a n | (p1) br.cond.dptk.many ciclo1;; //Salto si el i todavia no llego a n | ||
//FinCiclo1 | //FinCiclo1 | ||
mov ar.pfs=loc0;; | mov ar.pfs=loc0;; | ||
mov r8 = 1; | mov r8 = 1; | ||
br.ret.sptk.many b0;; | br.ret.sptk.many b0;; | ||
.endp coll | .endp coll | ||
.proc oper | .proc oper | ||
oper: | oper: | ||
alloc loc0=ar.pfs, 1, 3, 0, 0;; | alloc loc0=ar.pfs, 1, 3, 0, 0;; | ||
and loc1= 1, in0;; | and loc1= 1, in0;; | ||
cmp.eq p1,p2 = 0, loc1;; //Levanta p1 si es par, p2 si impar | cmp.eq p1,p2 = 0, loc1;; //Levanta p1 si es par, p2 si impar | ||
//Si es par | //Si es par | ||
(p1)shl in0= in0, 1;; | (p1)shl in0= in0, 1;; | ||
//Si es impar | //Si es impar | ||
(p2)add loc2= in0, in0;; | (p2)add loc2= in0, in0;; | ||
(p2)add in0= loc2, in0, 1;; | (p2)add in0= loc2, in0, 1;; | ||
mov r8= loc0;; | mov r8= loc0;; | ||
mov ar.pfs= loc0;; | mov ar.pfs= loc0;; | ||
br.ret.sptk.many b2;; | br.ret.sptk.many b2;; | ||
.endp oper | .endp oper |
Revisión del 12:58 4 oct 2006
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 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