* Rev2のベタ命令セット(バックエンド命令セット) -(by [[K]], 2014.04.24) ** (1) 基本構成 -最初に3バイトのシグネチャがある。 05 E2 00 --なお、OSECPU-VM命令セットは、他の様々な用途に応用される可能性があると思うが、その場合は、このシグネチャを強要しない(推奨もしない)。それぞれがそれぞれの方法でOSECPU-VMリビジョン2のバックエンドの命令セットであることを判断する。 ---応用を示唆する例: [[すべてがOSECPUアプリになる?>page0059]] --というか、そもそもここに書く命令セットは「ベタ」であって、サイズの追及もされていない冗長なものなので、これをそのまま応用することはないような気もする。 -シグネチャの後は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|命令表記 |説明| |00| | | | | | | |NOP(); | | |01|uimm|opt| | | | | |LB(opt, uimm); | | |02|imm |r |bit | | | | |LIMM(bit, r, imm); | | |03|uimm|p | | | | | |PLIMM(p, uimm); | | |04|r | | | | | | |CND(r); |CND命令は下位1bitしか見ない| |05| | | | | | | |(reserve) |API特別構文用| |06| | | | | | | |(reserve) |ループ構文用| |07| | | | | | | |(reserve) |ループ構文用| |08|p |typ|0 |r |bit| | |LMEM(bit, r, typ, p, 0);| | |09|r |bit|p |typ|0 | | |SMEM(bit, r, typ, p, 0);| | |0A|p1 |typ|0 |p0 | | | |-PLMEM(p0, typ, p1, 0);| | |0B|p0 |p1 |typ |0 | | | |-PSMEM(p0, typ, p1, 0);| | |0C| | | | | | | |(LEA) | | |0D| | | | | | | |(reserve) |型指定プリフィクス用| |0E|p1 |typ|r |bit|p0 | | |PADD(bit, p0, typ, p1, r);| | |0F|p0 |p1 |typ |r |bit| | |-PDIF(r, typ, p0, p1); | | |10|r1 |r2 |r0 |bit| | | |OR(bit, r0, r1, r2); |r1=r2にすると、CP(r0,r1);になる| |11|r1 |r2 |r0 |bit| | | |XOR(bit, r0, r1, r2); | | |12|r1 |r2 |r0 |bit| | | |AND(bit, r0, r1, r2); | | |13|r1 |r2 |r0 |bit| | | |SBX(bit, r0, r1, r2); |符号ビット拡張、r2はR3Fしか指定できない| |14|r1 |r2 |r0 |bit| | | |ADD(bit, r0, r1, r2); | | |15|r1 |r2 |r0 |bit| | | |SUB(bit, r0, r1, r2); | | |16|r1 |r2 |r0 |bit| | | |MUL(bit, r0, r1, r2); | | |17| | | | | | | | | | |18|r1 |r2 |r0 |bit| | | |SHL(bit, r0, r1, r2); | | |19|r1 |r2 |r0 |bit| | | |SAR(bit, r0, r1, r2); | | |1A|r1 |r2 |r0 |bit| | | |DIV(bit, r0, r1, r2); | | |1B|r1 |r2 |r0 |bit| | | |MOD(bit, r0, r1, r2); | | |1C| | | | | | | |(PLMT0) | | |1D| | | | | | | |(PLMT1) | | |1E|p1 |p0 | | | | | |PCP(p0, p1); | | |1F| | | | | | | |(PCST) | | |20|r1 |r2 |bit1|r0 |bit0| | |CMPE(bit0, bit1, r0, r1, r2);|bit1はr1とr2のbit、bit0はr0のbit| |21| | | | | | | |CMPNE | | |22| | | | | | | |CMPL | | |23| | | | | | | |CMPGE | | |24| | | | | | | |CMPLE | | |25| | | | | | | |CMPG | | |26| | | | | | | |TSTZ | | |27| | | | | | | |TSTNZ | | |28|p0 |p1 |r |bit| | | |-PCMPE(r, p0, p1); | | |29| | | | | | | |PCMPNE | | |2A| | | | | | | |PCMPL | | |2B| | | | | | | |PCMPGE | | |2C| | | | | | | |PCMPLE | | |2D| | | | | | | |PCMPG | | |2E|typ |len|... | | | | |data |typもlenもuimm, data部分はhh4エンコードをしない生データ| |2F|uimm| | | | | | |(reserve) |各種プリフィクス| |30|r0 |bit0|r1 |bit1|p | | |talloc |r0はtyp、r1は個数、bit0はr0のbit、bit1はr1のbit| |31|p |r0 |bit0|r1 |bit1| | |tfree | | |32|r0 |bit0|r1 |bit1|p | | |malloc | | |33|p |r0 |bit0|r1 |bit1| | |mfree | | |34| | | | | | | | | | |35| | | | | | | | | | |36| | | | | | | | | | |37| | | | | | | | | | |38| | | | | | | |(reserve) |PALMEM構文用| |39| | | | | | | |(reserve) |PASMEM構文用| |3A| | | | | | | |(reserve) |PAPLMEM構文用| |3B| | | | | | | |(reserve) |PAPSMEM構文用| |3C|rn |bit0|pn |fn |bit1|0| |ENTER |rn,pn,fnはuimmで保存する個数、bit0はRxxのbit、bit1はFxxのbit| |3D|rn |bit0|pn |fn |bit1|0| |LEAVE | | |3E| | | | | | | |(reserve) |call構文用| |3F| | | | | | | |(reserve) |call構文用| |40|mod|fimm|f |bit| | | |FLIMM | | |41|f1 |bit1|f0 |bit0| | | |FCP |bit0>bit1でもよい(つまり精度拡張にも使える)| |42|r |bit1|f |bit0| | | |CNVIF | | |43|f |bit1|r |bit0| | | |CNVFI | | |44| | | | | | | |(FLMEM) | | |45| | | | | | | |(FSMEM) | | |46| | | | | | | |(reserve) |PAFLMEM構文用| |47| | | | | | | |(reserve) |PAFSMEM構文用| |48|f1 |f2 |bit1|r |bit0| | |FCMPE | | |49| | | | | | | |FCMPNE | | |4A| | | | | | | |FCMPL | | |4B| | | | | | | |FCMPGE | | |4C| | | | | | | |FCMPLE | | |4D| | | | | | | |FCMPG | | |4E| | | | | | | | |NaN検出用の命令にするかも| |4F| | | | | | | | |NaN検出用の命令にするかも| |50| | | | | | | |FADD | | |51| | | | | | | |FSUB | | |52| | | | | | | |FMUL | | |53| | | | | | | |FDIV | | |54| | | | | | | |FCOS | | |55| | | | | | | |FSIN | | |56| | | | | | | |FTAN | | |57| | | | | | | |(reserve) |FCOSIN構文用| |54| | | | | | | |(reserve) | | |55| | | | | | | |(reserve) | | |56| | | | | | | |(reserve) | | |57| | | | | | | |(reserve) | | |58| | | | | | | |FCOS | | |59| | | | | | | |FSIN | | |5A| | | | | | | |FTAN | | |5B| | | | | | | |(reserve) |FCOSIN構文用| |78| | | | | | | |(reserve) |bit/bit1オーバーライド構文用| |79| | | | | | | |(reserve) |bit0オーバーライド構文用| |FD|imm |dr | | | | | |LIDR |load imm. to debug register| |FE|uimm|len| | | | | |remark | | //レジスタの一部のデータだけが保存されることを理解しているというメモリストア系のプリフィクス(2F) -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]] SIZE(10){2014-04-24 (木) 17:09:32} -(こちらにあったhikarupspさんの質問とその回答は[[page0082]]に引っ越しました。) -- ''K'' SIZE(10){2014-06-09 (月) 11:23:24} #comment