Diferencia entre revisiones de «Ejercicios varios Itanium (Organización del Computador II)»

De Cuba-Wiki
Sin resumen de edición
 
Sin resumen de edición
Línea 6: Línea 6:
  .align 64
  .align 64
  .global fibo
  .global fibo
  .proc fibo
  .proc fibo
  fibo:
  fibo:
alloc loc0=ar.pfs, 1, 4, 0, 0;;  
  alloc loc0=ar.pfs, 1, 4, 0, 0;;  
add in0= -2, in0;;
  add in0= -2, in0;;
mov ar.LC= in0;;
  mov ar.LC= in0;
 
  mov loc1= r0;;
mov loc1= r0;;
  mov loc2= 1;;
mov loc2= 1;;
 
  ciclo1:
  ciclo1:
add loc3= loc1, loc2;;
  add loc3= loc1, loc2;;
mov loc1= loc2;;
  mov loc1= loc2;;
mov loc2= loc3;;
  mov loc2= loc3;;
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 35: Línea 29:
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.
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
.text
.align 64
.align 64
.global coll
.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 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:
.proc oper
alloc loc0=ar.pfs, 1, 3, 0, 0;;
oper:
and loc1= 1, in0;;
alloc loc0=ar.pfs, 1, 3, 0, 0;;
cmp.eq p1,p2 = 0, loc1;; //Levanta p1 si es par, p2 si impar
and loc1= 1, in0;;
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 ar.pfs= loc0;;
mov r8= loc0;;
br.ret.sptk.many b2;;
.endp oper
mov ar.pfs= loc0;;
br.ret.sptk.many b2;;
.endp oper

Revisión del 12:55 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