aboutsummaryrefslogtreecommitdiff
path: root/il-gen.c
diff options
context:
space:
mode:
Diffstat (limited to 'il-gen.c')
-rw-r--r--il-gen.c15
1 files changed, 14 insertions, 1 deletions
diff --git a/il-gen.c b/il-gen.c
index 9e1ec64..9dafbbf 100644
--- a/il-gen.c
+++ b/il-gen.c
@@ -516,7 +516,7 @@ int gtst(int inv, int t)
break;
}
t = out_opj(c, t);
- } else { /* VT_JMP || VT_JMPI */
+ } else if (v == VT_JMP || v == VT_JMPI) {
/* && or || optimization */
if ((v & 1) == inv) {
/* insert vtop->c jump list in t */
@@ -529,6 +529,19 @@ int gtst(int inv, int t)
t = gjmp(t);
gsym(vtop->c.i);
}
+ } else {
+ if (is_float(vtop->t)) {
+ vpushi(0);
+ gen_op(TOK_NE);
+ }
+ if ((vtop->r & (VT_VALMASK | VT_LVAL | VT_FORWARD)) == VT_CONST) {
+ /* constant jmp optimization */
+ if ((vtop->c.i != 0) != inv)
+ t = gjmp(t);
+ } else {
+ v = gv(RC_INT);
+ t = out_opj(IL_OP_BRTRUE - inv, t);
+ }
}
vtop--;
return t;