* Rev2のバックエンド命令セット(32ビット単位版)
-(by [[K]], 2014.06.21)

** (0)
-このページは[[page0072]]の派生で、hh4がわずらわしい人向けです。なんと32ビット単位で記述されています。ビット演算が最小限になるように設計されています。
-以下のデータを「ビッグエンディアン」でバイト列に直せば、OSECPU-VMが正しく解釈できる命令コードになります。
-appackというツールを使えば、以下のバックエンドのバイトコードからコンパクトなフロントエンドコードに変換できます(予定)。
-OSECPU-VMのrev2用のコンパイラとかを作る人は、このページの内容が役立つはずです。
--もちろん直接hh4でコンパクトに出してくれてもいいけど、それはそれなりに面倒だと思います。そんなことで手間をかけるのは本質じゃないよね、ということで。
-osecpu-m32は以下のフォーマットしか受け付けません。なお、この規格は[[page0072]]のサブセットです。
-osecpu-m32では、整数のtypは全てSInt32(=0006)だけです。FxxのtypもFloat32だけです。だからVMを書くのも簡単です。

** (1) 基本構成
-シグネチャは 05E200CF EE7FF188 の8バイト。

-命令表: (rはRxx+0x76000000のこと、pはPxx+0x76000000のこと、bitは定数0x7600000020を入れておく、uimmは符号なし整数のことでこれも+76000000、その他特記のない限り全て+0x76000000する)
,+0,+1,+2,+3,+4,+5,+6,+7,命令表記,説明,補足
,76000000,,==,==,==,==,==,==,"NOP();","何もしない",
,76000001,uimm,opt,,==,==,==,==,"LB(opt, uimm);","ラベル番号uimmの定義","optは0~2"
,76000002,FFFFF788,imm,r,bit,,==,==,"LIMM(bit, r, imm);","整数レジスタの定数代入 r=imm","immは+76000000「しない」"
,76000003,uimm,p,,==,==,==,==,"PLIMM(p, uimm);","ポインタレジスタのラベル番号代入 p=uimm","P3Fに代入すればジャンプ命令になる"
,76000004,r,,==,==,==,==,==,"CND(r);","rが奇数の場合のみ後続する1命令を実行","CND命令は下位1bitしか見ない"
,76000008,p,typ,76000000,r,bit,,==,"LMEM(bit, r, typ, p, 0);","メモリから値を読み込む",
,76000009,r,bit,p,typ,76000000,,==,"SMEM(bit, r, typ, p, 0);","メモリに値を書き込む",
,7600000E,p1,typ,r,bit,p0,,==,"PADD(bit, p0, typ, p1, r);","p0=p1+r",
,76000010,r1,r2,r0,bit,,==,==,"OR(bit, r0, r1, r2);","ビット演算 r0=r1|r2","r1=r2にすると、CP(r0,r1);になる"
,76000011,r1,r2,r0,bit,,==,==,"XOR(bit, r0, r1, r2);","ビット演算 r0=r1^r2",
,76000012,r1,r2,r0,bit,,==,==,"AND(bit, r0, r1, r2);","ビット演算 r0=r1&r2",
,76000013,r1,r2,r0,bit,,==,==,"SBX(bit, r0, r1, r2);","符号ビット拡張","r2はR3Fしか指定できない"
,76000014,r1,r2,r0,bit,,==,==,"ADD(bit, r0, r1, r2);","r0=r1+r2",
,76000015,r1,r2,r0,bit,,==,==,"SUB(bit, r0, r1, r2);","r0=r1-r2",
,76000016,r1,r2,r0,bit,,==,==,"MUL(bit, r0, r1, r2);","r0=r1*r2",
,76000018,r1,r2,r0,bit,,==,==,"SHL(bit, r0, r1, r2);","r0=r1<<r2",
,76000019,r1,r2,r0,bit,,==,==,"SAR(bit, r0, r1, r2);","r0=r1>>r2",
,7600001A,r1,r2,r0,bit,,==,==,"DIV(bit, r0, r1, r2);","r0=r1/r2",
,7600001B,r1,r2,r0,bit,,==,==,"MOD(bit, r0, r1, r2);","r0=r1%r2",
,7600001E,p1,p0,,==,==,==,==,"PCP(p0, p1);","p0=p1","P3Fに代入すればジャンプ命令になる"
,76000020,r1,r2,bit1,r0,bit0,,==,"CMPE(bit0, bit1, r0, r1, r2);","比較命令 if(r1==r2){r0=-1}else{r0=0}","bit1はr1とr2のbit、bit0はr0のbit"
,76000021,r1,r2,bit1,r0,bit0,,==,"CMPNE(bit0, bit1, r0, r1, r2);","比較命令 if(r1!=r2)",
,76000022,r1,r2,bit1,r0,bit0,,==,"CMPL(bit0, bit1, r0, r1, r2);","比較命令 if(r1<r2)",
,76000023,r1,r2,bit1,r0,bit0,,==,"CMPGE(bit0, bit1, r0, r1, r2);","比較命令 if(r1>=r2)",
,76000024,r1,r2,bit1,r0,bit0,,==,"CMPLE(bit0, bit1, r0, r1, r2);","比較命令 if(r1<=r2)",
,76000025,r1,r2,bit1,r0,bit0,,==,"CMPG(bit0, bit1, r0, r1, r2);","比較命令 if(r1>r2)",
,76000026,r1,r2,bit1,r0,bit0,,==,"TSTZ(bit0, bit1, r0, r1, r2);","比較命令 if((r1&r2)==0)",
,76000027,r1,r2,bit1,r0,bit0,,==,"TSTNZ(bit0, bit1, r0, r1, r2);","比較命令 if((r1&r2)!=0)",
,76000028,p0,p1,r,bit,,==,==,"PCMPE(bit, r, p0, p1);","ポインタ比較命令 if(p0==p1)",
,76000029,p0,p1,r,bit,,==,==,"PCMPNE(bit, r, p0, p1);","ポインタ比較命令 if(p0!=p1)",
,7600002A,p0,p1,r,bit,,==,==,"PCMPL(bit, r, p0, p1);","ポインタ比較命令 if(p0<p1)",
,7600002B,p0,p1,r,bit,,==,==,"PCMPGE(bit, r, p0, p1);","ポインタ比較命令 if(p0>=p1)",
,7600002C,p0,p1,r,bit,,==,==,"PCMPLE(bit, r, p0, p1);","ポインタ比較命令 if(p0<=p1)",
,7600002D,p0,p1,r,bit,,==,==,"PCMPG(bit, r, p0, p1);","ポインタ比較命令 if(p0>p1)",
,7600002E,typ,len,,==,==,==,==,"data(typ, len);","データ定義命令",
,76000030,r0,bit0,r1,bit1,p,,==,"talloc","r0にタイプ番号、r1は個数",
,76000031,p,r0,bit0,r1,bit1,,==,"tfree","r0にタイプ番号、r1は個数",
,76000032,r0,bit0,r1,bit1,p,,==,"malloc","r0にタイプ番号、r1は個数",
,76000033,p,r0,bit0,r1,bit1,,==,"mfree","r0にタイプ番号、r1は個数",
,7600003C,rn,bit0,pn,fn,bit1,0,,"enter","rn,pn,fnはuimmで保存する個数、bit0はRxxのbit、bit1はFxxのbit",
,7600003D,rn,bit0,pn,fn,bit1,0,,"leave",,
,760000FD,FFFFF788,imm,dr,,==,==,==,"LIDR(dr, imm);","dr=imm","immは+76000000「しない」"
,760000FE,uimm,len,,==,==,==,==,"REMx(...);","何もしない",
,760000FE,760001FF,76000000,,==,==,==,==,"break-point","",
-(まだ書き途中)


トップ   編集 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS