7

次のコードを含むアセンブリ プログラムがあります。このコードは、Intel プロセッサ用に正常にコンパイルされます。しかし、PPC (クロス) コンパイラを使用すると、opcode が認識されないというエラーが発生します。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 には、定期的にインクリメントされる「タイム ベース」レジスタが含まれています (ただし、各クロックではなく、実際のハードウェアとオペレーティング システムによって異なります)。mftbTB レジスタは 64 ビット値であり、 (下位半分) とmftbu(上位半分)を持つ 2 つの 32 ビット半分として読み取られます。TB の最下位 4 ビットはやや信頼性に欠けます (単調に増加しますが、必ずしも固定レートで増加するとは限りません)。

一部の古い PowerPC プロセッサには TB レジスタがありません (ただし、OS がそれをエミュレートする可能性がありますが、おそらく正確性に疑問があります)。ただし、603e には既に搭載されているため、実際に生産されているすべての PowerPC システムではないにしても、ほとんどの PowerPC システムに搭載されていると考えて間違いありません。「代替タイムベースレジスタ」もあります。

詳細については、power.org Web サイトから入手できる Power ISA 仕様を参照してください。その回答を書いている時点で、現在のバージョンは 2.06B で、TB レジスタとオペコードは 703 ~ 706 ページに記載されていました。

于 2011-05-04T13:52:57.680 に答える
3

32 ビット アーキテクチャで 64 ビット値が必要な場合 (64 ビットでどのように動作するか不明)、TB レジスタを読み取ると、下半分が 0xffffffff から 0 になるという問題が発生する可能性があります。頻繁に発生するわけではありませんが、最もダメージが大きいときに発生することは確実です ;)

最初に上半分、次に下半分、最後に上半分をもう一度読むことをお勧めします。2 つのアッパーを比較し、それらが等しい場合は問題ありません。それらが異なる場合 (最初のビットは最後のビットよりも 1 小さい必要があります)、下のビットを調べて、どの上のビットとペアにする必要があるかを確認する必要があります。

于 2011-06-05T12:44:38.810 に答える
2

Apple には、さまざまなタイプのコード用に3 つのバージョンのmach_absolute_time()があります。

  • 32ビット
  • 64 ビット カーネル、32 ビット アプリ
  • 64 ビット カーネル、64 ビット アプリ
于 2011-06-18T01:49:58.980 に答える