Fix 64bit comparisons on 32bit x86
We used to do 64bit comparisons like this:
ChildCode64 code1 r1_lo <- iselExpr64 e1
ChildCode64 code2 r2_lo <- iselExpr64 e2
let r1_hi = getHiVRegFromLo r1_lo
r2_hi = getHiVRegFromLo r2_lo
cond = machOpToCond mop
Just cond' = maybeFlipCond cond
--TODO: Update CFG for x86
let code = code1 `appOL` code2 `appOL` toOL [
CMP II32 (OpReg r2_hi) (OpReg r1_hi),
JXX cond true,
JXX cond' false,
CMP II32 (OpReg r2_lo) (OpReg r1_lo),
JXX cond true] `appOL` genBranch false
return code
This is subtly wrong.
If we have >=
as comparison and the high bits are equal we immediately jump to true.
But in fact the low bits might still go either way! We actually have to look at them to
make a final decision but we (currently) don't.
This patch fixes the logic and also rewrites it to make do with a single conditional jump.
Edited by Ben Gamari