WebCPU-VMの内部仕様

OpCodeMap(Backend)

/+0+1+2+3+4+5+6+7+8+9+A+B+C+D+E+F
+00NOPLBLIMMPLIMMCND+5+6+7LMEMSMEM+A+B+C+DPADDPDIF
+10CP/ORXORAND+3ADDSUBMUL+7SHLSARDIVMOD+C+DPCP+F
+20CMPECMPNECMPLCMPGECMPLECMPGTSTZTSTNZPCMPEPCMPNEPCMPLPCMPGEPCMPLEPCMPG+E+F
+30+0+1MALLOC+3DATA+5+6+7+8+9+A+B+C+D+E+F
+40+0+1+2+3+4+5+6+7+8+9+A+B+C+D+E+F
+50+0+1+2+3+4+5+6+7+8+9+A+B+C+D+E+F
+60+0+1+2+3+4+5+6+7+8+9+A+B+C+D+E+F
+70+0+1+2+3+4+5+6+7+8+9+A+B+C+D+E+F
+80+0+1+2+3+4+5+6+7+8+9+A+B+C+D+E+F
+90+0+1+2+3+4+5+6+7+8+9+A+B+C+D+E+F
+A0+0+1+2+3+4+5+6+7+8+9+A+B+C+D+E+F
+B0+0+1+2+3+4+5+6+7+8+9+A+B+C+D+E+F
+C0+0+1+2+3+4+5+6+7+8+9+A+B+C+D+E+F
+D0+0+1+2+3+4+5+6+7+8+9+A+B+C+D+E+F
+E0+0+1+2+3+4+5+6+7+8+9+A+B+C+D+E+F
+F0+0+1+2+3+4+5+6+7+8+9+A+B+C+DREMARK+F
OSECPUOSECPUOSECPUOSECPUOSECPUOSECPUOSECPUOSECPUOSECPUOSECPUOSECPUOSECPUOSECPUOSECPUOSECPUOSECPU

実装済みの命令

