From a7622ce0294ba43e4d5d9dc8103d12959ef8dac1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fredrik=20H=C3=BCbinette=20=28Hubbe=29?= <hubbe@hubbe.net> Date: Tue, 6 Aug 1996 00:05:27 +0200 Subject: [PATCH] if(foo && bar) optimized Rev: src/docode.c:1.7 --- src/docode.c | 63 ++++++++++++++++++++++++++++++++++++---------------- 1 file changed, 44 insertions(+), 19 deletions(-) diff --git a/src/docode.c b/src/docode.c index c7b606bb57..10cf1fc050 100644 --- a/src/docode.c +++ b/src/docode.c @@ -119,9 +119,9 @@ INT32 pop_address() static int label_no=0; -static int alloc_label() { return ++label_no; } +int alloc_label() { return ++label_no; } -static int do_jump(int token,INT32 lbl) +int do_jump(int token,INT32 lbl) { if(lbl==-1) lbl=alloc_label(); emit(token, lbl); @@ -132,7 +132,7 @@ static int do_docode2(node *n,int flags); #define ins_label(L) do_jump(F_LABEL, L) -static void do_pop(int x) +void do_pop(int x) { switch(x) { @@ -156,44 +156,66 @@ int do_docode(node *n,INT16 flags) } -static INT32 do_jump_when_zero(node *n,int j); +void do_jump_when_zero(node *n,int j); -static int do_jump_when_non_zero(node *n,int j) +void do_jump_when_non_zero(node *n,int j) { if(!node_is_tossable(n)) { if(node_is_true(n)) - return do_jump(F_BRANCH,j); + { + do_jump(F_BRANCH,j); + return; + } if(node_is_false(n)) - return -1; + return; } - if(n->token == F_NOT) - return do_jump_when_zero(CAR(n), j); + switch(n->token) + { + case F_NOT: + do_jump_when_zero(CAR(n), j); + return; + case F_OR: + do_jump_when_non_zero(CAR(n), j); + do_jump_when_non_zero(CDR(n), j); + return; + } if(do_docode(n, DO_NOT_COPY)!=1) fatal("Infernal compiler skiterror.\n"); - return do_jump(F_BRANCH_WHEN_NON_ZERO,j); + do_jump(F_BRANCH_WHEN_NON_ZERO,j); } -static INT32 do_jump_when_zero(node *n,int j) +void do_jump_when_zero(node *n,int j) { if(!node_is_tossable(n)) { if(node_is_true(n)) - return -1; + return; if(node_is_false(n)) - return do_jump(F_BRANCH,j); + { + do_jump(F_BRANCH,j); + return; + } } - if(n->token == F_NOT) - return do_jump_when_non_zero(CAR(n), j); + switch(n->token) + { + case F_NOT: + do_jump_when_non_zero(CAR(n), j); + return; + case F_AND: + do_jump_when_zero(CAR(n), j); + do_jump_when_zero(CDR(n), j); + return; + } if(do_docode(n, DO_NOT_COPY)!=1) fatal("Infernal compiler skiterror.\n"); - return do_jump(F_BRANCH_WHEN_ZERO,j); + do_jump(F_BRANCH_WHEN_ZERO,j); } static INT32 count_cases(node *n) @@ -266,7 +288,8 @@ static int do_docode2(node *n,int flags) if(!CDDR(n)) { - tmp1=do_jump_when_zero(CAR(n), -1); + tmp1=alloc_label(); + do_jump_when_zero(CAR(n), tmp1); DO_CODE_BLOCK(CADR(n)); emit(F_LABEL, tmp1); return 0; @@ -274,13 +297,15 @@ static int do_docode2(node *n,int flags) if(!CADR(n)) { - tmp1=do_jump_when_non_zero(CAR(n), -1); + tmp1=alloc_label(); + do_jump_when_non_zero(CAR(n), tmp1); DO_CODE_BLOCK(CDDR(n)); emit(F_LABEL,tmp1); return 0; } - tmp1=do_jump_when_zero(CAR(n),-1); + tmp1=alloc_label(); + do_jump_when_zero(CAR(n),tmp1); adroppings=do_docode(CADR(n), flags); tmp3=emit(F_POP_N_ELEMS,0); -- GitLab