Merge zizzer:/bk/newmem
into zeep.pool:/tmp/newmem --HG-- extra : convert_revision : 8f173d3522e2e8847e51dfab48f35e34e6d3c1a7
This commit is contained in:
commit
088a056583
12 changed files with 103 additions and 68 deletions
|
@ -245,13 +245,13 @@ AlphaISA::MiscRegFile::readIpr(int idx, ThreadContext *tc)
|
||||||
{
|
{
|
||||||
AlphaISA::PTE &pte = tc->getDTBPtr()->index(!tc->misspeculating());
|
AlphaISA::PTE &pte = tc->getDTBPtr()->index(!tc->misspeculating());
|
||||||
|
|
||||||
retval |= ((u_int64_t)pte.ppn & ULL(0x7ffffff)) << 32;
|
retval |= ((uint64_t)pte.ppn & ULL(0x7ffffff)) << 32;
|
||||||
retval |= ((u_int64_t)pte.xre & ULL(0xf)) << 8;
|
retval |= ((uint64_t)pte.xre & ULL(0xf)) << 8;
|
||||||
retval |= ((u_int64_t)pte.xwe & ULL(0xf)) << 12;
|
retval |= ((uint64_t)pte.xwe & ULL(0xf)) << 12;
|
||||||
retval |= ((u_int64_t)pte.fonr & ULL(0x1)) << 1;
|
retval |= ((uint64_t)pte.fonr & ULL(0x1)) << 1;
|
||||||
retval |= ((u_int64_t)pte.fonw & ULL(0x1))<< 2;
|
retval |= ((uint64_t)pte.fonw & ULL(0x1))<< 2;
|
||||||
retval |= ((u_int64_t)pte.asma & ULL(0x1)) << 4;
|
retval |= ((uint64_t)pte.asma & ULL(0x1)) << 4;
|
||||||
retval |= ((u_int64_t)pte.asn & ULL(0x7f)) << 57;
|
retval |= ((uint64_t)pte.asn & ULL(0x7f)) << 57;
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
|
|
@ -35,7 +35,7 @@
|
||||||
#include "arch/alpha/isa_traits.hh"
|
#include "arch/alpha/isa_traits.hh"
|
||||||
#include "arch/alpha/types.hh"
|
#include "arch/alpha/types.hh"
|
||||||
|
|
||||||
#include <string.h>
|
#include <cstring>
|
||||||
#include <iostream>
|
#include <iostream>
|
||||||
|
|
||||||
class Checkpoint;
|
class Checkpoint;
|
||||||
|
@ -61,7 +61,7 @@ namespace AlphaISA
|
||||||
void unserialize(Checkpoint *cp, const std::string §ion);
|
void unserialize(Checkpoint *cp, const std::string §ion);
|
||||||
|
|
||||||
void clear()
|
void clear()
|
||||||
{ bzero(d, sizeof(d)); }
|
{ std::memset(d, 0, sizeof(d)); }
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -35,7 +35,7 @@
|
||||||
#include "arch/alpha/types.hh"
|
#include "arch/alpha/types.hh"
|
||||||
|
|
||||||
#include <iostream>
|
#include <iostream>
|
||||||
#include <strings.h>
|
#include <cstring>
|
||||||
|
|
||||||
class Checkpoint;
|
class Checkpoint;
|
||||||
|
|
||||||
|
@ -71,7 +71,7 @@ namespace AlphaISA
|
||||||
void unserialize(Checkpoint *cp, const std::string §ion);
|
void unserialize(Checkpoint *cp, const std::string §ion);
|
||||||
|
|
||||||
void clear()
|
void clear()
|
||||||
{ bzero(regs, sizeof(regs)); }
|
{ std::memset(regs, 0, sizeof(regs)); }
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -192,10 +192,10 @@ output decoder {{
|
||||||
}
|
}
|
||||||
|
|
||||||
const int AlphaFP::alphaToC99RoundingMode[] = {
|
const int AlphaFP::alphaToC99RoundingMode[] = {
|
||||||
FE_TOWARDZERO, // Chopped
|
M5_FE_TOWARDZERO, // Chopped
|
||||||
FE_DOWNWARD, // Minus_Infinity
|
M5_FE_DOWNWARD, // Minus_Infinity
|
||||||
FE_TONEAREST, // Normal
|
M5_FE_TONEAREST, // Normal
|
||||||
FE_UPWARD // Dynamic in inst, Plus_Infinity in FPCR
|
M5_FE_UPWARD // Dynamic in inst, Plus_Infinity in FPCR
|
||||||
};
|
};
|
||||||
|
|
||||||
const char *AlphaFP::roundingModeSuffix[] = { "c", "m", "", "d" };
|
const char *AlphaFP::roundingModeSuffix[] = { "c", "m", "", "d" };
|
||||||
|
@ -228,10 +228,10 @@ def template FloatingPointExecute {{
|
||||||
if (roundingMode == Normal) {
|
if (roundingMode == Normal) {
|
||||||
%(code)s;
|
%(code)s;
|
||||||
} else {
|
} else {
|
||||||
fesetround(getC99RoundingMode(
|
m5_fesetround(getC99RoundingMode(
|
||||||
xc->readMiscRegNoEffect(AlphaISA::MISCREG_FPCR)));
|
xc->readMiscRegNoEffect(AlphaISA::MISCREG_FPCR)));
|
||||||
%(code)s;
|
%(code)s;
|
||||||
fesetround(FE_TONEAREST);
|
m5_fesetround(M5_FE_TONEAREST);
|
||||||
}
|
}
|
||||||
#else
|
#else
|
||||||
if (roundingMode != Normal && !warnedOnRounding) {
|
if (roundingMode != Normal && !warnedOnRounding) {
|
||||||
|
|
|
@ -109,37 +109,22 @@ def format FpBasic(code, *flags) {{
|
||||||
fp_code = """
|
fp_code = """
|
||||||
Fsr |= bits(Fsr,4,0) << 5;
|
Fsr |= bits(Fsr,4,0) << 5;
|
||||||
Fsr = insertBits(Fsr,4,0,0);
|
Fsr = insertBits(Fsr,4,0,0);
|
||||||
#if defined(__sun) || defined (__OpenBSD__)
|
int newrnd = M5_FE_TONEAREST;
|
||||||
fp_rnd newrnd = FP_RN;
|
|
||||||
switch (Fsr<31:30>) {
|
switch (Fsr<31:30>) {
|
||||||
case 0: newrnd = FP_RN; break;
|
case 0: newrnd = M5_FE_TONEAREST; break;
|
||||||
case 1: newrnd = FP_RZ; break;
|
case 1: newrnd = M5_FE_TOWARDZERO; break;
|
||||||
case 2: newrnd = FP_RP; break;
|
case 2: newrnd = M5_FE_UPWARD; break;
|
||||||
case 3: newrnd = FP_RM; break;
|
case 3: newrnd = M5_FE_DOWNWARD; break;
|
||||||
}
|
}
|
||||||
fp_rnd oldrnd = fpsetround(newrnd);
|
int oldrnd = m5_fegetround();
|
||||||
#else
|
m5_fesetround(newrnd);
|
||||||
int newrnd = FE_TONEAREST;
|
|
||||||
switch (Fsr<31:30>) {
|
|
||||||
case 0: newrnd = FE_TONEAREST; break;
|
|
||||||
case 1: newrnd = FE_TOWARDZERO; break;
|
|
||||||
case 2: newrnd = FE_UPWARD; break;
|
|
||||||
case 3: newrnd = FE_DOWNWARD; break;
|
|
||||||
}
|
|
||||||
int oldrnd = fegetround();
|
|
||||||
fesetround(newrnd);
|
|
||||||
#endif
|
|
||||||
"""
|
"""
|
||||||
|
|
||||||
fp_code += code
|
fp_code += code
|
||||||
|
|
||||||
|
|
||||||
fp_code += """
|
fp_code += """
|
||||||
#if defined(__sun) || defined (__OpenBSD__)
|
m5_fesetround(oldrnd);
|
||||||
fpsetround(oldrnd);
|
|
||||||
#else
|
|
||||||
fesetround(oldrnd);
|
|
||||||
#endif
|
|
||||||
"""
|
"""
|
||||||
fp_code = filterDoubles(fp_code)
|
fp_code = filterDoubles(fp_code)
|
||||||
iop = InstObjParams(name, Name, 'SparcStaticInst', fp_code, flags)
|
iop = InstObjParams(name, Name, 'SparcStaticInst', fp_code, flags)
|
||||||
|
|
|
@ -53,22 +53,14 @@ output decoder {{
|
||||||
#include "cpu/thread_context.hh" // for Jump::branchTarget()
|
#include "cpu/thread_context.hh" // for Jump::branchTarget()
|
||||||
#include "mem/packet.hh"
|
#include "mem/packet.hh"
|
||||||
|
|
||||||
#if defined(linux) || defined(__APPLE__)
|
#include "base/fenv.hh"
|
||||||
#include <fenv.h>
|
|
||||||
#endif
|
|
||||||
#include <algorithm>
|
#include <algorithm>
|
||||||
|
|
||||||
using namespace SparcISA;
|
using namespace SparcISA;
|
||||||
}};
|
}};
|
||||||
|
|
||||||
output exec {{
|
output exec {{
|
||||||
#if defined(linux) || defined(__APPLE__)
|
#include "base/fenv.hh"
|
||||||
#include <fenv.h>
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#if defined(__sun) || defined (__OpenBSD__)
|
|
||||||
#include <ieeefp.h>
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#if FULL_SYSTEM
|
#if FULL_SYSTEM
|
||||||
#include "sim/pseudo_inst.hh"
|
#include "sim/pseudo_inst.hh"
|
||||||
|
|
|
@ -57,6 +57,7 @@ Source('circlebuf.cc')
|
||||||
Source('cprintf.cc')
|
Source('cprintf.cc')
|
||||||
Source('crc.cc')
|
Source('crc.cc')
|
||||||
Source('fast_alloc.cc')
|
Source('fast_alloc.cc')
|
||||||
|
Source('fenv.c')
|
||||||
Source('fifo_buffer.cc')
|
Source('fifo_buffer.cc')
|
||||||
Source('hostinfo.cc')
|
Source('hostinfo.cc')
|
||||||
Source('hybrid_pred.cc')
|
Source('hybrid_pred.cc')
|
||||||
|
|
56
src/base/fenv.c
Normal file
56
src/base/fenv.c
Normal file
|
@ -0,0 +1,56 @@
|
||||||
|
/*
|
||||||
|
* Copyright (c) 2007 The Regents of The University of Michigan
|
||||||
|
* All rights reserved.
|
||||||
|
*
|
||||||
|
* Redistribution and use in source and binary forms, with or without
|
||||||
|
* modification, are permitted provided that the following conditions are
|
||||||
|
* met: redistributions of source code must retain the above copyright
|
||||||
|
* notice, this list of conditions and the following disclaimer;
|
||||||
|
* redistributions in binary form must reproduce the above copyright
|
||||||
|
* notice, this list of conditions and the following disclaimer in the
|
||||||
|
* documentation and/or other materials provided with the distribution;
|
||||||
|
* neither the name of the copyright holders nor the names of its
|
||||||
|
* contributors may be used to endorse or promote products derived from
|
||||||
|
* this software without specific prior written permission.
|
||||||
|
*
|
||||||
|
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
||||||
|
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
||||||
|
* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
||||||
|
* A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
|
||||||
|
* OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
||||||
|
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
||||||
|
* LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
||||||
|
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
||||||
|
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||||
|
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
||||||
|
* OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||||
|
*
|
||||||
|
* Authors: Ali Saidi
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <assert.h>
|
||||||
|
#include <stdlib.h>
|
||||||
|
#include <fenv.h>
|
||||||
|
|
||||||
|
void m5_fesetround(int rm);
|
||||||
|
int m5_fegetround();
|
||||||
|
|
||||||
|
static const int m5_round_ops[] = {FE_DOWNWARD, FE_TONEAREST, FE_TOWARDZERO, FE_UPWARD};
|
||||||
|
|
||||||
|
void m5_fesetround(int rm)
|
||||||
|
{
|
||||||
|
assert(rm > 0 && rm < 4);
|
||||||
|
fesetround(m5_round_ops[rm]);
|
||||||
|
}
|
||||||
|
|
||||||
|
int m5_fegetround()
|
||||||
|
{
|
||||||
|
int x;
|
||||||
|
int rm = fegetround();
|
||||||
|
for(x = 0; x < 4; x++)
|
||||||
|
if (m5_round_ops[x] == rm)
|
||||||
|
return x;
|
||||||
|
abort();
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
|
@ -33,20 +33,21 @@
|
||||||
|
|
||||||
#include "config/use_fenv.hh"
|
#include "config/use_fenv.hh"
|
||||||
|
|
||||||
|
#define M5_FE_DOWNWARD 0
|
||||||
|
#define M5_FE_TONEAREST 1
|
||||||
|
#define M5_FE_TOWARDZERO 2
|
||||||
|
#define M5_FE_UPWARD 3
|
||||||
|
|
||||||
#if USE_FENV
|
#if USE_FENV
|
||||||
|
extern "C" {
|
||||||
#include <fenv.h>
|
void m5_fesetround(int rm);
|
||||||
|
int m5_fegetround();
|
||||||
|
}
|
||||||
#else
|
#else
|
||||||
|
|
||||||
// Dummy definitions to allow code to compile w/o a real <fenv.h>.
|
// Dummy definitions to allow code to compile w/o a real <fenv.h>.
|
||||||
|
inline void m5_fesetround(int rm) { ; }
|
||||||
#define FE_TONEAREST 0
|
inline int m5_fegetround() {return 0; }
|
||||||
#define FE_DOWNWARD 0
|
|
||||||
#define FE_UPWARD 0
|
|
||||||
#define FE_TOWARDZERO 0
|
|
||||||
|
|
||||||
inline int fesetround(int rounding_mode) { return 0; }
|
|
||||||
|
|
||||||
#endif // USE_FENV
|
#endif // USE_FENV
|
||||||
|
|
||||||
|
|
|
@ -29,9 +29,6 @@
|
||||||
* Ali Saidi
|
* Ali Saidi
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#if defined(__sun)
|
|
||||||
#include <ieeefp.h>
|
|
||||||
#endif
|
|
||||||
#ifdef __SUNPRO_CC
|
#ifdef __SUNPRO_CC
|
||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
#include <math.h>
|
#include <math.h>
|
||||||
|
@ -40,6 +37,7 @@
|
||||||
#include <cstdlib>
|
#include <cstdlib>
|
||||||
#include <cmath>
|
#include <cmath>
|
||||||
|
|
||||||
|
#include "base/fenv.hh"
|
||||||
#include "base/random.hh"
|
#include "base/random.hh"
|
||||||
|
|
||||||
using namespace std;
|
using namespace std;
|
||||||
|
@ -61,9 +59,10 @@ m5round(double r)
|
||||||
{
|
{
|
||||||
#if defined(__sun)
|
#if defined(__sun)
|
||||||
double val;
|
double val;
|
||||||
fp_rnd oldrnd = fpsetround(FP_RN);
|
int oldrnd = m5_fegetround();
|
||||||
|
m5_fesetround(M5_FE_TONEAREST);
|
||||||
val = rint(r);
|
val = rint(r);
|
||||||
fpsetround(oldrnd);
|
m5_fesetround(oldrnd);
|
||||||
return val;
|
return val;
|
||||||
#else
|
#else
|
||||||
return round(r);
|
return round(r);
|
||||||
|
|
|
@ -33,6 +33,7 @@
|
||||||
#define __CPU_O3_LSQ_UNIT_HH__
|
#define __CPU_O3_LSQ_UNIT_HH__
|
||||||
|
|
||||||
#include <algorithm>
|
#include <algorithm>
|
||||||
|
#include <cstring>
|
||||||
#include <map>
|
#include <map>
|
||||||
#include <queue>
|
#include <queue>
|
||||||
|
|
||||||
|
@ -292,7 +293,7 @@ class LSQUnit {
|
||||||
: inst(NULL), req(NULL), size(0),
|
: inst(NULL), req(NULL), size(0),
|
||||||
canWB(0), committed(0), completed(0)
|
canWB(0), committed(0), completed(0)
|
||||||
{
|
{
|
||||||
bzero(data, sizeof(data));
|
std::memset(data, 0, sizeof(data));
|
||||||
}
|
}
|
||||||
|
|
||||||
/** Constructs a store queue entry for a given instruction. */
|
/** Constructs a store queue entry for a given instruction. */
|
||||||
|
@ -300,7 +301,7 @@ class LSQUnit {
|
||||||
: inst(_inst), req(NULL), size(0),
|
: inst(_inst), req(NULL), size(0),
|
||||||
canWB(0), committed(0), completed(0)
|
canWB(0), committed(0), completed(0)
|
||||||
{
|
{
|
||||||
bzero(data, sizeof(data));
|
std::memset(data, 0, sizeof(data));
|
||||||
}
|
}
|
||||||
|
|
||||||
/** The store instruction. */
|
/** The store instruction. */
|
||||||
|
|
|
@ -76,7 +76,7 @@ AlphaConsole::AlphaConsole(Params *p)
|
||||||
alphaAccess->diskOperation = 0;
|
alphaAccess->diskOperation = 0;
|
||||||
alphaAccess->outputChar = 0;
|
alphaAccess->outputChar = 0;
|
||||||
alphaAccess->inputChar = 0;
|
alphaAccess->inputChar = 0;
|
||||||
bzero(alphaAccess->cpuStack, sizeof(alphaAccess->cpuStack));
|
std::memset(alphaAccess->cpuStack, 0, sizeof(alphaAccess->cpuStack));
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue