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

Subversion Repositories 1664

[/] [1664/] [trunk/] [c/] [cpu_1664/] [cpu_1664_opera__mul.c] - Blame information for rev 2

Details | Compare with Previous | View Log

Line No. Rev Author Line
1 2 mrdmkg
#include "cpu_1664.h"
2
 
3
void cpu_1664_opera__mul(struct cpu_1664 *cpu, n1 bait)
4
{
5
 cpu->opera_sicle=cpu_1664_sicle_opera_mul;
6
 
7
 #define sz_sinia sizeof(cpu_1664_sinia_t)
8
 #define masca_di ((((cpu_1664_sinia_t)(-1))>>((sz_sinia*4)-1))>>1)
9
 #define desloca_di ((sz_sinia*4)-1)
10
 
11
 n1 rd=bait&((1<<cpu_1664_bitio_rd)-1);
12
 n1 rf=bait>>cpu_1664_bitio_rd;
13
 
14
 cpu_1664_sinia_t A=cpu->sinia[rd];
15
 cpu_1664_sinia_t B=cpu->sinia[rf];
16
 
17
#ifdef ojeto_64
18
 cpu_1664_sinia_t m0=(A&masca_di)*(B&masca_di);
19
 cpu_1664_sinia_t m1=(A&masca_di)*((B>>desloca_di)>>1);
20
 cpu_1664_sinia_t m2=((A>>desloca_di)>>1)*(B&masca_di);
21
 cpu_1664_sinia_t m3=((A>>desloca_di)>>1)*((B>>desloca_di)>>1);
22
 
23
 cpu_1664_sinia_t masima = m3 + ((m1>>desloca_di)>>1) + ((m2>>desloca_di)>>1);
24
 cpu_1664_sinia_t minima = m0 + ((m1<<desloca_di)<<1);
25
 masima+=(minima<m0);
26
 minima+=((m2<<desloca_di)<<1);
27
 masima+=(minima<((m2<<desloca_di)<<1));
28
#endif
29
 
30
#ifdef ojeto_32
31
n8 produi=A*B;
32
cpu_1664_sinia_t masima = ((produi>>31)>>1);
33
cpu_1664_sinia_t minima = produi&0xffffffff;
34
#endif
35
 
36
#ifdef ojeto_16
37
n4 produi=A*B;
38
cpu_1664_sinia_t masima = (produi>>16);
39
cpu_1664_sinia_t minima = produi&0xffff;
40
#endif
41
 
42
#ifdef ojeto_8
43
n2 produi=A*B;
44
cpu_1664_sinia_t masima = (produi>>8);
45
cpu_1664_sinia_t minima = produi&0xff;
46
#endif
47
 
48
 {
49
 //?salva
50
 cpu->sinia[cpu_1664_sinia_masima]=masima;
51
 cpu->sinia[cpu_1664_sinia_minima]=minima;
52
 }
53
 
54
 cpu_1664_sinia_t desloca_masima;
55
 cpu_1664_sinia_t desloca_minima=0;
56
 cpu_1664_sinia_t masca;
57
 
58
 nN i;
59
 for(masca=-1, i=0;((masima&masca)!=0);i++)
60
 {
61
  masca<<=1;
62
 }
63
 desloca_masima=(sizeof(cpu_1664_sinia_t)*8)-i;
64
 
65
 if(desloca_masima==(sz_sinia*8))
66
 {
67
 
68
  for(masca=-1, i=0; ((minima&masca)!=0); i++)
69
  {
70
   masca<<=1;
71
  }
72
  desloca_minima=(sizeof(cpu_1664_sinia_t)*8)-i;
73
 
74
 }
75
 
76
#ifdef ojeto_32
77
 masima<<=desloca_masima;
78
 minima>>=(sz_sinia*8)-desloca_masima;
79
 minima<<=desloca_minima;
80
#endif
81
 
82
#ifdef ojeto_64 
83
 //x86-64
84
// nN i;
85
 for(i=desloca_masima;i>desloca_di;i-=desloca_di)
86
 {
87
  masima<<=desloca_di;
88
 }
89
 masima<<=i;
90
 for(i=(sz_sinia*8)-desloca_masima;i>desloca_di;i-=desloca_di)
91
 {
92
  minima>>=desloca_di;
93
 }
94
 minima>>=i;
95
 for(i=desloca_minima;i>desloca_di;i-=desloca_di)
96
 {
97
  minima<<=desloca_di;
98
 }
99
 minima<<=i;
100
#endif
101
 
102
 cpu->sinia[cpu_1664_sinia_desloca]+=desloca_masima+desloca_minima-sizeof(cpu_1664_sinia_t)*8;
103
 cpu->sinia[rd]=masima|minima; //x86-64
104
 
105
 if (cpu->depende[cpu_1664_depende_bitio_depende_influe]!=0)
106
 {
107
  cpu->depende[cpu_1664_depende_z] = (cpu->sinia[rd]==0);
108
  cpu->depende[cpu_1664_depende_n] = cpu->depende[cpu_1664_depende_z]==0;
109
 }
110
}

powered by: WebSVN 2.1.0

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