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