1/* |
2 * Copyright (c) 2014, 2017 ARM Limited |
3 * All rights reserved 4 * 5 * The license below extends only to copyright in the software and shall 6 * not be construed as granting a license to any other intellectual 7 * property including but not limited to intellectual property relating 8 * to a hardware implementation of the functionality of the software 9 * licensed hereunder. You may use the software subject to the license 10 * terms below provided that you ensure that this notice is replicated --- 28 unchanged lines hidden (view full) --- 39 * 40 * Authors: Steve Reinhardt 41 * Nathan Binkert 42 */ 43 44#ifndef __INSTRECORD_HH__ 45#define __INSTRECORD_HH__ 46 |
47#include "arch/generic/vec_pred_reg.hh" 48#include "arch/generic/vec_reg.hh" |
49#include "base/types.hh" 50#include "cpu/inst_seq.hh" 51#include "cpu/static_inst.hh" 52#include "sim/sim_object.hh" 53 54class ThreadContext; 55 56namespace Trace { --- 35 unchanged lines hidden (view full) --- 92 * since many instructions write multiple values (e.g. destintation 93 * register, flags, status, ...) This only captures the last write. 94 * @TODO fix this and record all destintations that an instruction writes 95 * @see data_status 96 */ 97 union { 98 uint64_t as_int; 99 double as_double; |
100 ::VecRegContainer<TheISA::VecRegSizeBytes>* as_vec; 101 ::VecPredRegContainer<TheISA::VecPredRegSizeBits, 102 TheISA::VecPredRegHasPackedRepr>* as_pred; |
103 } data; 104 105 /** @defgroup fetch_seq 106 * This records the serial number that the instruction was fetched in. 107 * @see fetch_seq_valid 108 */ 109 InstSeqNum fetch_seq; 110 --- 7 unchanged lines hidden (view full) --- 118 * What size of data was written? 119 */ 120 enum DataStatus { 121 DataInvalid = 0, 122 DataInt8 = 1, // set to equal number of bytes 123 DataInt16 = 2, 124 DataInt32 = 4, 125 DataInt64 = 8, |
126 DataDouble = 3, 127 DataVec = 5, 128 DataVecPred = 6 |
129 } data_status; 130 131 /** @ingroup memory 132 * Are the memory fields in the record valid? 133 */ 134 bool mem_valid; 135 136 /** @ingroup fetch_seq --- 15 unchanged lines hidden (view full) --- 152 TheISA::PCState _pc, 153 const StaticInstPtr _macroStaticInst = NULL) 154 : when(_when), thread(_thread), staticInst(_staticInst), pc(_pc), 155 macroStaticInst(_macroStaticInst), addr(0), size(0), flags(0), 156 fetch_seq(0), cp_seq(0), data_status(DataInvalid), mem_valid(false), 157 fetch_seq_valid(false), cp_seq_valid(false), predicate(true) 158 { } 159 |
160 virtual ~InstRecord() 161 { 162 if (data_status == DataVec) { 163 assert(data.as_vec); 164 delete data.as_vec; 165 } else if (data_status == DataVecPred) { 166 assert(data.as_pred); 167 delete data.as_pred; 168 } 169 } |
170 171 void setWhen(Tick new_when) { when = new_when; } 172 void setMem(Addr a, Addr s, unsigned f) 173 { 174 addr = a; size = s; flags = f; mem_valid = true; 175 } 176 177 template <typename T, size_t N> --- 14 unchanged lines hidden (view full) --- 192 193 void setData(int64_t d) { setData((uint64_t)d); } 194 void setData(int32_t d) { setData((uint32_t)d); } 195 void setData(int16_t d) { setData((uint16_t)d); } 196 void setData(int8_t d) { setData((uint8_t)d); } 197 198 void setData(double d) { data.as_double = d; data_status = DataDouble; } 199 |
200 void 201 setData(::VecRegContainer<TheISA::VecRegSizeBytes>& d) 202 { 203 data.as_vec = new ::VecRegContainer<TheISA::VecRegSizeBytes>(d); 204 data_status = DataVec; 205 } 206 207 void 208 setData(::VecPredRegContainer<TheISA::VecPredRegSizeBits, 209 TheISA::VecPredRegHasPackedRepr>& d) 210 { 211 data.as_pred = new ::VecPredRegContainer< 212 TheISA::VecPredRegSizeBits, TheISA::VecPredRegHasPackedRepr>(d); 213 data_status = DataVecPred; 214 } 215 |
216 void setFetchSeq(InstSeqNum seq) 217 { fetch_seq = seq; fetch_seq_valid = true; } 218 219 void setCPSeq(InstSeqNum seq) 220 { cp_seq = seq; cp_seq_valid = true; } 221 222 void setPredicate(bool val) { predicate = val; } 223 --- 45 unchanged lines hidden --- |