--- gcc/config/m88k/m88k.h 2018/04/24 18:13:54 1.1.1.2 +++ gcc/config/m88k/m88k.h 2018/04/24 18:20:33 1.1.1.3 @@ -1,9 +1,9 @@ -/* Definitions of target machine for GNU compiler. +/* Definitions of target machine for GNU compiler for Motorola m88100 in an 88open OCS/BCS environment. - Copyright (C) 1988, 1989, 1990, 1991, 1993 Free Software Foundation, Inc. + Copyright (C) 1988, 89, 90, 91, 93, 1994 Free Software Foundation, Inc. Contributed by Michael Tiemann (tiemann@mcc.com) Enhanced by Michael Meissner (meissner@osf.org) - Version 2 port by Tom Wood (Tom_Wood@NeXT.com) + Version 2 port by Tom Wood (twood@pets.sps.mot.com) This file is part of GNU CC. @@ -55,10 +55,10 @@ the Free Software Foundation, 675 Mass A Release 1.0, January 1991 A companion ABI document from 88open. */ -/* Other m88k*.h files include this one and override certain items. - At present, these are m88kv3.h, m88kv4.h, m88kdgux.h, and m88kluna.h. - Additionally, m88kv4.h and m88kdgux.h include svr4.h first. All other - m88k targets except m88kluna.h are based on svr3.h. */ +/* Other *.h files in config/m88k include this one and override certain items. + Currently these are sysv3.h, sysv4.h, dgux.h, dolph.h, tekXD88.h, and luna.h. + Additionally, sysv4.h and dgux.h include svr4.h first. All other + m88k targets except luna.h are based on svr3.h. */ /* Choose SVR3 as the default. */ #if !defined(DBX_DEBUGGING_INFO) && !defined(DWARF_DEBUGGING_INFO) @@ -79,6 +79,18 @@ enum m88k_instruction { m88k_oru_or }; +/* Which processor to schedule for. The elements of the enumeration + must match exactly the cpu attribute in the m88k.md machine description. */ + +enum processor_type { + PROCESSOR_M88100, + PROCESSOR_M88110, + PROCESSOR_M88000, +}; + +/* Recast the cpu class to be the cpu attribute. */ +#define m88k_cpu_attr ((enum attr_cpu)m88k_cpu) + /* External variables/functions defined in m88k.c. */ extern char *m88k_pound_sign; @@ -86,19 +98,18 @@ extern char *m88k_short_data; extern char *m88k_version; extern char m88k_volatile_code; -extern int m88k_gp_threshold; +extern unsigned m88k_gp_threshold; extern int m88k_prologue_done; extern int m88k_function_number; extern int m88k_fp_offset; extern int m88k_stack_size; extern int m88k_case_index; -extern int m88k_version_0300; extern struct rtx_def *m88k_compare_reg; extern struct rtx_def *m88k_compare_op0; extern struct rtx_def *m88k_compare_op1; -extern enum attr_cpu m88k_cpu; +extern enum processor_type m88k_cpu; extern int null_prologue (); extern int integer_ok_for_set (); @@ -158,38 +169,8 @@ extern char * reg_names[]; #endif /*** Controlling the Compilation Driver, `gcc' ***/ - -/* Some machines may desire to change what optimizations are performed for - various optimization levels. This macro, if defined, is executed once - just after the optimization level is determined and before the remainder - of the command options have been parsed. Values set in this macro are - used as the default values for the other command line options. - - LEVEL is the optimization level specified; 2 if -O2 is specified, - 1 if -O is specified, and 0 if neither is specified. */ - -/* This macro used to store 0 in flag_signed_bitfields. - Not only is that misuse of this macro; the whole idea is wrong. - - The GNU C dialect makes bitfields signed by default, - regardless of machine type. Making any machine inconsistent in this - regard is bad for portability. - - I chose to make bitfields signed by default because this is consistent - with the way ordinary variables are handled: `int' equals `signed int'. - If there is a good reason to prefer making bitfields unsigned by default, - it cannot have anything to do with the choice of machine. - If the reason is good enough, we should change the convention for all machines. - - -- rms, 20 July 1991. */ - -#define OPTIMIZATION_OPTIONS(LEVEL) \ - do { \ - if (LEVEL) \ - { \ - flag_omit_frame_pointer = 1; \ - } \ - } while (0) +/* Show we can debug even without a frame pointer. */ +#define CAN_DEBUG_WITHOUT_FP /* If -m88100 is in effect, add -D__m88100__; similarly for -m88110. Here, the CPU_DEFAULT is assumed to be -m88100. */ @@ -201,23 +182,34 @@ extern char * reg_names[]; ASM_SPEC, ASM_FINAL_SPEC, LIB_SPEC, LINK_SPEC, and STARTFILE_SPEC redefined in svr4.h. CPP_SPEC, ASM_SPEC, ASM_FINAL_SPEC, LIB_SPEC, LINK_SPEC, and - STARTFILE_SPEC redefined in m88kdgux.h. */ + STARTFILE_SPEC redefined in dgux.h. */ /*** Run-time Target Specification ***/ /* Names to predefine in the preprocessor for this target machine. - Redefined in m88kv3.h, m88kv4.h, m88kdgux.h, and m88kluna.h. */ -#define CPP_PREDEFINES "-Dm88000 -Dm88k -Dunix -D__CLASSIFY_TYPE__=2 -Asystem(unix) -Acpu(m88k) -Amachine(m88k)" + Redefined in sysv3.h, sysv4.h, dgux.h, and luna.h. */ +#define CPP_PREDEFINES "-Dm88000 -Dm88k -Dunix -D__CLASSIFY_TYPE__=2" #define TARGET_VERSION fprintf (stderr, " (%s%s)", \ VERSION_INFO1, VERSION_INFO2) /* Print subsidiary information on the compiler version in use. - Redefined in m88kv4.h, and m88kluna.h. */ + Redefined in sysv4.h, and luna.h. */ #define VERSION_INFO1 "88open OCS/BCS, " -#define VERSION_INFO2 "12/16/92" -#define VERSION_STRING version_string -#define TM_SCCS_ID "@(#)m88k.h 2.3.3.2 12/16/92 08:26:09" +#ifndef VERSION_INFO2 +#define VERSION_INFO2 "$Revision: 1.1.1.3 $" +#endif + +#ifndef VERSION_STRING +#define VERSION_STRING version_string +#ifdef __STDC__ +#define TM_RCS_ID "@(#)" __FILE__ " $Revision: 1.1.1.3 $ " __DATE__ +#else +#define TM_RCS_ID "$What$" +#endif /* __STDC__ */ +#else +#define TM_RCS_ID "@(#)" __FILE__ " " VERSION_INFO2 " " __DATE__ +#endif /* VERSION_STRING */ /* Run-time compilation parameters selecting different hardware subsets. */ @@ -232,6 +224,7 @@ extern char * reg_names[]; #define MASK_OCS_DEBUG_INFO 0x00000004 /* Emit .tdesc info */ #define MASK_OCS_FRAME_POSITION 0x00000008 /* Debug frame = CFA, not r30 */ #define MASK_SVR4 0x00000010 /* Target is AT&T System V.4 */ +#define MASK_SVR3 0x00000020 /* Target is AT&T System V.3 */ #define MASK_NO_UNDERSCORES 0x00000040 /* Don't emit a leading `_' */ #define MASK_BIG_PIC 0x00000080 /* PIC with large got-rel's -fPIC */ #define MASK_TRAP_LARGE_SHIFT 0x00000100 /* Trap if shift not <= 31 */ @@ -254,6 +247,7 @@ extern char * reg_names[]; #define TARGET_OCS_DEBUG_INFO (target_flags & MASK_OCS_DEBUG_INFO) #define TARGET_OCS_FRAME_POSITION (target_flags & MASK_OCS_FRAME_POSITION) #define TARGET_SVR4 (target_flags & MASK_SVR4) +#define TARGET_SVR3 (target_flags & MASK_SVR3) #define TARGET_NO_UNDERSCORES (target_flags & MASK_NO_UNDERSCORES) #define TARGET_BIG_PIC (target_flags & MASK_BIG_PIC) #define TARGET_TRAP_LARGE_SHIFT (target_flags & MASK_TRAP_LARGE_SHIFT) @@ -267,7 +261,7 @@ extern char * reg_names[]; #define TARGET_EITHER_LARGE_SHIFT (target_flags & MASK_EITHER_LARGE_SHIFT) -/* Redefined in m88kv3.h,m88kv4.h, and m88kdgux.h. */ +/* Redefined in sysv3.h, sysv4.h, and dgux.h. */ #define TARGET_DEFAULT (MASK_CHECK_ZERO_DIV) #define CPU_DEFAULT MASK_88100 @@ -300,7 +294,7 @@ extern char * reg_names[]; { "", TARGET_DEFAULT }, \ } -/* Redefined in m88kdgux.h. */ +/* Redefined in dgux.h. */ #define SUBTARGET_SWITCHES /* Macro to define table for command options with values. */ @@ -317,8 +311,14 @@ extern char * reg_names[]; if ((target_flags & MASK_88000) == 0) \ target_flags |= CPU_DEFAULT; \ \ - m88k_cpu = (TARGET_88000 ? CPU_M88000 \ - : (TARGET_88100 ? CPU_M88100 : CPU_M88110)); \ + if (TARGET_88110) \ + { \ + target_flags |= MASK_USE_DIV; \ + target_flags &= ~MASK_CHECK_ZERO_DIV; \ + } \ + \ + m88k_cpu = (TARGET_88000 ? PROCESSOR_M88000 \ + : (TARGET_88100 ? PROCESSOR_M88100 : PROCESSOR_M88110)); \ \ if (TARGET_BIG_PIC) \ flag_pic = 2; \ @@ -326,23 +326,17 @@ extern char * reg_names[]; if ((target_flags & MASK_EITHER_LARGE_SHIFT) == MASK_EITHER_LARGE_SHIFT) \ error ("-mtrap-large-shift and -mhandle-large-shift are incompatible");\ \ - m88k_version_0300 = (m88k_version != 0 \ - && strcmp (m88k_version, "03.00") >= 0); \ - \ - if (VERSION_0300_SYNTAX) \ + if (TARGET_SVR4) \ { \ for (i = 0; i < FIRST_PSEUDO_REGISTER; i++) \ reg_names[i]--; \ m88k_pound_sign = "#"; \ - if (m88k_version == 0) \ - m88k_version = VERSION_0400_SYNTAX ? "04.00" : "03.00"; \ - else if (strcmp (m88k_version, "03.00") < 0) \ - error ("Specified assembler version (%s) is less that 03.00", \ - m88k_version); \ } \ - \ - m88k_version_0300 = (m88k_version != 0 \ - && strcmp (m88k_version, "03.00") >= 0); \ + else \ + { \ + target_flags |= MASK_SVR3; \ + target_flags &= ~MASK_SVR4; \ + } \ \ if (m88k_short_data) \ { \ @@ -356,6 +350,8 @@ extern char * reg_names[]; break; \ } \ m88k_gp_threshold = atoi (m88k_short_data); \ + if (m88k_gp_threshold > 0x7fffffff) \ + error ("-mshort-data-%s is too large ", m88k_short_data); \ if (flag_pic) \ error ("-mshort-data-%s and PIC are incompatible", m88k_short_data); \ } \ @@ -1098,8 +1094,8 @@ enum reg_class { NO_REGS, AP_REG, XRF_RE #define FUNCTION_END_PROLOGUE(FILE) m88k_end_prologue(FILE) /* Output assembler code to FILE to increment profiler label # LABELNO - for profiling a function entry. Redefined in m88kv3.h, m88kv4.h and - m88kdgux.h. */ + for profiling a function entry. Redefined in sysv3.h, sysv4.h and + dgux.h. */ #define FUNCTION_PROFILER(FILE, LABELNO) \ output_function_profiler (FILE, LABELNO, "mcount", 1) @@ -1260,11 +1256,16 @@ enum reg_class { NO_REGS, AP_REG, XRF_RE /* #define HAVE_PRE_DECREMENT */ /* #define HAVE_PRE_INCREMENT */ -/* Recognize any constant value that is a valid address. */ +/* Recognize any constant value that is a valid address. + When PIC, we do not accept an address that would require a scratch reg + to load into a register. */ + #define CONSTANT_ADDRESS_P(X) \ (GET_CODE (X) == LABEL_REF || GET_CODE (X) == SYMBOL_REF \ - || GET_CODE (X) == CONST_INT || GET_CODE (X) == CONST \ - || GET_CODE (X) == HIGH) + || GET_CODE (X) == CONST_INT || GET_CODE (X) == HIGH \ + || (GET_CODE (X) == CONST \ + && ! (flag_pic && pic_address_needs_scratch (X)))) + /* Maximum number of registers that can appear in a valid memory address. */ #define MAX_REGS_PER_ADDRESS 2 @@ -1302,6 +1303,18 @@ enum reg_class { NO_REGS, AP_REG, XRF_RE && GET_CODE (XEXP (X, 1)) == CONST_INT \ && INTVAL (XEXP (X, 1)) == GET_MODE_SIZE (MODE))) +#define RTX_OK_FOR_BASE_P(X) \ + ((GET_CODE (X) == REG && REG_OK_FOR_BASE_P (X)) \ + || (GET_CODE (X) == SUBREG \ + && GET_CODE (SUBREG_REG (X)) == REG \ + && REG_OK_FOR_BASE_P (SUBREG_REG (X)))) + +#define RTX_OK_FOR_INDEX_P(X) \ + ((GET_CODE (X) == REG && REG_OK_FOR_INDEX_P (X)) \ + || (GET_CODE (X) == SUBREG \ + && GET_CODE (SUBREG_REG (X)) == REG \ + && REG_OK_FOR_INDEX_P (SUBREG_REG (X)))) + #define GO_IF_LEGITIMATE_ADDRESS(MODE, X, ADDR) \ { \ register rtx _x; \ @@ -1317,7 +1330,7 @@ enum reg_class { NO_REGS, AP_REG, XRF_RE if ((flag_pic \ && _x0 == pic_offset_table_rtx \ && (flag_pic == 2 \ - ? REG_P (_x1) \ + ? RTX_OK_FOR_BASE_P (_x1) \ : (GET_CODE (_x1) == SYMBOL_REF \ || GET_CODE (_x1) == LABEL_REF))) \ || (REG_P (_x0) \ @@ -1408,6 +1421,12 @@ enum reg_class { NO_REGS, AP_REG, XRF_RE if (GET_CODE (X) == PLUS && GET_CODE (XEXP (X, 1)) == MULT) \ (X) = gen_rtx (PLUS, SImode, XEXP (X, 0), \ force_operand (XEXP (X, 1), 0)); \ + if (GET_CODE (X) == PLUS && GET_CODE (XEXP (X, 0)) == PLUS) \ + (X) = gen_rtx (PLUS, Pmode, force_operand (XEXP (X, 0), NULL_RTX),\ + XEXP (X, 1)); \ + if (GET_CODE (X) == PLUS && GET_CODE (XEXP (X, 1)) == PLUS) \ + (X) = gen_rtx (PLUS, Pmode, XEXP (X, 0), \ + force_operand (XEXP (X, 1), NULL_RTX)); \ if (GET_CODE (X) == SYMBOL_REF || GET_CODE (X) == CONST \ || GET_CODE (X) == LABEL_REF) \ (X) = legitimize_address (flag_pic, X, 0, 0); \ @@ -1423,6 +1442,12 @@ enum reg_class { NO_REGS, AP_REG, XRF_RE /* Nonzero if the constant value X is a legitimate general operand. It is given that X satisfies CONSTANT_P or is a CONST_DOUBLE. */ #define LEGITIMATE_CONSTANT_P(X) (1) + +/* Define this, so that when PIC, reload won't try to reload invalid + addresses which require two reload registers. */ + +#define LEGITIMATE_PIC_OPERAND_P(X) (! pic_address_needs_scratch (X)) + /*** Condition Code Information ***/ @@ -1457,7 +1482,7 @@ enum reg_class { NO_REGS, AP_REG, XRF_RE {"add_operand", {SUBREG, REG, CONST_INT}}, \ {"reg_or_bbx_mask_operand", {SUBREG, REG, CONST_INT}}, \ {"real_or_0_operand", {SUBREG, REG, CONST_DOUBLE}}, \ - {"reg_or_0_operand", {SUBREG, REG, CONST_INT}}, \ + {"reg_or_0_operand", {SUBREG, REG, CONST_INT}}, \ {"relop", {EQ, NE, LT, LE, GE, GT, LTU, LEU, GEU, GTU}}, \ {"even_relop", {EQ, LT, GT, LTU, GTU}}, \ {"odd_relop", { NE, LE, GE, LEU, GEU}}, \ @@ -1517,15 +1542,9 @@ enum reg_class { NO_REGS, AP_REG, XRF_RE in one reasonably fast instruction. */ #define MOVE_MAX 8 -/* Define if operations between registers always perform the operation - on the full register even if a narrower mode is specified. */ -#define WORD_REGISTER_OPERATIONS - -/* Define if loading in MODE, an integral mode narrower than BITS_PER_WORD - will either zero-extend or sign-extend. The value of this macro should - be the code that says which one of the two operations is implicitly - done, NIL if none. */ -#define LOAD_EXTEND_OP(MODE) ZERO_EXTEND +/* Define if normal loads of shorter-than-word items from memory clears + the rest of the bigs in the register. */ +#define BYTE_LOADS_ZERO_EXTEND /* Zero if access to memory by bytes is faster. */ #define SLOW_BYTE_ACCESS 1 @@ -1547,7 +1566,7 @@ enum reg_class { NO_REGS, AP_REG, XRF_RE #define PROMOTE_PROTOTYPES /* Define this macro if a float function always returns float - (even in traditional mode). Redefined in m88kluna.h. */ + (even in traditional mode). Redefined in luna.h. */ #define TRADITIONAL_RETURN_FLOAT /* We assume that the store-condition-codes instructions store 0 for false @@ -1690,12 +1709,6 @@ enum reg_class { NO_REGS, AP_REG, XRF_RE /* Control the assembler format that we output. */ -/* Which assembler syntax. Redefined in m88kdgux.h. */ -#define VERSION_0300_SYNTAX TARGET_SVR4 - -/* At some point, m88kv4.h will redefine this. */ -#define VERSION_0400_SYNTAX 0 - /* Allow pseudo-ops to be overridden. Override these in svr[34].h. */ #undef INT_ASM_OP #undef ASCII_DATA_ASM_OP @@ -1718,10 +1731,10 @@ enum reg_class { NO_REGS, AP_REG, XRF_RE #define DATA_SECTION_ASM_OP "data" /* Other sections. */ -#define CONST_SECTION_ASM_OP (VERSION_0300_SYNTAX \ +#define CONST_SECTION_ASM_OP (TARGET_SVR4 \ ? "section\t .rodata,\"a\"" \ : "section\t .rodata,\"x\"") -#define TDESC_SECTION_ASM_OP (VERSION_0300_SYNTAX \ +#define TDESC_SECTION_ASM_OP (TARGET_SVR4 \ ? "section\t .tdesc,\"a\"" \ : "section\t .tdesc,\"x\"") @@ -1811,12 +1824,17 @@ enum reg_class { NO_REGS, AP_REG, XRF_RE #define ASM_COFFSEM(FILE) #endif -/* Output the first line of the assembly file. Redefined in m88kdgux.h. */ +/* Output the first line of the assembly file. Redefined in dgux.h. */ #define ASM_FIRST_LINE(FILE) \ do { \ - if (m88k_version) \ - fprintf (FILE, "\t%s\t \"%s\"\n", VERSION_ASM_OP, m88k_version); \ + if (TARGET_SVR4) \ + { \ + if (TARGET_88110) \ + fprintf (FILE, "\t%s\t \"%s\"\n", VERSION_ASM_OP, "04.00"); \ + else \ + fprintf (FILE, "\t%s\t \"%s\"\n", VERSION_ASM_OP, "03.00"); \ + } \ } while (0) /* Override svr[34].h. */ @@ -1828,12 +1846,10 @@ enum reg_class { NO_REGS, AP_REG, XRF_RE #undef ASM_FILE_END #define ASM_OUTPUT_SOURCE_FILENAME(FILE, NAME) \ - do { fprintf (FILE, "\t%s\t ", FILE_ASM_OP); \ - output_quoted_string (FILE, NAME); \ - fprintf (FILE, "\n"); \ - } while (0) + fprintf (FILE, "\t%s\t \"%s\"\n", FILE_ASM_OP, NAME) #ifdef SDB_DEBUGGING_INFO +#undef ASM_OUTPUT_SOURCE_LINE #define ASM_OUTPUT_SOURCE_LINE(FILE, LINE) \ if (m88k_prologue_done) \ fprintf (FILE, "\n\tln\t %d\t\t\t\t; Real source line %d\n",\ @@ -1958,6 +1974,7 @@ do { \ && DECL_INITIAL (DECL) == error_mark_node \ && !size_directive_output) \ { \ + size_directive_output = 1; \ fprintf (FILE, "\t%s\t ", SIZE_ASM_OP); \ assemble_name (FILE, name); \ fprintf (FILE, ",%d\n", int_size_in_bytes (TREE_TYPE (DECL))); \ @@ -2005,7 +2022,7 @@ do { \ #undef ASM_OUTPUT_LABELREF #define ASM_OUTPUT_LABELREF(FILE,NAME) \ { \ - if (! TARGET_NO_UNDERSCORES && ! VERSION_0300_SYNTAX) \ + if (!TARGET_NO_UNDERSCORES && !TARGET_SVR4) \ fputc ('_', FILE); \ fputs (NAME, FILE); \ } @@ -2017,11 +2034,11 @@ do { \ #undef ASM_OUTPUT_INTERNAL_LABEL #ifdef AS_BUG_DOT_LABELS /* The assembler requires a declaration of local. */ #define ASM_OUTPUT_INTERNAL_LABEL(FILE,PREFIX,NUM) \ - fprintf (FILE, VERSION_0300_SYNTAX ? ".%s%d:\n\t%s\t .%s%d\n" : "@%s%d:\n", \ + fprintf (FILE, TARGET_SVR4 ? ".%s%d:\n\t%s\t .%s%d\n" : "@%s%d:\n", \ PREFIX, NUM, INTERNAL_ASM_OP, PREFIX, NUM) #else #define ASM_OUTPUT_INTERNAL_LABEL(FILE,PREFIX,NUM) \ - fprintf (FILE, VERSION_0300_SYNTAX ? ".%s%d:\n" : "@%s%d:\n", PREFIX, NUM) + fprintf (FILE, TARGET_SVR4 ? ".%s%d:\n" : "@%s%d:\n", PREFIX, NUM) #endif /* AS_BUG_DOT_LABELS */ /* This is how to store into the string LABEL @@ -2033,7 +2050,7 @@ do { \ #undef ASM_GENERATE_INTERNAL_LABEL #define ASM_GENERATE_INTERNAL_LABEL(LABEL,PREFIX,NUM) \ - sprintf (LABEL, VERSION_0300_SYNTAX ? "*.%s%d" : "*@%s%d", PREFIX, NUM) + sprintf (LABEL, TARGET_SVR4 ? "*.%s%d" : "*@%s%d", PREFIX, NUM) /* Internal macro to get a single precision floating point value into an int, so we can print it's value in hex. */ @@ -2473,7 +2490,7 @@ do { \ #define EXTRA_SECTIONS in_const, in_tdesc, in_sdata, in_ctors, in_dtors, \ in_init, in_fini -#else /* m88kluna or other not based on svr[34].h. */ +#else /* luna or other not based on svr[34].h. */ #undef INIT_SECTION_ASM_OP #define EXTRA_SECTIONS in_const, in_tdesc, in_sdata @@ -2533,8 +2550,7 @@ sdata_section () \ { \ if (! flag_writable_strings) \ const_section (); \ - else if (m88k_gp_threshold > 0 \ - && TREE_STRING_LENGTH (DECL) <= m88k_gp_threshold) \ + else if ( TREE_STRING_LENGTH (DECL) <= m88k_gp_threshold) \ sdata_section (); \ else \ data_section (); \ @@ -2544,7 +2560,10 @@ sdata_section () \ if (SYMBOL_REF_FLAG (XEXP (DECL_RTL (DECL), 0))) \ sdata_section (); \ else if ((flag_pic && RELOC) \ - || !TREE_READONLY (DECL) || TREE_SIDE_EFFECTS (DECL)) \ + || !TREE_READONLY (DECL) || TREE_SIDE_EFFECTS (DECL) \ + || !DECL_INITIAL (DECL) \ + || (DECL_INITIAL (DECL) != error_mark_node \ + && !TREE_CONSTANT (DECL_INITIAL (DECL)))) \ data_section (); \ else \ const_section (); \ @@ -2596,3 +2615,8 @@ sdata_section () \ /* Print a memory address as an operand to reference that memory location. */ #define PRINT_OPERAND_ADDRESS(FILE, ADDR) print_operand_address (FILE, ADDR) + +/* This says not to strength reduce the addr calculations within loops + (otherwise it does not take advantage of m88k scaled loads and stores */ + +#define DONT_REDUCE_ADDR