Rev2のベタ命令セット(バックエンド命令セット)

  • (by K, 2014.04.24)

(1) 基本構成

  • 最初に3バイトのシグネチャがある。
    05 E2 00
    • なお、OSECPU-VM命令セットは、他の様々な用途に応用される可能性があると思うが、その場合は、このシグネチャを強要しない(推奨もしない)。それぞれがそれぞれの方法でOSECPU-VMリビジョン2のバックエンドの命令セットであることを判断する。
    • というか、そもそもここに書く命令セットは「ベタ」であって、サイズの追及もされていない冗長なものなので、これをそのまま応用することはないような気もする。
  • シグネチャの後はhh4エンコードで命令列を並べる。データ系命令以外はこれに従う。
    • hh4: http://osask.net/w/634.html
    • [Q]なぜ以前のようにバイト列で定義しないのですか?
    • [A]OSECPU-VMは32bitに限定されない仕様に近づくから。・・・完全に32bitの制約が無くなるのが「第三世代OSASK」で、OSECPU-VMはそのうちの32bit以下だけをサポートしたものに相当する。
    • 32bit前提じゃなくなると、immやtypが32bit固定だとは言いにくくなる。だから単純なバイト列では規定できない。それで可変ビット長なhh4を採用。hh4なら固定ビット長方式もできる。
  • 命令表: (rはRxxのこと、pはPxxのこと、bitは定数32を入れておくとよい、uimmは符号なし整数のこと)
    +0+1+2+3+4+5+6+7命令表記説明
    00NOP();
    01uimmoptLB(opt, uimm);
    02immrbitLIMM(bit, r, imm);
    03uimmpPLIMM(p, uimm);
    04rCND(r);CND命令は下位1bitしか見ない
    05(reserve)API特別構文用
    06(reserve)ループ構文用
    07(reserve)ループ構文用
    08ptyp0rbitLMEM(bit, r, typ, p, 0);
    09rbitptyp0SMEM(bit, r, typ, p, 0);
    0Ap1typ0p0-PLMEM(p0, typ, p1, 0);
    0Bp0p1typ0-PSMEM(p0, typ, p1, 0);
    0C(LEA)
    0D(reserve)型指定プリフィクス用
    0Ep1typrbitp0PADD(bit, p0, typ, p1, r);
    0Fp0p1typrbit-PDIF(r, typ, p0, p1);
    10r1r2r0bitOR(bit, r0, r1, r2);r1=r2にすると、CP(r0,r1);になる
    11r1r2r0bitXOR(bit, r0, r1, r2);
    12r1r2r0bitAND(bit, r0, r1, r2);
    13r1r2r0bitSBX(bit, r0, r1, r2);符号ビット拡張、r2はR3Fしか指定できない
    14r1r2r0bitADD(bit, r0, r1, r2);
    15r1r2r0bitSUB(bit, r0, r1, r2);
    16r1r2r0bitMUL(bit, r0, r1, r2);
    17
    18r1r2r0bitSHL(bit, r0, r1, r2);
    19r1r2r0bitSAR(bit, r0, r1, r2);
    1Ar1r2r0bitDIV(bit, r0, r1, r2);
    1Br1r2r0bitMOD(bit, r0, r1, r2);
    1C(PLMT0)
    1D(PLMT1)
    1Ep1p0PCP(p0, p1);
    1F(PCST)
    20r1r2bit1r0bit0CMPE(bit0, bit1, r0, r1, r2);bit1はr1とr2のbit、bit0はr0のbit
    21CMPNE
    22CMPL
    23CMPGE
    24CMPLE
    25CMPG
    26TSTZ
    27TSTNZ
    28p0p1rbit-PCMPE(r, p0, p1);
    29PCMPNE
    2APCMPL
    2BPCMPGE
    2CPCMPLE
    2DPCMPG
    2Etyplen...datatypもlenもuimm, data部分はhh4エンコードをしない生データ
    2Fuimm(reserve)各種プリフィクス
    30r0bit0r1bit1ptallocr0はtyp、r1は個数、bit0はr0のbit、bit1はr1のbit
    31pr0bit0r1bit1tfree
    32r0bit0r1bit1pmalloc
    33pr0bit0r1bit1mfree
    34
    35
    36
    37
    38(reserve)PALMEM構文用
    39(reserve)PASMEM構文用
    3A(reserve)PAPLMEM構文用
    3B(reserve)PAPSMEM構文用
    3Crnbit0pnfnbit10ENTERrn,pn,fnはuimmで保存する個数、bit0はRxxのbit、bit1はFxxのbit
    3Drnbit0pnfnbit10LEAVE
    3E(reserve)call構文用
    3F(reserve)call構文用
    40modfimmfbitFLIMM
    41f1bit1f0bit0FCPbit0>bit1でもよい(つまり精度拡張にも使える)
    42rbit1fbit0CNVIF
    43fbit1rbit0CNVFI
    44(FLMEM)
    45(FSMEM)
    46(reserve)PAFLMEM構文用
    47(reserve)PAFSMEM構文用
    48f1f2bit1rbit0FCMPE
    49FCMPNE
    4AFCMPL
    4BFCMPGE
    4CFCMPLE
    4DFCMPG
    4ENaN検出用の命令にするかも
    4FNaN検出用の命令にするかも
    50FADD
    51FSUB
    52FMUL
    53FDIV
    54(reserve)
    55(reserve)
    56(reserve)
    57(reserve)
    58FCOS
    59FSIN
    5AFTAN
    5B(reserve)FCOSIN構文用
    78(reserve)bit/bit1オーバーライド構文用
    79(reserve)bit0オーバーライド構文用
    FDimmdrLIDRload imm. to debug register
    FEuimmlenremark
  • 2013年のころのバイトコードと比較すると、データの流れが左から右になっている。
    • なぜ?・・・そのほうがデコーダを書きやすいから。
  • typはpの直後に来る。
    • なぜ?・・・そのほうが型推論を書きやすいから。
  • bitってなんですか?
    • Rxxの演算精度のこと。bit=32の場合、Rxxは32bitかそれ以上で計算してほしいということ。
    • これが何のために必要かというと、今まではcharの演算で済むときでさえ無条件で32bit演算していたわけで、これは32bitのCPUでは大して問題にならないとしても、8bitのCPUにとっては大きなロスになる。bitを指定できないとこの無駄をVMは「気づくことすらできなかった」が、bitが入ることでこれを反映して無駄を取り除けるようになる。
    • 「第三世代OSASK」では、bitは64や256などを指定してもよくなる。
    • このようにアーキテクチャが固有の標準bitを持たないことを「ビットフリー」ということにする。
  • C0~DFまでは独自拡張用に開けておくので勝手に使って構わない。
  • E0~EFは内部エラー通知用。

こめんと欄

  • hikarupsp_WebCPU-VM_internalをすごく参考にしています! -- K 2014-04-24 (木) 17:09:32
  • (こちらにあったhikarupspさんの質問とその回答はpage0082に引っ越しました。) -- K 2014-06-09 (月) 11:23:24

コメントお名前NameLink

トップ   編集 凍結 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS
Last-modified: 2014-07-31 (木) 11:35:21 (1631d)