diff --git a/src/interpret_functions.h b/src/interpret_functions.h index ed2d07f919ee00daa0b500dc52ca5e773b6427a2..16cd70b2839b091c704608ae2dfed1819c2fe10b 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 af1f5c5d96e410a0161de1c846b1c0d2953a5f8c..63a95219f94ff2e9f82fe7620bba0d6c0bdab9ff 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 //