Commit caf94b06 authored by rwbarton's avatar rwbarton Committed by Ben Gamari
Browse files

x86 nativeGen: Fix test with mask in range [128,255] (#13425)

My commit bdb0c43c optimized the encoding of instructions to test
tag bits, but it did not always set exactly the same condition codes
since the testb instruction does a single-byte comparison, rather
than a full-word comparison.

It would be correct to optimize the expression `x .&. 128 > 0` to
the sequence

    testb $128, %al
    seta %al         ; note: 'a' for unsigned comparison,
                     ; not 'g' for signed comparison

but the pretty-printer is not the right place to make this kind of
context-sensitive optimization.

Test Plan: harbormaster

Reviewers: trofi, austin, bgamari, dfeuer

Reviewed By: trofi, dfeuer

Subscribers: thomie

Differential Revision: https://phabricator.haskell.org/D3359
parent 8429a202
......@@ -671,8 +671,12 @@ pprInstr (TEST format src dst) = sdocWithPlatform $ \platform ->
-- (We could handle masks larger than a single byte too,
-- but it would complicate the code considerably
-- and tag checks are by far the most common case.)
-- The mask must have the high bit clear for this smaller encoding
-- to be completely equivalent to the original; in particular so
-- that the signed comparison condition bits are the same as they
-- would be if doing a full word comparison. See Trac #13425.
(OpImm (ImmInteger mask), OpReg dstReg)
| 0 <= mask && mask < 256 -> minSizeOfReg platform dstReg
| 0 <= mask && mask < 128 -> minSizeOfReg platform dstReg
_ -> format
in pprFormatOpOp (sLit "test") format' src dst
where
......
import Data.Bits ((.&.))
flags :: Int -> Int
flags x
| x .&. 128 > 0 = 12
| otherwise = 13
{-# NOINLINE flags #-}
main :: IO ()
main = print (flags 255)
......@@ -155,3 +155,4 @@ test('T9577', [ unless(arch('x86_64') or arch('i386'),skip),
when(opsys('darwin'), expect_broken(12937)),
when(opsys('mingw32'), expect_broken(12965)),
only_ways(['normal']) ], compile_and_run, [''])
test('T13425', normal, compile_and_run, ['-O'])
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment