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