reduce the instruction number by merging some instructions
parent
b0917ade03
commit
b05bc51b14
|
@ -1540,7 +1540,7 @@ compilecomv:
|
|||
if (!more) {
|
||||
if (op1 == (CsCodeBlock | (len1 << 8))) {
|
||||
gs.code[start1] = (len1 << 8) |
|
||||
CsCodeJumpFalse;
|
||||
CsCodeJumpB | CsCodeFlagFalse;
|
||||
gs.code[start1 + 1] = CsCodeEnterResult;
|
||||
gs.code[start1 + len1] = (
|
||||
gs.code[start1 + len1] & ~CsCodeRetMask
|
||||
|
@ -1556,7 +1556,7 @@ compilecomv:
|
|||
if (op1 == (CsCodeBlock | (len1 << 8))) {
|
||||
gs.code[start1] = (
|
||||
(start2 - start1) << 8
|
||||
) | CsCodeJumpFalse;
|
||||
) | CsCodeJumpB | CsCodeFlagFalse;
|
||||
gs.code[start1 + 1] = CsCodeEnterResult;
|
||||
gs.code[start1 + len1] = (
|
||||
gs.code[start1 + len1] & ~CsCodeRetMask
|
||||
|
@ -1570,7 +1570,8 @@ compilecomv:
|
|||
} else if (op1 == (CsCodeEmpty | (len1 << 8))) {
|
||||
gs.code[start1] = CsCodeNull |
|
||||
(inst2 & CsCodeRetMask);
|
||||
gs.code[start2] = (len2 << 8) | CsCodeJumpTrue;
|
||||
gs.code[start2] = (len2 << 8)
|
||||
| CsCodeJumpB | CsCodeFlagTrue;
|
||||
gs.code[start2 + 1] = CsCodeEnterResult;
|
||||
gs.code[start2 + len2] = (
|
||||
gs.code[start2 + len2] & ~CsCodeRetMask
|
||||
|
@ -1653,8 +1654,8 @@ compilecomv:
|
|||
);
|
||||
} else {
|
||||
ostd::Uint32 op = (id->get_type_raw() == CsIdAnd)
|
||||
? CsCodeJumpResultFalse
|
||||
: CsCodeJumpResultTrue;
|
||||
? (CsCodeJumpResult | CsCodeFlagFalse)
|
||||
: (CsCodeJumpResult | CsCodeFlagTrue);
|
||||
gs.code.push(op);
|
||||
end = gs.code.size();
|
||||
while ((start + 1) < end) {
|
||||
|
|
16
src/cs_vm.cc
16
src/cs_vm.cc
|
@ -253,10 +253,10 @@ static ostd::Uint32 *skipcode(
|
|||
}
|
||||
case CsCodeBlock:
|
||||
case CsCodeJump:
|
||||
case CsCodeJumpTrue:
|
||||
case CsCodeJumpFalse:
|
||||
case CsCodeJumpResultTrue:
|
||||
case CsCodeJumpResultFalse: {
|
||||
case CsCodeJumpB | CsCodeFlagTrue:
|
||||
case CsCodeJumpB | CsCodeFlagFalse:
|
||||
case CsCodeJumpResult | CsCodeFlagTrue:
|
||||
case CsCodeJumpResult | CsCodeFlagFalse: {
|
||||
ostd::Uint32 len = op >> 8;
|
||||
code += len;
|
||||
continue;
|
||||
|
@ -694,21 +694,21 @@ static ostd::Uint32 *runcode(CsState &cs, ostd::Uint32 *code, CsValue &result) {
|
|||
code += len;
|
||||
continue;
|
||||
}
|
||||
case CsCodeJumpTrue: {
|
||||
case CsCodeJumpB | CsCodeFlagTrue: {
|
||||
ostd::Uint32 len = op >> 8;
|
||||
if (args[--numargs].get_bool()) {
|
||||
code += len;
|
||||
}
|
||||
continue;
|
||||
}
|
||||
case CsCodeJumpFalse: {
|
||||
case CsCodeJumpB | CsCodeFlagFalse: {
|
||||
ostd::Uint32 len = op >> 8;
|
||||
if (!args[--numargs].get_bool()) {
|
||||
code += len;
|
||||
}
|
||||
continue;
|
||||
}
|
||||
case CsCodeJumpResultTrue: {
|
||||
case CsCodeJumpResult | CsCodeFlagTrue: {
|
||||
ostd::Uint32 len = op >> 8;
|
||||
--numargs;
|
||||
if (args[numargs].get_type() == CsValueType::Code) {
|
||||
|
@ -721,7 +721,7 @@ static ostd::Uint32 *runcode(CsState &cs, ostd::Uint32 *code, CsValue &result) {
|
|||
}
|
||||
continue;
|
||||
}
|
||||
case CsCodeJumpResultFalse: {
|
||||
case CsCodeJumpResult | CsCodeFlagFalse: {
|
||||
ostd::Uint32 len = op >> 8;
|
||||
--numargs;
|
||||
if (args[numargs].get_type() == CsValueType::Code) {
|
||||
|
|
|
@ -75,8 +75,7 @@ enum {
|
|||
CsCodePrint,
|
||||
CsCodeLocal,
|
||||
CsCodeDo, CsCodeDoArgs,
|
||||
CsCodeJump, CsCodeJumpTrue, CsCodeJumpFalse,
|
||||
CsCodeJumpResultTrue, CsCodeJumpResultFalse,
|
||||
CsCodeJump, CsCodeJumpB, CsCodeJumpResult,
|
||||
|
||||
CsCodeOpMask = 0x3F,
|
||||
CsCodeRet = 6,
|
||||
|
@ -87,6 +86,10 @@ enum {
|
|||
CsRetString = CsValString << CsCodeRet,
|
||||
CsRetInt = CsValInt << CsCodeRet,
|
||||
CsRetFloat = CsValFloat << CsCodeRet,
|
||||
|
||||
/* CsCodeJumpB, CsCodeJumpResult */
|
||||
CsCodeFlagTrue = 1 << CsCodeRet,
|
||||
CsCodeFlagFalse = 0 << CsCodeRet
|
||||
};
|
||||
|
||||
struct CsSharedState {
|
||||
|
|
Loading…
Reference in New Issue