From f41ed9e7eac5a351d8581400e696549a1fda01cc Mon Sep 17 00:00:00 2001 From: Simon Marlow Date: Tue, 6 Jun 2006 11:23:57 +0000 Subject: [PATCH] fix a case of "naughty I386 byte reg" The fix is a little hacky, because we don't have support for register classes in general, but it's an improvement. --- compiler/nativeGen/MachCodeGen.hs | 34 ++++++++++++++++++++++------------ 1 file changed, 22 insertions(+), 12 deletions(-) diff --git a/compiler/nativeGen/MachCodeGen.hs b/compiler/nativeGen/MachCodeGen.hs index 90ce6b5..7f09c9d 100644 --- a/compiler/nativeGen/MachCodeGen.hs +++ b/compiler/nativeGen/MachCodeGen.hs @@ -898,21 +898,19 @@ getRegister (CmmMachOp mop [x]) -- unary MachOps MO_Not rep -> trivialUCode rep (NOT rep) x -- Nop conversions - -- TODO: these are only nops if the arg is not a fixed register that - -- can't be byte-addressed. - MO_U_Conv I32 I8 -> conversionNop I32 x - MO_S_Conv I32 I8 -> conversionNop I32 x - MO_U_Conv I16 I8 -> conversionNop I16 x - MO_S_Conv I16 I8 -> conversionNop I16 x - MO_U_Conv I32 I16 -> conversionNop I32 x - MO_S_Conv I32 I16 -> conversionNop I32 x + MO_U_Conv I32 I8 -> toI8Reg I32 x + MO_S_Conv I32 I8 -> toI8Reg I32 x + MO_U_Conv I16 I8 -> toI8Reg I16 x + MO_S_Conv I16 I8 -> toI8Reg I16 x + MO_U_Conv I32 I16 -> toI16Reg I32 x + MO_S_Conv I32 I16 -> toI16Reg I32 x #if x86_64_TARGET_ARCH MO_U_Conv I64 I32 -> conversionNop I64 x MO_S_Conv I64 I32 -> conversionNop I64 x - MO_U_Conv I64 I16 -> conversionNop I64 x - MO_S_Conv I64 I16 -> conversionNop I64 x - MO_U_Conv I64 I8 -> conversionNop I64 x - MO_S_Conv I64 I8 -> conversionNop I64 x + MO_U_Conv I64 I16 -> toI16Reg I64 x + MO_S_Conv I64 I16 -> toI16Reg I64 x + MO_U_Conv I64 I8 -> toI8Reg I64 x + MO_S_Conv I64 I8 -> toI8Reg I64 x #endif MO_U_Conv rep1 rep2 | rep1 == rep2 -> conversionNop rep1 x @@ -964,6 +962,18 @@ getRegister (CmmMachOp mop [x]) -- unary MachOps instr from (OpReg reg) (OpReg dst) return (Any to code) + toI8Reg new_rep expr + = do codefn <- getAnyReg expr + return (Any new_rep codefn) + -- HACK: use getAnyReg to get a byte-addressable register. + -- If the source was a Fixed register, this will add the + -- mov instruction to put it into the desired destination. + -- We're assuming that the destination won't be a fixed + -- non-byte-addressable register; it won't be, because all + -- fixed registers are word-sized. + + toI16Reg = toI8Reg -- for now + conversionNop new_rep expr = do e_code <- getRegister expr return (swizzleRegisterRep e_code new_rep) -- 1.7.10.4