vins.c
3.38 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
#include <stdio.h>
#include "vudefs.h"
/**************************************************************************
* Used for vins_{T,Q,N}, vext_{T,Q,N}
* ==========================
*
* Check_Vins (tno, Op, rMp, vS, vT, vT_El, vD, vDexp, vTemp)
*
**************************************************************************/
char *Templ_vins_frmt = "( %2d, %s, $26, $v%-d, $v%-d, $v%-d%-s, $v%-d, $v%-d, $v%-d)\n";
vins(fp)
FILE *fp;
{
int i,j,triple,quad,nibble, insert;
i16 si, ti;
i32 di;
u16 d_tmp[8];
u16 Tmask0,Tmask1,Tmask2,Tmask3,Qmask0,Qmask1,Qmask2,Qmask3;
u8 dtmp;
triple = optab[opindex].enu_name==VINS_T ||
optab[opindex].enu_name==VEXT_T;
quad = optab[opindex].enu_name==VINS_Q ||
optab[opindex].enu_name==VEXT_Q;
nibble = !triple && !quad;
insert = optab[opindex].enu_name==VINS_T ||
optab[opindex].enu_name==VINS_Q ||
optab[opindex].enu_name==VINS_N;
Tmask0 = 0xf800; Tmask1 = 0x07c0; Tmask2 = 0x003e; Tmask3 = 0x0001;
Qmask0 = 0xf000; Qmask1 = 0x0f00; Qmask2 = 0x00f0; Qmask3 = 0x000f;
for (i=0; i<8; i++) {
si = (i16) vs[i];
ti = (i16) vt[i]; /* vector always */
el &= 0x7;
d_tmp[i] = (i%4==0) ? si&ti :
(i%4==1) ? si|ti :
(i%4==2) ? si^ti : ~(si^ti);
if (insert)
if (triple)
{
dtmp = (u8) (si>>10) & 0x1f;
if (el==0) vd[i] = (ti & ~Tmask0) | (dtmp << 11);
else if (el==1) vd[i] = (ti & ~Tmask1) | (dtmp << 6);
else if (el==2) vd[i] = (ti & ~Tmask2) | (dtmp << 1);
else if (el==3) vd[i] = (ti & ~Tmask3) | ((dtmp >> 4) & 0x1);
}
else
{
dtmp = (quad) ? ((u8) (si>>11)&0xf) : ((u8) si&0xf);
if (el==0) vd[i] = (ti & ~Qmask0) | (dtmp << 12);
else if (el==1) vd[i] = (ti & ~Qmask1) | (dtmp << 8);
else if (el==2) vd[i] = (ti & ~Qmask2) | (dtmp << 4);
else if (el==3) vd[i] = (ti & ~Qmask3) | dtmp;
}
else /*ext*/
if (triple)
{
if (el==0) dtmp = (u8) ((si >> 11) & 0x1f);
else if (el==1) dtmp = (u8) ((si >> 6) & 0x1f);
else if (el==2) dtmp = (u8) ((si >> 1) & 0x1f);
else if (el==3) dtmp = (u8) ((si & 0x01)<<4);
vd[i] = dtmp<<10;
}
else
{
if (el==0) dtmp = (u8) ((si >> 12) & 0xf);
else if (el==1) dtmp = (u8) ((si >> 8) & 0xf);
else if (el==2) dtmp = (u8) ((si >> 4) & 0xf);
else if (el==3) dtmp = (u8) ((si >> 0) & 0xf);
if (quad) vd[i] = dtmp<<11;
else if (dtmp & 0x8) vd[i] = 0xfff0 | dtmp;
else vd[i] = dtmp;
}
} /*for*/
if (data_pntr < (2048 - 100))
{
/* initidLize data segment starting at data_pntr */
/* SRC, TRGT, RES, RES_ACCH, RES_ACCM, RES_ACCL */
for (i=0;i<8;i++) {data[data_pntr++] = vs[i];}
for (i=0;i<8;i++) {data[data_pntr++] = vt[i];}
for (i=0;i<8;i++) {data[data_pntr++] = vd[i];}
for (i=0;i<8;i++) {data[data_pntr++] = d_tmp[i];}
}
fprintf(fp,optab[opindex].op_tmplt);
fprintf(fp,Templ_vins_frmt,
test_num,
optab[opindex].name,
regtab[SRC].rnum,
regtab[TRG].rnum,
regtab[TRG].rnum,el_sf,
regtab[DST].rnum,
regtab[DST_EXP].rnum,
regtab[TEMP].rnum
);
}/*vins*/