7

我有一个包含以下代码的汇编程序。这段代码可以很好地编译为英特尔处理器。但是,当我使用 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

4 回答 4

8

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

一些较旧的 PowerPC 处理器没有 TB 寄存器(但操作系统可能会模拟它,可能精度有问题);但是,603e 已经拥有它,因此可以肯定的是,实际上生产中的大多数(如果不是所有)PowerPC 系统都拥有它。还有一个“备用时基寄存器”。

有关详细信息,请参阅power.org 网站上的 Power ISA 规范。在撰写该答案时,当前版本是 2.06B,TB 寄存器和操作码记录在第 703 到 706 页。

于 2011-05-04T13:52:57.680 回答
3

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

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

于 2011-06-05T12:44:38.810 回答
2

Apple为不同类型的代码提供了三个版本的mach_absolute_time() :

  • 32 位
  • 64 位内核,32 位应用程序
  • 64 位内核,64 位应用程序
于 2011-06-18T01:49:58.980 回答
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;
}

或者对于铿锵声:

unsigned long long readTSC() {
    // _mm_lfence();  // optionally wait for earlier insns to retire before reading the clock
    return __builtin_readcyclecounter();
}
于 2018-10-29T05:40:30.203 回答