aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorDavid S. Miller <davem@redhat.com>2002-06-24 03:08:38 -0700
committerDavid S. Miller <davem@gcc.gnu.org>2002-06-24 03:08:38 -0700
commit556a56acec1f32fe977c0d48da84bbff4373fd93 (patch)
tree0b57b1ced0947668bcdbc374a39f118f0c2008e8 /gcc
parent2c35c7be14cfc9b9c515e5f4767c2f56e9217c44 (diff)
downloadgcc-556a56acec1f32fe977c0d48da84bbff4373fd93.zip
gcc-556a56acec1f32fe977c0d48da84bbff4373fd93.tar.gz
gcc-556a56acec1f32fe977c0d48da84bbff4373fd93.tar.bz2
sparc.c (INIT_TARGET_OPTABS): If ARCH64, set the 32-bit ABI libfuncs to NULL.
2002-06-24 David S. Miller <davem@redhat.com> * config/sparc/sparc.c (INIT_TARGET_OPTABS): If ARCH64, set the 32-bit ABI libfuncs to NULL. * expmed.c (expand_divmod): Do not set optab1/optab2 to the shift optabs if op1 is const0_rtx. From-SVN: r54950
Diffstat (limited to 'gcc')
-rw-r--r--gcc/ChangeLog8
-rw-r--r--gcc/config/sparc/sparc.h11
-rw-r--r--gcc/expmed.c7
3 files changed, 24 insertions, 2 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index 717dcb0..f3cdecc 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,3 +1,11 @@
+2002-06-24 David S. Miller <davem@redhat.com>
+
+ * config/sparc/sparc.c (INIT_TARGET_OPTABS): If ARCH64, set the
+ 32-bit ABI libfuncs to NULL.
+
+ * expmed.c (expand_divmod): Do not set optab1/optab2 to the shift
+ optabs if op1 is const0_rtx.
+
2002-06-24 Neil Booth <neil@daikokuya.co.uk>
* cpptrad.c (scan_out_logical_line): Check recursing only when
diff --git a/gcc/config/sparc/sparc.h b/gcc/config/sparc/sparc.h
index cb556a3..97f1a2d 100644
--- a/gcc/config/sparc/sparc.h
+++ b/gcc/config/sparc/sparc.h
@@ -2585,6 +2585,17 @@ do { \
sqrt_optab->handlers[(int) TFmode].libfunc \
= init_one_libfunc ("_Q_sqrt"); \
} \
+ if (TARGET_ARCH64) \
+ { \
+ /* In the SPARC 64bit ABI, these libfuncs do not exist in the \
+ library. Make sure the compiler does not emit calls to them \
+ by accident. */ \
+ sdiv_optab->handlers[(int) SImode].libfunc = NULL; \
+ udiv_optab->handlers[(int) SImode].libfunc = NULL; \
+ smod_optab->handlers[(int) SImode].libfunc = NULL; \
+ umod_optab->handlers[(int) SImode].libfunc = NULL; \
+ smul_optab->handlers[(int) SImode].libfunc = NULL; \
+ } \
INIT_SUBTARGET_OPTABS; \
} while (0)
diff --git a/gcc/expmed.c b/gcc/expmed.c
index 8ef4fca..317dcc4 100644
--- a/gcc/expmed.c
+++ b/gcc/expmed.c
@@ -3049,9 +3049,12 @@ expand_divmod (rem_flag, code, mode, op0, op1, target, unsignedp)
not straightforward to generalize this. Maybe we should make an array
of possible modes in init_expmed? Save this for GCC 2.7. */
- optab1 = (op1_is_pow2 ? (unsignedp ? lshr_optab : ashr_optab)
+ optab1 = ((op1_is_pow2 && op1 != const0_rtx)
+ ? (unsignedp ? lshr_optab : ashr_optab)
: (unsignedp ? udiv_optab : sdiv_optab));
- optab2 = (op1_is_pow2 ? optab1 : (unsignedp ? udivmod_optab : sdivmod_optab));
+ optab2 = ((op1_is_pow2 && op1 != const0_rtx)
+ ? optab1
+ : (unsignedp ? udivmod_optab : sdivmod_optab));
for (compute_mode = mode; compute_mode != VOIDmode;
compute_mode = GET_MODE_WIDER_MODE (compute_mode))