オペコードデバッグモード表記説明
...1......2......3......4......5......6......7......8......9.....10...
00NOP();(No operation)
01optimm32LB(opt, imm32);set label#imm32 to current address.
02reg0Rimm32LIMM(reg0R, imm32);reg0R = imm32;
03reg0Rimm32PLIMM(reg0R, imm32);reg0R = Pointer of label #imm32;
04reg0RCND(reg0R);if((reg0R & 1) == 1){ execute next; } else { pass next; }
08reg0Rtyp32reg1P00LMEM(reg0R, typ32, reg1P, 0);reg0R = *((typ32 *) reg1P);
09reg0Rtyp32reg1P00SMEM(reg0R, typ32, reg1P, 0);*((typ32 *) reg1P) = reg0R;
0Ereg0Ptyp32reg1Preg2RPADD(reg0P, typ32, reg1P, reg2R);reg0P = reg1P + reg2R;
0Freg0Rtyp32reg1Preg2PPDIF(reg0R, typ32, reg1P, reg2P);reg0R = reg1P - reg2P;
10reg0Rreg1RFFCP(reg0R, reg1R);reg0R = reg1R;
10reg0Rreg1Rreg2ROR(reg0R, reg1R, reg2R);reg0R = (reg1R | reg2R);
11reg0Rreg1Rreg2RXOR(reg0R, reg1R, reg2R);reg0R = (reg1R ^ reg2R);
12reg0Rreg1Rreg2RAND(reg0R, reg1R, reg2R);reg0R = (reg1R & reg2R);
14reg0Rreg1Rreg2RADD(reg0R, reg1R, reg2R);reg0R = (reg1R + reg2R);
15reg0Rreg1Rreg2RSUB(reg0R, reg1R, reg2R);reg0R = (reg1R - reg2R);
16reg0Rreg1Rreg2RMUL(reg0R, reg1R, reg2R);reg0R = (reg1R * reg2R);
18reg0Rreg1Rreg2RSHL(reg0R, reg1R, reg2R);reg0R = (reg1R << reg2R);
19reg0Rreg1Rreg2RSAR(reg0R, reg1R, reg2R);reg0R = (reg1R >> reg2R);
1Areg0Rreg1Rreg2RDIV(reg0R, reg1R, reg2R);reg0R = (reg1R / reg2R);
1Breg0Rreg1Rreg2RMOD(reg0R, reg1R, reg2R);reg0R = (reg1R % reg2R);
1Ereg0Preg1PPCP(reg0P, reg1P);reg0P = reg1P
20reg0Rreg1Rreg2RCMPE(reg0R, reg1R, reg2R);reg0R = (reg1R == reg2R) ? -1 : 0;
21reg0Rreg1Rreg2RCMPNE(reg0R, reg1R, reg2R);reg0R = (reg1R != reg2R) ? -1 : 0;
22reg0Rreg1Rreg2RCMPL(reg0R, reg1R, reg2R);reg0R = (reg1R < reg2R) ? -1 : 0;
23reg0Rreg1Rreg2RCMPGE(reg0R, reg1R, reg2R);reg0R = (reg1R >= reg2R) ? -1 : 0;
24reg0Rreg1Rreg2RCMPLE(reg0R, reg1R, reg2R);reg0R = (reg1R <= reg2R) ? -1 : 0;
25reg0Rreg1Rreg2RCMPG(reg0R, reg1R, reg2R);reg0R = (reg1R > reg2R) ? -1 : 0;
26reg0Rreg1Rreg2RTSTZ(reg0R, reg1R, reg2R);reg0R = ((reg1R & reg2R) == 0) ? -1 : 0;
27reg0Rreg1Rreg2RTSTNZ(reg0R, reg1R, reg2R);reg0R = ((reg1R & reg2R) != 0) ? -1 : 0;
28reg0Rreg1Preg2PPCMPE(reg0R, reg1P, reg2P);reg0R = (reg1P == reg2P) ? -1 : 0;
29reg0Rreg1Preg2PPCMPNE(reg0R, reg1P, reg2P);reg0R = (reg1P != reg2P) ? -1 : 0;
2Areg0Rreg1Preg2PPCMPL(reg0R, reg1P, reg2P);reg0R = (reg1P < reg2P) ? -1 : 0;
2Breg0Rreg1Preg2PPCMPGE(reg0R, reg1P, reg2P);reg0R = (reg1P >= reg2P) ? -1 : 0;
2Creg0Rreg1Preg2PPCMPLE(reg0R, reg1P, reg2P);reg0R = (reg1P <= reg2P) ? -1 : 0;
2Dreg0Rreg1Preg2PPCMPG(reg0R, reg1P, reg2P);reg0R = (reg1P > reg2P) ? -1 : 0;
32reg0Preg1Rreg2RMALLOC(reg0P, reg1R, reg2R);reg0P = &(reg1R *)[reg2R];
34typ32len32data...DATA(type32, length32);[data]
FElen...REMARK(len);[...]

命令リファレンス

整数レジスタ

ポインタレジスタ

ポインタタイプ

00:NOP 何もしない命令

この命令は何もしません。JITコンパイラはこの命令を翻訳せず、実CPUに対してNOP命令は発行されません。

01:LB ラベル定義命令

123456
LB01optimm32

ラベルを定義します。OSECPUでは、ラベルの場所に対してのみ実行を転送できます。 ラベル番号は同一アプリケーション中で重複してはなりません。

02:LIMM 定数即値代入命令

123456
LIMM02reg0Rimm32

03:PLIMM ラベル番号代入命令

123456
PLIMM03reg0Pimm32

04:CND 条件実行プリフィックス

12
CND04reg0R...

08,09:LMEM/SMEM メモリアクセス命令

12345678
LMEM08reg0Rtyp32reg1P00
SMEM09reg0Rtyp32reg1P00

セキュリティ違反になる場合

0E:PADD メモリ加算命令

12345678
PADD0Ereg0Ptyp32reg1Preg2R

reg1Pのポインタ位置にreg2Rの値を加えた結果、指し示す位置のポインタをreg0Pに代入します。

セキュリティ違反になる場合

0F:PDIF メモリ差分命令

12345678
PDIF0Freg0Rtyp32reg1Preg2P

reg0R = reg1P - reg2Pとなるよう、二つのポインタの差分をreg0Rに代入します。

セキュリティ違反になる場合

10-1B:CP/OR,XOR,AND,ADD,SUB,MUL,SHL,SAR,DIV,MOD 整数三項演算命令

1234
CP10reg0Rreg1RFF
OR10reg0Rreg1Rreg2R
(other)OpCodereg0Rreg1Rreg2R

実装済みのAPI

間違い等の指摘があればお願いします…


コメントお名前NameLink

トップ   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS