aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorRichard Sandiford <rsandifo@redhat.com>2003-01-28 12:45:12 +0000
committerRichard Sandiford <rsandifo@gcc.gnu.org>2003-01-28 12:45:12 +0000
commit3620944c5081462e6606283d2b9992f9251ca4d1 (patch)
treebc291c552c281dfb0144fc1e8d7309894a20c7f1 /gcc
parent95fcd0ab306d65e0334dd148f774694f2867b818 (diff)
downloadgcc-3620944c5081462e6606283d2b9992f9251ca4d1.zip
gcc-3620944c5081462e6606283d2b9992f9251ca4d1.tar.gz
gcc-3620944c5081462e6606283d2b9992f9251ca4d1.tar.bz2
sh.h (CLASS_MAX_NREGS): If TARGET_SHMEDIA...
* config/sh/sh.h (CLASS_MAX_NREGS): If TARGET_SHMEDIA, and the given class contains a floating-point register, return the size of the mode in half words. From-SVN: r61966
Diffstat (limited to 'gcc')
-rw-r--r--gcc/ChangeLog6
-rw-r--r--gcc/config/sh/sh.h8
2 files changed, 12 insertions, 2 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index 48b1e2a..2fcc66f 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,3 +1,9 @@
+2003-01-28 Richard Sandiford <rsandifo@redhat.com>
+
+ * config/sh/sh.h (CLASS_MAX_NREGS): If TARGET_SHMEDIA, and the given
+ class contains a floating-point register, return the size of the
+ mode in half words.
+
Tue Jan 28 12:15:13 CET 2003 Jan Hubicka <jh@suse.cz>
* i386.c (ix86_carry_flag_operator): New predicate.
diff --git a/gcc/config/sh/sh.h b/gcc/config/sh/sh.h
index 7213933..e5d0677 100644
--- a/gcc/config/sh/sh.h
+++ b/gcc/config/sh/sh.h
@@ -1382,9 +1382,13 @@ extern enum reg_class reg_class_from_letter[];
/* Return the maximum number of consecutive registers
needed to represent mode MODE in a register of class CLASS.
- On SH this is the size of MODE in words. */
+ If TARGET_SHMEDIA, we need two FP registers per word.
+ Otherwise we will need at most one register per word. */
#define CLASS_MAX_NREGS(CLASS, MODE) \
- ((GET_MODE_SIZE (MODE) + UNITS_PER_WORD - 1) / UNITS_PER_WORD)
+ (TARGET_SHMEDIA \
+ && TEST_HARD_REG_BIT (reg_class_contents[CLASS], FIRST_FP_REG) \
+ ? (GET_MODE_SIZE (MODE) + UNITS_PER_WORD/2 - 1) / (UNITS_PER_WORD/2) \
+ : (GET_MODE_SIZE (MODE) + UNITS_PER_WORD - 1) / UNITS_PER_WORD)
/* If defined, gives a class of registers that cannot be used as the
operand of a SUBREG that changes the mode of the object illegally. */