From a2b70a626d6f6b24ea9bc1ab95e718c181b2b4b0 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Fredrik=20H=C3=BCbinette=20=28Hubbe=29?= <hubbe@hubbe.net>
Date: Sun, 30 Apr 2000 20:33:47 -0700
Subject: [PATCH] more optimizations (fairly minor)

Rev: src/docode.c:1.72
Rev: src/interpret_functions.h:1.20
Rev: src/language.yacc:1.183
Rev: src/operators.c:1.92
Rev: src/peep.in:1.36
---
 src/docode.c              | 42 +++++++++++++++++++++++++++++----------
 src/interpret_functions.h | 26 +++++++++++++++++++++++-
 src/language.yacc         |  4 ++--
 src/operators.c           | 21 ++++++++++++++++++--
 src/peep.in               | 19 ++++++++++++++++--
 5 files changed, 94 insertions(+), 18 deletions(-)

diff --git a/src/docode.c b/src/docode.c
index 2251f3cd51..37337b0cce 100644
--- a/src/docode.c
+++ b/src/docode.c
@@ -5,7 +5,7 @@
 \*/
 /**/
 #include "global.h"
-RCSID("$Id: docode.c,v 1.71 2000/05/01 02:11:25 hubbe Exp $");
+RCSID("$Id: docode.c,v 1.72 2000/05/01 03:33:45 hubbe Exp $");
 #include "las.h"
 #include "program.h"
 #include "language.h"
@@ -389,6 +389,13 @@ static int do_docode2(node *n,int flags)
       fatal("HELP! FATAL INTERNAL COMPILER ERROR (7)\n");
 #endif
 
