■ SIMD命令への対応
Sakura2仮想マシンでは仮想マシンの命令セットにSIMD命令が含まれており、インラインアセンブラSIMD命令を利用したコードを直接記述する事が出来ます。
実行時にはJITコンパイラによって実行マシンのSIMD命令へ変換され実行されます。
実CPUでSIMDニーモニックを記述する場合との違いとして、実行プロセッサが実際に命令に対応しているかどうかの判定や、命令セット毎に同じ処理を複数用意する必要がない点が挙げられます。
従って、Sakura2仮想マシンのSIMD命令で記述しておけば、Intel x86系CPUのMMX、MMX2、SSE、SSE2命令や、ARM系CPUのVFP、NEON命令のパフォーマンスの恩恵を受けられます。
因みに、詞葉コンパイラのインラインアセンブラには、構造化プログラミングなどの高級な記述に対応しているので、アセンブリコードの記述を加速します。
(Sakura2仮想マシン・インラインアセンブラ例)
void SGLPaintBuffer::PaintNormalBlendProc
( SGLPalette * pargbDst, float32_t * pzBuf,
const SGLPalette * pargbSrc, size_t nPixels )
{
asm
{
REG LOAD pargbSrc
REG LOAD pargbDst
REG LOAD nPixels
REG ALLOC argbSrc : uint32
REG ALLOC argbDst : uint32
REG ALLOC aSrc : int32
REG ALLOC aMask : uint32
REG ALLOC rgbMask : uint32
//
prefetch.tlb0 pargbSrc
prefetch.tlb1 pargbDst
move aMask, 0xFF000000
move rgbMask, 0x00FFFFFF
.WHILE (uint32) nPixels != (uint32) #zero
load.uint32 argbSrc, [pargbSrc]
//
.IF (uint32) argbSrc != (uint32) #zero
psrl.d aSrc, argbSrc, 24
.IF (int32) aSrc > (int32) 0xFD
or argbSrc, aMask
store.uint32 [pargbDst], argbSrc
.ELSE
load.uint32 argbDst, [pargbDst]
xor aSrc, #ff
padd.d aSrc, #one
xor argbDst, aMask
pshuf.w aSrc, aSrc, 0
punpack.lbw argbDst, #zero
pmul.lw argbDst, aSrc
and argbSrc, rgbMask
psrl.w argbDst, argbDst, 8
pcvt.uswb argbDst, #zero
padd.ub argbDst, argbSrc
xor argbDst, aMask
store.uint32 [pargbDst], argbDst
.ENDIF
.ENDIF
//
add pargbSrc, sizeof(SGLPalette)
add pargbDst, sizeof(SGLPalette)
dec nPixels
.ENDW
unfetch.tlb0 pargbSrc
unfetch.tlb1 pargbDst
}
}
Sakura2仮想マシンでは通常のスレッドの他、フレーム駆動型のスレッドも利用出来ます。
フレーム駆動型スレッドは原始的なCPUタスク処理を高級に扱えるようにしたスレッドで、ある処理の区間を別のスレッドから関数のように呼び出して利用する事が出来る機能です。
この機能はゲームなどで、キャラクターやオブジェクトの動作を記述するのに有効です。
// 呼び出し元
SThread thread ;
if ( thread.BeginFrameThread( proc, 0x400 ) == errPending )
{
while ( thread.ContinueFrameThread() == errPending )
/*
BeginFrameThread や ContinueFrameThread 呼び出しでは
SleepFrame までが実行される
*/ ;
}
// フレーム駆動スレッド例
for ( int i = 0; i < 100; i ++ )
{
MoveLeft();
SleepFrame(1); // 毎フレーム左へ
}
SleepFrame(60); // 60フレーム待機
for ( int i = 0; i < 100; i ++ )
{
MoveRight();
SleepFrame(1); // 毎フレーム右へ
}
Sakura2仮想マシンでは、基本的に全ての関数のアドレスを関数名から取得出来ます。
Win32 で例えると、全ての関数が暗黙にDLLエクスポートされているような状態となっています。
関数名は基本的に関数名そのまま(クラスのメンバや名前空間のローカル関数の場合にはそれら名前空間を「::」で結合した名前)です。
更に、現在のバージョンでは未実装ですが、将来のバージョンでは簡易なプロトタイプ情報を取得出来るようになる予定です。
これによって、インタプリタ言語上からSakura2仮想マシン上の関数を直接呼び出すような、インタプリタの設計/実装が容易となります。