From 2c3055afeccdc7f0861d8467b5d2cd770378fb32 Mon Sep 17 00:00:00 2001 From: Per Hedbor <ph@opera.com> Date: Sun, 31 Aug 2014 12:12:25 +0200 Subject: [PATCH] Added a few more opcodes to do constant integer arithmentcs. --- src/interpret_functions.h | 45 +++++++++++++++++++++++++++++++++++++++ src/peep.in | 20 +++++++++++++++++ 2 files changed, 65 insertions(+) diff --git a/src/interpret_functions.h b/src/interpret_functions.h index ed2d07f919..16cd70b283 100644 --- a/src/interpret_functions.h +++ b/src/interpret_functions.h @@ -1915,6 +1915,51 @@ OPCODE0_ALIAS(F_MULTIPLY, "*", I_UPDATE_SP, o_multiply); OPCODE0_ALIAS(F_DIVIDE, "/", I_UPDATE_SP, o_divide); OPCODE0_ALIAS(F_MOD, "%", I_UPDATE_SP, o_mod); +OPCODE1(F_SUBTRACT_INT, "- int", 0, { + push_int( arg1 ); + o_subtract(); +}); + +OPCODE1(F_AND_INT, "& int", 0, { + push_int( arg1 ); + o_and(); +}); + +OPCODE1(F_OR_INT, "| int", 0, { + push_int( arg1 ); + o_or(); +}); + +OPCODE1(F_XOR_INT, "^ int", 0, { + push_int( arg1 ); + o_xor(); +}); + +OPCODE1(F_MULTIPLY_INT, "* int", 0, { + push_int( arg1 ); + o_multiply(); +}); + +OPCODE1(F_DIVIDE_INT, "/ int", 0, { + push_int( arg1 ); + o_divide(); +}); + +OPCODE1(F_MOD_INT, "% int", 0, { + push_int( arg1 ); + o_mod(); +}); + +OPCODE1(F_RSH_INT, ">> int", 0, { + push_int( arg1 ); + o_rsh(); +}); + +OPCODE1(F_LSH_INT, "<< int", 0, { + push_int( arg1 ); + o_lsh(); +}); + OPCODE1(F_ADD_INT, "add integer", 0, { if(TYPEOF(Pike_sp[-1]) == T_INT && !INT_TYPE_ADD_OVERFLOW(Pike_sp[-1].u.integer, arg1)) diff --git a/src/peep.in b/src/peep.in index af1f5c5d96..63a95219f9 100644 --- a/src/peep.in +++ b/src/peep.in @@ -290,6 +290,26 @@ CONST_1 SUBTRACT: ADD_INT (1) NUMBER [$1a >= 0] SUBTRACT : ADD_NEG_INT ($1a) NEG_NUMBER [$1a > 0] SUBTRACT : ADD_INT ($1a) +NUMBER MOD : MOD_INT($1a) +NUMBER LSH : LSH_INT($1a) +NUMBER RSH : RSH_INT($1a) +NUMBER SUBTRACT : SUBTRACT_INT($1a) +NUMBER AND : DIVIDE_INT($1a) +NUMBER OR : OR_INT($1a) +NUMBER XOR : XOR_INT($1a) +NUMBER MULTIPLY : MULTIPLY_INT($1a) +NUMBER DIVIDE : DIVIDE_INT($1a) + +NEG_NUMBER MOD : MOD_INT(-$1a) +NEG_NUMBER LSH : LSH_INT(-$1a) +NEG_NUMBER RSH : RSH_INT(-$1a) +NEG_NUMBER SUBTRACT : SUBTRACT_INT(-$1a) +NEG_NUMBER AND : DIVIDE_INT(-$1a) +NEG_NUMBER OR : OR_INT(-$1a) +NEG_NUMBER XOR : XOR_INT(-$1a) +NEG_NUMBER MULTIPLY : MULTIPLY_INT(-$1a) +NEG_NUMBER DIVIDE : DIVIDE_INT(-$1a) + // This set of optimizations is broken. Consider the case: // STRING ADD_INT ADD_INT // -- GitLab