pike.git / src / peep.in

version» Context lines:

pike.git/src/peep.in:1:   // This file is part of Pike. For copyright information see COPYRIGHT.   // Pike is distributed under GPL, LGPL and MPL. See the file COPYING   // for more information.      NOP :   POP_N_ELEMS (0) :   POP_N_ELEMS POP_VALUE : POP_N_ELEMS ($1a + 1) - POP_VALUE POP_VALUE : POP_N_ELEMS (2) +    POP_VALUE POP_N_ELEMS : POP_N_ELEMS ($2a + 1) -  + POP_VALUE POP_VALUE POP_VALUE : POP_N_ELEMS (3)   POP_N_ELEMS POP_N_ELEMS : POP_N_ELEMS ($1a + $2a)   POP_N_ELEMS(1) : POP_VALUE   POP_VALUE POP_TO_MARK : POP_TO_MARK   POP_N_ELEMS POP_TO_MARK : POP_TO_MARK      MARK MARK: MARK2   MARK POP_MARK:   MARK2 POP_MARK: MARK   MARK POP_TO_MARK:   MARK2 POP_TO_MARK: MARK -  + MARK_X POP_TO_MARK: POP_N_ELEMS($1a)      SWAP SWAP:   DUP POP_VALUE:   DUP POP_N_ELEMS [$2a > 0]: POP_N_ELEMS($2a-1)   // The opcode list is clearer without this.   //SYNCH_MARK POP_SYNCH_MARK:      ASSIGN_GLOBAL POP_VALUE : ASSIGN_GLOBAL_AND_POP($1a)   ASSIGN_LOCAL POP_VALUE : ASSIGN_LOCAL_AND_POP($1a)   RECUR POP_VALUE : RECUR_AND_POP($1a)
pike.git/src/peep.in:35:   NEG_NUMBER(1) : CONST_1   NUMBER (0x7fffffff) : BIGNUM   CONST0 NEGATE : CONST0   CONST1 NEGATE : CONST_1   CONST_1 NEGATE : CONST1   NUMBER NEGATE : NEG_NUMBER($1a)   NEG_NUMBER NEGATE : NUMBER ($1a)   NUMBER [ $1a < 0 && !INT32_NEG_OVERFLOW($1a) ] : NEG_NUMBER (-$1a)   NEG_NUMBER [ $1a <= 0 && !INT32_NEG_OVERFLOW($1a) ] : NUMBER (-$1a)   NEGATE NEGATE : + CONST0 COMPL: CONST_1 + CONST1 COMPL: NEG_NUMBER(2) + CONST_1 COMPL: CONST0 + BIGNUM COMPL: NUMBER(-0x80000000) // Note: Invalid as NEG_NUMBER on 32bit!   COMPL COMPL :   NEGATE CONST_1 ADD_INTS : COMPL -  + NEGATE ADD_NEG_INT(1) : COMPL   NEGATE CONST1 SUBTRACT : COMPL - NUMBER ASSIGN_LOCAL NEGATE: NUMBER($1a) ASSIGN_LOCAL_AND_POP($2a) NEG_NUMBER($1a) - NEG_NUMBER ASSIGN_LOCAL NEGATE: NEG_NUMBER($1a) ASSIGN_LOCAL_AND_POP($2a) NUMBER($1a) - CONST1 ASSIGN_LOCAL NEGATE: CONST1 ASSIGN_LOCAL_AND_POP($2a) CONST_1 - CONST_1 ASSIGN_LOCAL NEGATE: CONST_1 ASSIGN_LOCAL_AND_POP($2a) CONST1 + CONST1 ADD_INTS NEGATE : COMPL + ADD_INT(1) NEGATE : COMPL + CONST_1 SUBTRACT NEGATE : COMPL + COMPL CONST1 ADD_INTS : NEGATE + COMPL ADD_INT(1) : NEGATE + COMPL CONST_1 SUBTRACT : NEGATE + CONST_1 ADD_INTS COMPL : NEGATE + ADD_NEG_INT(1) COMPL : NEGATE + CONST1 SUBTRACT COMPL : NEGATE    - CONST0 ASSIGN_LOCAL_AND_POP : CLEAR_LOCAL($2a) - CONST0 ASSIGN_LOCAL: CLEAR_LOCAL($2a) CONST0 -  +    LOCAL_2_LOCAL [$1a == $1b] :   GLOBAL ASSIGN_GLOBAL_AND_POP($1a) :      // Generated by for( int i=0; i<local; i++ ) where i is not used in   // the loop.   ASSIGN_LOCAL_NUMBER_AND_POP LOCAL($1a) : ASSIGN_LOCAL_NUMBER_AND_POP($1a,$1b) NUMBER($1b)   ASSIGN_GLOBAL_NUMBER_AND_POP GLOBAL($1a) : ASSIGN_GLOBAL_NUMBER_AND_POP($1a,$1b) NUMBER($1b)   NUMBER COMPL: NUMBER(~$1a) -  + NEG_NUMBER COMPL: NEG_NUMBER(~$1a)   ASSIGN_LOCAL_NUMBER_AND_POP LOCAL_LVALUE LOCAL($1a) : ASSIGN_LOCAL_NUMBER_AND_POP($1a,$1b) LOCAL_LVALUE($2a) NUMBER($1b)   ASSIGN_GLOBAL_NUMBER_AND_POP GLOBAL_LVALUE GLOBAL($1a) : ASSIGN_GLOBAL_NUMBER_AND_POP($1a,$1b) GLOBAL_LVALUE($2a) NUMBER($1b)   ASSIGN_LOCAL_NUMBER_AND_POP GLOBAL_LVALUE LOCAL($1a) : ASSIGN_LOCAL_NUMBER_AND_POP($1a,$1b) GLOBAL_LVALUE($2a) NUMBER($1b)      // Ok, this is ridiculously specific, but it is generated by for(..)   // when the variable is not used, like above, but for globals: - ASSIGN_GLOBAL_NUMBER_AND_POP[$1b > -0x80000000L] GLOBAL_LVALUE($1a) DEC: ASSIGN_GLOBAL_NUMBER_AND_POP($1a, $1b - 1) NUMBER($1b - 1) + ASSIGN_GLOBAL_NUMBER_AND_POP[!INT32_SUB_OVERFLOW($1b, 1)] GLOBAL_LVALUE($1a) DEC: ASSIGN_GLOBAL_NUMBER_AND_POP($1a, $1b - 1) NUMBER($1b - 1)    - ASSIGN_GLOBAL_NUMBER_AND_POP[$1b < 0x7fffffff] GLOBAL_LVALUE($1a) INC: ASSIGN_GLOBAL_NUMBER_AND_POP($1a, $1b + 1) NUMBER($1b + 1) + ASSIGN_GLOBAL_NUMBER_AND_POP[!INT32_ADD_OVERFLOW($1b, 1)] GLOBAL_LVALUE($1a) INC: ASSIGN_GLOBAL_NUMBER_AND_POP($1a, $1b + 1) NUMBER($1b + 1)    - ASSIGN_GLOBAL_NUMBER_AND_POP[$1b > -0x80000000L] GLOBAL_LVALUE($1a) DEC_AND_POP: ASSIGN_GLOBAL_NUMBER_AND_POP($1a, $1b - 1) - ASSIGN_GLOBAL_NUMBER_AND_POP[$1b < 0x7fffffff] GLOBAL_LVALUE($1a) INC_AND_POP: ASSIGN_GLOBAL_NUMBER_AND_POP($1a, $1b + 1) + ASSIGN_GLOBAL_NUMBER_AND_POP[!INT32_SUB_OVERFLOW($1b, 1)] GLOBAL_LVALUE($1a) DEC_AND_POP: ASSIGN_GLOBAL_NUMBER_AND_POP($1a, $1b - 1) + ASSIGN_GLOBAL_NUMBER_AND_POP[!INT32_ADD_OVERFLOW($1b, 1)] GLOBAL_LVALUE($1a) INC_AND_POP: ASSIGN_GLOBAL_NUMBER_AND_POP($1a, $1b + 1)      LOCAL_LVALUE LOCAL ADD_TO_AND_POP : ADD_LOCALS_AND_POP($1a,$2a)   LOCAL_LVALUE NUMBER ADD_TO_AND_POP: ADD_LOCAL_INT_AND_POP($1a,$2a)   LOCAL_LVALUE CONST_1 ADD_TO_AND_POP: ADD_LOCAL_INT_AND_POP($1a,-1)   LOCAL_LVALUE CONST1 ADD_TO_AND_POP: ADD_LOCAL_INT_AND_POP($1a,1)   LOCAL_LVALUE CONST0 ADD_TO_AND_POP:      LOCAL_LVALUE LTOSVAL ADD_INT ASSIGN: ADD_LOCAL_INT($1a,$3a) - LOCAL_LVALUE LTOSVAL ADD_NEG_INT ASSIGN: ADD_LOCAL_INT($1a,-$3a) + LOCAL_LVALUE LTOSVAL ADD_NEG_INT [ !INT32_NEG_OVERFLOW($3a) ] ASSIGN: ADD_LOCAL_INT($1a,-$3a)      NUMBER ASSIGN_LOCAL_AND_POP : ASSIGN_LOCAL_NUMBER_AND_POP($2a,$1a) -  + NEG_NUMBER ASSIGN_LOCAL_AND_POP [ !INT32_NEG_OVERFLOW($1a) ] : ASSIGN_LOCAL_NUMBER_AND_POP($2a,-$1a)   CONST0 ASSIGN_LOCAL_AND_POP : CLEAR_LOCAL($2a)   CONST1 ASSIGN_LOCAL_AND_POP : ASSIGN_LOCAL_NUMBER_AND_POP($2a,1)   CONST_1 ASSIGN_LOCAL_AND_POP : ASSIGN_LOCAL_NUMBER_AND_POP($2a,-1)      NUMBER ASSIGN_GLOBAL_AND_POP : ASSIGN_GLOBAL_NUMBER_AND_POP($2a,$1a) -  + NEG_NUMBER ASSIGN_GLOBAL_AND_POP [ !INT32_NEG_OVERFLOW($1a) ] : ASSIGN_GLOBAL_NUMBER_AND_POP($2a,-$1a)   CONST0 ASSIGN_GLOBAL_AND_POP : ASSIGN_GLOBAL_NUMBER_AND_POP($2a,0)   CONST1 ASSIGN_GLOBAL_AND_POP : ASSIGN_GLOBAL_NUMBER_AND_POP($2a,1)   CONST_1 ASSIGN_GLOBAL_AND_POP : ASSIGN_GLOBAL_NUMBER_AND_POP($2a,-1)    -  + // Propagate constants past assignments. + NUMBER ASSIGN_LOCAL : ASSIGN_LOCAL_NUMBER_AND_POP($2a,$1a) NUMBER($1a) + NEG_NUMBER ASSIGN_LOCAL [ !INT32_NEG_OVERFLOW($1a) ] : ASSIGN_LOCAL_NUMBER_AND_POP($2a,-$1a) NEG_NUMBER($1a) + CONST0 ASSIGN_LOCAL : CLEAR_LOCAL($2a) CONST0 + CONST1 ASSIGN_LOCAL : ASSIGN_LOCAL_NUMBER_AND_POP($2a,1) CONST1 + CONST_1 ASSIGN_LOCAL : ASSIGN_LOCAL_NUMBER_AND_POP($2a,-1) CONST_1 +  + NUMBER ASSIGN_GLOBAL : ASSIGN_GLOBAL_NUMBER_AND_POP($2a,$1a) NUMBER($1a) + NEG_NUMBER ASSIGN_GLOBAL [ !INT32_NEG_OVERFLOW($1a) ] : ASSIGN_GLOBAL_NUMBER_AND_POP($2a,-$1a) NEG_NUMBER($1a) + CONST0 ASSIGN_GLOBAL : ASSIGN_GLOBAL_NUMBER_AND_POP($2a,0) CONST0 + CONST1 ASSIGN_GLOBAL : ASSIGN_GLOBAL_NUMBER_AND_POP($2a,1) CONST1 + CONST_1 ASSIGN_GLOBAL : ASSIGN_GLOBAL_NUMBER_AND_POP($2a,-1) CONST_1 +    // Remove clearing of locals from the beginning of functions   // But don't remove clearing of arguments!   BYTE ENTRY START_FUNCTION LABEL(0) CLEAR_LOCAL [$1a <= $5a] : BYTE($1a) ENTRY START_FUNCTION LABEL(0) - BYTE ENTRY START_FUNCTION LABEL(0) CLEAR_2_LOCAL [$1a <= $5a] : BYTE($1a) ENTRY START_FUNCTION LABEL(0) - BYTE ENTRY START_FUNCTION LABEL(0) CLEAR_4_LOCAL [$1a <= $5a] : BYTE($1a) ENTRY START_FUNCTION LABEL(0) + BYTE ENTRY START_FUNCTION LABEL(0) CLEAR_N_LOCAL [$1a <= $5a] : BYTE($1a) ENTRY START_FUNCTION LABEL(0)      BYTE ENTRY START_FUNCTION CLEAR_LOCAL [$1a <= $4a] : BYTE($1a) ENTRY START_FUNCTION - BYTE ENTRY START_FUNCTION CLEAR_2_LOCAL [$1a <= $4a] : BYTE($1a) ENTRY START_FUNCTION - BYTE ENTRY START_FUNCTION CLEAR_4_LOCAL [$1a <= $4a] : BYTE($1a) ENTRY START_FUNCTION + BYTE ENTRY START_FUNCTION CLEAR_N_LOCAL [$1a <= $4a] : BYTE($1a) ENTRY START_FUNCTION      CLEAR_LOCAL CLEAR_LOCAL($1a) : CLEAR_LOCAL($1a) - CLEAR_LOCAL CLEAR_LOCAL($1a+1) : CLEAR_2_LOCAL($1a) - CLEAR_2_LOCAL CLEAR_2_LOCAL($1a+2) : CLEAR_4_LOCAL($1a) + CLEAR_LOCAL CLEAR_LOCAL($1a+1) : CLEAR_N_LOCAL($1a,2) + CLEAR_LOCAL CLEAR_LOCAL($1a-1) : CLEAR_N_LOCAL($2a,2)    - // Attempt to make the above trigger more often. - CLEAR_LOCAL CLEAR_2_LOCAL($1a+1) : CLEAR_2_LOCAL($1a) CLEAR_LOCAL($2a+1) - CLEAR_LOCAL CLEAR_4_LOCAL($1a+1) : CLEAR_4_LOCAL($1a) CLEAR_LOCAL($2a+3) - CLEAR_2_LOCAL CLEAR_4_LOCAL($1a+2) : CLEAR_4_LOCAL($1a) CLEAR_2_LOCAL($2a+2) + CLEAR_LOCAL CLEAR_N_LOCAL($1a+1) : CLEAR_N_LOCAL($1a,$2b+1) + CLEAR_N_LOCAL CLEAR_LOCAL($1a-1) : CLEAR_N_LOCAL($1a-1, $1b+1) + CLEAR_N_LOCAL CLEAR_LOCAL($1a+$1b) : CLEAR_N_LOCAL($1a,$1b+1)    -  + // Overlapping range and single: + CLEAR_LOCAL CLEAR_N_LOCAL [$1a >= $2a] [$1a < $2a+$2b] : CLEAR_N_LOCAL($2a, $2b) + CLEAR_N_LOCAL CLEAR_LOCAL [$1a <= $2a] [$2a < $1a+$1b] : CLEAR_N_LOCAL($1a, $1b) +  + // Joining of ranges: + CLEAR_N_LOCAL CLEAR_N_LOCAL [$1a <= $2a] [$1a + $1b >= $2a] : CLEAR_N_LOCAL($1a, MAXIMUM($1a + $1b, $2a + $2b) - $1a) + CLEAR_N_LOCAL CLEAR_N_LOCAL [$2a <= $1a] [$2a + $2b >= $1a] : CLEAR_N_LOCAL($2a, MAXIMUM($1a + $1b, $2a + $2b) - $2a) +    // Attempt to de-interleave clearing of locals.   CONST0 CLEAR_LOCAL : CLEAR_LOCAL($2a) CONST0   CONST1 CLEAR_LOCAL : CLEAR_LOCAL($2a) CONST1   CONST_1 CLEAR_LOCAL : CLEAR_LOCAL($2a) CONST_1   NUMBER CLEAR_LOCAL : CLEAR_LOCAL($2a) NUMBER($1a)   NEG_NUMBER CLEAR_LOCAL : CLEAR_LOCAL($2a) NEG_NUMBER($1a)   CONSTANT CLEAR_LOCAL : CLEAR_LOCAL($2a) CONSTANT($1a)    -  + // FIXME: + // The following aren't sound as they need to account for + // frame->min_number_of_locals to not affect trampolines. + // The cleanest fix is probably to move trampolies to true objects. + // CLEAR_LOCAL RETURN_0: RETURN_0 + // CLEAR_LOCAL_RETURN_1: RETURN_1 + // CLEAR_N_LOCAL RETURN_0: RETURN_0 + // CLEAR_N_LOCAL RETURN_1: RETURN_1      // CONST_1 MULTIPLY : NEGATE   // CONST0 MULTIPLY : POP_VALUE CONST0   // CONST1 MULTIPLY :   // NUMBER MULTIPLY [!($1a & ($1a - 1))]: NUMBER(my_log2($1a)) LSH      // CONST_1 DIVIDE : NEGATE   // CONST1 DIVIDE :   // NUMBER DIVIDE [!($1a & ($1a - 1))]: NUMBER(my_log2($1a)) RSH    - CONST0 SUBTRACT: - CONST0 XOR: - CONST_1 XOR: COMPL +    CONST0 RETURN: RETURN_0   CONST1 RETURN: RETURN_1   CONST0 VOLATILE_RETURN: RETURN_0   CONST1 VOLATILE_RETURN: RETURN_1   INC POP_VALUE: INC_AND_POP   POST_INC POP_VALUE: INC_AND_POP   DEC POP_VALUE: DEC_AND_POP   POST_DEC POP_VALUE: DEC_AND_POP   NOT BRANCH_WHEN_NON_ZERO: BRANCH_WHEN_ZERO($2a)   NOT BRANCH_WHEN_ZERO: BRANCH_WHEN_NON_ZERO($2a)
pike.git/src/peep.in:158:   VOLATILE_RETURN ? DeadCodeEndCond($2o) : VOLATILE_RETURN   RETURN_0 ? DeadCodeEndCond($2o) : RETURN_0   RETURN_1 ? DeadCodeEndCond($2o) : RETURN_1   RETURN_LOCAL ? DeadCodeEndCond($2o) : RETURN_LOCAL($1a)      // Get rid of extra catch-levels.   // Note that the corresponding exit catch is killed   // by dead code elimination.   CATCH ESCAPE_CATCH:    + LEXICAL_LOCAL [!$1b] : LOCAL($1a) + LEXICAL_LOCAL_LVALUE [!$1b] : LOCAL_LVALUE($1a) +  + EXTERNAL [!$1b] : GLOBAL($1a) + EXTERNAL_LVALUE [!$1b] : GLOBAL_LVALUE($1a) +    LOCAL_LVALUE INC : INC_LOCAL ($1a)   LOCAL_LVALUE POST_INC : POST_INC_LOCAL ($1a)   LOCAL_LVALUE INC_AND_POP : INC_LOCAL_AND_POP ($1a)   INC_LOCAL POP_VALUE : INC_LOCAL_AND_POP ($1a)   POST_INC_LOCAL POP_VALUE : INC_LOCAL_AND_POP ($1a)      LOCAL_LVALUE DEC : DEC_LOCAL ($1a)   LOCAL_LVALUE POST_DEC : POST_DEC_LOCAL ($1a)   LOCAL_LVALUE DEC_AND_POP : DEC_LOCAL_AND_POP ($1a)   DEC_LOCAL POP_VALUE : DEC_LOCAL_AND_POP ($1a)
pike.git/src/peep.in:187:      ASSIGN_LOCAL BRANCH_WHEN_ZERO LOCAL($1a) RETURN LABEL($2a): ASSIGN_LOCAL($1a) RETURN_IF_TRUE LABEL($2a)   ASSIGN_LOCAL BRANCH_WHEN_ZERO LOCAL($1a) VOLATILE_RETURN LABEL($2a): ASSIGN_LOCAL($1a) RETURN_IF_TRUE LABEL($2a)      ASSIGN_LOCAL BRANCH_WHEN_ZERO LOCAL($1a) RETURN LABEL($2a) [!(Pike_compiler->compiler_frame->lexical_scope & SCOPE_SCOPED)] : RETURN_IF_TRUE ASSIGN_LOCAL($1a) LABEL($2a)   ASSIGN_LOCAL BRANCH_WHEN_ZERO LOCAL($1a) VOLATILE_RETURN LABEL($2a) [!(Pike_compiler->compiler_frame->lexical_scope & SCOPE_SCOPED)] : RETURN_IF_TRUE ASSIGN_LOCAL($1a) LABEL($2a)      ASSIGN_GLOBAL BRANCH_WHEN_ZERO GLOBAL($1a) RETURN LABEL($2a): ASSIGN_GLOBAL($1a) RETURN_IF_TRUE LABEL($2a)   ASSIGN_GLOBAL BRANCH_WHEN_ZERO GLOBAL($1a) VOLATILE_RETURN LABEL($2a): ASSIGN_GLOBAL($1a) RETURN_IF_TRUE LABEL($2a)    -  - GLOBAL_LVALUE INC_AND_POP GLOBAL($1a): GLOBAL_LVALUE($1a) INC - GLOBAL_LVALUE DEC_AND_POP GLOBAL($1a): GLOBAL_LVALUE($1a) DEC -  +    CONST1 BRANCH_WHEN_ZERO:   CONST0 BRANCH_WHEN_ZERO: BRANCH($2a)   CONST1 BRANCH_WHEN_NON_ZERO: BRANCH($2a)   CONST0 BRANCH_WHEN_NON_ZERO:   NUMBER [$1a] BRANCH_WHEN_ZERO:   NUMBER [$1a] BRANCH_WHEN_NON_ZERO: BRANCH($2a)    - // These optimizations are now handled in optimize_eq - // CONST0 BRANCH_WHEN_EQ: BRANCH_WHEN_ZERO($2a) - // CONST0 BRANCH_WHEN_NE: BRANCH_WHEN_NON_ZERO($2a) - // - // This one is not safe. - // CONST0 EQ: NOT -  - EQ BRANCH_WHEN_NON_ZERO: BRANCH_WHEN_EQ ($2a) - NE BRANCH_WHEN_NON_ZERO: BRANCH_WHEN_NE ($2a) - LT BRANCH_WHEN_NON_ZERO: BRANCH_WHEN_LT ($2a) - GT BRANCH_WHEN_NON_ZERO: BRANCH_WHEN_GT ($2a) - LE BRANCH_WHEN_NON_ZERO: BRANCH_WHEN_LE ($2a) - GE BRANCH_WHEN_NON_ZERO: BRANCH_WHEN_GE ($2a) -  - EQ BRANCH_WHEN_ZERO: BRANCH_WHEN_NE ($2a) - NE BRANCH_WHEN_ZERO: BRANCH_WHEN_EQ ($2a) - // The following only work on total orders. We can't assume that. - // LT BRANCH_WHEN_ZERO: BRANCH_WHEN_GE ($2a) - // GT BRANCH_WHEN_ZERO: BRANCH_WHEN_LE ($2a) - // LE BRANCH_WHEN_ZERO: BRANCH_WHEN_GT ($2a) - // GE BRANCH_WHEN_ZERO: BRANCH_WHEN_LT ($2a) -  +    EQ LOR: EQ_OR ($2a)   EQ LAND: EQ_AND ($2a)      EQ NOT: NE   NE NOT: EQ      // The following only work on total orders. We can't assume that.   //   // LT NOT: GE   // GT NOT: LE
pike.git/src/peep.in:241:   // GE NOT: LT      LOCAL LOCAL : 2_LOCALS ($1a,$2a)   MARK LOCAL : MARK_AND_LOCAL ($2a)   MARK GLOBAL: MARK_AND_GLOBAL ($2a)   MARK STRING : MARK_AND_STRING($2a)   MARK EXTERNAL : MARK_AND_EXTERNAL($2a,$2b)   MARK CONST0 : MARK_AND_CONST0   MARK CONST1 : MARK_AND_CONST1   LOCAL SIZEOF: SIZEOF_LOCAL ($1a) + LOCAL SIZEOF_STRING: SIZEOF_LOCAL_STRING ($1a)   MARK_AND_LOCAL SIZEOF: MARK SIZEOF_LOCAL ($1a)   2_LOCALS SIZEOF: LOCAL($1a) SIZEOF_LOCAL ($1b)   STRING INDEX: STRING_INDEX ($1a)   INDEX SWITCH: SWITCH_ON_INDEX($2a)   LOCAL SWITCH: SWITCH_ON_LOCAL($1a,$2a)   2_LOCALS SWITCH: LOCAL($1a) SWITCH_ON_LOCAL($1b,$2a)      STRING CLEAR_STRING_SUBTYPE: STRING ($1a)   CONST0 CLEAR_STRING_SUBTYPE: CONST0   CONST1 CLEAR_STRING_SUBTYPE: CONST1   CONST_1 CLEAR_STRING_SUBTYPE: CONST_1   NUMBER CLEAR_STRING_SUBTYPE: NUMBER($1a)   NEG_NUMBER CLEAR_STRING_SUBTYPE: NEG_NUMBER($1a) -  + ARROW_STRING CLEAR_STRING_SUBTYPE: STRING($1a)      LOCAL INDEX: LOCAL_INDEX ($1a)   LOCAL CLEAR_STRING_SUBTYPE INDEX: LOCAL_INDEX ($1a)   MARK_AND_LOCAL INDEX: MARK LOCAL_INDEX ($1a)   MARK_AND_LOCAL CLEAR_STRING_SUBTYPE INDEX: MARK LOCAL_INDEX ($1a)   2_LOCALS INDEX: LOCAL_LOCAL_INDEX($1b,$1a)   2_LOCALS CLEAR_STRING_SUBTYPE INDEX: LOCAL_LOCAL_INDEX($1b,$1a)      2_LOCALS [$1a == $1b]: LOCAL($1a) DUP   GLOBAL GLOBAL($1a): GLOBAL($1a) DUP
pike.git/src/peep.in:293:   //   // 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)   NEG_NUMBER [$1a > 0] ADD_INTS : ADD_NEG_INT ($1a) + ADD_INT [$1a < 0 && !INT32_NEG_OVERFLOW($1a)]: ADD_NEG_INT(-$1a) + ADD_NEG_INT [$1a < 0 && !INT32_NEG_OVERFLOW($1a)]: ADD_INT(-$1a)    - CONST0 ADD: ADD_INT (0) - CONST1 ADD: ADD_INT (1) - CONST_1 ADD: ADD_NEG_INT (1) - NUMBER [$1a >= 0] ADD : ADD_INT ($1a) - NEG_NUMBER [$1a > 0] ADD : ADD_NEG_INT ($1a) + #define OPER_INT(X,Y) \ +  X MOD : MOD_INT(Y); \ +  X LSH : LSH_INT(Y); \ +  X RSH : RSH_INT(Y); \ +  X SUBTRACT : SUBTRACT_INT(Y); \ +  X ADD : ADD_INT(Y); \ +  X AND : AND_INT(Y); \ +  X OR : OR_INT(Y); \ +  X XOR : XOR_INT(Y); \ +  X DIVIDE : DIVIDE_INT(Y);\ +  X MULTIPLY : MULTIPLY_INT(Y);    - CONST1 SUBTRACT: ADD_NEG_INT (1) - CONST_1 SUBTRACT: ADD_INT (1) - NUMBER [$1a >= 0] SUBTRACT : ADD_NEG_INT ($1a) - NEG_NUMBER [$1a > 0] SUBTRACT : ADD_INT ($1a) + OPER_INT(NUMBER,$1a) + OPER_INT(NEG_NUMBER [!INT32_NEG_OVERFLOW($1a)], -$1a) + OPER_INT(CONST1,1) + OPER_INT(CONST_1,-1) + OPER_INT(BIGNUM,0x7fffffff) + OPER_INT(CONST0, 0)    -  + MOD_INT(0) : "Division by constant 0." + DIVIDE_INT(0) : "Division by constant 0." +  + // Some noops related to the above opcodes. + // MOD_INT(1): POP_VALUE CONST0 // cf string % int ==> string + LSH_INT(0): + RSH_INT(0): + SUBTRACT_INT(0): + // ADD_INT(0): // cf string + int ==> string + AND_INT(0): POP_VALUE CONST0 + AND_INT(-1): + OR_INT(0): + OR_INT(-1): POP_VALUE CONST_1 + XOR_INT(0): + XOR_INT(-1): COMPL + // DIVIDE_INT(1): // cf string / int ==> array(string) + DIVIDE_INT(-1): NEGATE + // MULTIPLY_INT(0): POP_VALUE CONST0 // cf string * int ==> string + MULTIPLY_INT(1): + MULTIPLY_INT(-1): NEGATE +  + // this should be automatically const optimized, right? + // ADD_INTS ADD_INTS: ADD_INTS ($1a+$2a) +  +    // This set of optimizations is broken. Consider the case:   // STRING ADD_INT ADD_INT   // - // ADD_INT ADD_INT: ADD_INT ($1a+$2a) + // ADD_INT ADD_INT: ADD_INTS ($1a+$2a)   // ADD_NEG_INT ADD_NEG_INT: ADD_NEG_INT ($1a+$2a)   // ADD_NEG_INT ADD_INT [$1a <= $2a]: ADD_INT ($2a-$1a)   // ADD_NEG_INT ADD_INT [$1a > $2a]: ADD_NEG_INT ($1a-$2a)   // ADD_INT ADD_NEG_INT [$2a <= $1a]: ADD_INT ($1a-$2a)   // ADD_INT ADD_NEG_INT [$2a > $1a]: ADD_NEG_INT ($2a-$1a)    - // FIXME: BIGNUMS? - // - // NUMBER ADD_INT : NUMBER ($1a+$2a) - // NUMBER ADD_NEG_INT : NUMBER ($1a-$2a) - // CONST1 ADD_INT : NUMBER(1+$2a) - // CONST1 ADD_NEG_INT : NUMBER(1-$2a) - // CONST_1 ADD_INT : NUMBER($2a-1) - // CONST_1 ADD_NEG_INT : NUMBER(-(1+$2a)) -  +    // FIXME: What about LTOSVAL_AND_FREE variants of the following three rules?      LTOSVAL2_AND_FREE ADD ASSIGN : ADD_TO   LTOSVAL ADD ASSIGN : ADD_TO      LTOSVAL2_AND_FREE ADD_INTS ASSIGN : ADD_TO   LTOSVAL ADD_INTS ASSIGN : ADD_TO      LTOSVAL2_AND_FREE ADD_FLOATS ASSIGN : ADD_TO   LTOSVAL ADD_FLOATS ASSIGN : ADD_TO      LOCAL CONST1 ADD_TO : INC_LOCAL($1a)   LOCAL CONST_1 ADD_TO : DEC_LOCAL($1a)      ADD_TO POP_VALUE : ADD_TO_AND_POP   ASSIGN POP_VALUE : ASSIGN_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)    - INC_LOCAL POP_VALUE : INC_LOCAL_AND_POP($1a) - DEC_LOCAL POP_VALUE : DEC_LOCAL_AND_POP($1a) -  +    #ifdef EAT_STACK   APPLY ASSIGN_LOCAL_AND_POP : APPLY_ASSIGN_LOCAL_AND_POP($1a,$2a)   #endif   ASSIGN_LOCAL_AND_POP INC_LOCAL($1a) : ADD_INT(1) ASSIGN_LOCAL($1a)   ASSIGN_LOCAL_AND_POP DEC_LOCAL($1a) : ADD_NEG_INT(1) ASSIGN_LOCAL($1a)      LOCAL RETURN : RETURN_LOCAL($1a)   LOCAL VOLATILE_RETURN : RETURN_LOCAL($1a)      NUMBER ADD_INT [ !INT32_ADD_OVERFLOW($1a, $2a) ] : NUMBER($1a+$2a)
pike.git/src/peep.in:386:      LOCAL BRANCH_WHEN_NON_ZERO : BRANCH_IF_LOCAL($1a) POINTER($2a)   LOCAL BRANCH_WHEN_ZERO : BRANCH_IF_NOT_LOCAL($1a) POINTER($2a)      // quick_branch_when[_non]_zero _knows_ that the   // value on the stack is an integer.   GT BRANCH_WHEN_ZERO : GT QUICK_BRANCH_WHEN_ZERO($2a)   GE BRANCH_WHEN_ZERO : GE QUICK_BRANCH_WHEN_ZERO($2a)   LT BRANCH_WHEN_ZERO : LT QUICK_BRANCH_WHEN_ZERO($2a)   LE BRANCH_WHEN_ZERO : LE QUICK_BRANCH_WHEN_ZERO($2a) + NE BRANCH_WHEN_ZERO : NE QUICK_BRANCH_WHEN_ZERO($2a) + EQ BRANCH_WHEN_ZERO : EQ QUICK_BRANCH_WHEN_ZERO($2a) +    SIZEOF BRANCH_WHEN_ZERO : SIZEOF($1a) QUICK_BRANCH_WHEN_ZERO($2a)   SIZEOF_LOCAL BRANCH_WHEN_ZERO : SIZEOF_LOCAL($1a) QUICK_BRANCH_WHEN_ZERO($2a)      GT BRANCH_WHEN_NON_ZERO : GT QUICK_BRANCH_WHEN_NON_ZERO($2a)   GE BRANCH_WHEN_NON_ZERO : GE QUICK_BRANCH_WHEN_NON_ZERO($2a)   LT BRANCH_WHEN_NON_ZERO : LT QUICK_BRANCH_WHEN_NON_ZERO($2a)   LE BRANCH_WHEN_NON_ZERO : LE QUICK_BRANCH_WHEN_NON_ZERO($2a) -  + NE BRANCH_WHEN_NON_ZERO : NE QUICK_BRANCH_WHEN_NON_ZERO($2a) + EQ BRANCH_WHEN_NON_ZERO : EQ QUICK_BRANCH_WHEN_NON_ZERO($2a) +    SIZEOF BRANCH_WHEN_NON_ZERO : SIZEOF($1a) QUICK_BRANCH_WHEN_NON_ZERO($2a)   SIZEOF_LOCAL BRANCH_WHEN_NON_ZERO : SIZEOF_LOCAL($1a) QUICK_BRANCH_WHEN_NON_ZERO($2a)    - // It is not really neccessary to set up a frame for these cases. + // It is not really necessary to set up a frame for these cases.   // Deluxe version: Also avoid the argument/local clearing, asm-level   // register pushing etc.   //   // These are functions returning a constant, and doing nothing else.   MARK_AT(0) POP_TO_MARK INIT_FRAME RETURN_0 : RETURN_0   MARK_AT(0) POP_TO_MARK INIT_FRAME UNDEFINED RETURN : UNDEFINED RETURN   MARK_AT(0) POP_TO_MARK INIT_FRAME RETURN_1 : RETURN_1   MARK_AT(0) POP_TO_MARK INIT_FRAME NUMBER RETURN : NUMBER($4a) RETURN   MARK_AT(0) POP_TO_MARK INIT_FRAME STRING RETURN : STRING($4a) RETURN   MARK_AT(0) POP_TO_MARK INIT_FRAME CONSTANT RETURN : CONSTANT($4a) RETURN
pike.git/src/peep.in:433:   BRANCH_IF_NOT_LOCAL POINTER LABEL($2a) : LABEL($2a)      #define OPT_INCDEC(X) \   X##_LOCAL_AND_POP LOCAL ($1a) : X##_LOCAL ($1a) ; \   X##_LOCAL_AND_POP LOCAL LOCAL ($1a) : LOCAL($2a) X##_LOCAL ($1a) ; \   X##_LOCAL_AND_POP GLOBAL LOCAL ($1a) : GLOBAL($2a) X##_LOCAL ($1a) ;      OPT_INCDEC(INC)   OPT_INCDEC(DEC)    - ASSIGN_LOCAL_AND_POP LOCAL($1a) : ASSIGN_LOCAL($1a) - ASSIGN_GLOBAL_AND_POP GLOBAL($1a) : ASSIGN_GLOBAL($1a) +    CLEAR_LOCAL LOCAL($1a) : CLEAR_LOCAL($1a) CONST0   #ifdef EAT_STACK   APPLY_ASSIGN_LOCAL_AND_POP LOCAL ($1b) : APPLY_ASSIGN_LOCAL($1a,$1b)   #endif      DEC_LOCAL_AND_POP MARK_AND_LOCAL ($1a) : DEC_LOCAL ($1a) MARK_X(1)   INC_LOCAL_AND_POP MARK_AND_LOCAL ($1a) : INC_LOCAL ($1a) MARK_X(1)   ASSIGN_GLOBAL_AND_POP MARK GLOBAL($1a) : ASSIGN_GLOBAL($1a) MARK_X(1)   ASSIGN_LOCAL_AND_POP MARK_AND_LOCAL($1a) : ASSIGN_LOCAL($1a) MARK_X(1)   ASSIGN_LOCAL_AND_POP NUMBER LOCAL($1a) : ASSIGN_LOCAL($1a) NUMBER($2a) SWAP
pike.git/src/peep.in:561:   SimpleBranch( LOCAL_ARROW($1a, $1b) ARROW($2a) ARROW($3a) ARROW($4a), $5a )   SimpleBranch( GLOBAL_LOCAL_INDEX($1a, $1b) , $2a )   SimpleBranch( LOCAL_LOCAL_INDEX($1a, $1b) , $2a )      SimpleBranch( GLOBAL($1a) ARROW ($2a), $3a )      LOCAL ASSIGN_LOCAL_AND_POP : LOCAL_2_LOCAL($2a,$1a)   GLOBAL ASSIGN_LOCAL_AND_POP : GLOBAL_2_LOCAL($1a,$2a)   LOCAL ASSIGN_GLOBAL_AND_POP : LOCAL_2_GLOBAL($2a,$1a)    + ASSIGN_PRIVATE_GLOBAL_AND_POP PRIVATE_GLOBAL($1a) : ASSIGN_PRIVATE_GLOBAL($1a) + ASSIGN_PRIVATE_TYPED_GLOBAL_AND_POP PRIVATE_TYPED_GLOBAL($1a) : ASSIGN_PRIVATE_TYPED_GLOBAL($1a,$1b) + ASSIGN_GLOBAL_AND_POP GLOBAL($1a) : ASSIGN_GLOBAL($1a) + ASSIGN_LOCAL_AND_POP LOCAL($1a) : ASSIGN_LOCAL($1a) +    LOCAL ARROW : LOCAL_ARROW($2a,$1a)   LOCAL_ARROW BRANCH_WHEN_ZERO: BRANCH_IF_NOT_LOCAL_ARROW($1a,$1b) POINTER($2a)      GLOBAL LOCAL_INDEX : GLOBAL_LOCAL_INDEX($1a,$2a)      SIZEOF CONST1 BRANCH_WHEN_LT : SIZEOF BRANCH_WHEN_ZERO ($3a)   SIZEOF_LOCAL CONST1 BRANCH_WHEN_LT : SIZEOF_LOCAL($1a) BRANCH_WHEN_ZERO ($3a)   SIZEOF CONST0 BRANCH_WHEN_LE : SIZEOF BRANCH_WHEN_ZERO ($3a)   SIZEOF_LOCAL CONST0 BRANCH_WHEN_LE : SIZEOF_LOCAL($1a) BRANCH_WHEN_ZERO ($3a)      CLEAR_LOCAL DEC_LOCAL_AND_POP($1a) : CONST_1 ASSIGN_LOCAL_AND_POP($1a)   CLEAR_LOCAL INC_LOCAL_AND_POP($1a) : CONST1 ASSIGN_LOCAL_AND_POP($1a)    -  + // Popping of side-effect free values.   NUMBER POP_VALUE : -  + NUMBER64 POP_VALUE : + NEG_NUMBER POP_VALUE:   STRING POP_VALUE :   //FLOAT POP_VALUE :   CONSTANT POP_VALUE :   LOCAL POP_VALUE : - IDENTIFIER POP_VALUE : + LEXICAL_LOCAL POP_VALUE : + GLOBAL POP_VALUE: + PRIVATE_GLOBAL POP_VALUE : + PRIVATE_TYPED_GLOBAL POP_VALUE : + 2_LOCALS POP_VALUE: LOCAL($1a) + LFUN POP_VALUE:   TRAMPOLINE POP_VALUE : -  + CONST0 POP_VALUE: + CONST1 POP_VALUE: + CONST_1 POP_VALUE: + BIGNUM POP_VALUE: + MOD_INT POP_VALUE: POP_VALUE + LSH_INT POP_VALUE: POP_VALUE + RSH_INT POP_VALUE: POP_VALUE + SUBTRACT_INT POP_VALUE: POP_VALUE + ADD_INT POP_VALUE: POP_VALUE + AND_INT POP_VALUE: POP_VALUE + OR_INT POP_VALUE: POP_VALUE + XOR_INT POP_VALUE: POP_VALUE + DIVIDE_INT POP_VALUE: POP_VALUE + MULTIPLY_INT POP_VALUE: POP_VALUE + NEGATE POP_VALUE: POP_VALUE + COMPL POP_VALUE: POP_VALUE + NOT POP_VALUE: POP_VALUE + SIZEOF POP_VALUE: POP_VALUE + MARK_AND_CONST0 POP_VALUE: MARK + MARK_AND_CONST1 POP_VALUE: MARK + MARK_AND_STRING POP_VALUE: MARK + MARK_AND_GLOBAL POP_VALUE: MARK + MARK_AND_EXTERNAL POP_VALUE: MARK + MARK_AND_LOCAL POP_VALUE: MARK    -  + NUMBER POP_TO_MARK : POP_TO_MARK + NUMBER64 POP_TO_MARK : POP_TO_MARK + NEG_NUMBER POP_TO_MARK: POP_TO_MARK + STRING POP_TO_MARK : POP_TO_MARK + //FLOAT POP_TO_MARK : POP_TO_MARK + CONSTANT POP_TO_MARK : POP_TO_MARK + LOCAL POP_TO_MARK : POP_TO_MARK + LEXICAL_LOCAL POP_TO_MARK : POP_TO_MARK + GLOBAL POP_TO_MARK: POP_TO_MARK + PRIVATE_GLOBAL POP_TO_MARK : POP_TO_MARK + PRIVATE_TYPED_GLOBAL POP_TO_MARK : POP_TO_MARK + 2_LOCALS POP_TO_MARK: POP_TO_MARK + LFUN POP_TO_MARK: POP_TO_MARK + TRAMPOLINE POP_TO_MARK : POP_TO_MARK + CONST0 POP_TO_MARK: POP_TO_MARK + CONST1 POP_TO_MARK: POP_TO_MARK + CONST_1 POP_TO_MARK: POP_TO_MARK + BIGNUM POP_TO_MARK: POP_TO_MARK + MOD_INT POP_TO_MARK: POP_TO_MARK + LSH_INT POP_TO_MARK: POP_TO_MARK + RSH_INT POP_TO_MARK: POP_TO_MARK + SUBTRACT_INT POP_TO_MARK: POP_TO_MARK + ADD_INT POP_TO_MARK: POP_TO_MARK + AND_INT POP_TO_MARK: POP_TO_MARK + OR_INT POP_TO_MARK: POP_TO_MARK + XOR_INT POP_TO_MARK: POP_TO_MARK + DIVIDE_INT POP_TO_MARK: POP_TO_MARK + MULTIPLY_INT POP_TO_MARK: POP_TO_MARK + NEGATE POP_TO_MARK: POP_TO_MARK + COMPL POP_TO_MARK: POP_TO_MARK + NOT POP_TO_MARK: POP_TO_MARK + SIZEOF POP_TO_MARK: POP_TO_MARK + PUSH_ARRAY POP_TO_MARK: POP_TO_MARK + MARK_AND_CONST0 POP_TO_MARK: + MARK_AND_CONST1 POP_TO_MARK: + MARK_AND_STRING POP_TO_MARK: + MARK_AND_GLOBAL POP_TO_MARK: + MARK_AND_EXTERNAL POP_TO_MARK: + MARK_AND_LOCAL POP_TO_MARK: +  + NUMBER POP_N_ELEMS [$2a > 0]: POP_N_ELEMS($2a-1) + NUMBER64 POP_N_ELEMS [$2a > 0]: POP_N_ELEMS($2a-1) + NEG_NUMBER POP_N_ELEMS [$2a > 0]: POP_N_ELEMS($2a-1) + STRING POP_N_ELEMS [$2a > 0]: POP_N_ELEMS($2a-1) + //FLOAT POP_N_ELEMS [$2a > 0]: POP_N_ELEMS($2a-1) + CONSTANT POP_N_ELEMS [$2a > 0]: POP_N_ELEMS($2a-1) + LOCAL POP_N_ELEMS [$2a > 0]: POP_N_ELEMS($2a-1) + GLOBAL POP_N_ELEMS [$2a > 0]: POP_N_ELEMS($2a-1) + PRIVATE_GLOBAL POP_N_ELEMS [$2a > 0]: POP_N_ELEMS($2a-1) + PRIVATE_TYPED_GLOBAL POP_N_ELEMS [$2a > 0]: POP_N_ELEMS($2a-1) + 2_LOCALS POP_N_ELEMS [$2a > 0]: LOCAL($1a) POP_N_ELEMS($2a-1) + TRAMPOLINE POP_N_ELEMS [$2a > 0]: LOCAL($1a) POP_N_ELEMS($2a-1) + CONST0 POP_N_ELEMS [$2a > 0]: POP_N_ELEMS($2a-1) + CONST1 POP_N_ELEMS [$2a > 0]: POP_N_ELEMS($2a-1) + CONST_1 POP_N_ELEMS [$2a > 0]: POP_N_ELEMS($2a-1) + BIGNUM POP_N_ELEMS [$2a > 0]: POP_N_ELEMS($2a-1) + MOD_INT POP_N_ELEMS[$2a > 0]: POP_N_ELEMS($2a) + LSH_INT POP_N_ELEMS[$2a > 0]: POP_N_ELEMS($2a) + RSH_INT POP_N_ELEMS[$2a > 0]: POP_N_ELEMS($2a) + SUBTRACT_INT POP_N_ELEMS[$2a > 0]: POP_N_ELEMS($2a) + ADD_INT POP_N_ELEMS[$2a > 0]: POP_N_ELEMS($2a) + ADD_NEG_INT POP_N_ELEMS[$2a > 0]: POP_N_ELEMS($2a) + AND_INT POP_N_ELEMS[$2a > 0]: POP_N_ELEMS($2a) + OR_INT POP_N_ELEMS[$2a > 0]: POP_N_ELEMS($2a) + XOR_INT POP_N_ELEMS[$2a > 0]: POP_N_ELEMS($2a) + DIVIDE_INT POP_N_ELEMS[$2a > 0]: POP_N_ELEMS($2a) + MULTIPLY_INT POP_N_ELEMS[$2a > 0]: POP_N_ELEMS($2a) + NEGATE POP_N_ELEMS[$2a > 0]: POP_N_ELEMS($2a) + COMPL POP_N_ELEMS[$2a > 0]: POP_N_ELEMS($2a) + NOT POP_N_ELEMS[$2a > 0]: POP_N_ELEMS($2a) + SIZEOF POP_N_ELEMS[$2a > 0]: POP_N_ELEMS($2a) +    RECUR RETURN [check_tailrecursion()] : TAIL_RECUR ($1a)      // This doesn't really work - // MARK TAIL_RECUR : BRANCH ($1a) + // MARK TAIL_RECUR : BRANCH ($2a) + // These optimizations are now handled in optimize_eq + // CONST0 BRANCH_WHEN_EQ: BRANCH_WHEN_ZERO($2a) + // CONST0 BRANCH_WHEN_NE: BRANCH_WHEN_NON_ZERO($2a) + // + // This one is not safe. + // CONST0 EQ: NOT    -  + // These are known to always return integers. + ZERO_TYPE BRANCH_WHEN_ZERO: ZERO_TYPE QUICK_BRANCH_WHEN_ZERO($2a) + ZERO_TYPE BRANCH_WHEN_NON_ZERO: ZERO_TYPE QUICK_BRANCH_WHEN_NON_ZERO($2a) +  + UNDEFINEDP BRANCH_WHEN_ZERO: UNDEFINEDP QUICK_BRANCH_WHEN_ZERO($2a) + UNDEFINEDP BRANCH_WHEN_NON_ZERO: UNDEFINEDP QUICK_BRANCH_WHEN_NON_ZERO($2a) +  + DESTRUCTEDP BRANCH_WHEN_ZERO: UNDEFINEDP QUICK_BRANCH_WHEN_ZERO($2a) + DESTRUCTEDP BRANCH_WHEN_NON_ZERO: UNDEFINEDP QUICK_BRANCH_WHEN_NON_ZERO($2a) +  + BRANCH_WHEN_EQ: EQ QUICK_BRANCH_WHEN_NON_ZERO($1a) + BRANCH_WHEN_NE: EQ QUICK_BRANCH_WHEN_ZERO($1a) + BRANCH_WHEN_LT: LT QUICK_BRANCH_WHEN_NON_ZERO($1a) + BRANCH_WHEN_GT: GT QUICK_BRANCH_WHEN_NON_ZERO($1a) + BRANCH_WHEN_LE: LE QUICK_BRANCH_WHEN_NON_ZERO($1a) + BRANCH_WHEN_GE: GE QUICK_BRANCH_WHEN_NON_ZERO($1a) +    ASSIGN_LOCAL BRANCH_WHEN_ZERO 2_LOCALS(,$1a) BRANCH_WHEN_EQ : ASSIGN_LOCAL($1a) BRANCH_AND_POP_WHEN_ZERO($2a) LOCAL($3a) BRANCH_WHEN_EQ($4a)   ASSIGN_LOCAL BRANCH_WHEN_ZERO 2_LOCALS(,$1a) BRANCH_WHEN_NE : ASSIGN_LOCAL($1a) BRANCH_AND_POP_WHEN_ZERO($2a) LOCAL($3a) BRANCH_WHEN_NE($4a)      /* This will facilitate other optimizations I hope */   CLEAR_LOCAL MARK LOCAL [ $1a != $3a ] : MARK LOCAL($3a) CLEAR_LOCAL($1a)      /* The result of this optimization could be reordered... */   CLEAR_LOCAL MARK LOCAL($1a) : MARK CLEAR_LOCAL($1a) CONST0       -  +    #define LOW_MKCALLOPTS(A) \   A POP_VALUE: A##_AND_POP($1a); \   A [ check_tailrecursion() ] RETURN : A##_AND_RETURN($1a) ; \   A##_AND_RETURN ? DeadCodeEndCond($2o) : A##_AND_RETURN($1a) ;      #define MKCALLOPTS(A) \   MARK A: MARK_##A($2a) ; \ -  + MARK_X A: A##_N($2a,$1a); \   LOW_MKCALLOPTS(A); \ -  + A##_N[!$1b]:MARK_##A($1a); \   LOW_MKCALLOPTS(MARK_##A);         MKCALLOPTS(APPLY)   MKCALLOPTS(CALL_LFUN)   MKCALLOPTS(CALL_BUILTIN)   // MARK CALL_FUNCTION doesn't make any sense...   LOW_MKCALLOPTS(CALL_FUNCTION)      // MARK CALL_OTHER doesn't make any sense either...
pike.git/src/peep.in:666:   GLOBAL_LVALUE NUMBER ASSIGN_GLOBAL_AND_POP($1a) DEC_AND_POP : NUMBER($2a) ADD_NEG_INT(1) ASSIGN_GLOBAL_AND_POP($1a)   GLOBAL_LVALUE NEG_NUMBER ASSIGN_GLOBAL_AND_POP($1a) INC_AND_POP : NEG_NUMBER($2a) ADD_INT(1) ASSIGN_GLOBAL_AND_POP($1a)   GLOBAL_LVALUE NEG_NUMBER ASSIGN_GLOBAL_AND_POP($1a) DEC_AND_POP : NEG_NUMBER($2a) ADD_NEG_INT(1) ASSIGN_GLOBAL_AND_POP($1a)      // Move marks to where they're relevant.   MARK CLEAR_LOCAL: CLEAR_LOCAL($2a) MARK   MARK ASSIGN_LOCAL_NUMBER_AND_POP: ASSIGN_LOCAL_NUMBER_AND_POP($2a,$2b) MARK   MARK ASSIGN_GLOBAL_NUMBER_AND_POP: ASSIGN_GLOBAL_NUMBER_AND_POP($2a,$2b) MARK   MARK NEG_NUMBER ASSIGN_LOCAL_AND_POP: NEG_NUMBER($2a) ASSIGN_LOCAL_AND_POP($3a) MARK   MARK NEG_NUMBER ASSIGN_GLOBAL_AND_POP: NEG_NUMBER($2a) ASSIGN_GLOBAL_AND_POP($3a) MARK - MARK_AND_CONST1 ASSIGN_LOCAL_AND_POP: CONST1 ASSIGN_LOCAL_AND_POP($3a) MARK - MARK_AND_CONST1 ASSIGN_GLOBAL_AND_POP: CONST1 ASSIGN_GLOBAL_AND_POP($3a) MARK - MARK CONST_1 ASSIGN_LOCAL_AND_POP: CONST_1 ASSIGN_LOCAL_AND_POP($3a) MARK - MARK CONST_1 ASSIGN_GLOBAL_AND_POP: CONST_1 ASSIGN_GLOBAL_AND_POP($3a) MARK -  - CONST_1 COMPL : CONST0 - CONST_1 ASSIGN_LOCAL COMPL : CONST_1 ASSIGN_LOCAL_AND_POP($2a) CONST0 - CONST_1 ASSIGN_GLOBAL COMPL : CONST_1 ASSIGN_GLOBAL_AND_POP($2a) CONST0 -  - CONST0 COMPL : CONST_1 - CONST0 ASSIGN_LOCAL COMPL : CLEAR_LOCAL($2a) CONST_1 - CONST0 ASSIGN_GLOBAL COMPL : CONST0 ASSIGN_GLOBAL_AND_POP($2a) CONST_1 + MARK_AND_CONST1 ASSIGN_LOCAL_AND_POP: ASSIGN_LOCAL_NUMBER_AND_POP($3a,1) MARK + MARK_AND_CONST1 ASSIGN_GLOBAL_AND_POP: ASSIGN_GLOBAL_NUMBER_AND_POP($3a,1) MARK