112107SRekai.GonzalezAlberquilla@arm.com/* 213610Sgiacomo.gabrielli@arm.com * Copyright (c) 2016-2017 ARM Limited 312107SRekai.GonzalezAlberquilla@arm.com * All rights reserved 412107SRekai.GonzalezAlberquilla@arm.com * 512107SRekai.GonzalezAlberquilla@arm.com * The license below extends only to copyright in the software and shall 612107SRekai.GonzalezAlberquilla@arm.com * not be construed as granting a license to any other intellectual 712107SRekai.GonzalezAlberquilla@arm.com * property including but not limited to intellectual property relating 812107SRekai.GonzalezAlberquilla@arm.com * to a hardware implementation of the functionality of the software 912107SRekai.GonzalezAlberquilla@arm.com * licensed hereunder. You may use the software subject to the license 1012107SRekai.GonzalezAlberquilla@arm.com * terms below provided that you ensure that this notice is replicated 1112107SRekai.GonzalezAlberquilla@arm.com * unmodified and in its entirety in all distributions of the software, 1212107SRekai.GonzalezAlberquilla@arm.com * modified or unmodified, in source code or in binary form. 1312107SRekai.GonzalezAlberquilla@arm.com * 1412107SRekai.GonzalezAlberquilla@arm.com * Redistribution and use in source and binary forms, with or without 1512107SRekai.GonzalezAlberquilla@arm.com * modification, are permitted provided that the following conditions are 1612107SRekai.GonzalezAlberquilla@arm.com * met: redistributions of source code must retain the above copyright 1712107SRekai.GonzalezAlberquilla@arm.com * notice, this list of conditions and the following disclaimer; 1812107SRekai.GonzalezAlberquilla@arm.com * redistributions in binary form must reproduce the above copyright 1912107SRekai.GonzalezAlberquilla@arm.com * notice, this list of conditions and the following disclaimer in the 2012107SRekai.GonzalezAlberquilla@arm.com * documentation and/or other materials provided with the distribution; 2112107SRekai.GonzalezAlberquilla@arm.com * neither the name of the copyright holders nor the names of its 2212107SRekai.GonzalezAlberquilla@arm.com * contributors may be used to endorse or promote products derived from 2312107SRekai.GonzalezAlberquilla@arm.com * this software without specific prior written permission. 2412107SRekai.GonzalezAlberquilla@arm.com * 2512107SRekai.GonzalezAlberquilla@arm.com * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 2612107SRekai.GonzalezAlberquilla@arm.com * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 2712107SRekai.GonzalezAlberquilla@arm.com * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 2812107SRekai.GonzalezAlberquilla@arm.com * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 2912107SRekai.GonzalezAlberquilla@arm.com * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 3012107SRekai.GonzalezAlberquilla@arm.com * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 3112107SRekai.GonzalezAlberquilla@arm.com * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 3212107SRekai.GonzalezAlberquilla@arm.com * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 3312107SRekai.GonzalezAlberquilla@arm.com * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 3412107SRekai.GonzalezAlberquilla@arm.com * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 3512107SRekai.GonzalezAlberquilla@arm.com * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 3612107SRekai.GonzalezAlberquilla@arm.com * 3712107SRekai.GonzalezAlberquilla@arm.com * Authors: Nathanael Premillieu 3812107SRekai.GonzalezAlberquilla@arm.com */ 3912107SRekai.GonzalezAlberquilla@arm.com 4012107SRekai.GonzalezAlberquilla@arm.com#ifndef __CPU_INST_RES_HH__ 4112107SRekai.GonzalezAlberquilla@arm.com#define __CPU_INST_RES_HH__ 4212107SRekai.GonzalezAlberquilla@arm.com 4312107SRekai.GonzalezAlberquilla@arm.com#include <type_traits> 4412107SRekai.GonzalezAlberquilla@arm.com 4512107SRekai.GonzalezAlberquilla@arm.com#include "arch/generic/types.hh" 4612109SRekai.GonzalezAlberquilla@arm.com#include "arch/generic/vec_reg.hh" 4712107SRekai.GonzalezAlberquilla@arm.com 4812107SRekai.GonzalezAlberquilla@arm.comclass InstResult { 4912109SRekai.GonzalezAlberquilla@arm.com using VecRegContainer = TheISA::VecRegContainer; 5012109SRekai.GonzalezAlberquilla@arm.com using VecElem = TheISA::VecElem; 5113610Sgiacomo.gabrielli@arm.com using VecPredRegContainer = TheISA::VecPredRegContainer; 5212107SRekai.GonzalezAlberquilla@arm.com public: 5312107SRekai.GonzalezAlberquilla@arm.com union MultiResult { 5412107SRekai.GonzalezAlberquilla@arm.com uint64_t integer; 5512107SRekai.GonzalezAlberquilla@arm.com double dbl; 5612109SRekai.GonzalezAlberquilla@arm.com VecRegContainer vector; 5712109SRekai.GonzalezAlberquilla@arm.com VecElem vecElem; 5813610Sgiacomo.gabrielli@arm.com VecPredRegContainer pred; 5912107SRekai.GonzalezAlberquilla@arm.com MultiResult() {} 6012107SRekai.GonzalezAlberquilla@arm.com }; 6112107SRekai.GonzalezAlberquilla@arm.com 6212107SRekai.GonzalezAlberquilla@arm.com enum class ResultType { 6312107SRekai.GonzalezAlberquilla@arm.com Scalar, 6412109SRekai.GonzalezAlberquilla@arm.com VecElem, 6512109SRekai.GonzalezAlberquilla@arm.com VecReg, 6613610Sgiacomo.gabrielli@arm.com VecPredReg, 6712107SRekai.GonzalezAlberquilla@arm.com NumResultTypes, 6812107SRekai.GonzalezAlberquilla@arm.com Invalid 6912107SRekai.GonzalezAlberquilla@arm.com }; 7012107SRekai.GonzalezAlberquilla@arm.com 7112107SRekai.GonzalezAlberquilla@arm.com private: 7212107SRekai.GonzalezAlberquilla@arm.com MultiResult result; 7312107SRekai.GonzalezAlberquilla@arm.com ResultType type; 7412107SRekai.GonzalezAlberquilla@arm.com 7512107SRekai.GonzalezAlberquilla@arm.com public: 7612107SRekai.GonzalezAlberquilla@arm.com /** Default constructor creates an invalid result. */ 7712107SRekai.GonzalezAlberquilla@arm.com InstResult() : type(ResultType::Invalid) { } 7812107SRekai.GonzalezAlberquilla@arm.com /** Scalar result from scalar. */ 7912107SRekai.GonzalezAlberquilla@arm.com template<typename T> 8012107SRekai.GonzalezAlberquilla@arm.com explicit InstResult(T i, const ResultType& t) : type(t) { 8112107SRekai.GonzalezAlberquilla@arm.com static_assert(std::is_integral<T>::value ^ 8212107SRekai.GonzalezAlberquilla@arm.com std::is_floating_point<T>::value, 8312107SRekai.GonzalezAlberquilla@arm.com "Parameter type is neither integral nor fp, or it is both"); 8412107SRekai.GonzalezAlberquilla@arm.com if (std::is_integral<T>::value) { 8512107SRekai.GonzalezAlberquilla@arm.com result.integer = i; 8612107SRekai.GonzalezAlberquilla@arm.com } else if (std::is_floating_point<T>::value) { 8712107SRekai.GonzalezAlberquilla@arm.com result.dbl = i; 8812107SRekai.GonzalezAlberquilla@arm.com } 8912107SRekai.GonzalezAlberquilla@arm.com } 9012109SRekai.GonzalezAlberquilla@arm.com /** Vector result. */ 9112109SRekai.GonzalezAlberquilla@arm.com explicit InstResult(const VecRegContainer& v, const ResultType& t) 9212109SRekai.GonzalezAlberquilla@arm.com : type(t) { result.vector = v; } 9313610Sgiacomo.gabrielli@arm.com /** Predicate result. */ 9413610Sgiacomo.gabrielli@arm.com explicit InstResult(const VecPredRegContainer& v, const ResultType& t) 9513610Sgiacomo.gabrielli@arm.com : type(t) { result.pred = v; } 9612107SRekai.GonzalezAlberquilla@arm.com 9712109SRekai.GonzalezAlberquilla@arm.com InstResult& operator=(const InstResult& that) { 9812109SRekai.GonzalezAlberquilla@arm.com type = that.type; 9912109SRekai.GonzalezAlberquilla@arm.com switch (type) { 10012109SRekai.GonzalezAlberquilla@arm.com /* Given that misc regs are not written to, there may be invalids in 10112109SRekai.GonzalezAlberquilla@arm.com * the result stack. */ 10212109SRekai.GonzalezAlberquilla@arm.com case ResultType::Invalid: 10312109SRekai.GonzalezAlberquilla@arm.com break; 10412109SRekai.GonzalezAlberquilla@arm.com case ResultType::Scalar: 10512109SRekai.GonzalezAlberquilla@arm.com result.integer = that.result.integer; 10612109SRekai.GonzalezAlberquilla@arm.com break; 10712109SRekai.GonzalezAlberquilla@arm.com case ResultType::VecElem: 10812109SRekai.GonzalezAlberquilla@arm.com result.vecElem = that.result.vecElem; 10912109SRekai.GonzalezAlberquilla@arm.com break; 11012109SRekai.GonzalezAlberquilla@arm.com case ResultType::VecReg: 11112109SRekai.GonzalezAlberquilla@arm.com result.vector = that.result.vector; 11212109SRekai.GonzalezAlberquilla@arm.com break; 11313610Sgiacomo.gabrielli@arm.com case ResultType::VecPredReg: 11413610Sgiacomo.gabrielli@arm.com result.pred = that.result.pred; 11513610Sgiacomo.gabrielli@arm.com break; 11613610Sgiacomo.gabrielli@arm.com 11712109SRekai.GonzalezAlberquilla@arm.com default: 11812109SRekai.GonzalezAlberquilla@arm.com panic("Assigning result from unknown result type"); 11912109SRekai.GonzalezAlberquilla@arm.com break; 12012109SRekai.GonzalezAlberquilla@arm.com } 12112109SRekai.GonzalezAlberquilla@arm.com return *this; 12212109SRekai.GonzalezAlberquilla@arm.com } 12312107SRekai.GonzalezAlberquilla@arm.com /** 12412107SRekai.GonzalezAlberquilla@arm.com * Result comparison 12512107SRekai.GonzalezAlberquilla@arm.com * Two invalid results always differ. 12612107SRekai.GonzalezAlberquilla@arm.com */ 12712107SRekai.GonzalezAlberquilla@arm.com bool operator==(const InstResult& that) const { 12812107SRekai.GonzalezAlberquilla@arm.com if (this->type != that.type) 12912107SRekai.GonzalezAlberquilla@arm.com return false; 13012107SRekai.GonzalezAlberquilla@arm.com switch (type) { 13112107SRekai.GonzalezAlberquilla@arm.com case ResultType::Scalar: 13212107SRekai.GonzalezAlberquilla@arm.com return result.integer == that.result.integer; 13312109SRekai.GonzalezAlberquilla@arm.com case ResultType::VecElem: 13412109SRekai.GonzalezAlberquilla@arm.com return result.vecElem == that.result.vecElem; 13512109SRekai.GonzalezAlberquilla@arm.com case ResultType::VecReg: 13612109SRekai.GonzalezAlberquilla@arm.com return result.vector == that.result.vector; 13713610Sgiacomo.gabrielli@arm.com case ResultType::VecPredReg: 13813610Sgiacomo.gabrielli@arm.com return result.pred == that.result.pred; 13912107SRekai.GonzalezAlberquilla@arm.com case ResultType::Invalid: 14012107SRekai.GonzalezAlberquilla@arm.com return false; 14112107SRekai.GonzalezAlberquilla@arm.com default: 14212107SRekai.GonzalezAlberquilla@arm.com panic("Unknown type of result: %d\n", (int)type); 14312107SRekai.GonzalezAlberquilla@arm.com } 14412107SRekai.GonzalezAlberquilla@arm.com } 14512107SRekai.GonzalezAlberquilla@arm.com 14612107SRekai.GonzalezAlberquilla@arm.com bool operator!=(const InstResult& that) const { 14712107SRekai.GonzalezAlberquilla@arm.com return !operator==(that); 14812107SRekai.GonzalezAlberquilla@arm.com } 14912107SRekai.GonzalezAlberquilla@arm.com 15012107SRekai.GonzalezAlberquilla@arm.com /** Checks */ 15112107SRekai.GonzalezAlberquilla@arm.com /** @{ */ 15212107SRekai.GonzalezAlberquilla@arm.com /** Is this a scalar result?. */ 15312107SRekai.GonzalezAlberquilla@arm.com bool isScalar() const { return type == ResultType::Scalar; } 15412109SRekai.GonzalezAlberquilla@arm.com /** Is this a vector result?. */ 15512109SRekai.GonzalezAlberquilla@arm.com bool isVector() const { return type == ResultType::VecReg; } 15612109SRekai.GonzalezAlberquilla@arm.com /** Is this a vector element result?. */ 15712109SRekai.GonzalezAlberquilla@arm.com bool isVecElem() const { return type == ResultType::VecElem; } 15813610Sgiacomo.gabrielli@arm.com /** Is this a predicate result?. */ 15913610Sgiacomo.gabrielli@arm.com bool isPred() const { return type == ResultType::VecPredReg; } 16012107SRekai.GonzalezAlberquilla@arm.com /** Is this a valid result?. */ 16112107SRekai.GonzalezAlberquilla@arm.com bool isValid() const { return type != ResultType::Invalid; } 16212107SRekai.GonzalezAlberquilla@arm.com /** @} */ 16312107SRekai.GonzalezAlberquilla@arm.com 16412107SRekai.GonzalezAlberquilla@arm.com /** Explicit cast-like operations. */ 16512107SRekai.GonzalezAlberquilla@arm.com /** @{ */ 16612107SRekai.GonzalezAlberquilla@arm.com const uint64_t& 16712107SRekai.GonzalezAlberquilla@arm.com asInteger() const 16812107SRekai.GonzalezAlberquilla@arm.com { 16912107SRekai.GonzalezAlberquilla@arm.com assert(isScalar()); 17012107SRekai.GonzalezAlberquilla@arm.com return result.integer; 17112107SRekai.GonzalezAlberquilla@arm.com } 17212107SRekai.GonzalezAlberquilla@arm.com 17312107SRekai.GonzalezAlberquilla@arm.com /** Cast to integer without checking type. 17412107SRekai.GonzalezAlberquilla@arm.com * This is required to have the o3 cpu checker happy, as it 17512107SRekai.GonzalezAlberquilla@arm.com * compares results as integers without being fully aware of 17612107SRekai.GonzalezAlberquilla@arm.com * their nature. */ 17712107SRekai.GonzalezAlberquilla@arm.com const uint64_t& 17812107SRekai.GonzalezAlberquilla@arm.com asIntegerNoAssert() const 17912107SRekai.GonzalezAlberquilla@arm.com { 18012107SRekai.GonzalezAlberquilla@arm.com return result.integer; 18112107SRekai.GonzalezAlberquilla@arm.com } 18212109SRekai.GonzalezAlberquilla@arm.com const VecRegContainer& 18312109SRekai.GonzalezAlberquilla@arm.com asVector() const 18412109SRekai.GonzalezAlberquilla@arm.com { 18512109SRekai.GonzalezAlberquilla@arm.com panic_if(!isVector(), "Converting scalar (or invalid) to vector!!"); 18612109SRekai.GonzalezAlberquilla@arm.com return result.vector; 18712109SRekai.GonzalezAlberquilla@arm.com } 18812109SRekai.GonzalezAlberquilla@arm.com const VecElem& 18912109SRekai.GonzalezAlberquilla@arm.com asVectorElem() const 19012109SRekai.GonzalezAlberquilla@arm.com { 19112109SRekai.GonzalezAlberquilla@arm.com panic_if(!isVecElem(), "Converting scalar (or invalid) to vector!!"); 19212109SRekai.GonzalezAlberquilla@arm.com return result.vecElem; 19312109SRekai.GonzalezAlberquilla@arm.com } 19413610Sgiacomo.gabrielli@arm.com 19513610Sgiacomo.gabrielli@arm.com const VecPredRegContainer& 19613610Sgiacomo.gabrielli@arm.com asPred() const 19713610Sgiacomo.gabrielli@arm.com { 19813610Sgiacomo.gabrielli@arm.com panic_if(!isPred(), "Converting scalar (or invalid) to predicate!!"); 19913610Sgiacomo.gabrielli@arm.com return result.pred; 20013610Sgiacomo.gabrielli@arm.com } 20113610Sgiacomo.gabrielli@arm.com 20212107SRekai.GonzalezAlberquilla@arm.com /** @} */ 20312107SRekai.GonzalezAlberquilla@arm.com}; 20412107SRekai.GonzalezAlberquilla@arm.com 20512107SRekai.GonzalezAlberquilla@arm.com#endif // __CPU_INST_RES_HH__ 206