From 4fa51affe8353ac8b39a41ccba69fb38101f7c3e Mon Sep 17 00:00:00 2001 From: Mike Pall Date: Sat, 21 Feb 2015 21:44:41 +0100 Subject: [PATCH] x86/x64: Fix code generation for fused test/arith ops. Thanks to Alexander Nasonov and AFL. --- src/lj_asm_x86.h | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/src/lj_asm_x86.h b/src/lj_asm_x86.h index bb6976f2..0b6b2d4a 100644 --- a/src/lj_asm_x86.h +++ b/src/lj_asm_x86.h @@ -1836,8 +1836,12 @@ static void asm_intarith(ASMState *as, IRIns *ir, x86Arith xa) Reg dest, right; int32_t k = 0; if (as->flagmcp == as->mcp) { /* Drop test r,r instruction. */ - as->flagmcp = NULL; - as->mcp += (LJ_64 && *as->mcp < XI_TESTb) ? 3 : 2; + MCode *p = as->mcp + ((LJ_64 && *as->mcp < XI_TESTb) ? 3 : 2); + if ((p[1] & 15) < 14) { + if ((p[1] & 15) >= 12) p[1] -= 4; /* L <->S, NL <-> NS */ + as->flagmcp = NULL; + as->mcp = p; + } /* else: cannot transform LE/NLE to cc without use of OF. */ } right = IR(rref)->r; if (ra_hasreg(right)) {