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