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
117
118
119
120
121
122
|
// -*- C -*-
//
// Simulator definition for the SmartMIPS extensions.
// Copyright (C) 2005, 2010 Free Software Foundation, Inc.
// Contributed by Nigel Stephens (nigel@mips.com) and
// David Ung (davidu@mips.com) of MIPS Technologies.
//
// This file is part of GDB, the GNU debugger.
//
// This program is free software; you can redistribute it and/or modify
// it under the terms of the GNU General Public License as published by
// the Free Software Foundation; either version 3 of the License, or
// (at your option) any later version.
//
// This program is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU General Public License for more details.
//
// You should have received a copy of the GNU General Public License
// along with this program. If not, see <http://www.gnu.org/licenses/>.
011100,5.BASE,5.INDEX,5.RD,00010,001000:SPECIAL:32::LWXS
"lwxs r<RD>, <INDEX>(r<BASE>)"
*smartmips:
{
GPR[RD] = EXTEND32 (do_load(SD_, AccessLength_WORD, GPR[BASE], GPR[INDEX]<<2));
}
011100,5.RS,5.RT,00000,10001,000001:SPECIAL:32::MADDP
"maddp r<RS>, r<RT>"
*smartmips:
{
unsigned64 res;
unsigned64 rs, rt;
int i;
check_mult_hilo (SD_, HIHISTORY, LOHISTORY);
TRACE_ALU_INPUT2 (GPR[RS], GPR[RT]);
res = 0;
rs = GPR[RS];
rt = GPR[RT];
for (i = 0; i < 32; i++)
{
if (rs & 1)
res ^= rt;
rs >>= 1;
rt <<= 1;
}
LO ^= EXTEND32 (VL4_8 (res));
HI ^= EXTEND32 (VH4_8 (res));
TRACE_ALU_RESULT2 (HI, LO);
}
000000,0000000000,5.RD,00001,010010:SPECIAL:32::MFLHXU
"mflhxu r<RD>"
*smartmips:
{
check_mf_hilo (SD_, HIHISTORY, LOHISTORY);
TRACE_ALU_INPUT3 (ACX,HI,LO);
GPR[RD] = LO;
LO = HI;
HI = ACX;
ACX = 0;
TRACE_ALU_RESULT4 (ACX,HI,LO,GPR[RD]);
}
000000,5.RS,000000000000001,010011:SPECIAL:32::MTLHX
"mtlhx r<RS>"
*smartmips:
{
check_mf_hilo (SD_, HIHISTORY, LOHISTORY);
TRACE_ALU_INPUT3 (HI,LO,GPR[RS]);
ACX = HI;
HI = LO;
LO = GPR[RS];
TRACE_ALU_RESULT4 (ACX,HI,LO,GPR[RS]);
}
000000,5.RS,5.RT,00000,10001,011001:SPECIAL:32::MULTP
"multp r<RS>, r<RT>"
*smartmips:
{
unsigned64 res;
unsigned64 rs, rt;
int i;
check_mult_hilo (SD_, HIHISTORY, LOHISTORY);
TRACE_ALU_INPUT2 (GPR[RS], GPR[RT]);
res = 0;
rs = GPR[RS];
rt = GPR[RT];
for (i = 0; i < 32; i++)
{
if (rs & 1)
res ^= rt;
rs >>= 1;
rt <<= 1;
}
LO = EXTEND32 (VL4_8 (res));
HI = EXTEND32 (VH4_8 (res));
ACX = 0;
TRACE_ALU_RESULT2 (HI, LO);
}
011100,5.RS,5.RT,00000,10010,000001:SPECIAL:32::PPERM
"pperm r<RS>, r<RT>"
*smartmips:
{
int i;
ACX = (ACX << 6) | MSEXTRACTED(HI,26,31);
HI = EXTEND32 ((HI << 6) | MSEXTRACTED(LO,26,31));
LO = EXTEND32 (LO << 6);
for (i = 0; i < 6; i++) {
int sbit = 5*i;
int ebit = sbit + 4;
int tbit = EXTRACTED(GPR[RT],sbit,ebit);
LO |= MSEXTRACTED(GPR[RS],tbit,tbit) << i;
}
}
|