aboutsummaryrefslogtreecommitdiff
path: root/gcc/expmed.c
diff options
context:
space:
mode:
authorDavid Edelsohn <edelsohn@gnu.org>2000-01-04 20:09:19 +0000
committerDavid Edelsohn <dje@gcc.gnu.org>2000-01-04 15:09:19 -0500
commite1565e6588aaf9e7062ff462cb22840f4e66b8c7 (patch)
tree8bb48a44401bc6bcd038457e6237820e598dfc94 /gcc/expmed.c
parent399b9016a73cf485b8f1863ae21e5cf06e6f6273 (diff)
downloadgcc-e1565e6588aaf9e7062ff462cb22840f4e66b8c7.zip
gcc-e1565e6588aaf9e7062ff462cb22840f4e66b8c7.tar.gz
gcc-e1565e6588aaf9e7062ff462cb22840f4e66b8c7.tar.bz2
expmed.c (SLOW_UNALIGNED_ACCESS): Add mode and align parameters to default definition.
* expmed.c (SLOW_UNALIGNED_ACCESS): Add mode and align parameters to default definition. (store_bit_field): Call SLOW_UNALIGNED_ACCESS with mode and alignment. (store_fixed_bit_field): Call macro with word_mode and alignment. (extract_bit_field): Call macro with relevant mode and alignment. * expr.c (SLOW_UNALIGNED_ACCESS): Add mode and align parameters to default definition. (move_by_pieces): Call SLOW_UNALIGNED_ACCESS with word_mode and alignment. (move_by_pieces_ninsns): Likewise. (clear_by_pieces): Likewise. (emit_push_insn): Likewise. (store_field): Call macro with relevant mode and alignment. (expand_expr): Likewise. (expand_expr_unaligned): Likewise. * rs6000.h (HANDLE_PRAGMA_PACK): Define. (SLOW_UNALIGNED_ACCESS): Define. (CASE_VECTOR_MODE): Always use 32-bit offsets. (ASM_FILE_END): Generate 64-bit symbol in 64-bit mode. (EXTRA_SECTOIN_FUNCTIONS): Indent .csect pseudo-op. (toc_section): Likewise and .toc pseudo-op. (ASM_DECLARE_FUNCTION): Likewise. Align text more strictly in 64-bit mode. (TEXT_SECTION_ASM_OP): Likewise. (ASM_OUTPUT_ADD_VEC_ELT, ASM_OUTPUT_ADDR_DIFF_ELT): Always use 32-bit offsets. * a29k.h (SLOW_UNALIGNED_ACCESS): Add MODE and ALIGN parameters. * alpha.h (SLOW_UNALIGNED_ACCESS): Likewise. * arm/thumb.h (SLOW_UNALIGNED_ACCESS): Likewise. * gmicro.h (SLOW_UNALIGNED_ACCESS): Likewise. * fr30.h (SLOW_UNALIGNED_ACCESS): Likewise. From-SVN: r31211
Diffstat (limited to 'gcc/expmed.c')
-rw-r--r--gcc/expmed.c17
1 files changed, 10 insertions, 7 deletions
diff --git a/gcc/expmed.c b/gcc/expmed.c
index e558cb0..2897d77 100644
--- a/gcc/expmed.c
+++ b/gcc/expmed.c
@@ -54,7 +54,7 @@ static void do_cmp_and_jump PROTO((rtx, rtx, enum rtx_code,
static int sdiv_pow2_cheap, smod_pow2_cheap;
#ifndef SLOW_UNALIGNED_ACCESS
-#define SLOW_UNALIGNED_ACCESS STRICT_ALIGNMENT
+#define SLOW_UNALIGNED_ACCESS(MODE, ALIGN) STRICT_ALIGNMENT
#endif
/* For compilers that support multiple targets with different word sizes,
@@ -295,7 +295,7 @@ store_bit_field (str_rtx, bitsize, bitnum, fieldmode, value, align, total_size)
BITPOS is 0 in a REG bigger than a word. */
if (GET_MODE_SIZE (fieldmode) >= UNITS_PER_WORD
&& (GET_CODE (op0) != MEM
- || ! SLOW_UNALIGNED_ACCESS
+ || ! SLOW_UNALIGNED_ACCESS (fieldmode, align)
|| (offset * BITS_PER_UNIT % bitsize == 0
&& align % GET_MODE_SIZE (fieldmode) == 0))
&& bitpos == 0 && bitsize == GET_MODE_BITSIZE (fieldmode))
@@ -509,7 +509,8 @@ store_bit_field (str_rtx, bitsize, bitnum, fieldmode, value, align, total_size)
bestmode = GET_MODE (op0);
if (bestmode == VOIDmode
- || (SLOW_UNALIGNED_ACCESS && GET_MODE_SIZE (bestmode) > align))
+ || (SLOW_UNALIGNED_ACCESS (bestmode, align)
+ && GET_MODE_SIZE (bestmode) > align))
goto insv_loses;
/* Adjust address to point to the containing unit of that mode. */
@@ -632,7 +633,7 @@ store_fixed_bit_field (op0, offset, bitsize, bitpos, value, struct_align)
int all_zero = 0;
int all_one = 0;
- if (! SLOW_UNALIGNED_ACCESS)
+ if (! SLOW_UNALIGNED_ACCESS (word_mode, struct_align))
struct_align = BIGGEST_ALIGNMENT / BITS_PER_UNIT;
/* There is a case not handled here:
@@ -1052,7 +1053,7 @@ extract_bit_field (str_rtx, bitsize, bitnum, unsignedp,
&& TRULY_NOOP_TRUNCATION (GET_MODE_BITSIZE (mode),
GET_MODE_BITSIZE (GET_MODE (op0))))
|| (GET_CODE (op0) == MEM
- && (! SLOW_UNALIGNED_ACCESS
+ && (! SLOW_UNALIGNED_ACCESS (mode, align)
|| (offset * BITS_PER_UNIT % bitsize == 0
&& align * BITS_PER_UNIT % bitsize == 0))))
&& ((bitsize >= BITS_PER_WORD && bitsize == GET_MODE_BITSIZE (mode)
@@ -1253,7 +1254,8 @@ extract_bit_field (str_rtx, bitsize, bitnum, unsignedp,
bestmode = GET_MODE (xop0);
if (bestmode == VOIDmode
- || (SLOW_UNALIGNED_ACCESS && GET_MODE_SIZE (bestmode) > align))
+ || (SLOW_UNALIGNED_ACCESS (bestmode, align)
+ && GET_MODE_SIZE (bestmode) > align))
goto extzv_loses;
/* Compute offset as multiple of this unit,
@@ -1390,7 +1392,8 @@ extract_bit_field (str_rtx, bitsize, bitnum, unsignedp,
bestmode = GET_MODE (xop0);
if (bestmode == VOIDmode
- || (SLOW_UNALIGNED_ACCESS && GET_MODE_SIZE (bestmode) > align))
+ || (SLOW_UNALIGNED_ACCESS (bestmode, align)
+ && GET_MODE_SIZE (bestmode) > align))
goto extv_loses;
/* Compute offset as multiple of this unit,