From d3d04df48193e64393fbc5b51222d5e53d263ca3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Henrik=20Grubbstr=C3=B6m=20=28Grubba=29?= <grubba@grubba.org> Date: Sat, 7 Feb 2015 14:00:26 +0100 Subject: [PATCH] Optimizer: Handle more cases of CLEAR_{,N_}LOCAL. This improves the code generated by the previous commit. --- src/peep.in | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) diff --git a/src/peep.in b/src/peep.in index 781a5f82a3..a9419a6257 100644 --- a/src/peep.in +++ b/src/peep.in @@ -118,10 +118,20 @@ BYTE ENTRY START_FUNCTION CLEAR_N_LOCAL [$1a <= $4a] : BYTE($1a) ENTRY START_FUN CLEAR_LOCAL CLEAR_LOCAL($1a) : CLEAR_LOCAL($1a) CLEAR_LOCAL CLEAR_LOCAL($1a+1) : CLEAR_N_LOCAL($1a,2) +CLEAR_LOCAL CLEAR_LOCAL($1a-1) : CLEAR_N_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 @@ -130,6 +140,14 @@ 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 -- GitLab