2c2
< * Copyright (c) 2011,2013 ARM Limited
---
> * Copyright (c) 2011,2013,2016 ARM Limited
52d51
< #include <string>
53a53
> #include <string>
60d59
< #include "cpu/o3/comm.hh"
62a62
> #include "cpu/inst_res.hh"
63a64
> #include "cpu/o3/comm.hh"
97,105d97
< union Result {
< uint64_t integer;
< double dbl;
< void set(uint64_t i) { integer = i; }
< void set(double d) { dbl = d; }
< void get(uint64_t& i) { i = integer; }
< void get(double& d) { d = dbl; }
< };
<
177c169
< std::queue<Result> instResult;
---
> std::queue<InstResult> instResult;
609,611c601,607
< /** Pops a result off the instResult queue */
< template <class T>
< void popResult(T& t)
---
> /** Return the size of the instResult queue. */
> uint8_t resultSize() { return instResult.size(); }
>
> /** Pops a result off the instResult queue.
> * If the result stack is empty, return the default value.
> * */
> InstResult popResult(InstResult dflt = InstResult())
614c610
< instResult.front().get(t);
---
> InstResult t = instResult.front();
615a612
> return t;
616a614
> return dflt;
619,621c617,619
< /** Read the most recent result stored by this instruction */
< template <class T>
< void readResult(T& t)
---
> /** Pushes a result onto the instResult queue. */
> template<typename T>
> void setScalarResult(T&& t)
623,629d620
< instResult.back().get(t);
< }
<
< /** Pushes a result onto the instResult queue */
< template <class T>
< void setResult(T t)
< {
631,633c622,623
< Result instRes;
< instRes.set(t);
< instResult.push(instRes);
---
> instResult.push(InstResult(std::forward<T>(t),
> InstResult::ResultType::Scalar));
640c630
< setResult<uint64_t>(val);
---
> setScalarResult(val);
646c636
< setResult<uint64_t>(val);
---
> setScalarResult(val);
652c642
< setResult<double>(val);
---
> setScalarResult(val);
656c646,647
< void setFloatRegOperandBits(const StaticInst *si, int idx, FloatRegBits val)
---
> void
> setFloatRegOperandBits(const StaticInst *si, int idx, FloatRegBits val)
658c649
< setResult<uint64_t>(val);
---
> setScalarResult(val);