关于mips64的cycle count的实现问题

甘蔗   2011-4-20 11:54 楼主

在mips32中是这样实现的:

 

#define rdtscl(dest)\
      __asm__ __volatile__("mfc0 %0, $9; nop":"=r"(dest));

 

 

但是我发现$9是一个32位的寄存器,那如何实现64位上电时间呢?

 

下面是一些其他体系结构的实现方法,实现的都是64位的,就是想在上面加上mips64的实现方法,请各位大牛们给予指点,万分感谢~

 

struct CycleClock {
  // This should return the number of cycles since power-on.  Thread-safe.
  static inline int64 Now() {
#if defined(__MACH__) && defined(__APPLE__)
       return mach_absolute_time();
#elif defined(__i386__)
    int64 ret;
    __asm__ volatile ("rdtsc" : "=A" (ret) );
    return ret;
#elif defined(__x86_64__) || defined(__amd64__)
    uint64 low, high;
    __asm__ volatile ("rdtsc" : "=a" (low), "=d" (high));
    return (high << 32) | low;
#elif defined(__powerpc__) || defined(__ppc__)
    // This returns a time-base, which is not always precisely a cycle-count.
    int64 tbl, tbu0, tbu1;
    asm("mftbu %0" : "=r" (tbu0));
    asm("mftb  %0" : "=r" (tbl));
    asm("mftbu %0" : "=r" (tbu1));
    tbl &= -static_cast<int64>(tbu0 == tbu1);
    // high 32 bits in tbu1; low 32 bits in tbl  (tbu0 is garbage)
    return (tbu1 << 32) | tbl;

回复评论 (2)

回复 楼主 甘蔗 的帖子

你可以使能counter的中断,counter翻转的时候会发生这个中断,在中断里面计数吧。
64bit的的确没有。
点赞  2011-4-20 12:13

回复 沙发 richiefang 的帖子

版主真nice
大概明白您的意思了,不过我真是个mips菜鸟,版主能讲述的具体些嘛,也不用具体到代码,比如怎样时能中断?中断的寄存器是什么?或者版主直接推荐个资料给我看,我自己再去学习吧,给这不懂得人解释问题好麻烦,真是辛苦您了噻
点赞  2011-4-20 12:35
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 京公网安备 11010802033920号
    写回复