+    if(n->token == F_ADD_EQ && (flags & DO_POP))
+    {
+      code_expression(CDR(n), 0, "assignment");
+      emit0(F_ADD_TO_AND_POP);
+      return 0;
+    }
+
     if(match_types(CAR(n)->type,array_type_string) ||
        match_types(CAR(n)->type,string_type_string) ||
        match_types(CAR(n)->type,mapping_type_string) ||
@@ -404,16 +411,29 @@ static int do_docode2(node *n,int flags)
 
     switch(n->token)
     {
-    case F_ADD_EQ: emit0(F_ADD); break;
-    case F_AND_EQ: emit0(F_AND); break;
-    case F_OR_EQ:  emit0(F_OR);  break;
-    case F_XOR_EQ: emit0(F_XOR); break;
-    case F_LSH_EQ: emit0(F_LSH); break;
-    case F_RSH_EQ: emit0(F_RSH); break;
-    case F_SUB_EQ: emit0(F_SUBTRACT); break;
-    case F_MULT_EQ:emit0(F_MULTIPLY);break;
-    case F_MOD_EQ: emit0(F_MOD); break;
-    case F_DIV_EQ: emit0(F_DIVIDE); break;
+      case F_ADD_EQ:
+	if(CAR(n)->type == int_type_string &&
+	   CDR(n)->type == int_type_string)
+	{
+	  emit0(F_ADD_INTS);
+	}
+	else if(CAR(n)->type == float_type_string &&
+		CDR(n)->type == float_type_string)
+	{
+	  emit0(F_ADD_FLOATS);
+	}else{
+	 emit0(F_ADD);
+	}
+	break;
+      case F_AND_EQ: emit0(F_AND); break;
+      case F_OR_EQ:  emit0(F_OR);  break;
+      case F_XOR_EQ: emit0(F_XOR); break;
+      case F_LSH_EQ: emit0(F_LSH); break;
+      case F_RSH_EQ: emit0(F_RSH); break;
+      case F_SUB_EQ: emit0(F_SUBTRACT); break;
+      case F_MULT_EQ:emit0(F_MULTIPLY);break;
+      case F_MOD_EQ: emit0(F_MOD); break;
+      case F_DIV_EQ: emit0(F_DIVIDE); break;
     }
 
     if(flags & DO_POP)
diff --git a/src/interpret_functions.h b/src/interpret_functions.h
index 0a41679e71..3b5902602c 100644
--- a/src/interpret_functions.h
+++ b/src/interpret_functions.h
@@ -1,5 +1,5 @@
 /*
- * $Id: interpret_functions.h,v 1.19 2000/05/01 02:11:25 hubbe Exp $
+ * $Id: interpret_functions.h,v 1.20 2000/05/01 03:33:45 hubbe Exp $
  *
  * Opcode definitions for the interpreter.
  */
@@ -1130,6 +1130,30 @@ OPCODE0(F_ADD, "+")
   f_add(2);
 BREAK;
 
+OPCODE0(F_ADD_INTS, "int+int")
+  if(sp[-1].type == T_INT && sp[-2].type == T_INT 
+#ifdef AUTO_BIGNUM
+      && (!INT_TYPE_ADD_OVERFLOW(sp[-1].u.integer, sp[-2].u.integer))
+#endif
+    )
+  {
+    sp[-2].u.integer+=sp[-1].u.integer;
+    sp--;
+  }else{
+    f_add(2);
+  }
+BREAK;
+
+OPCODE0(F_ADD_FLOATS, "float+float")
+  if(sp[-1].type == T_FLOAT && sp[-2].type == T_FLOAT)
+  {
+    sp[-2].u.float_number+=sp[-1].u.float_number;
+    sp--;
+  }else{
+    f_add(2);
+  }
+BREAK;
+
 OPCODE0(F_SUBTRACT, "-")
   o_subtract();
 BREAK;
diff --git a/src/language.yacc b/src/language.yacc
index f993d4b104..90f6ab00f3 100644
--- a/src/language.yacc
+++ b/src/language.yacc
@@ -71,7 +71,7 @@
 %token F_ASSIGN_GLOBAL F_ASSIGN_GLOBAL_AND_POP
 %token F_LOCAL_2_LOCAL F_LOCAL_2_GLOBAL F_GLOBAL_2_LOCAL
 %token F_ADD F_SUBTRACT F_ADD_INT F_ADD_NEG_INT
-%token F_ADD_TO_AND_POP
+%token F_ADD_TO_AND_POP F_ADD_FLOATS F_ADD_INTS
 %token F_MULTIPLY F_DIVIDE F_MOD
 
 %token F_LT F_GT F_EQ F_GE F_LE F_NE
@@ -195,7 +195,7 @@
 /* This is the grammar definition of Pike. */
 
 #include "global.h"
-RCSID("$Id: language.yacc,v 1.182 2000/05/01 02:11:25 hubbe Exp $");
+RCSID("$Id: language.yacc,v 1.183 2000/05/01 03:33:46 hubbe Exp $");
 #ifdef HAVE_MEMORY_H
 #include <memory.h>
 #endif
diff --git a/src/operators.c b/src/operators.c
index 59b9226af8..a461665163 100644
--- a/src/operators.c
+++ b/src/operators.c
@@ -6,7 +6,7 @@
 /**/
 #include "global.h"
 #include <math.h>
-RCSID("$Id: operators.c,v 1.91 2000/04/20 02:41:45 hubbe Exp $");
+RCSID("$Id: operators.c,v 1.92 2000/05/01 03:33:47 hubbe Exp $");
 #include "interpret.h"
 #include "svalue.h"
 #include "multiset.h"
@@ -428,6 +428,7 @@ void f_add(INT32 args)
 
 static int generate_sum(node *n)
 {
+  node **first_arg, **second_arg;
   switch(count_args(CDR(n)))
   {
   case 1:
@@ -435,8 +436,24 @@ static int generate_sum(node *n)
     return 1;
 
   case 2:
+    first_arg=my_get_arg(&_CDR(n), 0);
+    second_arg=my_get_arg(&_CDR(n), 1);
+    
     do_docode(CDR(n),DO_NOT_COPY);
-    emit0(F_ADD);
+    if(first_arg[0]->type == float_type_string &&
+       second_arg[0]->type == float_type_string)
+    {
+      emit0(F_ADD_FLOATS);
+    }
+    else if(first_arg[0]->type == int_type_string &&
+       second_arg[0]->type == int_type_string)
+    {
+      emit0(F_ADD_INTS);
+    }
+    else
+    {
+      emit0(F_ADD);
+    }
     return 1;
 
   default:
diff --git a/src/peep.in b/src/peep.in
index 87465fc862..1f6b4c7c77 100644
--- a/src/peep.in
+++ b/src/peep.in
@@ -1,5 +1,5 @@
 //
-// $Id: peep.in,v 1.35 2000/05/01 02:11:25 hubbe Exp $
+// $Id: peep.in,v 1.36 2000/05/01 03:33:47 hubbe Exp $
 //
 
 NOP :
@@ -30,7 +30,7 @@ NUMBER [$1a < 0 && (-$1a)>0] : NEG_NUMBER (-$1a)
 NEG_NUMBER NEGATE : NUMBER ($1a)
 NEGATE NEGATE :
 COMPL COMPL :
-NEGATE CONST_1 ADD : COMPL
+NEGATE CONST_1 ADD_INTS : COMPL
 NEGATE CONST1 SUBTRACT : COMPL
 CONST0 ASSIGN_LOCAL_AND_POP : CLEAR_LOCAL($2a)
 
@@ -183,6 +183,12 @@ BRANCH_WHEN_LE BRANCH LABEL ($1a) : BRANCH_WHEN_GT($2a) LABEL($1a)
 BRANCH_WHEN_GT BRANCH LABEL ($1a) : BRANCH_WHEN_LE($2a) LABEL($1a)
 
 
+CONST0 ADD_INTS: ADD_INT (0)
+CONST1 ADD_INTS: ADD_INT (1)
+CONST_1 ADD_INTS: ADD_NEG_INT (1)
+NUMBER [$1a >= 0] ADD_INTS : ADD_INT ($1a)
+NUMBER [$1a < 0] ADD_INTS : ADD_NEG_INT (-$1a)
+
 CONST0 ADD: ADD_INT (0)
 CONST1 ADD: ADD_INT (1)
 CONST_1 ADD: ADD_NEG_INT (1)
@@ -198,6 +204,15 @@ NUMBER [$1a < 0] SUBTRACT : ADD_INT (-$1a)
 LTOSVAL2 ADD ASSIGN_AND_POP : ADD_TO_AND_POP
 LTOSVAL ADD ASSIGN_AND_POP : ADD_TO_AND_POP
 
+LTOSVAL2 ADD_INTS ASSIGN_AND_POP : ADD_TO_AND_POP
+LTOSVAL ADD_INTS ASSIGN_AND_POP : ADD_TO_AND_POP
+
+LTOSVAL2 ADD_FLOATS ASSIGN_AND_POP : ADD_TO_AND_POP
+LTOSVAL ADD_FLOATS ASSIGN_AND_POP : ADD_TO_AND_POP
+
+LOCAL CONST1 ADD_TO_AND_POP : INC_LOCAL_AND_POP($1a)
+LOCAL CONST_1 ADD_TO_AND_POP : DEC_LOCAL_AND_POP($1a)
+
 APPLY [ !(debug_options & NO_TAILRECURSION) ] RETURN : APPLY_AND_RETURN($1a)
 CALL_FUNCTION [ !(debug_options & NO_TAILRECURSION) ] RETURN : CALL_FUNCTION_AND_RETURN
 CALL_LFUN [ !(debug_options & NO_TAILRECURSION) ] RETURN : CALL_LFUN_AND_RETURN($1a)
-- 
GitLab