OpenCores
URL https://opencores.org/ocsvn/1664/1664/trunk

Subversion Repositories 1664

[/] [1664/] [trunk/] [c/] [cpu_1664/] [cpu_1664_opera__div.c] - Rev 2

Compare with Previous | Blame | View Log

#include "cpu_1664.h"
 
void cpu_1664_opera__div(struct cpu_1664 *cpu, n1 bait)
{
 cpu->opera_sicle=cpu_1664_sicle_opera_div;
 cpu_1664_sinia_t masima=cpu->sinia[bait&((1<<cpu_1664_bitio_rd)-1)];
 cpu_1664_sinia_t minima=cpu->sinia[bait>>cpu_1664_bitio_rd];
 cpu_1664_sinia_t desloca_masima;
 cpu_1664_sinia_t desloca_minima;
 cpu_1664_sinia_t masca;
 
 if(minima==0)
 {
  cpu_1664_eseta(cpu, cpu_1664_eseta_div_zero);
  return;
 }
 else
 {
  nN i;
  for(masca=-1, i=0;((masima&masca)!=0);i++)
  {
   masca<<=1;
  }
  desloca_masima=(sizeof(cpu_1664_sinia_t)*8)-i;
 
  for(masca=1, i=0; ((minima&masca)==0); i++)
  {
   masca<<=1;
  }
  desloca_minima=i;
 
//x86-64
  for(i=desloca_masima; i>31; i-=31)
  {
   masima<<=31;
  }
  masima<<=i;
 
  for(i=desloca_minima; i>31; i-=31)
  {
   minima>>=31;
  }
  minima>>=i;
 
  cpu_1664_sinia_t loca_div;
  cpu_1664_sinia_t div=masima/minima;
 
  for(masca=-1, i=0; ((div&masca)!=0); i++)
  {
   masca<<=1;
  }
  loca_div=(sizeof(cpu_1664_sinia_t)*8)-i;
 
  for(i=loca_div; i>31; i-=31)
  {
   div<<=31;
  }
  div<<=i;
 
  cpu->sinia[bait&((1<<cpu_1664_bitio_rd)-1)]=div;
  cpu->sinia[cpu_1664_sinia_desloca]+=loca_div+desloca_minima+desloca_masima;
 }
}

Compare with Previous | Blame | View Log

powered by: WebSVN 2.1.0

© copyright 1999-2024 OpenCores.org, equivalent to Oliscience, all rights reserved. OpenCores®, registered trademark.