📄 vm_ppc.c
字号:
ltopandsecond(); // get value from opstack
Inst( PPC_CMP, 0, R_SECOND, R_TOP );
i = Constant4();
jused[i] = 1;
InstImm( PPC_BC, 4, 1, 8 );
if ( pass==1 ) {
v = vm->instructionPointers[ i ] - (int)&buf[compiledOfs];
} else {
v = 0;
}
Emit4(PPC_B | (unsigned int)(v&0x3ffffff) );
// InstImm( PPC_BC, 12, 1, v );
rtopped = qfalse;
break;
case OP_GEI:
ltopandsecond(); // get value from opstack
Inst( PPC_CMP, 0, R_SECOND, R_TOP );
i = Constant4();
jused[i] = 1;
InstImm( PPC_BC, 12, 0, 8 );
if ( pass==1 ) {
v = vm->instructionPointers[ i ] - (int)&buf[compiledOfs];
} else {
v = 0;
}
Emit4(PPC_B | (unsigned int)(v&0x3ffffff) );
// InstImm( PPC_BC, 4, 0, v );
rtopped = qfalse;
break;
case OP_LTU:
ltopandsecond(); // get value from opstack
Inst( PPC_CMPL, 0, R_SECOND, R_TOP );
i = Constant4();
jused[i] = 1;
InstImm( PPC_BC, 4, 0, 8 );
if ( pass==1 ) {
v = vm->instructionPointers[ i ] - (int)&buf[compiledOfs];
} else {
v = 0;
}
Emit4(PPC_B | (unsigned int)(v&0x3ffffff) );
// InstImm( PPC_BC, 12, 0, v );
rtopped = qfalse;
break;
case OP_LEU:
ltopandsecond(); // get value from opstack
Inst( PPC_CMPL, 0, R_SECOND, R_TOP );
i = Constant4();
jused[i] = 1;
InstImm( PPC_BC, 12, 1, 8 );
if ( pass==1 ) {
v = vm->instructionPointers[ i ] - (int)&buf[compiledOfs];
} else {
v = 0;
}
Emit4(PPC_B | (unsigned int)(v&0x3ffffff) );
// InstImm( PPC_BC, 4, 1, v );
rtopped = qfalse;
break;
case OP_GTU:
ltopandsecond(); // get value from opstack
Inst( PPC_CMPL, 0, R_SECOND, R_TOP );
i = Constant4();
jused[i] = 1;
InstImm( PPC_BC, 4, 1, 8 );
if ( pass==1 ) {
v = vm->instructionPointers[ i ] - (int)&buf[compiledOfs];
} else {
v = 0;
}
Emit4(PPC_B | (unsigned int)(v&0x3ffffff) );
// InstImm( PPC_BC, 12, 1, v );
rtopped = qfalse;
break;
case OP_GEU:
ltopandsecond(); // get value from opstack
Inst( PPC_CMPL, 0, R_SECOND, R_TOP );
i = Constant4();
jused[i] = 1;
InstImm( PPC_BC, 12, 0, 8 );
if ( pass==1 ) {
v = vm->instructionPointers[ i ] - (int)&buf[compiledOfs];
} else {
v = 0;
}
Emit4(PPC_B | (unsigned int)(v&0x3ffffff) );
// InstImm( PPC_BC, 4, 0, v );
rtopped = qfalse;
break;
case OP_EQF:
fltopandsecond(); // get value from opstack
Inst( PPC_FCMPU, 0, R_TOP, R_SECOND );
i = Constant4();
jused[i] = 1;
InstImm( PPC_BC, 4, 2, 8 );
if ( pass==1 ) {
v = vm->instructionPointers[ i ] - (int)&buf[compiledOfs];
} else {
v = 0;
}
Emit4(PPC_B | (unsigned int)(v&0x3ffffff) );
// InstImm( PPC_BC, 12, 2, v );
rtopped = qfalse;
break;
case OP_NEF:
fltopandsecond(); // get value from opstack
Inst( PPC_FCMPU, 0, R_TOP, R_SECOND );
i = Constant4();
jused[i] = 1;
InstImm( PPC_BC, 12, 2, 8 );
if ( pass==1 ) {
v = vm->instructionPointers[ i ] - (int)&buf[compiledOfs];
} else {
v = 0;
}
Emit4(PPC_B | (unsigned int)(v&0x3ffffff) );
// InstImm( PPC_BC, 4, 2, v );
rtopped = qfalse;
break;
case OP_LTF:
fltopandsecond(); // get value from opstack
Inst( PPC_FCMPU, 0, R_SECOND, R_TOP );
i = Constant4();
jused[i] = 1;
InstImm( PPC_BC, 4, 0, 8 );
if ( pass==1 ) {
v = vm->instructionPointers[ i ] - (int)&buf[compiledOfs];
} else {
v = 0;
}
Emit4(PPC_B | (unsigned int)(v&0x3ffffff) );
// InstImm( PPC_BC, 12, 0, v );
rtopped = qfalse;
break;
case OP_LEF:
fltopandsecond(); // get value from opstack
Inst( PPC_FCMPU, 0, R_SECOND, R_TOP );
i = Constant4();
jused[i] = 1;
InstImm( PPC_BC, 12, 1, 8 );
if ( pass==1 ) {
v = vm->instructionPointers[ i ] - (int)&buf[compiledOfs];
} else {
v = 0;
}
Emit4(PPC_B | (unsigned int)(v&0x3ffffff) );
// InstImm( PPC_BC, 4, 1, v );
rtopped = qfalse;
break;
case OP_GTF:
fltopandsecond(); // get value from opstack
Inst( PPC_FCMPU, 0, R_SECOND, R_TOP );
i = Constant4();
jused[i] = 1;
InstImm( PPC_BC, 4, 1, 8 );
if ( pass==1 ) {
v = vm->instructionPointers[ i ] - (int)&buf[compiledOfs];
} else {
v = 0;
}
Emit4(PPC_B | (unsigned int)(v&0x3ffffff) );
// InstImm( PPC_BC, 12, 1, v );
rtopped = qfalse;
break;
case OP_GEF:
fltopandsecond(); // get value from opstack
Inst( PPC_FCMPU, 0, R_SECOND, R_TOP );
i = Constant4();
jused[i] = 1;
InstImm( PPC_BC, 12, 0, 8 );
if ( pass==1 ) {
v = vm->instructionPointers[ i ] - (int)&buf[compiledOfs];
} else {
v = 0;
}
Emit4(PPC_B | (unsigned int)(v&0x3ffffff) );
// InstImm( PPC_BC, 4, 0, v );
rtopped = qfalse;
break;
case OP_NEGI:
ltop(); // get value from opstack
InstImm( PPC_SUBFIC, R_TOP, R_TOP, 0 );
InstImm( PPC_STW, R_TOP, R_OPSTACK, 0 ); // save value to opstack
rtopped = qtrue;
break;
case OP_ADD:
ltop(); // get value from opstack
InstImm( PPC_LWZU, R_SECOND, R_OPSTACK, -4 ); // get value from opstack
Inst( PPC_ADD, R_TOP, R_TOP, R_SECOND );
InstImm( PPC_STW, R_TOP, R_OPSTACK, 0 ); // save value to opstack
rtopped = qtrue;
break;
case OP_SUB:
ltop(); // get value from opstack
InstImm( PPC_LWZU, R_SECOND, R_OPSTACK, -4 ); // get value from opstack
Inst( PPC_SUBF, R_TOP, R_TOP, R_SECOND );
InstImm( PPC_STW, R_TOP, R_OPSTACK, 0 ); // save value to opstack
rtopped = qtrue;
break;
case OP_DIVI:
ltop(); // get value from opstack
InstImm( PPC_LWZU, R_SECOND, R_OPSTACK, -4 ); // get value from opstack
Inst( PPC_DIVW, R_TOP, R_SECOND, R_TOP );
InstImm( PPC_STW, R_TOP, R_OPSTACK, 0 ); // save value to opstack
rtopped = qtrue;
break;
case OP_DIVU:
ltop(); // get value from opstack
InstImm( PPC_LWZU, R_SECOND, R_OPSTACK, -4 ); // get value from opstack
Inst( PPC_DIVWU, R_TOP, R_SECOND, R_TOP );
InstImm( PPC_STW, R_TOP, R_OPSTACK, 0 ); // save value to opstack
rtopped = qtrue;
break;
case OP_MODI:
ltop(); // get value from opstack
InstImm( PPC_LWZU, R_SECOND, R_OPSTACK, -4 ); // get value from opstack
Inst( PPC_DIVW, R_EA, R_SECOND, R_TOP );
Inst( PPC_MULLW, R_EA, R_TOP, R_EA );
Inst( PPC_SUBF, R_TOP, R_EA, R_SECOND );
InstImm( PPC_STW, R_TOP, R_OPSTACK, 0 ); // save value to opstack
rtopped = qtrue;
break;
case OP_MODU:
ltop(); // get value from opstack
InstImm( PPC_LWZU, R_SECOND, R_OPSTACK, -4 ); // get value from opstack
Inst( PPC_DIVWU, R_EA, R_SECOND, R_TOP );
Inst( PPC_MULLW, R_EA, R_TOP, R_EA );
Inst( PPC_SUBF, R_TOP, R_EA, R_SECOND );
InstImm( PPC_STW, R_TOP, R_OPSTACK, 0 ); // save value to opstack
rtopped = qtrue;
break;
case OP_MULI:
case OP_MULU:
ltop(); // get value from opstack
InstImm( PPC_LWZU, R_SECOND, R_OPSTACK, -4 ); // get value from opstack
Inst( PPC_MULLW, R_TOP, R_SECOND, R_TOP );
InstImm( PPC_STW, R_TOP, R_OPSTACK, 0 ); // save value to opstack
rtopped = qtrue;
break;
case OP_BAND:
ltop(); // get value from opstack
InstImm( PPC_LWZU, R_SECOND, R_OPSTACK, -4 ); // get value from opstack
Inst( PPC_AND, R_SECOND, R_TOP, R_TOP );
InstImm( PPC_STW, R_TOP, R_OPSTACK, 0 ); // save value to opstack
rtopped = qtrue;
break;
case OP_BOR:
ltop(); // get value from opstack
InstImm( PPC_LWZU, R_SECOND, R_OPSTACK, -4 ); // get value from opstack
Inst( PPC_OR, R_SECOND, R_TOP, R_TOP );
InstImm( PPC_STW, R_TOP, R_OPSTACK, 0 ); // save value to opstack
rtopped = qtrue;
break;
case OP_BXOR:
ltop(); // get value from opstack
InstImm( PPC_LWZU, R_SECOND, R_OPSTACK, -4 ); // get value from opstack
Inst( PPC_XOR, R_SECOND, R_TOP, R_TOP );
InstImm( PPC_STW, R_TOP, R_OPSTACK, 0 ); // save value to opstack
rtopped = qtrue;
break;
case OP_BCOM:
ltop(); // get value from opstack
Inst( PPC_NOR, R_TOP, R_TOP, R_TOP );
InstImm( PPC_STW, R_TOP, R_OPSTACK, 0 ); // save value to opstack
rtopped = qtrue;
break;
case OP_LSH:
ltop(); // get value from opstack
InstImm( PPC_LWZU, R_SECOND, R_OPSTACK, -4 ); // get value from opstack
Inst( PPC_SLW, R_SECOND, R_TOP, R_TOP );
InstImm( PPC_STW, R_TOP, R_OPSTACK, 0 ); // save value to opstack
rtopped = qtrue;
break;
case OP_RSHI:
ltop(); // get value from opstack
InstImm( PPC_LWZU, R_SECOND, R_OPSTACK, -4 ); // get value from opstack
Inst( PPC_SRAW, R_SECOND, R_TOP, R_TOP );
InstImm( PPC_STW, R_TOP, R_OPSTACK, 0 ); // save value to opstack
rtopped = qtrue;
break;
case OP_RSHU:
ltop(); // get value from opstack
InstImm( PPC_LWZU, R_SECOND, R_OPSTACK, -4 ); // get value from opstack
Inst( PPC_SRW, R_SECOND, R_TOP, R_TOP );
InstImm( PPC_STW, R_TOP, R_OPSTACK, 0 ); // save value to opstack
rtopped = qtrue;
break;
case OP_NEGF:
InstImm( PPC_LFS, R_TOP, R_OPSTACK, 0 ); // get value from opstack
Inst( PPC_FNEG, R_TOP, 0, R_TOP );
InstImm( PPC_STFS, R_TOP, R_OPSTACK, 0 ); // save value to opstack
rtopped = qfalse;
break;
case OP_ADDF:
InstImm( PPC_LFS, R_TOP, R_OPSTACK, 0 ); // get value from opstack
InstImm( PPC_LFSU, R_SECOND, R_OPSTACK, -4 ); // get value from opstack
Inst( PPC_FADDS, R_TOP, R_SECOND, R_TOP );
InstImm( PPC_STFS, R_TOP, R_OPSTACK, 0 ); // save value to opstack
rtopped = qfalse;
break;
case OP_SUBF:
InstImm( PPC_LFS, R_TOP, R_OPSTACK, 0 ); // get value from opstack
InstImm( PPC_LFSU, R_SECOND, R_OPSTACK, -4 ); // get value from opstack
Inst( PPC_FSUBS, R_TOP, R_SECOND, R_TOP );
InstImm( PPC_STFS, R_TOP, R_OPSTACK, 0 ); // save value to opstack
rtopped = qfalse;
break;
case OP_DIVF:
InstImm( PPC_LFS, R_TOP, R_OPSTACK, 0 ); // get value from opstack
InstImm( PPC_LFSU, R_SECOND, R_OPSTACK, -4 ); // get value from opstack
Inst( PPC_FDIVS, R_TOP, R_SECOND, R_TOP );
InstImm( PPC_STFS, R_TOP, R_OPSTACK, 0 ); // save value to opstack
rtopped = qfalse;
break;
case OP_MULF:
InstImm( PPC_LFS, R_TOP, R_OPSTACK, 0 ); // get value from opstack
InstImm( PPC_LFSU, R_SECOND, R_OPSTACK, -4 ); // get value from opstack
Inst4( PPC_FMULS, R_TOP, R_SECOND, 0, R_TOP );
InstImm( PPC_STFS, R_TOP, R_OPSTACK, 0 ); // save value to opstack
rtopped = qfalse;
break;
case OP_CVIF:
v = (int)&itofConvert;
InstImmU( PPC_ADDIS, R_EA, 0, (v >> 16)&0xffff );
InstImmU( PPC_ORI, R_EA, R_EA, v & 0xffff );
InstImm( PPC_LWZ, R_TOP, R_OPSTACK, 0 ); // get value from opstack
InstImmU( PPC_XORIS, R_TOP, R_TOP, 0x8000 );
InstImm( PPC_STW, R_TOP, R_EA, 12 );
InstImm( PPC_LFD, R_TOP, R_EA, 0 );
InstImm( PPC_LFD, R_SECOND, R_EA, 8 );
Inst( PPC_FSUB, R_TOP, R_SECOND, R_TOP );
// Inst( PPC_FRSP, R_TOP, 0, R_TOP );
InstImm( PPC_STFS, R_TOP, R_OPSTACK, 0 ); // save value to opstack
rtopped = qfalse;
break;
case OP_CVFI:
InstImm( PPC_LFS, R_TOP, R_OPSTACK, 0 ); // get value from opstack
Inst( PPC_FCTIWZ, R_TOP, 0, R_TOP );
Inst( PPC_STFIWX, R_TOP, 0, R_OPSTACK ); // save value to opstack
rtopped = qfalse;
break;
case OP_SEX8:
ltop(); // get value from opstack
Inst( PPC_EXTSB, R_TOP, R_TOP, 0 );
InstImm( PPC_STW, R_TOP, R_OPSTACK, 0 );
rtopped = qtrue;
break;
case OP_SEX16:
ltop(); // get value from opstack
Inst( PPC_EXTSH, R_TOP, R_TOP, 0 );
InstImm( PPC_STW, R_TOP, R_OPSTACK, 0 );
rtopped = qtrue;
break;
case OP_BLOCK_COPY:
v = Constant4() >> 2;
ltop(); // source
InstImm( PPC_LWZ, R_SECOND, R_OPSTACK, -4 ); // dest
InstImm( PPC_ADDI, R_OPSTACK, R_OPSTACK, -8 );
InstImmU( PPC_ADDI, R_EA, 0, v ); // count
// FIXME: range check
Inst( PPC_MTSPR, R_EA, 9, 0 ); // move to count register
Inst( PPC_ADD, R_TOP, R_TOP, R_MEMBASE );
InstImm( PPC_ADDI, R_TOP, R_TOP, -4 );
Inst( PPC_ADD, R_SECOND, R_SECOND, R_MEMBASE );
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -