exec_context.hh (11877:5ea85692a53e) exec_context.hh (12104:edd63f9c6184)
1/*
2 * Copyright (c) 2011-2014 ARM Limited
3 * Copyright (c) 2013 Advanced Micro Devices, Inc.
4 * All rights reserved
5 *
6 * The license below extends only to copyright in the software and shall
7 * not be construed as granting a license to any other intellectual
8 * property including but not limited to intellectual property relating

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

119 execute.getLSQ().pushRequest(inst, false /* store */, data,
120 size, addr, flags, res);
121 return NoFault;
122 }
123
124 IntReg
125 readIntRegOperand(const StaticInst *si, int idx) override
126 {
1/*
2 * Copyright (c) 2011-2014 ARM Limited
3 * Copyright (c) 2013 Advanced Micro Devices, Inc.
4 * All rights reserved
5 *
6 * The license below extends only to copyright in the software and shall
7 * not be construed as granting a license to any other intellectual
8 * property including but not limited to intellectual property relating

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

119 execute.getLSQ().pushRequest(inst, false /* store */, data,
120 size, addr, flags, res);
121 return NoFault;
122 }
123
124 IntReg
125 readIntRegOperand(const StaticInst *si, int idx) override
126 {
127 return thread.readIntReg(si->srcRegIdx(idx));
127 RegId reg = si->srcRegIdx(idx);
128 assert(reg.regClass == IntRegClass);
129 return thread.readIntReg(reg.regIdx);
128 }
129
130 TheISA::FloatReg
131 readFloatRegOperand(const StaticInst *si, int idx) override
132 {
130 }
131
132 TheISA::FloatReg
133 readFloatRegOperand(const StaticInst *si, int idx) override
134 {
133 int reg_idx = si->srcRegIdx(idx) - TheISA::FP_Reg_Base;
134 return thread.readFloatReg(reg_idx);
135 RegId reg = si->srcRegIdx(idx);
136 assert(reg.regClass == FloatRegClass);
137 return thread.readFloatReg(reg.regIdx);
135 }
136
137 TheISA::FloatRegBits
138 readFloatRegOperandBits(const StaticInst *si, int idx) override
139 {
138 }
139
140 TheISA::FloatRegBits
141 readFloatRegOperandBits(const StaticInst *si, int idx) override
142 {
140 int reg_idx = si->srcRegIdx(idx) - TheISA::FP_Reg_Base;
141 return thread.readFloatRegBits(reg_idx);
143 RegId reg = si->srcRegIdx(idx);
144 assert(reg.regClass == FloatRegClass);
145 return thread.readFloatRegBits(reg.regIdx);
142 }
143
144 void
145 setIntRegOperand(const StaticInst *si, int idx, IntReg val) override
146 {
146 }
147
148 void
149 setIntRegOperand(const StaticInst *si, int idx, IntReg val) override
150 {
147 thread.setIntReg(si->destRegIdx(idx), val);
151 RegId reg = si->destRegIdx(idx);
152 assert(reg.regClass == IntRegClass);
153 thread.setIntReg(reg.regIdx, val);
148 }
149
150 void
151 setFloatRegOperand(const StaticInst *si, int idx,
152 TheISA::FloatReg val) override
153 {
154 }
155
156 void
157 setFloatRegOperand(const StaticInst *si, int idx,
158 TheISA::FloatReg val) override
159 {
154 int reg_idx = si->destRegIdx(idx) - TheISA::FP_Reg_Base;
155 thread.setFloatReg(reg_idx, val);
160 RegId reg = si->destRegIdx(idx);
161 assert(reg.regClass == FloatRegClass);
162 thread.setFloatReg(reg.regIdx, val);
156 }
157
158 void
159 setFloatRegOperandBits(const StaticInst *si, int idx,
160 TheISA::FloatRegBits val) override
161 {
163 }
164
165 void
166 setFloatRegOperandBits(const StaticInst *si, int idx,
167 TheISA::FloatRegBits val) override
168 {
162 int reg_idx = si->destRegIdx(idx) - TheISA::FP_Reg_Base;
163 thread.setFloatRegBits(reg_idx, val);
169 RegId reg = si->destRegIdx(idx);
170 assert(reg.regClass == FloatRegClass);
171 thread.setFloatRegBits(reg.regIdx, val);
164 }
165
166 bool
167 readPredicate() override
168 {
169 return thread.readPredicate();
170 }
171

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

203 setMiscReg(int misc_reg, const TheISA::MiscReg &val) override
204 {
205 thread.setMiscReg(misc_reg, val);
206 }
207
208 TheISA::MiscReg
209 readMiscRegOperand(const StaticInst *si, int idx) override
210 {
172 }
173
174 bool
175 readPredicate() override
176 {
177 return thread.readPredicate();
178 }
179

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

211 setMiscReg(int misc_reg, const TheISA::MiscReg &val) override
212 {
213 thread.setMiscReg(misc_reg, val);
214 }
215
216 TheISA::MiscReg
217 readMiscRegOperand(const StaticInst *si, int idx) override
218 {
211 int reg_idx = si->srcRegIdx(idx) - TheISA::Misc_Reg_Base;
212 return thread.readMiscReg(reg_idx);
219 RegId reg = si->srcRegIdx(idx);
220 assert(reg.regClass == MiscRegClass);
221 return thread.readMiscReg(reg.regIdx);
213 }
214
215 void
216 setMiscRegOperand(const StaticInst *si, int idx,
217 const TheISA::MiscReg &val) override
218 {
222 }
223
224 void
225 setMiscRegOperand(const StaticInst *si, int idx,
226 const TheISA::MiscReg &val) override
227 {
219 int reg_idx = si->destRegIdx(idx) - TheISA::Misc_Reg_Base;
220 return thread.setMiscReg(reg_idx, val);
228 RegId reg = si->destRegIdx(idx);
229 assert(reg.regClass == MiscRegClass);
230 return thread.setMiscReg(reg.regIdx, val);
221 }
222
223 Fault
224 hwrei() override
225 {
226#if THE_ISA == ALPHA_ISA
227 return thread.hwrei();
228#else

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

264 {
265 thread.getITBPtr()->demapPage(vaddr, asn);
266 thread.getDTBPtr()->demapPage(vaddr, asn);
267 }
268
269 TheISA::CCReg
270 readCCRegOperand(const StaticInst *si, int idx) override
271 {
231 }
232
233 Fault
234 hwrei() override
235 {
236#if THE_ISA == ALPHA_ISA
237 return thread.hwrei();
238#else

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

274 {
275 thread.getITBPtr()->demapPage(vaddr, asn);
276 thread.getDTBPtr()->demapPage(vaddr, asn);
277 }
278
279 TheISA::CCReg
280 readCCRegOperand(const StaticInst *si, int idx) override
281 {
272 int reg_idx = si->srcRegIdx(idx) - TheISA::CC_Reg_Base;
273 return thread.readCCReg(reg_idx);
282 RegId reg = si->srcRegIdx(idx);
283 assert(reg.regClass == CCRegClass);
284 return thread.readCCReg(reg.regIdx);
274 }
275
276 void
277 setCCRegOperand(const StaticInst *si, int idx, TheISA::CCReg val) override
278 {
285 }
286
287 void
288 setCCRegOperand(const StaticInst *si, int idx, TheISA::CCReg val) override
289 {
279 int reg_idx = si->destRegIdx(idx) - TheISA::CC_Reg_Base;
280 thread.setCCReg(reg_idx, val);
290 RegId reg = si->destRegIdx(idx);
291 assert(reg.regClass == CCRegClass);
292 thread.setCCReg(reg.regIdx, val);
281 }
282
283 void
284 demapInstPage(Addr vaddr, uint64_t asn)
285 {
286 thread.getITBPtr()->demapPage(vaddr, asn);
287 }
288

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

303 /* POWER: Effective address storage */
304 Addr getEA() const override
305 {
306 return inst->ea;
307 }
308
309 /* MIPS: other thread register reading/writing */
310 uint64_t
293 }
294
295 void
296 demapInstPage(Addr vaddr, uint64_t asn)
297 {
298 thread.getITBPtr()->demapPage(vaddr, asn);
299 }
300

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

315 /* POWER: Effective address storage */
316 Addr getEA() const override
317 {
318 return inst->ea;
319 }
320
321 /* MIPS: other thread register reading/writing */
322 uint64_t
311 readRegOtherThread(int idx, ThreadID tid = InvalidThreadID)
323 readRegOtherThread(RegId reg, ThreadID tid = InvalidThreadID)
312 {
313 SimpleThread *other_thread = (tid == InvalidThreadID
314 ? &thread : cpu.threads[tid]);
315
324 {
325 SimpleThread *other_thread = (tid == InvalidThreadID
326 ? &thread : cpu.threads[tid]);
327
316 if (idx < TheISA::FP_Reg_Base) { /* Integer */
317 return other_thread->readIntReg(idx);
318 } else if (idx < TheISA::Misc_Reg_Base) { /* Float */
319 return other_thread->readFloatRegBits(idx
320 - TheISA::FP_Reg_Base);
321 } else { /* Misc */
322 return other_thread->readMiscReg(idx
323 - TheISA::Misc_Reg_Base);
328 switch(reg.regClass) {
329 case IntRegClass:
330 return other_thread->readIntReg(reg.regIdx);
331 break;
332 case FloatRegClass:
333 return other_thread->readFloatRegBits(reg.regIdx);
334 break;
335 case MiscRegClass:
336 return other_thread->readMiscReg(reg.regIdx);
337 default:
338 panic("Unexpected reg class! (%s)",
339 RegClassStrings[reg.regClass]);
340 return 0;
324 }
325 }
326
327 void
341 }
342 }
343
344 void
328 setRegOtherThread(int idx, const TheISA::MiscReg &val,
345 setRegOtherThread(RegId reg, const TheISA::MiscReg &val,
329 ThreadID tid = InvalidThreadID)
330 {
331 SimpleThread *other_thread = (tid == InvalidThreadID
332 ? &thread : cpu.threads[tid]);
333
346 ThreadID tid = InvalidThreadID)
347 {
348 SimpleThread *other_thread = (tid == InvalidThreadID
349 ? &thread : cpu.threads[tid]);
350
334 if (idx < TheISA::FP_Reg_Base) { /* Integer */
335 return other_thread->setIntReg(idx, val);
336 } else if (idx < TheISA::Misc_Reg_Base) { /* Float */
337 return other_thread->setFloatRegBits(idx
338 - TheISA::FP_Reg_Base, val);
339 } else { /* Misc */
340 return other_thread->setMiscReg(idx
341 - TheISA::Misc_Reg_Base, val);
351 switch(reg.regClass) {
352 case IntRegClass:
353 return other_thread->setIntReg(reg.regIdx, val);
354 break;
355 case FloatRegClass:
356 return other_thread->setFloatRegBits(reg.regIdx, val);
357 break;
358 case MiscRegClass:
359 return other_thread->setMiscReg(reg.regIdx, val);
360 default:
361 panic("Unexpected reg class! (%s)",
362 RegClassStrings[reg.regClass]);
342 }
343 }
344
345 public:
346 // monitor/mwait funtions
347 void armMonitor(Addr address) override
348 { getCpuPtr()->armMonitor(inst->id.threadId, address); }
349

--- 13 unchanged lines hidden ---
363 }
364 }
365
366 public:
367 // monitor/mwait funtions
368 void armMonitor(Addr address) override
369 { getCpuPtr()->armMonitor(inst->id.threadId, address); }
370

--- 13 unchanged lines hidden ---