From 9ff288648b23537c205e4dad16002e2b9ca03203 Mon Sep 17 00:00:00 2001 From: jiang <30155751@qq.com> Date: Wed, 30 Apr 2014 14:24:44 +0800 Subject: Restore eda2c756edc4dca004ba217d5bf361235dd9de1f --- x86_64-gen.c | 19 ++++++++++++++++++- 1 file changed, 18 insertions(+), 1 deletion(-) (limited to 'x86_64-gen.c') diff --git a/x86_64-gen.c b/x86_64-gen.c index a8a7e87..72709be 100644 --- a/x86_64-gen.c +++ b/x86_64-gen.c @@ -1593,7 +1593,7 @@ int gtst(int inv, int t) } g(0x0f); t = psym((vtop->c.i - 16) ^ inv, 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 */ @@ -1606,6 +1606,23 @@ int gtst(int inv, int t) t = gjmp(t); gsym(vtop->c.i); } + } else { + if (is_float(vtop->type.t) || + (vtop->type.t & VT_BTYPE) == VT_LLONG) { + vpushi(0); + gen_op(TOK_NE); + } + if ((vtop->r & (VT_VALMASK | VT_LVAL | VT_SYM)) == VT_CONST) { + /* constant jmp optimization */ + if ((vtop->c.i != 0) != inv) + t = gjmp(t); + } else { + v = gv(RC_INT); + orex(0,v,v,0x85); + o(0xc0 + REG_VALUE(v) * 9); + g(0x0f); + t = psym(0x85 ^ inv, t); + } } vtop--; return t; -- cgit v1.3.1