6.2.3 C Code restrictions ¶
Vmgen は、ユーザー指定の C 言語コードがスタック・ポインターやスタック項目にアクセスせず、
命令ポインターへのアクセスは特殊なマクロを介してのみ発生するという想定に基づいて、 コードを生成し、 いくつかの最適化を実行します。 一般に、
あなたはこれらの制限に注意する必要があります。 ただし、 あなたがこれらの制限を破る必要がある場合は、 以下をお読みください。
スタックまたはスタック・ポインターに直接アクセスすると、 いくつかの理由で問題が発生する可能性があります:
- Vmgen はオプションで、 スタック・トップの項目をローカル変数(レジスターに割り当てられる)にキャッシュすることをサポートします。
これは最も頻繁に起こるトラブルの原因です。 これに対処するには、 スタック・トップ・キャッシュを使用しない(マシンによって異なるが、 減速係数 1 ~
1.4)か、 あるいは、 問題のある C 言語コードの先頭にフラッシュ・コード(たとえば ‘IF_spTOS(sp[...] =
spTOS);’)を挿入し、 最後にコードをリロードする(たとえば ‘IF_spTOS(spTOS =
sp[0])’)かのいずれかで対処できます。 Vmgen は、 ユーザー指定の C 言語コードの開始前にスタック・ポインターの更新を挿入するため、
フラッシュ・コードではそれを修正するインデックスを使用する必要があります。 将来的には、 C 言語コードで特別な文字列を指定することによって、
このフラッシュが自動的に行われるようになる可能性があります。
- Vmgen で生成されたコードは、 ユーザーが指定した C
言語コードの前にスタック項目をスタック・ポインターでインデックス付けされたメモリーから変数にロードし、 その後、
変数からスタック・ポインターでインデックス付けされたメモリーに格納します。 C
言語コードでスタック・ポインターを介してスタックに書き込みを行った場合、 変数には影響せず、 その書き込みは C
言語コードの格納によって上書きされる可能性があります。 同様に、 スタック・ポインターを使用したスタックからの読み取りは、 同じ VM
命令内のスタック項目の計算を反映しません。
- スーパー命令(superinstructions)は、 スーパー命令全体にわたってスタック項目を変数に保持します。 したがって、
スタックまたはスタック・ポインターにアクセスする VM 命令をスーパー命令のコンポーネントとして含めるべきではありません(see VM profiler)。
命令ポインターには、 そのための特別なマクロ(‘IP’, ‘SET_IP’,
‘IPTOS’)を介してのみアクセスする必要があります。 これにより、
これらのマクロをいくつかの方法で実装して最高のパフォーマンスを実現できるようになります。 ‘IP’ は次の命令を指していて、
‘IPTOS’ はその内容です。