basic.isa (7741:340b6f01d69b) basic.isa (8621:2a6d9a7197fe)
1// Copyright (c) 2006-2007 The Regents of The University of Michigan
2// All rights reserved.
3//
4// Redistribution and use in source and binary forms, with or without
5// modification, are permitted provided that the following conditions are
6// met: redistributions of source code must retain the above copyright
7// notice, this list of conditions and the following disclaimer;
8// redistributions in binary form must reproduce the above copyright

--- 19 unchanged lines hidden (view full) ---

28// Gabe Black
29// Steve Reinhardt
30
31// Declarations for execute() methods.
32def template BasicExecDeclare {{
33 Fault execute(%(CPU_exec_context)s *, Trace::InstRecord *) const;
34}};
35
1// Copyright (c) 2006-2007 The Regents of The University of Michigan
2// All rights reserved.
3//
4// Redistribution and use in source and binary forms, with or without
5// modification, are permitted provided that the following conditions are
6// met: redistributions of source code must retain the above copyright
7// notice, this list of conditions and the following disclaimer;
8// redistributions in binary form must reproduce the above copyright

--- 19 unchanged lines hidden (view full) ---

28// Gabe Black
29// Steve Reinhardt
30
31// Declarations for execute() methods.
32def template BasicExecDeclare {{
33 Fault execute(%(CPU_exec_context)s *, Trace::InstRecord *) const;
34}};
35
36def template DoFpOpDeclare {{
37 Fault doFpOp(%(CPU_exec_context)s *, Trace::InstRecord *)
38 const M5_NO_INLINE;
39}};
40
36// Definitions of execute methods that panic.
37def template BasicExecPanic {{
38 Fault
39 execute(%(CPU_exec_context)s *, Trace::InstRecord *) const
40 {
41 panic("Execute method called when it shouldn't!");
42 M5_DUMMY_RETURN
43 }

--- 9 unchanged lines hidden (view full) ---

53 public:
54 // Constructor.
55 %(class_name)s(ExtMachInst machInst);
56 %(BasicExecDeclare)s
57 };
58}};
59
60// Basic instruction class declaration template.
41// Definitions of execute methods that panic.
42def template BasicExecPanic {{
43 Fault
44 execute(%(CPU_exec_context)s *, Trace::InstRecord *) const
45 {
46 panic("Execute method called when it shouldn't!");
47 M5_DUMMY_RETURN
48 }

--- 9 unchanged lines hidden (view full) ---

58 public:
59 // Constructor.
60 %(class_name)s(ExtMachInst machInst);
61 %(BasicExecDeclare)s
62 };
63}};
64
65// Basic instruction class declaration template.
66def template FpBasicDeclare {{
67 /**
68 * Static instruction class for "%(mnemonic)s".
69 */
70 class %(class_name)s : public %(base_class)s
71 {
72 public:
73 // Constructor.
74 %(class_name)s(ExtMachInst machInst);
75 %(BasicExecDeclare)s
76 %(DoFpOpDeclare)s
77 };
78}};
79
80// Basic instruction class declaration template.
61def template BasicDeclareWithMnemonic {{
62 /**
63 * Static instruction class for "%(mnemonic)s".
64 */
65 class %(class_name)s : public %(base_class)s
66 {
67 public:
68 // Constructor.

--- 36 unchanged lines hidden (view full) ---

105
106 if (fault == NoFault) {
107 %(op_wb)s;
108 }
109 return fault;
110 }
111}};
112
81def template BasicDeclareWithMnemonic {{
82 /**
83 * Static instruction class for "%(mnemonic)s".
84 */
85 class %(class_name)s : public %(base_class)s
86 {
87 public:
88 // Constructor.

--- 36 unchanged lines hidden (view full) ---

125
126 if (fault == NoFault) {
127 %(op_wb)s;
128 }
129 return fault;
130 }
131}};
132
133def template DoFpOpExecute {{
134 Fault
135 %(class_name)s::doFpOp(%(CPU_exec_context)s *xc,
136 Trace::InstRecord *traceData) const
137 {
138 Fault fault = NoFault;
139 %(op_decl)s;
140 %(op_rd)s;
141 %(fp_code)s;
142 if (fault == NoFault) {
143 %(op_wb)s;
144 }
145 return fault;
146 }
147}};
148
113// Basic decode template.
114def template BasicDecode {{
115 return new %(class_name)s(machInst);
116}};
117
118// Basic decode template, passing mnemonic in as string arg to constructor.
119def template BasicDecodeWithMnemonic {{
120 return new %(class_name)s("%(mnemonic)s", machInst);

--- 5 unchanged lines hidden (view full) ---

126 iop = InstObjParams(name, Name, 'SparcStaticInst', code, flags)
127 header_output = BasicDeclare.subst(iop)
128 decoder_output = BasicConstructor.subst(iop)
129 decode_block = BasicDecode.subst(iop)
130 exec_output = BasicExecute.subst(iop)
131}};
132
133def format FpBasic(code, *flags) {{
149// Basic decode template.
150def template BasicDecode {{
151 return new %(class_name)s(machInst);
152}};
153
154// Basic decode template, passing mnemonic in as string arg to constructor.
155def template BasicDecodeWithMnemonic {{
156 return new %(class_name)s("%(mnemonic)s", machInst);

--- 5 unchanged lines hidden (view full) ---

162 iop = InstObjParams(name, Name, 'SparcStaticInst', code, flags)
163 header_output = BasicDeclare.subst(iop)
164 decoder_output = BasicConstructor.subst(iop)
165 decode_block = BasicDecode.subst(iop)
166 exec_output = BasicExecute.subst(iop)
167}};
168
169def format FpBasic(code, *flags) {{
134 fp_code = """
170 exec_code = """
135 Fsr |= bits(Fsr,4,0) << 5;
171 Fsr |= bits(Fsr,4,0) << 5;
136 Fsr = insertBits(Fsr,4,0,0);
172 Fsr = insertBits(Fsr, 4, 0, 0);
137 int newrnd = M5_FE_TONEAREST;
138 switch (Fsr<31:30>) {
139 case 0: newrnd = M5_FE_TONEAREST; break;
140 case 1: newrnd = M5_FE_TOWARDZERO; break;
141 case 2: newrnd = M5_FE_UPWARD; break;
142 case 3: newrnd = M5_FE_DOWNWARD; break;
143 }
144 int oldrnd = m5_fegetround();
145 m5_fesetround(newrnd);
173 int newrnd = M5_FE_TONEAREST;
174 switch (Fsr<31:30>) {
175 case 0: newrnd = M5_FE_TONEAREST; break;
176 case 1: newrnd = M5_FE_TOWARDZERO; break;
177 case 2: newrnd = M5_FE_UPWARD; break;
178 case 3: newrnd = M5_FE_DOWNWARD; break;
179 }
180 int oldrnd = m5_fegetround();
181 m5_fesetround(newrnd);
182 __asm__ __volatile__("" ::: "memory");
183 fault = doFpOp(xc, traceData);
184 __asm__ __volatile__("" ::: "memory");
185 m5_fesetround(oldrnd);
186 return fault;
146"""
187"""
147
148 fp_code += code
149
150
151 fp_code += """
152 m5_fesetround(oldrnd);
153"""
154 fp_code = filterDoubles(fp_code)
155 iop = InstObjParams(name, Name, 'SparcStaticInst', fp_code, flags)
156 header_output = BasicDeclare.subst(iop)
157 decoder_output = BasicConstructor.subst(iop)
158 decode_block = BasicDecode.subst(iop)
159 exec_output = BasicExecute.subst(iop)
188 fp_code = filterDoubles(code)
189 iop = InstObjParams(name, Name, 'SparcStaticInst',
190 { "code" : exec_code, "fp_code" : fp_code }, flags)
191 header_output = FpBasicDeclare.subst(iop)
192 decoder_output = BasicConstructor.subst(iop)
193 decode_block = BasicDecode.subst(iop)
194 exec_output = BasicExecute.subst(iop)
195 exec_output += DoFpOpExecute.subst(iop)
160}};
196}};