pseudo inst: Add rpns (read processor nanoseconds) instruction.
authorNathan Binkert <nate@binkert.org>
Mon, 10 Nov 2008 19:51:18 +0000 (11:51 -0800)
committerNathan Binkert <nate@binkert.org>
Mon, 10 Nov 2008 19:51:18 +0000 (11:51 -0800)
This instruction basically returns the number of nanoseconds that the CPU
has been running.

src/arch/alpha/isa/decoder.isa
src/sim/pseudo_inst.cc
src/sim/pseudo_inst.hh
util/m5/m5op.h
util/m5/m5op_alpha.S
util/m5/m5ops.h

index 270940df2e1c806c38ed7071fe647417ac0969d5..115cf7fa7ab70a40914b7c03e72941e797d123b6 100644 (file)
@@ -806,6 +806,9 @@ decode OPCODE default Unknown::unknown() {
             0x04: quiesceTime({{
                 R0 = PseudoInst::quiesceTime(xc->tcBase());
             }}, IsNonSpeculative, IsUnverifiable);
+            0x07: rpns({{
+                R0 = PseudoInst::rpns(xc->tcBase());
+            }}, IsNonSpeculative, IsUnverifiable);
             0x10: deprecated_ivlb({{
                 warn_once("Obsolete M5 ivlb instruction encountered.\n");
             }});
index 409a6e00900606f4dbd182ffdf4e70008235cb8c..e43279376e89195d8c44b8cf8ad19012d0ca03b3 100644 (file)
@@ -125,6 +125,12 @@ quiesceTime(ThreadContext *tc)
     return (tc->readLastActivate() - tc->readLastSuspend()) / Clock::Int::ns;
 }
 
+uint64_t
+rpns(ThreadContext *tc)
+{
+    return curTick / Clock::Int::ns;
+}
+
 void
 m5exit(ThreadContext *tc, Tick delay)
 {
index 40702fced24dbc470277ba3ae5f2efa364d7e9e0..80f58f80d041f88f299cfbd197ed5c9d905d44ea 100644 (file)
@@ -47,6 +47,7 @@ void quiesce(ThreadContext *tc);
 void quiesceNs(ThreadContext *tc, uint64_t ns);
 void quiesceCycles(ThreadContext *tc, uint64_t cycles);
 uint64_t quiesceTime(ThreadContext *tc);
+uint64_t rpns(ThreadContext *tc);
 void m5exit(ThreadContext *tc, Tick delay);
 void loadsymbol(ThreadContext *xc);
 void resetstats(ThreadContext *tc, Tick delay, Tick period);
index f4e6bb0f1c153697daa275b142ee9264e57ce3b0..bab2e2b9eeac170744b07f53b0e97f3354a20b9b 100644 (file)
@@ -39,6 +39,7 @@ void quiesce(void);
 void quiesceNs(uint64_t ns);
 void quiesceCycle(uint64_t cycles);
 uint64_t quiesceTime(void);
+uint64_t rpns();
 
 void m5_exit(uint64_t ns_delay);
 uint64_t m5_initparam(void);
index 7aeffb2c7bc5c9c6a2d10201a5ad8dd125b35459..77e9afe3469da08be4d6b260bb693a4986c724a7 100644 (file)
@@ -59,6 +59,7 @@ func:
 #define QUIESCENS(r1) INST(m5_op, r1, 0, quiescens_func)
 #define QUIESCECYC(r1) INST(m5_op, r1, 0, quiescecycle_func)
 #define QUIESCETIME INST(m5_op, 0, 0, quiescetime_func)
+#define RPNS INST(m5_op, 0, 0, rpns_func)
 #define M5EXIT(reg) INST(m5_op, reg, 0, exit_func)
 #define INITPARAM(reg) INST(m5_op, reg, 0, initparam_func)
 #define LOADSYMBOL(reg) INST(m5_op, reg, 0, loadsymbol_func)
@@ -79,6 +80,7 @@ SIMPLE_OP(quiesce, QUIESCE)
 SIMPLE_OP(quiesceNs, QUIESCENS(16))
 SIMPLE_OP(quiesceCycle, QUIESCECYC(16))
 SIMPLE_OP(quiesceTime, QUIESCETIME)
+SIMPLE_OP(rpns, RPNS)
 SIMPLE_OP(m5_exit, M5EXIT(16))
 SIMPLE_OP(m5_initparam, INITPARAM(0))
 SIMPLE_OP(m5_loadsymbol, LOADSYMBOL(0))
index 58846e1cf0a5cafc3fa471d9e9090cf5bf46003e..ab9bdd85772cd040eea3cc0f345740471141b805 100644 (file)
@@ -34,6 +34,7 @@
 #define quiescens_func          0x02
 #define quiescecycle_func       0x03
 #define quiescetime_func        0x04
+#define rpns_func               0x07
 #define deprecated1_func        0x10 // obsolete ivlb
 #define deprecated2_func        0x11 // obsolete ivle
 #define deprecated3_func        0x20 // deprecated exit function