我有一个具有以下代码的汇编程序。 此代码可编译为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
答案 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()版本:
答案 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();
}