mirror of
https://github.com/ccxvii/mujs.git
synced 2026-02-06 09:51:41 +08:00
Simplify opcodes: numbers and integer constants.
This commit is contained in:
22
jscompile.c
22
jscompile.c
@@ -186,20 +186,20 @@ static void emitfunction(JF, js_Function *fun)
|
||||
static void emitnumber(JF, double num)
|
||||
{
|
||||
if (num == 0) {
|
||||
emit(J, F, OP_NUMBER_0);
|
||||
emit(J, F, OP_INTEGER);
|
||||
emitarg(J, F, 32768);
|
||||
if (signbit(num))
|
||||
emit(J, F, OP_NEG);
|
||||
} else if (num == 1) {
|
||||
emit(J, F, OP_NUMBER_1);
|
||||
} else if (num == (js_Instruction)num) {
|
||||
emit(J, F, OP_NUMBER_POS);
|
||||
emitarg(J, F, (js_Instruction)num);
|
||||
} else if (num < 0 && -num == (js_Instruction)(-num)) {
|
||||
emit(J, F, OP_NUMBER_NEG);
|
||||
emitarg(J, F, (js_Instruction)(-num));
|
||||
} else {
|
||||
emit(J, F, OP_NUMBER);
|
||||
emitarg(J, F, addnumber(J, F, num));
|
||||
double nv = num + 32768;
|
||||
js_Instruction iv = nv;
|
||||
if (nv == iv) {
|
||||
emit(J, F, OP_INTEGER);
|
||||
emitarg(J, F, iv);
|
||||
} else {
|
||||
emit(J, F, OP_NUMBER);
|
||||
emitarg(J, F, addnumber(J, F, num));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -10,11 +10,7 @@ enum js_OpCode
|
||||
OP_ROT3, /* A B C -- C A B */
|
||||
OP_ROT4, /* A B C D -- D A B C */
|
||||
|
||||
OP_NUMBER_0, /* -- 0 */
|
||||
OP_NUMBER_1, /* -- 1 */
|
||||
OP_NUMBER_POS, /* -K- K */
|
||||
OP_NUMBER_NEG, /* -K- -K */
|
||||
|
||||
OP_INTEGER, /* -K- (number-32768) */
|
||||
OP_NUMBER, /* -N- <number> */
|
||||
OP_STRING, /* -S- <string> */
|
||||
OP_CLOSURE, /* -F- <closure> */
|
||||
|
||||
5
jsdump.c
5
jsdump.c
@@ -797,6 +797,9 @@ void jsC_dumpfunction(js_State *J, js_Function *F)
|
||||
ps(opname[c]);
|
||||
|
||||
switch (c) {
|
||||
case OP_INTEGER:
|
||||
printf(" %d", (*p++) - 32768);
|
||||
break;
|
||||
case OP_NUMBER:
|
||||
printf(" %.9g", F->numtab[*p++]);
|
||||
break;
|
||||
@@ -830,8 +833,6 @@ void jsC_dumpfunction(js_State *J, js_Function *F)
|
||||
case OP_GETLOCAL:
|
||||
case OP_SETLOCAL:
|
||||
case OP_DELLOCAL:
|
||||
case OP_NUMBER_POS:
|
||||
case OP_NUMBER_NEG:
|
||||
case OP_CALL:
|
||||
case OP_NEW:
|
||||
case OP_JUMP:
|
||||
|
||||
5
jsrun.c
5
jsrun.c
@@ -1315,10 +1315,7 @@ static void jsR_run(js_State *J, js_Function *F)
|
||||
case OP_ROT3: js_rot3(J); break;
|
||||
case OP_ROT4: js_rot4(J); break;
|
||||
|
||||
case OP_NUMBER_0: js_pushnumber(J, 0); break;
|
||||
case OP_NUMBER_1: js_pushnumber(J, 1); break;
|
||||
case OP_NUMBER_POS: js_pushnumber(J, *pc++); break;
|
||||
case OP_NUMBER_NEG: js_pushnumber(J, -(*pc++)); break;
|
||||
case OP_INTEGER: js_pushnumber(J, *pc++ - 32768); break;
|
||||
case OP_NUMBER: js_pushnumber(J, NT[*pc++]); break;
|
||||
case OP_STRING: js_pushliteral(J, ST[*pc++]); break;
|
||||
|
||||
|
||||
Reference in New Issue
Block a user