+Thu Feb 19 01:32:37 1998 Jeffrey A Law (law@cygnus.com)
+ Richard Kenner <kenner@vlsi1.ultra.nyu.edu>
+
+ * emit-rtl.c (gen_lowpart_common): Suppress last change if __complex__.
+
+ * emit-rtl.c (hard-reg-set.h): Include.
+ (get_lowpart_common): Don't make new REG for hard reg in a
+ class that cannot change size.
+ * Makefile.in (emit-rtl.o): Depend on hard-reg-set.h.
+
+ * combine.c: Revert previous patch.
+
Tue Feb 17 23:34:29 1998 David Edelsohn <edelsohn@mhpcc.edu>
* rs6000.h (MY_ISCOFF): Add numeric value of U803XTOCMAGIC.
xcoffout.o : xcoffout.c $(CONFIG_H) $(TREE_H) $(RTL_H) xcoffout.h flags.h
emit-rtl.o : emit-rtl.c $(CONFIG_H) $(RTL_H) $(TREE_H) flags.h \
function.h regs.h insn-config.h insn-codes.h real.h expr.h bytecode.h \
- bc-opcode.h bc-typecd.h bc-typecd.def bc-optab.h bc-emit.h bc-opname.h
+ bc-opcode.h bc-typecd.h bc-typecd.def bc-optab.h bc-emit.h bc-opname.h \
+ hard-reg-set.h
real.o : real.c $(CONFIG_H) $(TREE_H)
getpwd.o : getpwd.c $(CONFIG_H)
if (GET_CODE (SUBREG_REG (x)) == REG
&& REGNO (SUBREG_REG (x)) < FIRST_PSEUDO_REGISTER
-#ifdef CLASS_CANNOT_CHANGE_SIZE
- && (! (TEST_HARD_REG_BIT
- (reg_class_contents[(int) CLASS_CANNOT_CHANGE_SIZE],
- REGNO (SUBREG_REG (x))))
- || (GET_MODE_SIZE (mode)
- == GET_MODE_SIZE (GET_MODE (SUBREG_REG (x)))))
-#endif
&& REGNO (SUBREG_REG (x)) != FRAME_POINTER_REGNUM
#if HARD_FRAME_POINTER_REGNUM != FRAME_POINTER_REGNUM
&& REGNO (SUBREG_REG (x)) != HARD_FRAME_POINTER_REGNUM
int modewidth;
rtx tem;
-#ifdef CLASS_CANNOT_CHANGE_SIZE
- /* When dealing with hard regs that cannot change size, don't even try
- expanding to shifts, since we wind up violating the rule. */
- if (GET_RTX_CLASS (GET_CODE (x)) == '1'
- && GET_CODE (XEXP (x, 0)) == REG
- && REGNO (SUBREG_REG (x)) < FIRST_PSEUDO_REGISTER
- && (TEST_HARD_REG_BIT
- (reg_class_contents[(int) CLASS_CANNOT_CHANGE_SIZE],
- REGNO (SUBREG_REG (x))))
- && (GET_MODE_SIZE (GET_MODE (x))
- != GET_MODE_SIZE (GET_MODE (SUBREG_REG (x)))))
- return x;
-#endif
-
switch (GET_CODE (x))
{
case ZERO_EXTEND:
break;
case SUBREG:
-#ifdef CLASS_CANNOT_CHANGE_SIZE
- if (GET_CODE (SUBREG_REG (x)) == REG
- && REGNO (SUBREG_REG (x)) < FIRST_PSEUDO_REGISTER
- && (TEST_HARD_REG_BIT
- (reg_class_contents[(int) CLASS_CANNOT_CHANGE_SIZE],
- REGNO (SUBREG_REG (x))))
- && (GET_MODE_SIZE (GET_MODE (x))
- != GET_MODE_SIZE (GET_MODE (SUBREG_REG (x)))))
- return x;
-#endif
-
if (subreg_lowpart_p (x)
/* We can ignore the effect of this SUBREG if it narrows the mode or
if the constant masks to zero all the bits the mode doesn't
#include "function.h"
#include "expr.h"
#include "regs.h"
+#include "hard-reg-set.h"
#include "insn-config.h"
#include "real.h"
#include "obstack.h"
/* integrate.c can't handle parts of a return value register. */
&& (! REG_FUNCTION_VALUE_P (x)
|| ! rtx_equal_function_value_matters)
+#ifdef CLASS_CANNOT_CHANGE_SIZE
+ && ! (GET_MODE_SIZE (mode) != GET_MODE_SIZE (GET_MODE (x))
+ && GET_MODE_CLASS (GET_MODE (x)) != MODE_COMPLEX_INT
+ && GET_MODE_CLASS (GET_MODE (x)) != MODE_COMPLEX_FLOAT
+ && (TEST_HARD_REG_BIT
+ (reg_class_contents[(int) CLASS_CANNOT_CHANGE_SIZE],
+ REGNO (x))))
+#endif
/* We want to keep the stack, frame, and arg pointers
special. */
&& x != frame_pointer_rtx