aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJames Van Artsdalen <jrv@gnu.org>1993-01-20 06:45:28 +0000
committerJames Van Artsdalen <jrv@gnu.org>1993-01-20 06:45:28 +0000
commit85ff473e569925cbf9858fcc45491dda25b7ae92 (patch)
tree00f32b9c341067c41c7a3f71b3a10c794acf726b
parenteca315011760544a68bf639fed765e8ecb81f604 (diff)
downloadgcc-85ff473e569925cbf9858fcc45491dda25b7ae92.zip
gcc-85ff473e569925cbf9858fcc45491dda25b7ae92.tar.gz
gcc-85ff473e569925cbf9858fcc45491dda25b7ae92.tar.bz2
(PREFERRED_RELOAD_CLASS): Narrow ALL_REGS to GENERAL_REGS.
(PREFERRED_OUTPUT_RELOAD_CLASS): New macro. Narrow ALL_REGS to GENERAL_REGS. (SECONDARY_MEMORY_NEEDED): New macro. From-SVN: r3295
-rw-r--r--gcc/config/i386/i386.h24
1 files changed, 17 insertions, 7 deletions
diff --git a/gcc/config/i386/i386.h b/gcc/config/i386/i386.h
index 73b6f25..c5383ac 100644
--- a/gcc/config/i386/i386.h
+++ b/gcc/config/i386/i386.h
@@ -524,19 +524,29 @@ extern enum reg_class regclass_map[FIRST_PSEUDO_REGISTER];
reloaded into floating registers (since no move-insn can do that)
and we ensure that QImodes aren't reloaded into the esi or edi reg. */
-/* Don't put float CONST_DOUBLE into any regs.
+/* Don't put float CONST_DOUBLE into fp regs.
QImode must go into class Q_REGS.
MODE_INT must not go into FLOAT_REGS. */
#define PREFERRED_RELOAD_CLASS(X,CLASS) \
- (GET_CODE (X) == CONST_DOUBLE && GET_MODE (X) != VOIDmode \
- ? NO_REGS \
- : GET_MODE (X) == QImode \
- ? (! reg_class_subset_p ((CLASS), Q_REGS) ? Q_REGS : (CLASS)) \
+ (GET_CODE (X) == CONST_DOUBLE && GET_MODE (X) != VOIDmode ? NO_REGS \
+ : GET_MODE (X) == QImode && ! reg_class_subset_p (CLASS, Q_REGS) ? Q_REGS \
: ((CLASS) == FLOAT_REGS \
&& (GET_MODE (X) == VOIDmode \
- || GET_MODE_CLASS (GET_MODE (X)) == MODE_INT) ? \
- GENERAL_REGS : (CLASS)))
+ || GET_MODE_CLASS (GET_MODE (X)) == MODE_INT)) ? GENERAL_REGS \
+ : (CLASS) == ALL_REGS ? GENERAL_REGS \
+ : (CLASS))
+
+#define PREFERRED_OUTPUT_RELOAD_CLASS(X,CLASS) \
+ ((CLASS) == ALL_REGS ? GENERAL_REGS \
+ : (CLASS))
+
+/* If we are copying between general and FP registers, we need a memory
+ location. */
+
+#define SECONDARY_MEMORY_NEEDED(CLASS1,CLASS2,MODE) \
+ (((CLASS1) == FLOAT_REGS && (CLASS2) != FLOAT_REGS) \
+ || ((CLASS2) == FLOAT_REGS && (CLASS1) != FLOAT_REGS))
/* Return the maximum number of consecutive registers
needed to represent mode MODE in a register of class CLASS. */