diff options
author | Alon Zakai <alonzakai@gmail.com> | 2012-02-02 16:05:57 -0800 |
---|---|---|
committer | Alon Zakai <alonzakai@gmail.com> | 2012-02-02 16:05:57 -0800 |
commit | d1155beddaf5d755ee8deff80fbd787a3d09cfb3 (patch) | |
tree | edccdb6f85f08f7b846ab021c18a576a2c708098 /src | |
parent | 364948c9a25be1896bdbdf02b9d708bd7972436c (diff) |
fix negative i64 comparisons
Diffstat (limited to 'src')
-rw-r--r-- | src/parseTools.js | 24 |
1 files changed, 16 insertions, 8 deletions
diff --git a/src/parseTools.js b/src/parseTools.js index f1413c1c..6986d1c1 100644 --- a/src/parseTools.js +++ b/src/parseTools.js @@ -1661,14 +1661,22 @@ function processMathop(item) { case 'fptoui': case 'fptosi': return splitI64(ident1); case 'icmp': { switch (variant) { - case 'uge': case 'sge': return ident1 + '[1] >= ' + ident2 + '[1] && (' + ident1 + '[1] > ' + ident2 + '[1] || ' + - ident1 + '[0] >= ' + ident2 + '[0])'; - case 'ule': case 'sle': return ident1 + '[1] <= ' + ident2 + '[1] && (' + ident1 + '[1] < ' + ident2 + '[1] || ' + - ident1 + '[0] <= ' + ident2 + '[0])'; - case 'ugt': case 'sgt': return ident1 + '[1] > ' + ident2 + '[1] || (' + ident1 + '[1] == ' + ident2 + '[1] && ' + - ident1 + '[0] > ' + ident2 + '[0])'; - case 'ult': case 'slt': return ident1 + '[1] < ' + ident2 + '[1] || (' + ident1 + '[1] == ' + ident2 + '[1] && ' + - ident1 + '[0] < ' + ident2 + '[0])'; + case 'uge': return ident1 + '[1] >= ' + ident2 + '[1] && (' + ident1 + '[1] > ' + ident2 + '[1] || ' + + ident1 + '[0] >= ' + ident2 + '[0])'; + case 'sge': return '(' + ident1 + '[1]|0) >= (' + ident2 + '[1]|0) && ((' + ident1 + '[1]|0) > (' + ident2 + '[1]|0) || ' + + '(' + ident1 + '[0]|0) >= (' + ident2 + '[0]|0))'; + case 'ule': return ident1 + '[1] <= ' + ident2 + '[1] && (' + ident1 + '[1] < ' + ident2 + '[1] || ' + + ident1 + '[0] <= ' + ident2 + '[0])'; + case 'sle': return '(' + ident1 + '[1]|0) <= (' + ident2 + '[1]|0) && ((' + ident1 + '[1]|0) < (' + ident2 + '[1]|0) || ' + + '(' + ident1 + '[0]|0) <= (' + ident2 + '[0]|0))'; + case 'ugt': return ident1 + '[1] > ' + ident2 + '[1] || (' + ident1 + '[1] == ' + ident2 + '[1] && ' + + ident1 + '[0] > ' + ident2 + '[0])'; + case 'sgt': return '(' + ident1 + '[1]|0) > (' + ident2 + '[1]|0) || ((' + ident1 + '[1]|0) == (' + ident2 + '[1]|0) && ' + + '(' + ident1 + '[0]|0) > (' + ident2 + '[0]|0))'; + case 'ult': return ident1 + '[1] < ' + ident2 + '[1] || (' + ident1 + '[1] == ' + ident2 + '[1] && ' + + ident1 + '[0] < ' + ident2 + '[0])'; + case 'slt': return '(' + ident1 + '[1]|0) < (' + ident2 + '[1]|0) || ((' + ident1 + '[1]|0) == (' + ident2 + '[1]|0) && ' + + '(' + ident1 + '[0]|0) < (' + ident2 + '[0]|0))'; case 'ne': case 'eq': { // We must sign them, so we do not compare -1 to 255 (could have unsigned them both too) // since LLVM tells us if <=, >= etc. comparisons are signed, but not == and !=. |