什么相当于PPC的rdtsc操作码?

时间:2011-05-04 12:09:15

标签: opcode powerpc rdtsc

我有一个具有以下代码的汇编程序。 此代码可编译为intel处理器。但是,当我使用PPC(交叉)编译器时,我收到一个错误,即操作码无法识别。我试图找出PPC架构是否有等效的操作码。

.file   "assembly.s"
.text
.globl func64
.type   func64,@function
func64:
    rdtsc
    ret

.size   func64,.Lfe1-func64
.globl func
.type   func,@function
func:
    rdtsc
    ret

4 个答案:

答案 0 :(得分:7)

PowerPC包含一个“时基”寄存器,它会定期递增(尽管可能不是每个时钟 - 但它取决于实际的硬件和操作系统)。 TB寄存器是64位值,读作两个32位半,mftb(低半)和mftbu(高半)。 TB的四个最低有效位有些不可靠(它们单调递增,但不一定以固定速率递增)。

一些较旧的PowerPC处理器没有TB寄存器(但操作系统可能会模拟它,可能具有可疑的准确性);然而,603e已经拥有它,所以可以肯定的是,大多数(如果不是所有的)PowerPC系统实际上都在生产它。还有一个“备用时基登记册”。

有关详细信息,请参阅power.org Web site中提供的Power ISA规范。在撰写该答案时,当前版本为2.06B,TB寄存器和操作码记录在第703至706页。

答案 1 :(得分:3)

当您需要32位架构上的64位值(不确定它如何在64位上运行)并且您读取TB寄存器时,您可能会遇到从0xffffffff到0的下半部分的问题 - 如果这种情况不经常发生,你可以确定它会在造成最大伤害时发生;)

我建议你首先读上半部分,然后再读下部,最后再读上部。比较两个鞋面,如果它们相等,没有问题。如果它们不同(第一个应该比最后一个少一个),你必须查看下面看它应该配对的上部:如果它的最高位设置它应该与第一个配对,否则与最后一个配对。

答案 2 :(得分:2)

对于不同类型的代码,Apple有三个mach_absolute_time()版本:

  • 32位
  • 64位内核,32位应用
  • 64位内核,64位应用

答案 3 :(得分:0)

您可以执行以下操作:

受到Peter Cordes的评论和clang's __builtin_readcyclecounter的分解的启发:

mfspr 3, 268
blr

如果您使用gcc,请使用以下内容:

unsigned long long rdtsc(){
        unsigned long long rval;
        __asm__ __volatile__("mfspr %%r3, 268": "=r" (rval));
        return rval;
}

对于c声:

unsigned long long readTSC() {
    // _mm_lfence();  // optionally wait for earlier insns to retire before reading the clock
    return __builtin_readcyclecounter();
}