POWER アーキテクチャーとアプリケーション・レベルでのプログラミング・モデルは、POWER アーキテクチャー系統樹の全ての枝にわたって共通しています。さらに詳しい情報をお求めでしたら、IBM® POWER WebサイトのTechnical Library にてユーザー用製品マニュアルをご覧ください(リンクは参考文献にあります)。
POWER アーキテクチャーは、200以上の定義された命令を持ったRISC(Reduced Instruction Set Computer)アーキテクチャーです。大半の命令は1サイクルで実行され1のオペレーション(レジスターへのロード、レジスターからメモリーへの格納)で行なうと言う意味では、POWERはRISCそのものです。
POWER アーキテクチャーは3つのレベル(ブック)に分けられます。このようにアーキテクチャーを分けることにより実装によらず互換性が維持され、その一方実装によって(パフォーマンスとコストの兼ね合いを考慮しながら)アーキテクチャーの複雑さの度合いを選ぶことができます。その3つのレベル(ブック)は以下のとおりです。
- Book I. ユーザー命令セット・アーキテクチャー
- 全てのPOWER 実装で共通のユーザー命令とレジスターの基本セットを定義します。これは大半のプログラムに使用される非特権命令です。
- Book II. 仮想環境アーキテクチャー
- キャッシュ管理、アトミック・オペレーション、そしてユーザー・レベルのタイマー・サポートなどのような、通常のアプリケーション・ソフトウェアの必要条件から外れた追加的なユーザー・レベルの機能性を定義します。これらのオペレーションは非特権ですが、一般的にはプログラムはオペレーティング・システム・コールを介してアクセスします。
- Book III. オペレーティング環境アーキテクチャー
- O.S.レベルで使用され必要とされる特権命令を定義します。これらはメモリー管理、例外ベクトル処理、特権レジスター・アクセス、そして特権タイマー・アクセスの機能を含みます。多種に渡るシステム・サービスと能力への直接的なハードウェア・サポートは、Book III にて指定されます。
元のPowerPC アーキテクチャーの開発が始まって以来、様々な方向に発展した後継機種はそれぞれ特定の市場に焦点を合わせて来ました。今日では、PowerPC アーキテクチャーの系統樹では2本の枝(PowerPC AS アーキテクチャー、PowerPC Book Eアーキテクチャー)が活躍しています。PowerPC AS アーキテクチャーはIBM のeServer™ pSeries®のUNIX とLinux のサーバー製品そしてIBM のeServer™ iSeries® 企業用サーバー製品の特殊なニーズに応えるべく、IBM が定義しています(参考文献のリンクを活用し、より詳しい情報を入手してください。)。一方Book E と呼ばれるPowerPC Book E アーキテクチャーは、『組み込み』市場の特殊な必要条件へ向けてIBM とMotorola が協力して開発しました。PowerPC ASに採用された元のPowerPC アーキテクチャーとBook E に採用された拡張の最大の相違点は、ほとんどがBook IIIにあります。
派生的なアーキテクチャーにて、アーキテクチャーに特化した機会に特に関連するささやかなアプリケーション・レベルでの拡張が存在します。しかし、PowerPC ASとPowerPC Book E は、PowerPC アーキテクチャーのBook I で定義される基本命令セットを共有します。これら3種のアーキテクチャーは、主としてO.S.レベルでの相違点がありますが、同時にアプリケーション・レベルでの高い互換性を提供します。
64-bit のシステムで32-bit のアプリケーションを実行する能力を駆使し、PowerPC は元々32-bit と64-bit 両方の実装のサポートを定義しました。(IBMのpSeries と iSeriesのサーバーで使用される) PowerPC ASシステムは、64-bit実装のアーキテクチャーのみを提供し、新型の64-bit アプリケーションと旧式の32-bit アプリケーションが同一のシステムで稼働できます。PowerPC Book Eアーキテクチャーは、32-bit と 64-bit実装の両方のサポートを提供し、64-bit実装もPowerPC アプリケーションで完全な32-bit 互換性をサポートします。どちらのアーキテクチャーもPowerPC Book I の命令とレジスターで完全互換性を提供し、(メモリー管理、例外と割り込み、タイマー・サポートそしてデバッグ・サポートの分野で)システム・レベルでの展開を提供します。
元のPowerPC アーキテクチャーは、PowerPC AS とPowerPC Book E の必要不可欠な一部として何も失われずに残され、アプリケーション・レベルの互換性に関する興味深い一面を示します。
複数種類のPowerPCプロセッサーを扱うとき、開発者はプロセッサーがメモリーを処理する方法にそれぞれ違いがあることを念頭に入れるべきです。
PowerPC アーキテクチャーは、バイト(8-bit)、ハーフワード(16-bit)、ワード(32-bit)、そしてダブルワード(64-bit)のデータ・タイプへのネイティブ・サポートを行ないます。PowerPC 実装は長さにして最大128-bitまでのマルチバイトストリングのストリング・オペレーションを取り扱えます。32-bit PowerPC実装は4ギガバイト分の有効アドレス・スペースをサポートし、64-bit PowerPC実装は16エクサバイト分の有効アドレス・スペースをサポートします。全てのストレージはバイト(byte)でアドレス可能です。
間違ったアライメントデータのアクセスに関して、アライメントのサポートは製品ファミリにより異なります。一部は例外を許しますが、他はハードウェアでの複数のオペレーションでアクセスを制御します。
PowerPC、PowerPC AS、そして初期のIBM PowerPC 4xx 系統のマシーンは根本的にビッグ・エンディアンのハードです。つまり、ハーフワード、ワード、そしてダブルワードのアクセスに関して言えば、最上位バイト (MSB)は最下層のアドレスにあります。リトル・エンディアンへのサポートは、実装に依存します。PowerPC と PowerPC ASは最低限のサポートしかせず、4xx 系統はよりしっかりしたリトル・エンディアンのストレージへのサポートを提供します。Book Eアーキテクチャーは両方のアクセス・メソッドを支持しますが、Book E はエンディアンから中立しております。
PowerPCのアプリケーション・レベルのレジスターは3種類のクラス(汎用レジスター(GPR)、浮動小数点レジスター(FPRそして浮動小数点ステータス/制御レジスター(FPSCR))、そして特殊目的レジスター(SPR))に分類されます。それぞれのクラスを見てみましょう。
User Instruction Set (ユーザー命令セット)アーキテクチャー(Book I)は全ての実装が32のGPR(GPR0 からGPR31まで)を含むことを指定します。GPRは全ての整数演算のソースそして宛先であり、全てのロード/ストアの演算のアドレス・オペランドのソースです。GPRはSPRへのアクセスをも提供します。一つの例外を除いて、全てのGPRは使用可能です。とある命令によれば、GPR0は単に0の値を意味し、GPR0のコンテントに対するルックアップが実行されない場合があります。
ユーザー命令セット(Book I)は全ての実装が32のFPR(FPR0 からFPR31まで)を抱くことを指定します。FPRは全ての浮動小数点演算のソースそして宛先であり、32-bitそして64-bitの符号付き(符号無し)整数と単精度(倍精度)浮動小数点数を含みます。それらはFPSCRへのアクセスをも提供します。
組み込まれたマイクロプロセッサーは、PowerPC 浮動小数点命令セットへの直接的なハードウェア・サポート無しで頻繁に実装されるか、浮動小数点のハードウェアを取り付けるインターフェースを提供するのみであることに気付いてください。多くの組み込まれたアプリケーションは、浮動小数点数演算をほとんど(または全く)必要とせず、PowerPCの浮動小数点命令実行のソフトウェア・エミュレーションで十分すぎるほどです。ハードウェアに浮動小数点を実装しないことによるチップの面積そして電力節約は、組み込まれたマイクロプロセッサーでは重大な課題になり得ます。
浮動小数点ステータス/制御レジスター(FPSCR)は、浮動小数点演算から発生するステータスと例外を捕捉(キャプチャー)します。FPSCR は(4つある丸めのモードの1つを選択するのみならず、指定の例外タイプを使用許可する)制御ビットを提供します。FPRをとおしてFPSCRへアクセスできます。
SPRはプロセッサー・コアの中でリソースのステータスと制御を与えます。Count Register、Link Register、そして Integer Exception Registerは、システム・サービスからのサポート無しでアプリケーションによる読み込みと書き込みを行なえるSPRです。Time Base やその他のサポートを必要とするタイマーは、システム・サービスからのサポートがあって初めてアプリケーションに読み込まれます。
-
命令アドレス・レジスター(IAR)
プログラマーの間では、このレジスターはプログラム・カウンターまたは命令ポインターとして知られています。それは現行の命令のアドレスです。分岐リンクの命令をとおしてでしかユーザーは直接入手できないので、それは実を言えば疑似レジスターです。主に次に実行される命令を披露するのにデバッガーはIARを活用します。 -
リンク・レジスター(LR)(LR)
ファンクションコールの終了時の戻りアドレスが格納されます。とある分岐命令は自動的にLR を分岐の後に来る命令にロードします。それぞれの分岐命令エンコード方式にはLK のビットがあります。LK ビットが1であれば、分岐命令はプログラム・カウンターをLRのアドレスに移します。また、条件付き分岐命令(bclr)はLRの値へと分岐します。 -
固定小数点例外レジスター(XER)
このレジスターは、整数算術演算からの繰り上がりそしてオーバーフローの情報を含みます。それは、とある整数算術演算への桁上げ入力 と(ロードそしてストアのストリング命令(lswxとstswx)の途中に)転送するバイト数をも含みます。 -
カウント・レジスター(CTR)
このレジスターはとある分岐命令で減少するループ・カウンターを含みます。また、条件付き分岐命令(bcctr)はCTR内の値に分岐します。 -
条件レジスター
このレジスターは8種類のフィールドに分類され、それぞれのフィールドは4ビットです。多くのPowerPC 命令は命令エンコード方式のbit 31をRcビットとして定義し、一部の命令はRcの値が1であることを暗示します。整数演算の場合にRcが1のとき、CRフィールド0はその命令の演算の結果を反映するように設定されます(Equal (EQ)、Greater Than (GT)、Less Than (LT)、そしてSummary Overflow (SO))。浮動小数点演算の場合にRcが1のとき、CRフィールド1はそのFPSCRでの例外状況ビット(FX、FEX、VX、OX)の状態を反映するように設定されます。どのCRフィールドも整数または浮動小数点の比較命令の標的になり得ます。CRフィールド0は条件付きストア命令(stwcxまたはstdcx)の結果を反映するように設定されもします。特定のCRビット、特定のCRフィールド、またはCR全体を操作できる命令のセットもあり、通常これらはテストのために複数の条件を1つのビットに集めます。 -
プロセッサー・バージョン・レジスター
PVR は、プロセッサーのバージョンと改訂レベルを識別する32-bit 読み取り専用レジスターです。プロセッサーのバージョンは、PowerPCのアーキテクチャー・プロセスに割り当てられます。改訂レベルは実装により定義されます。PVR へのアクセスは特権化されていますので、オペレーティング・システム機能の助けを借りることのみにより、プロセッサーのバージョンをアプリケーション・プログラムは判断できます。
異なる命令のカテゴリーとそれぞれの命令のタイプを表1に示します。
表1. 命令のカテゴリー
| 命令のカテゴリー | 基本命令 |
|---|---|
| Branch | branch, branch conditional, branch to LR, branch to CTR |
| Condition register | crand, crnor, creqv, crxor, crandc, crorc, crnand, cror, CR move |
| Storage access | load GPR/FPR, store GPR/FPR |
| Integer arithmetic | add, subtract, negate, multiply, divide |
| Integer comparison | compare algebraic, compare algebraic immediate, compare logical,compare logical immediate |
| Integer logical | and, andc, nand, or, orc, nor, xor, eqv, sign extension, count leading zeros |
| Integer rotate/shift | rotate, rotate and mask, shift left, shift right |
| Floating-point arithmetic | add, subtract, negate, multiply, divide, square root, multiply-add, multiply-subtract, negative multiply-add, negative multiply-subtract |
| Floating-point comparison | compare ordered, compare unordered |
| Floating-point conversion | round to single, convert from/to integer word/doubleword |
| FPSCR management | move to/from FPSCR, set/clear FPSCR bit, copy FPSCR field to CR |
| Cache control | touch, zero, flush, store |
| Processor management | system call, move to/from special purpose registers, mtcrf, mfcr |
全ての命令の解読は32ビット長で行われます。PowerPCの番号付けは他のほとんどの定義とは逆です。bit 0 は最も重要なビットで、bit 31は逆に一番重要度が低いと言えます。命令は最初にフィールド内で最も上の6ビット(基本命令コード)でデコードされます。残りの26ビットはオペランド指定子、即値オペランド、そして拡張命令コードのフィールドを含み、これらは予約済みのビットまたはフィールドとも言えます。PowerPCは、表2に示される基本命令フォーマットを定義します。
表2. PowerPC 命令フォーマット
| フォーマット | 0 | 6 | 11 | 16 | 21 | 26 | 30 | 31 |
|---|---|---|---|---|---|---|---|---|
| D-form | opcd | tgt/src | src/tgt | immediate | ||||
| X-form | opcd | tgt/src | src/tgt | src | extended opcd | |||
| A-form | opcd | tgt/src | src/tgt | src | src | extended opcd | Rc | |
| BD-form | opcd | BO | BI | BD | AA | LK | ||
| I-form | opcd | LI | AA | LK | ||||
opcd = 命令コード、tgt = ターゲット、src = ソース、immediate = 即値 extended opcd = 拡張命令コード
-
D-form
この命令フォーマットは、最大2つのレジスターをソース(src)・オペランドとして、1つのレジスターを即値(immediate)ソースとして、そして最大2つのレジスターをターゲット(tgt)・オペランドとして提供します。この命令フォーマットの別のバリエーションは、ターゲット・レジスター・オペランド指定子とソース・レジスター・オペランド指定子の一部を即値(immediate)フィールドまたは拡張命令コード(opcd)として活用します。 -
X-form
この命令フォーマットは最大2つのレジスターをソース(src)・オペランドとして、そして最大2つのターゲット(tgt)・オペランドを提供します。この命令フォーマットの別のバリエーションは、ターゲットそしてソースのオペランド指定子の一部を即値(immediate)フィールドまたは拡張命令コード(extended opcd)として活用します。 -
A-form
この命令フォーマットは最大3つのレジスターをソース(src)・オペランドとして、そして1つのターゲット(tgt)・オペランドを提供します。この命令フォーマットの別のバリエーションは、ターゲットそしてソースのオペランド指定子を即値(immediate)フィールドまたは拡張命令コード(extended opcd)として活用します。 -
BD-form
条件付き分岐命令はこの命令フォーマットを使用します。BO 命令フィールドは条件のタイプを指定します。BI 命令フィールドはどのCRビットが条件として使用されるかを指定し、BDフィールドは分岐変位として使われます。AA ビットは、分岐が絶対なのか相対なのかを指定します。つまり、分岐ターゲット・アドレスは即値フィールドの値であり、または即値フィールドと分岐のアドレスの合計値なのです。LK ビットは、次の順次命令がLink Register でサブルーチン呼び出しの戻りアドレスとして保存されるかどうかを指定します。 -
I-form
無条件分岐命令はこの命令フォーマットを使用します。無条件であるがゆえに、BDフォーマットでのBOとBIフィールドは追加の分岐変位と交換され、LI 命令フィールドを形成します。この命令フォーマットは、BD フォーマットと同じ方法でAAビットそしてLKビットをもサポートします。
前述の通り、これらの命令フォーマットには様々なバリエーションがあります。しかしながら、これらのフォーマットが大半のPowerPCの命令セットのエンコード方式の性質を象徴すると言えます。
PowerPCは以下のような制御フローの命令セットを提供します。
- 条件付き分岐命令、そして無条件分岐命令
- 「カウントの減分、そして0(ゼロ)であるか無いかで分岐(decrement count and branch if zero/not zero)」の能力
- 絶対そして相対分岐
- 分岐ターゲット・アドレスを指定するために、Link Register または Count Register のコンテントを使用する分岐命令
「Branch to Link Register」の命令を含む全ての分岐命令に、次のシーケンスの命令のアドレスを保存する能力が提供されます。条件付き分岐は、条件として使われる32のCondition Register ビットのうちの1つを指定することを許可し、分岐条件が継承成功されるためにCRビットが0または1なのかどうかを指定します。
CRフィールドのコピーのみならず、ブール演算をCRの特定のビットに行なう場合の命令セットを、PowerPC は提供します。複数の分岐する条件の融合を促し、コストのかかる条件付き分岐の個数の削減に貢献します。表3は、PowerPC のCR論理命令を表記します。
表3. PowerPC CR論理命令
| 簡略記号 | 命令名 |
|---|---|
| crand | CR logical and |
| crandc | CR logical and with complement |
| creqv | CR logical equivalent |
| crnand | CR logical not and |
| crnor | CR logical not or |
| cror | CR logical or |
| crorc | CR logical or with complement |
| crxor | CR logical xor |
加減乗除和差積商、負の符号、比較を含む算術演算を、多くの命令は実行します。多くの形式は即値、オーバーフローの検出、そして桁の繰り上げ(下げ)のためにあります。乗算と除算の命令は複数のサイクルを伴いますので、実装に依存します。表4は、PowerPCの整数演算命令を表記します。
図4. PowerPC 整数演算命令
| 簡略記号 | 命令名 |
|---|---|
| add[o][.] | add [& record OV] [& record CR0] |
| addc[o][.] | add carrying [& record OV] [& record CR0] |
| adde[o][.] | add extended [& record OV] [& record CR0] |
| addi | add immediate |
| addis | add immediate shifted |
| addic[.] | add immediate carrying [& record CR0] |
| addme[o][.] | add to minus one [& record OV] [& record CR0] |
| addze[o][.] | add to zero [& record OV] [& record CR0] |
| divd[o][.] | divide doubleword [& record OV] [& record CR0] |
| divdu[o][.] | divide doubleword unsigned [& record OV] [& record CR0] |
| divw[o][.] | divide word [& record OV] [& record CR0] |
| divwu[o][.] | divide word unsigned [& record OV] [& record CR0] |
| mulhd[.] | multiply high doubleword [& record CR0] |
| mulhdu[.] | multiply high doubleword unsigned [& record CR0] |
| mulhw[.] | multiply high word [& record CR0] |
| mulhwu[.] | multiply high word unsigned [& record CR0] |
| mulld[o][.] | multiply low doubleword [& record OV] [& record CR0] |
| mulli | multiply low immediate |
| mullw[o][.] | multiply low word [& record OV] [& record CR0] |
| neg[o][.] | negate [& record OV] [& record CR0] |
| subf[o][.] | subtract from [& record OV] [& record CR0] |
| subfc[o][.] | subtract from carrying [& record OV] [& record CR0] |
| subfe[o][.] | subtract from extended [& record OV] [& record CR0] |
| subfi | subtract from immediate |
| subfis | subtract from immediate shifted |
| subfic[.] | subtract from immediate carrying [& record CR0] |
| subfme[o][.] | subtract from to minus one [& record OV] [& record CR0] |
| subfze[o][.] | subtract from to zero [& record OV] [& record CR0] |
PowerPC は論理演算の完全なセットを供給し、GPRにて先導するゼロの数のカウントそして符号拡張へのサポートをも提供します。表5は、PowerPC の論理命令を表記します。
表5. PowerPC の論理命令
| 簡略記号 | 命令名 |
|---|---|
| and[.] | and [& record CR0] |
| andc[.] | and with complement [& record CR0] |
| andi. | and immediate & record CR0 |
| andis. | and immediate shifted & record CR0 |
| eqv[.] | equivalent [& record CR0] |
| nand[.] | not and [& record CR0] |
| nor[.] | not or [& record CR0] |
| or[.] | or [& record CR0] |
| orc[.] | or with complement [& record CR0] |
| oris | or immediate shifted |
| ori | or immediate |
| xor[.] | xor [& record CR0] |
| xoris | xor immediate shifted |
| xori | xor immediate |
| cntlzd[.] | count leading zeros doubleword [& record CR0] |
| cntlzw[.] | count leading zeros word [& record CR0] |
| extsb[.] | extend sign byte [& record CR0] |
| extsh[.] | extend sign halfword [& record CR0] |
| extsw[.] | extend sign word [& record CR0] |
表6に示されるように、PowerPC は回転そしてシフト演算のセットを提供します。
表6. PowerPC の回転そしてシフト命令
| 簡略記号 | 命令名 |
|---|---|
| rldc[.] | rotate left doubleword then clear [& record CR0] |
| rldcl[.] | rotate left doubleword then clear left [& record CR0] |
| rldcr[.] | rotate left doubleword then clear right [& record CR0] |
| rldicl[.] | rotate left doubleword immediate then clear left [& record CR0] |
| rldicr[.] | rotate left doubleword immediate then clear right [& record CR0] |
| rldimi[.] | rotate left doubleword immediate then mask insert [& record CR0] |
| rlwimi[.] | rotate left word immediate then mask insert [& record CR0] |
| rlwinm[.] | rotate left word immediate then and with mask [& record CR0] |
| rlwnm[.] | rotate left word then and with mask [& record CR0] |
| sld[.] | shift left doubleword [& record CR0] |
| slw[.] | shift left word [& record CR0] |
| srad[.] | shift right doubleword [& record CR0] |
| sradi[.] | shift right doubleword immediate [& record CR0] |
| sraw[.] | shift right word [& record CR0] |
| srawi[.] | shift right word immediate [& record CR0] |
| srd[.] | shift right doubleword [& record CR0] |
| srw[.] | shift right word [& record CR0] |
PowerPC は確固とした浮動小数点数演算、比較演算、そして変換演算のセットです。ソフトウェアからのサポートがあれば、PowerPC の浮動小数点数演算はANSI/IEEE Standard 754-1985仕様に完全対応します。単精度そして倍精度の浮動小数点フォーマットは全ての算術演算そして比較演算にてサポートされています。
浮動小数点データが倍精度フォーマットのFPRにストアされている間、単精度算術命令は算術演算を実行し、単精度演算時に発生しがちな例外(指数オーバーフロー、アンダーフロー、そして不正確)を探知し、最終結果を単精度に丸め(四捨五入し)ます。
- Load Floating-point Single 命令のセットはストレージのワードにアクセスし、ターゲットFPRに移行する前にその単精度値を倍精度フォーマットに変換します。
- Store Floating-point Single 命令のセットは、ターゲットのワードをストレージにストアする前に、ソースFPRのソース・オペランドを単精度フォーマットに変換します。
特定の浮動小数点の例外クラスは、トラッピングする環境へのサポートを使用可能にしたり使用禁止にしたりします。PowerPC 浮動小数点命令セットの基本そしてオプションの命令セットを、表7に示します。
表7. PowerPC 浮動小数点命令
| 簡略記号 | 命令名 |
|---|---|
| fmr[.] | FP move [& record CR1] |
| fneg[.] | FP negate [& record CR1] |
| fabs[.] | FP absolute value [& record CR1] |
| fnabs[.] | FP negative absolute value [& record CR1] |
| fadd[s][.] | FP add [single] [& record CR1] |
| fsub[s][.] | FP subtract [single] [& record CR1] |
| fmul[s][.] | FP multiply [single] [& record CR1] |
| fdiv[s][.] | FP divide [single] [& record CR1] |
| fsqrt[s][.] | FP square root [single] [& record CR1] |
| fmadd[s][.] | FP multiply-add [single] [& record CR1] |
| fmsub[s][.] | FP multiply-subtract [single] [& record CR1] |
| fnmadd[s][.] | FP negative multiply-add [single] [& record CR1] |
| fnmsub[s][.] | FP negative multiply-subtract [single] [& record CR1] |
| fcmpo | FP compare ordered |
| fcmpu | FP compare unordered |
| fsel[.] | FP select [& record CR1] |
| frsp[.] | FP round to single [& record CR1] |
| fcfid[.] | FP convert from integer doubleword [& record CR1] |
| fctid[z][.] | FP convert to integer doubleword [& round to zero] [& record CR1] |
| fctiw[z][.] | FP convert to integer word [& round to zero] [& record CR1] |
| fres[.] | FP reciprocal estimate single [& record CR1] |
| frsqrte[.] | FP reciprocal square root estimate [& record CR1] |
表8は、基本のPowerPC FPSCR 操作命令セットを表記します。
表8. PowerPC FPSCR 操作命令
| 簡略記号 | 命令名 |
|---|---|
| mcrfs | move to CR from FPSCR |
| mffs[.] | move from FPSCR |
| mtfsb0[.] | move to FPSCR bit 0 |
| mtfsb1[.] | move to FPSCR bit 1 |
| mtfsf[.] | move to FPSCR field |
| mtfsfi[.] | move to FPSCR field immediate |
全てのロードそしてストアの命令は、複数のGPR、または1つのGPRそして命令の即値フィールドを(ストレージ・アクセスのアドレスの指定子として)使用して実行されます。大半のロードそしてストアの命令に与えられたオプションは、命令に生成されたデータの有効アドレスで基本レジスター(つまりRA)のアップデートを実行することです。
下記の項目に対する命令があります。
- バイト、ハーフワード、ダブルワードのサイズ
- GPRまたはFPRとストレージの間でデータを動かす
- GPRまたはFPRとストレージの間でデータを動かす
特殊なストレージ・アクセス命令の例を、以下に記します。
- 複数ワードのロード/ストア
lmwとstmwがあり、最大31個の32-bit ワードを演算できます。 - ストリング命令
これらは128-byte のストリングまで演算できます。 - Memory Synchronization (メモリー同期の)命令
メモリー同期を実装するときにこれらを使います。ストア演算の終了成功を記録するのに、CRのBit 2 (EQ ビット) をセットします。Memsync 命令は以下の項目を含みます。-
lwarx(Load Word and Reserve Indexed) -
ldarx(Load Doubleword and Reserve Indexed) -
stwcx(Store Word Conditional Index) -
stdcx(Store Doubleword Conditional Index)
lwarx/ldarxはロードを実行し、プロセッサーに内在しプログラミング・モデルから隠された予約ビットを設定します。関連するストア命令stwcx./stdcxは、予約ビットが設定され予約ビットをその後にクリアーするのであれば、条件付きのストアを実行します。 -
PowerPC のアーキテクチャーには、ローカル・ストレージ用のスタックの概念はありません。push 又はpop命令や、アーキテクチャーに定義された専用のスタック・ポインター・レジスターがあるわけではありません。しかしながら、C/C++ プログラムに使われる、Embedded Application Binary Interface (EABI)と呼ばれ、スタックのレジスター規約そしてメモリー規約を定義するソフトウェア・スタンダードがあります。EABI は、スタック・ポインターのためにGPR1 、関数引き数の引き渡しにGPR3~GPR7、そして関数からの戻り値にGPR3 を予約します。
C/C++コードへのインターフェースを可能にしたいアセンブリー言語プログラムは、規約を保存するために同様の基準に対応しなくてはなりません。
PowerPC アーキテクチャーは、両方のアプリケーション・レベルのキャッシュ・アクセスへのキャッシュ管理命令を含みます。表9にて、キャッシュ管理命令が表記されています。
表9. キャッシュ管理命令
| 簡略記号 | 命令名 |
|---|---|
| dcbf | Flush Data Cache Line |
| dcbst | Store Data Cache Line |
| dcbt | Touch Data Cache Line (for load) |
| dcbtst | Touch Data Cache Line (for store) |
| dcbz | Zero Data Cache Line |
| icbi | Invalidate Instruction Cache Line |
別のPowerPC 実装にキャッシュ操作コードを移植するときに気を付けてください。キャッシュ命令は別々の実装をとおして一般的なものになり得ますが、キャッシュの構成そしてサイズが変化する可能性が高いのです。例えば、フラッシュを実行するのにキャッシュ・サイズに関する想定を行なうコードは、他のキャッシュ・サイズのために修正されるべきかも知れません。そしてそのうえ、キャッシュの初期化は実装により異なるかも知れません。一部はキャッシュ・タグを自動的にクリアーするためのハードウェアを提供し、他はキャッシュ・タグを無効化するためにソフトウェア・ループを必要とします。
自己修正コードの作成はあまり奨められませんが、ときにはそれは絶対に必要となります。下記のシーケンスはコードの修正を実行するのに使われる命令を示します。
- 修正された命令をストアする。
- 修正された命令を含むキャッシュ・ラインをストレージに強制する
dcbst命令を発行する。 -
dcbstが終了したことを保証するために、sync命令を発行する。 - 修正された命令を含む命令キャッシュ・ラインを無効にする
icbi命令を発行する。 - (キャッシュ・ラインが無効化される前にキャッシュ・ラインからすでにフェッチされた命令の)命令パイプラインをクリアーする
isync命令を発行する。 - ここで修正された命令を実行しても大丈夫でしょう。この命令をフェッチするときに命令キャッシュ・ミスが発生し、修正された命令のストレージからのフェッチにつながります。
大半の実装は、(2つの32-bit レジスターまたは1つの64-bit レジスターを介して読める)64-bit 時間基準を提供し続けました。時間基準へのアクセスの命令そしてSPR番号と同様に、タイマーの増分はファミリーによって異なります。それゆえに、実装をとおしてタイマーのコードを移植する場合には、気を付けてください。追加のタイマーの増分も異なる可能性が高いですが、大半が最低1種類の減分プログラマブル・タイマーを提供します。
複数の実装用にプログラムを組むことを予測されるPowerPC ユーザーは、一般的にコード互換性の保守に関する秘訣を知りたいと思うものです。下記の提案は、移植に関連する問題の最小化に貢献します。
- 可能な限りCコードを使用。
多くの場合、性能的に手書きのアセンブリー・コードと比較しても劣らないコードを、今日のCコンパイラーは制作できます。Book I コードであるCコードは、コード互換性を保証します。 - プロセッサーに特化した命令を可能な限り回避。
探すのに苦労しますので、Cの中にプロセッサーに特化したアセンブリー命令を組み込むのは控えましょう。装置に依存するレジスターや命令を含む(特定のプロセッサーに特化した)コードを隔離してください。典型的な例として、ブートのシーケンスや装置のドライバーがあげられますが、これらは浮動小数点のコード(とてつもなく長いのも含む)を含むかも知れません。前提事項と依存関係をこまめに記録しましょう。 - 適当な時にのみ、Processor Version Register (PVR)を使用。
少しずつ異なる実装にわたる共通のコードは便利で、PVR は意思決定に使われます。しかし、大掛かりな修正が必要な場合(例:PowerPC AS 対 Book E MMU コード)には、個別のコード・ベースを推奨します。
PowerPC AS と PowerPC Book Eの両方は、元のPowerPC アーキテクチャーにて定義されるアプリケーション・レベルのインフラストラクチャーをサポートし、それぞれ特定の市場への最適化を提供します。
2つある操作モードのうちの1つでは、PowerPC ASは元のPowerPCとほとんど全く一緒です。低コスト、低出力そして(それにもかかわらずに)構造上柔軟性の高い組み込まれた実装用に最適化されたBook IIIクラスの定義にてPowerPC Book E は別の路線を進み続けました。当然ですが、ダブルワード整数命令は32-bit実装には無く、浮動小数点命令は大半の組み込まれた実装のソフトウェア・エミュレーションのみをとおしてサポートされてきました。
しかしながら、アプリケーション・バイナリーはPowerPC アーキテクチャー系統樹の枝の間を動き回るのに充分な機会に恵まれています。
- IBM PowerPC のサイトで、より多くの情報を入手しましょう。
- IBM PowerPC Web site technical libraryにて、詳細にわたる技術情報がユーザー・マニュアルで入手可能です。技術的なPowerPC Product Briefs そしてPPC white papersにて、あふれんばかりの情報を入手できます。
- PowerPC Book Eは『組み込み』の市場に向けて最適化されており、2つある演算のモードのうちの1つに関して言えば、PowerPC AS は元のPowerPCと事実上同一です。
- PowerPCアセンブリー(developerWorks、2002年)は、PowerPC のパースペクティブからアセンブリー言語の全体図を観察し、3種のアーキテクチャーの例を明確にします。
- 「A programmer's view of performance monitoring in the PowerPC microprocessor」(IBM Systems Journal、1997年)は、どのようにして、PowerPCのオンチップ Performance Monitor (PM)を駆使して、様々なワークロードでプロセッサー、ソフトウェア、そしてシステムの属性を分析するかを説明します。
- IBM PowerPC 4xx組み込みプロセッサーの最適化されたライブラリー関数を、PowerPC Performance Libraries Project はいくつか提供します。浮動小数点のエミュレーション、共通のCライブラリーのストリング、そしてメモリー機能を網羅します。
- PMAPI は、選ばれたIBM POWERPC マイクロプロセッサーを含むハードウェア用パフォーマンス・カウンターへのアクセスを提供するAPIの入ったライブラリーです。
- PowerPCのアーキテクチャーは、「Reduced Instruction Set Computer (RISC) 」のアーキテクチャーです。
- POWERでLinux の開発を始めるには、企業用のアプリケーションを作成するには必要不可欠なLinuxの分散、コンパイラー、そしてライブラリーへのガイドである「PowerでLinux開発者を強化する」をお読みください。
- IBMの Linux on PowerPCチームの目的は、組み込み、32-bit、そして64-bitプロセッサーのLinuxを拡張し進化させることです。互換性に関する情報、文書、コード、そしてその他の事柄については、Linux on PowerPC home pageでお願いします。
- IBMのLinux Technology Centerは、POWER関連プログラマーへのリソースのコンパイルを提供します。
- IBMからのPOWER関連のLinux 提供物の全体像を、Linux on POWER は提供します。
- developerWorksLinux zoneにて、より多くのLinux 開発者向けリソースを探しましょう。