dsp.isa revision 5222:bb733a878f85
1// -*- mode:c++ -*-
2
3// Copyright N) 2007 MIPS Technologies, Inc.  All Rights Reserved
4
5//  This software is part of the M5 simulator.
6
7//  THIS IS A LEGAL AGREEMENT.  BY DOWNLOADING, USING, COPYING, CREATING
8//  DERIVATIVE WORKS, AND/OR DISTRIBUTING THIS SOFTWARE YOU ARE AGREEING
9//  TO THESE TERMS AND CONDITIONS.
10
11//  Permission is granted to use, copy, create derivative works and
12//  distribute this software and such derivative works for any purpose,
13//  so long as (1) the copyright notice above, this grant of permission,
14//  and the disclaimer below appear in all copies and derivative works
15//  made, (2) the copyright notice above is augmented as appropriate to
16//  reflect the addition of any new copyrightable work in a derivative
17//  work (e.g., Copyright N) <Publication Year> Copyright Owner), and (3)
18//  the name of MIPS Technologies, Inc. ($(B!H(BMIPS$(B!I(B) is not used in any
19//  advertising or publicity pertaining to the use or distribution of
20//  this software without specific, written prior authorization.
21
22//  THIS SOFTWARE IS PROVIDED $(B!H(BAS IS.$(B!I(B  MIPS MAKES NO WARRANTIES AND
23//  DISCLAIMS ALL WARRANTIES, WHETHER EXPRESS, STATUTORY, IMPLIED OR
24//  OTHERWISE, INCLUDING BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
25//  MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, AND
26//  NON-INFRINGEMENT OF THIRD PARTY RIGHTS, REGARDING THIS SOFTWARE.
27//  IN NO EVENT SHALL MIPS BE LIABLE FOR ANY DAMAGES, INCLUDING DIRECT,
28//  INDIRECT, INCIDENTAL, CONSEQUENTIAL, SPECIAL, OR PUNITIVE DAMAGES OF
29//  ANY KIND OR NATURE, ARISING OUT OF OR IN CONNECTION WITH THIS AGREEMENT,
30//  THIS SOFTWARE AND/OR THE USE OF THIS SOFTWARE, WHETHER SUCH LIABILITY
31//  IS ASSERTED ON THE BASIS OF CONTRACT, TORT (INCLUDING NEGLIGENCE OR
32//  STRICT LIABILITY), OR OTHERWISE, EVEN IF MIPS HAS BEEN WARNED OF THE
33//  POSSIBILITY OF ANY SUCH LOSS OR DAMAGE IN ADVANCE.
34
35//Authors: Korey L. Sewell
36//         Brett Miller
37
38////////////////////////////////////////////////////////////////////
39//
40// DSP integer operate instructions
41//
42output header {{
43#include <iostream>
44    using namespace std;
45    /**
46     * Base class for integer operations.
47     */
48    class DspIntOp : public MipsStaticInst
49    {
50      protected:
51
52        /// Constructor
53        DspIntOp(const char *mnem, MachInst _machInst, OpClass __opClass) :
54            MipsStaticInst(mnem, _machInst, __opClass)
55        {
56        }
57    };
58
59    class DspHiLoOp : public MipsStaticInst
60    {
61      protected:
62
63        /// Constructor
64        DspHiLoOp(const char *mnem, MachInst _machInst, OpClass __opClass) :
65            MipsStaticInst(mnem, _machInst, __opClass)
66        {
67        }
68    };
69}};
70
71// Dsp instruction class execute method template.
72def template DspExecute {{
73        Fault %(class_name)s::execute(%(CPU_exec_context)s *xc, Trace::InstRecord *traceData) const
74        {
75                Fault fault = NoFault;
76
77                %(op_decl)s;
78
79                if (isDspPresent(xc))
80                {
81                    if (isDspEnabled(xc))
82                    {
83                        %(op_rd)s;
84                        %(code)s;
85                    }
86                    else
87                    {
88                        fault = new DspStateDisabledFault();
89                    }
90                }
91                else
92                {
93                    fault = new ReservedInstructionFault();
94                }
95
96                if(fault == NoFault)
97                {
98                    %(op_wb)s;
99                }
100                return fault;
101        }
102}};
103
104// DspHiLo instruction class execute method template.
105def template DspHiLoExecute {{
106        Fault %(class_name)s::execute(%(CPU_exec_context)s *xc, Trace::InstRecord *traceData) const
107        {
108                Fault fault = NoFault;
109
110                %(op_decl)s;
111
112                if (isDspPresent(xc))
113                {
114                    if (isDspEnabled(xc))
115                    {
116                        %(op_rd)s;
117                        %(code)s;
118                    }
119                    else
120                    {
121                        fault = new DspStateDisabledFault();
122                    }
123                }
124                else
125                {
126                    fault = new ReservedInstructionFault();
127                }
128
129                if(fault == NoFault)
130                {
131                    %(op_wb)s;
132                    //If there are 2 Destination Registers then
133                    //concatenate the values for the traceData
134                    if(traceData && _numDestRegs == 2) {
135                        // FIXME - set the trace value correctly here
136                        //uint64_t hilo_final_val = (uint64_t)HI_RD_SEL << 32 | LO_RD_SEL;
137                        //traceData->setData(hilo_final_val);
138                    }
139                }
140                return fault;
141        }
142}};
143
144//Outputs to decoder.cc
145output decoder {{
146}};
147
148output exec {{
149    bool isDspEnabled(%(CPU_exec_context)s *xc)
150    {
151#if FULL_SYSTEM
152        if( bits( xc->readMiscReg(MipsISA::Status), 24, 24 ) == 0 )
153            return false;
154#else
155        //printf("Syscall Emulation Mode: isDspEnabled() check defaults to TRUE\n");
156#endif
157        return true;
158    }
159}};
160
161output exec {{
162    bool isDspPresent(%(CPU_exec_context)s *xc)
163    {
164#if FULL_SYSTEM
165        if( bits( xc->readMiscReg(MipsISA::Config3), 10, 10 ) == 0 )
166            return false;
167#else
168        //printf("Syscall Emulation Mode: isDspPresent() check defaults to TRUE\n");
169#endif
170        return true;
171    }
172}};
173
174// add code to fetch the DSPControl register
175// and write it back after execution, giving
176// the instruction the opportunity to modify
177// it if necessary
178def format DspIntOp(code, *opt_flags) {{
179
180    decl_code = 'uint32_t dspctl;\n'
181    decl_code += 'dspctl = DSPControl;\n'
182
183    write_code = 'DSPControl = dspctl;\n'
184
185    code = decl_code + code + write_code
186
187    opt_flags += ('IsDspOp',)
188
189    iop = InstObjParams(name, Name, 'DspIntOp', code, opt_flags)
190    header_output = BasicDeclare.subst(iop)
191    decoder_output = BasicConstructor.subst(iop)
192    decode_block = BasicDecode.subst(iop)
193    exec_output = DspExecute.subst(iop)
194}};
195
196// add code to fetch the DSPControl register
197// and write it back after execution, giving
198// the instruction the opportunity to modify
199// it if necessary; also, fetch the appropriate
200// HI/LO register pair, based on the AC
201// instruction field.
202
203def format DspHiLoOp(code, *opt_flags) {{
204
205    decl_code = 'int64_t dspac;\n'
206    decl_code += 'uint32_t dspctl;\n'
207
208    fetch_code = 'dspctl = DSPControl;\n'
209    fetch_code += 'dspac = HI_RD_SEL;\n'
210    fetch_code += 'dspac = dspac << 32 | LO_RD_SEL;\n'
211
212    write_code = 'DSPControl = dspctl;\n'
213    write_code += 'HI_RD_SEL = dspac<63:32>;\n'
214    write_code += 'LO_RD_SEL = dspac<31:0>;\n'
215
216    code = decl_code + fetch_code + code + write_code
217
218    opt_flags += ('IsDspOp',)
219
220    iop = InstObjParams(name, Name, 'DspHiLoOp', code, opt_flags)
221    header_output = BasicDeclare.subst(iop)
222    decoder_output = BasicConstructor.subst(iop)
223    decode_block = BasicDecode.subst(iop)
224    exec_output = DspHiLoExecute.subst(iop)
225
226}};
227
228
229
230