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

Subversion Repositories 1664

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

Compare with Previous | Blame | View Log

#include "cpu_1664.h"
 
void cpu_1664_opera__mul(struct cpu_1664 *cpu, n1 bait)
{
 cpu->opera_sicle=cpu_1664_sicle_opera_mul;
 
 #define sz_sinia sizeof(cpu_1664_sinia_t)
 #define masca_di ((((cpu_1664_sinia_t)(-1))>>((sz_sinia*4)-1))>>1)
 #define desloca_di ((sz_sinia*4)-1)
 
 n1 rd=bait&((1<<cpu_1664_bitio_rd)-1);
 n1 rf=bait>>cpu_1664_bitio_rd;
 
 cpu_1664_sinia_t A=cpu->sinia[rd];
 cpu_1664_sinia_t B=cpu->sinia[rf];
 
#ifdef ojeto_64
 cpu_1664_sinia_t m0=(A&masca_di)*(B&masca_di);
 cpu_1664_sinia_t m1=(A&masca_di)*((B>>desloca_di)>>1);
 cpu_1664_sinia_t m2=((A>>desloca_di)>>1)*(B&masca_di);
 cpu_1664_sinia_t m3=((A>>desloca_di)>>1)*((B>>desloca_di)>>1);
 
 cpu_1664_sinia_t masima = m3 + ((m1>>desloca_di)>>1) + ((m2>>desloca_di)>>1);
 cpu_1664_sinia_t minima = m0 + ((m1<<desloca_di)<<1);
 masima+=(minima<m0);
 minima+=((m2<<desloca_di)<<1);
 masima+=(minima<((m2<<desloca_di)<<1));
#endif
 
#ifdef ojeto_32
n8 produi=A*B;
cpu_1664_sinia_t masima = ((produi>>31)>>1);
cpu_1664_sinia_t minima = produi&0xffffffff;
#endif
 
#ifdef ojeto_16
n4 produi=A*B;
cpu_1664_sinia_t masima = (produi>>16);
cpu_1664_sinia_t minima = produi&0xffff;
#endif
 
#ifdef ojeto_8
n2 produi=A*B;
cpu_1664_sinia_t masima = (produi>>8);
cpu_1664_sinia_t minima = produi&0xff;
#endif
 
 {
 //?salva
 cpu->sinia[cpu_1664_sinia_masima]=masima;
 cpu->sinia[cpu_1664_sinia_minima]=minima;
 }
 
 cpu_1664_sinia_t desloca_masima;
 cpu_1664_sinia_t desloca_minima=0;
 cpu_1664_sinia_t masca;
 
 nN i;
 for(masca=-1, i=0;((masima&masca)!=0);i++)
 {
  masca<<=1;
 }
 desloca_masima=(sizeof(cpu_1664_sinia_t)*8)-i;
 
 if(desloca_masima==(sz_sinia*8))
 {
 
  for(masca=-1, i=0; ((minima&masca)!=0); i++)
  {
   masca<<=1;
  }
  desloca_minima=(sizeof(cpu_1664_sinia_t)*8)-i;
 
 }
 
#ifdef ojeto_32
 masima<<=desloca_masima;
 minima>>=(sz_sinia*8)-desloca_masima;
 minima<<=desloca_minima;
#endif
 
#ifdef ojeto_64 
 //x86-64
// nN i;
 for(i=desloca_masima;i>desloca_di;i-=desloca_di)
 {
  masima<<=desloca_di;
 }
 masima<<=i;
 for(i=(sz_sinia*8)-desloca_masima;i>desloca_di;i-=desloca_di)
 {
  minima>>=desloca_di;
 }
 minima>>=i;
 for(i=desloca_minima;i>desloca_di;i-=desloca_di)
 {
  minima<<=desloca_di;
 }
 minima<<=i;
#endif
 
 cpu->sinia[cpu_1664_sinia_desloca]+=desloca_masima+desloca_minima-sizeof(cpu_1664_sinia_t)*8;
 cpu->sinia[rd]=masima|minima; //x86-64
 
 if (cpu->depende[cpu_1664_depende_bitio_depende_influe]!=0)
 {
  cpu->depende[cpu_1664_depende_z] = (cpu->sinia[rd]==0);
  cpu->depende[cpu_1664_depende_n] = cpu->depende[cpu_1664_depende_z]==0;
 }
}

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.