summaryrefslogtreecommitdiff
path: root/src/arch/arm/utility.hh
diff options
context:
space:
mode:
authorGabe Black <gblack@eecs.umich.edu>2009-06-21 09:21:07 -0700
committerGabe Black <gblack@eecs.umich.edu>2009-06-21 09:21:07 -0700
commit71e0d1ded278a85e33a628ddc842c975a216854f (patch)
tree38b6d745885794a55021ab2f80f565dd4ed89fa8 /src/arch/arm/utility.hh
parent19a1966079442ccbcda70c33bbcead7abb609985 (diff)
downloadgem5-71e0d1ded278a85e33a628ddc842c975a216854f.tar.xz
ARM: Pull some static code out of the isa desc and create miscregs.hh.
Diffstat (limited to 'src/arch/arm/utility.hh')
-rw-r--r--src/arch/arm/utility.hh27
1 files changed, 27 insertions, 0 deletions
diff --git a/src/arch/arm/utility.hh b/src/arch/arm/utility.hh
index e0ae7cd2e..a31fcd841 100644
--- a/src/arch/arm/utility.hh
+++ b/src/arch/arm/utility.hh
@@ -33,6 +33,7 @@
#ifndef __ARCH_ARM_UTILITY_HH__
#define __ARCH_ARM_UTILITY_HH__
+#include "arch/arm/miscregs.hh"
#include "arch/arm/types.hh"
#include "base/misc.hh"
#include "base/types.hh"
@@ -43,6 +44,32 @@ class ThreadContext;
namespace ArmISA {
+ inline bool
+ testPredicate(CPSR cpsr, ConditionCode code)
+ {
+ switch (code)
+ {
+ case COND_EQ: return cpsr.z;
+ case COND_NE: return !cpsr.z;
+ case COND_CS: return cpsr.c;
+ case COND_CC: return !cpsr.c;
+ case COND_MI: return cpsr.n;
+ case COND_PL: return !cpsr.n;
+ case COND_VS: return cpsr.v;
+ case COND_VC: return !cpsr.v;
+ case COND_HI: return (cpsr.c && !cpsr.z);
+ case COND_LS: return !(cpsr.c && !cpsr.z);
+ case COND_GE: return !(cpsr.n ^ cpsr.v);
+ case COND_LT: return (cpsr.n ^ cpsr.v);
+ case COND_GT: return !(cpsr.n ^ cpsr.v || cpsr.z);
+ case COND_LE: return (cpsr.n ^ cpsr.v || cpsr.z);
+ case COND_AL: return true;
+ case COND_NV: return false;
+ default:
+ panic("Unhandled predicate condition: %d\n", code);
+ }
+ }
+
//Floating Point Utility Functions
uint64_t fpConvert(ConvertType cvt_type, double fp_val);
double roundFP(double val, int digits);