reduce the instruction number by merging some instructions

master
Daniel Kolesa 2016-09-15 02:02:54 +02:00
parent b0917ade03
commit b05bc51b14
3 changed files with 19 additions and 15 deletions

View File

@ -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) {

View File

@ -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) {

View File

@ -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 {