Simplify opcodes: numbers and integer constants.

This commit is contained in:
Tor Andersson
2019-03-08 10:57:13 +01:00
parent 603977ae5b
commit 20d0fa04df
5 changed files with 17 additions and 26 deletions

View File

@@ -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));
}
}
}

View File

@@ -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> */

View File

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

View File

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

View File

@@ -4,10 +4,7 @@
"rot2",
"rot3",
"rot4",
"number_0",
"number_1",
"number_pos",
"number_neg",
"integer",
"number",
"string",
"closure",