utility.cc revision 5222
112027Sjungma@eit.uni-kl.de/* 212027Sjungma@eit.uni-kl.de * Copyright N) 2007 MIPS Technologies, Inc. All Rights Reserved 312027Sjungma@eit.uni-kl.de * 412027Sjungma@eit.uni-kl.de * This software is part of the M5 simulator. 512027Sjungma@eit.uni-kl.de * 612027Sjungma@eit.uni-kl.de * THIS IS A LEGAL AGREEMENT. BY DOWNLOADING, USING, COPYING, CREATING 712027Sjungma@eit.uni-kl.de * DERIVATIVE WORKS, AND/OR DISTRIBUTING THIS SOFTWARE YOU ARE AGREEING 812027Sjungma@eit.uni-kl.de * TO THESE TERMS AND CONDITIONS. 912027Sjungma@eit.uni-kl.de * 1012027Sjungma@eit.uni-kl.de * Permission is granted to use, copy, create derivative works and 1112027Sjungma@eit.uni-kl.de * distribute this software and such derivative works for any purpose, 1212027Sjungma@eit.uni-kl.de * so long as (1) the copyright notice above, this grant of permission, 1312027Sjungma@eit.uni-kl.de * and the disclaimer below appear in all copies and derivative works 1412027Sjungma@eit.uni-kl.de * made, (2) the copyright notice above is augmented as appropriate to 1512027Sjungma@eit.uni-kl.de * reflect the addition of any new copyrightable work in a derivative 1612027Sjungma@eit.uni-kl.de * work (e.g., Copyright N) <Publication Year> Copyright Owner), and (3) 1712027Sjungma@eit.uni-kl.de * the name of MIPS Technologies, Inc. ($(B!H(BMIPS$(B!I(B) is not used in any 1812027Sjungma@eit.uni-kl.de * advertising or publicity pertaining to the use or distribution of 1912027Sjungma@eit.uni-kl.de * this software without specific, written prior authorization. 2012027Sjungma@eit.uni-kl.de * 2112027Sjungma@eit.uni-kl.de * THIS SOFTWARE IS PROVIDED $(B!H(BAS IS.$(B!I(B MIPS MAKES NO WARRANTIES AND 2212027Sjungma@eit.uni-kl.de * DISCLAIMS ALL WARRANTIES, WHETHER EXPRESS, STATUTORY, IMPLIED OR 2312027Sjungma@eit.uni-kl.de * OTHERWISE, INCLUDING BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF 2412027Sjungma@eit.uni-kl.de * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, AND 2512027Sjungma@eit.uni-kl.de * NON-INFRINGEMENT OF THIRD PARTY RIGHTS, REGARDING THIS SOFTWARE. 2612027Sjungma@eit.uni-kl.de * IN NO EVENT SHALL MIPS BE LIABLE FOR ANY DAMAGES, INCLUDING DIRECT, 2712027Sjungma@eit.uni-kl.de * INDIRECT, INCIDENTAL, CONSEQUENTIAL, SPECIAL, OR PUNITIVE DAMAGES OF 2812027Sjungma@eit.uni-kl.de * ANY KIND OR NATURE, ARISING OUT OF OR IN CONNECTION WITH THIS AGREEMENT, 2912027Sjungma@eit.uni-kl.de * THIS SOFTWARE AND/OR THE USE OF THIS SOFTWARE, WHETHER SUCH LIABILITY 3012027Sjungma@eit.uni-kl.de * IS ASSERTED ON THE BASIS OF CONTRACT, TORT (INCLUDING NEGLIGENCE OR 3112027Sjungma@eit.uni-kl.de * STRICT LIABILITY), OR OTHERWISE, EVEN IF MIPS HAS BEEN WARNED OF THE 3212027Sjungma@eit.uni-kl.de * POSSIBILITY OF ANY SUCH LOSS OR DAMAGE IN ADVANCE. 3312027Sjungma@eit.uni-kl.de * 3412027Sjungma@eit.uni-kl.de * Authors: Korey L. Sewell 3512027Sjungma@eit.uni-kl.de */ 3612027Sjungma@eit.uni-kl.de 3712027Sjungma@eit.uni-kl.de#include "arch/mips/isa_traits.hh" 3812027Sjungma@eit.uni-kl.de#include "arch/mips/utility.hh" 3912027Sjungma@eit.uni-kl.de#include "config/full_system.hh" 4012027Sjungma@eit.uni-kl.de#include "cpu/thread_context.hh" 4112027Sjungma@eit.uni-kl.de#include "cpu/static_inst.hh" 4212027Sjungma@eit.uni-kl.de#include "sim/serialize.hh" 4312027Sjungma@eit.uni-kl.de#include "base/bitfield.hh" 4412027Sjungma@eit.uni-kl.de#include "base/misc.hh" 4512027Sjungma@eit.uni-kl.de 4612027Sjungma@eit.uni-kl.de#if FULL_SYSTEM 4712027Sjungma@eit.uni-kl.de#include "arch/mips/vtophys.hh" 4812027Sjungma@eit.uni-kl.de#include "mem/vport.hh" 4912027Sjungma@eit.uni-kl.de#endif 5012027Sjungma@eit.uni-kl.de 5112027Sjungma@eit.uni-kl.de 5212027Sjungma@eit.uni-kl.deusing namespace MipsISA; 5312027Sjungma@eit.uni-kl.deusing namespace std; 5412027Sjungma@eit.uni-kl.de 5512027Sjungma@eit.uni-kl.denamespace MipsISA { 5612027Sjungma@eit.uni-kl.de 5712027Sjungma@eit.uni-kl.deuint64_t 5812027Sjungma@eit.uni-kl.degetArgument(ThreadContext *tc, int number, bool fp) 5912027Sjungma@eit.uni-kl.de{ 6012027Sjungma@eit.uni-kl.de#if FULL_SYSTEM 6112027Sjungma@eit.uni-kl.de if (number < NumArgumentRegs) { 6212027Sjungma@eit.uni-kl.de if (fp) 6312027Sjungma@eit.uni-kl.de return tc->readFloatRegBits(ArgumentReg[number]); 6412027Sjungma@eit.uni-kl.de else 6512027Sjungma@eit.uni-kl.de return tc->readIntReg(ArgumentReg[number]); 6612027Sjungma@eit.uni-kl.de } else { 6712027Sjungma@eit.uni-kl.de Addr sp = tc->readIntReg(StackPointerReg); 6812027Sjungma@eit.uni-kl.de VirtualPort *vp = tc->getVirtPort(tc); 6912027Sjungma@eit.uni-kl.de uint64_t arg = vp->read<uint64_t>(sp + 7012027Sjungma@eit.uni-kl.de (number-NumArgumentRegs) * sizeof(uint64_t)); 7112027Sjungma@eit.uni-kl.de tc->delVirtPort(vp); 7212027Sjungma@eit.uni-kl.de return arg; 7312027Sjungma@eit.uni-kl.de } 7412027Sjungma@eit.uni-kl.de#else 7512027Sjungma@eit.uni-kl.de panic("getArgument() is Full system only\n"); 7612027Sjungma@eit.uni-kl.de M5_DUMMY_RETURN 7712027Sjungma@eit.uni-kl.de#endif 7812027Sjungma@eit.uni-kl.de} 7912027Sjungma@eit.uni-kl.de 8012027Sjungma@eit.uni-kl.deuint64_t 8112027Sjungma@eit.uni-kl.defpConvert(ConvertType cvt_type, double fp_val) 8212027Sjungma@eit.uni-kl.de{ 8312027Sjungma@eit.uni-kl.de 8412027Sjungma@eit.uni-kl.de switch (cvt_type) 8512027Sjungma@eit.uni-kl.de { 8612027Sjungma@eit.uni-kl.de case SINGLE_TO_DOUBLE: 8712027Sjungma@eit.uni-kl.de { 8812027Sjungma@eit.uni-kl.de double sdouble_val = fp_val; 8912027Sjungma@eit.uni-kl.de void *sdouble_ptr = &sdouble_val; 9012027Sjungma@eit.uni-kl.de uint64_t sdp_bits = *(uint64_t *) sdouble_ptr; 9112027Sjungma@eit.uni-kl.de return sdp_bits; 9212027Sjungma@eit.uni-kl.de } 9312027Sjungma@eit.uni-kl.de 9412027Sjungma@eit.uni-kl.de case SINGLE_TO_WORD: 9512027Sjungma@eit.uni-kl.de { 9612027Sjungma@eit.uni-kl.de int32_t sword_val = (int32_t) fp_val; 9712027Sjungma@eit.uni-kl.de void *sword_ptr = &sword_val; 9812027Sjungma@eit.uni-kl.de uint64_t sword_bits= *(uint32_t *) sword_ptr; 9912027Sjungma@eit.uni-kl.de return sword_bits; 10012027Sjungma@eit.uni-kl.de } 10112027Sjungma@eit.uni-kl.de 10212027Sjungma@eit.uni-kl.de case WORD_TO_SINGLE: 10312027Sjungma@eit.uni-kl.de { 10412027Sjungma@eit.uni-kl.de float wfloat_val = fp_val; 10512027Sjungma@eit.uni-kl.de void *wfloat_ptr = &wfloat_val; 10612027Sjungma@eit.uni-kl.de uint64_t wfloat_bits = *(uint32_t *) wfloat_ptr; 10712027Sjungma@eit.uni-kl.de return wfloat_bits; 10812027Sjungma@eit.uni-kl.de } 10912027Sjungma@eit.uni-kl.de 11012027Sjungma@eit.uni-kl.de case WORD_TO_DOUBLE: 11112027Sjungma@eit.uni-kl.de { 11212027Sjungma@eit.uni-kl.de double wdouble_val = fp_val; 11312027Sjungma@eit.uni-kl.de void *wdouble_ptr = &wdouble_val; 11412027Sjungma@eit.uni-kl.de uint64_t wdp_bits = *(uint64_t *) wdouble_ptr; 11512027Sjungma@eit.uni-kl.de return wdp_bits; 11612027Sjungma@eit.uni-kl.de } 11712027Sjungma@eit.uni-kl.de 11812027Sjungma@eit.uni-kl.de default: 11912027Sjungma@eit.uni-kl.de panic("Invalid Floating Point Conversion Type (%d). See \"types.hh\" for List of Conversions\n",cvt_type); 12012027Sjungma@eit.uni-kl.de return 0; 12112027Sjungma@eit.uni-kl.de } 12212027Sjungma@eit.uni-kl.de} 12312027Sjungma@eit.uni-kl.de 12412027Sjungma@eit.uni-kl.dedouble 12512027Sjungma@eit.uni-kl.deroundFP(double val, int digits) 12612027Sjungma@eit.uni-kl.de{ 12712027Sjungma@eit.uni-kl.de double digit_offset = pow(10.0,digits); 12812027Sjungma@eit.uni-kl.de val = val * digit_offset; 12912027Sjungma@eit.uni-kl.de val = val + 0.5; 13012027Sjungma@eit.uni-kl.de val = floor(val); 13112027Sjungma@eit.uni-kl.de val = val / digit_offset; 13212027Sjungma@eit.uni-kl.de return val; 13312027Sjungma@eit.uni-kl.de} 13412027Sjungma@eit.uni-kl.de 13512027Sjungma@eit.uni-kl.dedouble 13612027Sjungma@eit.uni-kl.detruncFP(double val) 13712027Sjungma@eit.uni-kl.de{ 13812027Sjungma@eit.uni-kl.de int trunc_val = (int) val; 13912027Sjungma@eit.uni-kl.de return (double) trunc_val; 14012027Sjungma@eit.uni-kl.de} 14112027Sjungma@eit.uni-kl.de 14212027Sjungma@eit.uni-kl.debool 14312027Sjungma@eit.uni-kl.degetCondCode(uint32_t fcsr, int cc_idx) 14412027Sjungma@eit.uni-kl.de{ 14512027Sjungma@eit.uni-kl.de int shift = (cc_idx == 0) ? 23 : cc_idx + 24; 14612027Sjungma@eit.uni-kl.de bool cc_val = (fcsr >> shift) & 0x00000001; 14712027Sjungma@eit.uni-kl.de return cc_val; 14812027Sjungma@eit.uni-kl.de} 14912027Sjungma@eit.uni-kl.de 15012027Sjungma@eit.uni-kl.deuint32_t 15112027Sjungma@eit.uni-kl.degenCCVector(uint32_t fcsr, int cc_num, uint32_t cc_val) 15212027Sjungma@eit.uni-kl.de{ 15312027Sjungma@eit.uni-kl.de int cc_idx = (cc_num == 0) ? 23 : cc_num + 24; 15412027Sjungma@eit.uni-kl.de 15512027Sjungma@eit.uni-kl.de fcsr = bits(fcsr, 31, cc_idx + 1) << cc_idx + 1 | 15612027Sjungma@eit.uni-kl.de cc_val << cc_idx | 15712027Sjungma@eit.uni-kl.de bits(fcsr, cc_idx - 1, 0); 15812027Sjungma@eit.uni-kl.de 15912027Sjungma@eit.uni-kl.de return fcsr; 16012027Sjungma@eit.uni-kl.de} 16112027Sjungma@eit.uni-kl.de 16212027Sjungma@eit.uni-kl.deuint32_t 16312027Sjungma@eit.uni-kl.degenInvalidVector(uint32_t fcsr_bits) 16412027Sjungma@eit.uni-kl.de{ 16512027Sjungma@eit.uni-kl.de //Set FCSR invalid in "flag" field 16612027Sjungma@eit.uni-kl.de int invalid_offset = Invalid + Flag_Field; 16712027Sjungma@eit.uni-kl.de fcsr_bits = fcsr_bits | (1 << invalid_offset); 16812027Sjungma@eit.uni-kl.de 16912027Sjungma@eit.uni-kl.de //Set FCSR invalid in "cause" flag 170 int cause_offset = Invalid + Cause_Field; 171 fcsr_bits = fcsr_bits | (1 << cause_offset); 172 173 return fcsr_bits; 174} 175 176bool 177isNan(void *val_ptr, int size) 178{ 179 switch (size) 180 { 181 case 32: 182 { 183 uint32_t val_bits = *(uint32_t *) val_ptr; 184 return (bits(val_bits, 30, 23) == 0xFF); 185 } 186 187 case 64: 188 { 189 uint64_t val_bits = *(uint64_t *) val_ptr; 190 return (bits(val_bits, 62, 52) == 0x7FF); 191 } 192 193 default: 194 panic("Type unsupported. Size mismatch\n"); 195 } 196} 197 198 199bool 200isQnan(void *val_ptr, int size) 201{ 202 switch (size) 203 { 204 case 32: 205 { 206 uint32_t val_bits = *(uint32_t *) val_ptr; 207 return (bits(val_bits, 30, 22) == 0x1FE); 208 } 209 210 case 64: 211 { 212 uint64_t val_bits = *(uint64_t *) val_ptr; 213 return (bits(val_bits, 62, 51) == 0xFFE); 214 } 215 216 default: 217 panic("Type unsupported. Size mismatch\n"); 218 } 219} 220 221bool 222isSnan(void *val_ptr, int size) 223{ 224 switch (size) 225 { 226 case 32: 227 { 228 uint32_t val_bits = *(uint32_t *) val_ptr; 229 return (bits(val_bits, 30, 22) == 0x1FF); 230 } 231 232 case 64: 233 { 234 uint64_t val_bits = *(uint64_t *) val_ptr; 235 return (bits(val_bits, 62, 51) == 0xFFF); 236 } 237 238 default: 239 panic("Type unsupported. Size mismatch\n"); 240 } 241} 242 243int 244flattenIntIndex(ThreadContext * tc, int reg) 245{ 246 return reg; 247} 248 249 250void 251copyRegs(ThreadContext *src, ThreadContext *dest) 252{ 253 panic("Copy Regs Not Implemented Yet\n"); 254} 255 256void 257copyMiscRegs(ThreadContext *src, ThreadContext *dest) 258{ 259 panic("Copy Misc. Regs Not Implemented Yet\n"); 260} 261 262template <class CPU> 263void 264zeroRegisters(CPU *cpu) 265{ 266 // Insure ISA semantics 267 // (no longer very clean due to the change in setIntReg() in the 268 // cpu model. Consider changing later.) 269 cpu->thread->setIntReg(ZeroReg, 0); 270 cpu->thread->setFloatReg(ZeroReg, 0.0); 271} 272 273void 274startupCPU(ThreadContext *tc, int cpuId) 275{ 276 tc->activate(0/*tc->getThreadNum()*/); 277} 278 279} // namespace MipsISA 280