On Fri, Aug 04, 2006 at 11:21:05AM +0200, Bernd Schmidt wrote: > > Probably the compiler doesn't in general like a paradoxical subreg that > can take more hard regs than its SUBREG_REG. I think this is probably > something that can be worked around with a proper combination of > MODES_TIEABLE_P, CANNOT_CHANGE_MODE_CLASS, and maybe > REG_CANNOT_CHANGE_MODE_P. What are your definitions of those macros?
#define MODES_TIEABLE_P(MODE1, MODE2) \ (GET_MODE_SIZE(MODE1) > 1 && GET_MODE_SIZE(MODE2) > 1) There are registers for which HARD_REGNO_MODE_OK (regno, QImode) returns false but HARD_REGNO_MODE_OK (regno, HImode) (or larger) returns true. #define CANNOT_CHANGE_MODE_CLASS(FROM, TO, CLASS) \ ((FROM == QImode || (TO) == QImode) \ && reg_classes_intersect_p (HI_REGS, (CLASS))) HI_REGS is a class containing registers which can't hold QImode values. They are 16-bit only (%si, %di, %bp and %sp). Is there an undocumented assumption here that if CANNOT_CHANGE_MODE_CLASS() returns true, then the number of hard regs used is unchanged? I haven't heard of REG_CANNOT_CHANGE_MODE_P before, and it isn't mentioned in the documentation. -- Rask Ingemann Lambertsen