EntisGLS4/Sakura2仮想マシンの固有機能
 
SIMD命令への対応 
フレーム駆動スレッド
実行時関数情報


■ 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仮想マシン上の関数を直接呼び出すような、インタプリタの設計/実装が容易となります。