From 8376061dbeccebee5865a5bfdb8bb0988d2fd4ea Mon Sep 17 00:00:00 2001 From: Catherine Moore Date: Thu, 29 Aug 2002 09:50:20 +0000 Subject: [PATCH] v850.h (MULDI3_LIBCALL, [...]): Define. * config/v850/v850.h (MULDI3_LIBCALL, UCMPDI2_LIBCALL, CMPDI2_LIBCALL, NEGDI2_LIBCALL, INIT_TARGET_OPTABS, MASK_STRICT_ALIGN): Define. (PREDICATE_CODES): Include new predicates. (RTX_COSTS): Handle UMOD and UDIV. Tune MULT for v850e. (TARGET_SWITCHES): Add strict-align. (TARGET_STRICT_ALIGN): New. (MASK_DEFAULT, STRICT_ALIGNMENT): Redefine. * config/v850/t-v850 (MULTILIB_OPTIONS, MULTILIB_DIRNAMES): Define. (LIB1ASMFUNCS): Add v850_negdi2, v850_cmpdi2, v850_ucmpdi2, v850_muldi3. * config/v850/lib1funcs.asm (L_callt_save_r2_r29, L_return_r2_r29, L_callt_save_r2_r31, L_return_r2_r31, L_save_all_interrupt): Change addi to add. (L_save_interrupt, L_return_interrupt): Rework. (__return_r31): Correct .size directive. (mulsi3, divsi3, udivsi3, umodsi3, modsi3): Tune for v850e. (v850_negdi2, v850_cmpdi2, v850_ucmpdi2, v850_muldi3): New routines. * config/v850/v850.c (expand_prologue): Call gen_callt_save_interrupt, gen_callt_restore_all_interrupt, gen_callt_return_interrupt and gen_callt_save_all_interrupt. (reg_or_int9_operand): New predicate. (reg_or_const_operand): New routine. * config/v850/v850.md (return_interrupt): Changed from restore_interrupt. (callt_save_all_interrupt): Changed from save_all_interrupt_v850e. (callt_save_interrupt): Change save sequence. (callt_return_interrupt): New. (save_interrupt): Don't use runtime function for LONG_CALLS and TARGET_PROLOG_FUNCTION. (save_all_interrupt): Likewise. (mulsi3): Use new predicate. (moviscc): Disallow some combination of constants. Fix define_split for sasf insns, so that it will not generate bad code if operand0 and operand5 are the same. * config/v850/v850-protos.h: Prototype new predicates. From-SVN: r56654 --- gcc/ChangeLog | 40 ++++ gcc/config/v850/lib1funcs.asm | 353 ++++++++++++++++++++++++++++------ gcc/config/v850/t-v850 | 15 +- gcc/config/v850/v850-protos.h | 30 +-- gcc/config/v850/v850.c | 28 +-- gcc/config/v850/v850.h | 73 +++++-- gcc/config/v850/v850.md | 3 - 7 files changed, 437 insertions(+), 105 deletions(-) diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 223d00de5adf..2959e919b159 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,43 @@ +2001-08-29 Catherine Moore + + * config/v850/v850.h (MULDI3_LIBCALL, UCMPDI2_LIBCALL, CMPDI2_LIBCALL, + NEGDI2_LIBCALL, INIT_TARGET_OPTABS, MASK_STRICT_ALIGN): Define. + (PREDICATE_CODES): Include new predicates. + (RTX_COSTS): Handle UMOD and UDIV. Tune MULT for v850e. + (TARGET_SWITCHES): Add strict-align. + (TARGET_STRICT_ALIGN): New. + (MASK_DEFAULT, STRICT_ALIGNMENT): Redefine. + * config/v850/t-v850 (MULTILIB_OPTIONS, MULTILIB_DIRNAMES): + Define. + (LIB1ASMFUNCS): Add v850_negdi2, v850_cmpdi2, v850_ucmpdi2, + v850_muldi3. + * config/v850/lib1funcs.asm (L_callt_save_r2_r29, L_return_r2_r29, + L_callt_save_r2_r31, L_return_r2_r31, + L_save_all_interrupt): Change addi to add. + (L_save_interrupt, L_return_interrupt): Rework. + (__return_r31): Correct .size directive. + (mulsi3, divsi3, udivsi3, umodsi3, modsi3): Tune for v850e. + (v850_negdi2, v850_cmpdi2, v850_ucmpdi2, v850_muldi3): + New routines. + * config/v850/v850.c (expand_prologue): Call + gen_callt_save_interrupt, gen_callt_restore_all_interrupt, + gen_callt_return_interrupt and gen_callt_save_all_interrupt. + (reg_or_int9_operand): New predicate. + (reg_or_const_operand): New routine. + * config/v850/v850.md (return_interrupt): Changed from + restore_interrupt. + (callt_save_all_interrupt): Changed from save_all_interrupt_v850e. + (callt_save_interrupt): Change save sequence. + (callt_return_interrupt): New. + (save_interrupt): Don't use runtime function for LONG_CALLS + and TARGET_PROLOG_FUNCTION. + (save_all_interrupt): Likewise. + (mulsi3): Use new predicate. + (moviscc): Disallow some combination of constants. + Fix define_split for sasf insns, so that it will not generate bad + code if operand0 and operand5 are the same. + * config/v850/v850-protos.h: Prototype new predicates. + 2002-08-28 Gabriel Dos Reis * c-common.c (builtin_define_type_precision): New function. diff --git a/gcc/config/v850/lib1funcs.asm b/gcc/config/v850/lib1funcs.asm index fb241d4bea2d..2415f91830af 100644 --- a/gcc/config/v850/lib1funcs.asm +++ b/gcc/config/v850/lib1funcs.asm @@ -31,70 +31,87 @@ Boston, MA 02111-1307, USA. */ .text .globl ___mulsi3 .type ___mulsi3,@function - -/* - * #define SHIFT 12 - * #define MASK ((1 << SHIFT) - 1) - * - * #define STEP(i, j) \ - * ({ \ - * short a_part = (a >> (i)) & MASK; \ - * short b_part = (b >> (j)) & MASK; \ - * int res = (((int)a_part) * ((int)b_part)); \ - * res; \ - * }) - * - * int - * __mulsi3 (unsigned a, unsigned b) - * { - * return STEP (0, 0) + - * ((STEP (SHIFT, 0) + STEP (0, SHIFT)) << SHIFT) + - * ((STEP (0, 2 * SHIFT) + STEP (SHIFT, SHIFT) + STEP (2 * SHIFT, 0)) - * << (2 * SHIFT)); - * } - */ - ___mulsi3: - mov r6,r13 - movea lo(4095),r0,r16 - and r16,r13 - mov r7,r15 - and r16,r15 - mov r13,r10 - mulh r15,r10 - shr 12,r6 - mov r6,r14 - and r16,r14 - mov r14,r11 - mulh r15,r11 - shr 12,r7 - mov r7,r12 - and r16,r12 - shr 12,r7 - and r16,r7 - mulh r13,r7 - shr 12,r6 - mulh r12,r13 - and r16,r6 - add r13,r11 - shl 12,r11 - add r11,r10 - mov r14,r11 - mulh r12,r11 - mulh r15,r6 - add r11,r7 - add r6,r7 - shl 24,r7 - add r7,r10 - jmp [r31] +#ifdef __v850__ +/* + #define SHIFT 12 + #define MASK ((1 << SHIFT) - 1) + + #define STEP(i, j) \ + ({ \ + short a_part = (a >> (i)) & MASK; \ + short b_part = (b >> (j)) & MASK; \ + int res = (((int) a_part) * ((int) b_part)); \ + res; \ + }) + + int + __mulsi3 (unsigned a, unsigned b) + { + return STEP (0, 0) + + ((STEP (SHIFT, 0) + STEP (0, SHIFT)) << SHIFT) + + ((STEP (0, 2 * SHIFT) + STEP (SHIFT, SHIFT) + STEP (2 * SHIFT, 0)) + << (2 * SHIFT)); + } +*/ + mov r6, r14 + movea lo(32767), r0, r10 + and r10, r14 + mov r7, r15 + and r10, r15 + shr 15, r6 + mov r6, r13 + and r10, r13 + shr 15, r7 + mov r7, r12 + and r10, r12 + shr 15, r6 + shr 15, r7 + mov r14, r10 + mulh r15, r10 + mov r14, r11 + mulh r12, r11 + mov r13, r16 + mulh r15, r16 + mulh r14, r7 + mulh r15, r6 + add r16, r11 + mulh r13, r12 + shl 15, r11 + add r11, r10 + add r12, r7 + add r6, r7 + shl 30, r7 + add r7, r10 + jmp [r31] +#endif /* __v850__ */ +#if defined(__v850e__) || defined(__v850ea__) + /* This routine is almost unneccesarry because gcc + generates the MUL instruction for the RTX mulsi3. + But if someone wants to link his application with + previsously compiled v850 objects then they will + need this function. */ + + /* It isn't good to put the inst sequence as below; + mul r7, r6, + mov r6, r10, r0 + In this case, there is a RAW hazard between them. + MUL inst takes 2 cycle in EX stage, then MOV inst + must wait 1cycle. */ + mov r7, r10 + mul r6, r10, r0 + jmp [r31] +#endif /* __v850e__ */ .size ___mulsi3,.-___mulsi3 -#endif +#endif /* L_mulsi3 */ + #ifdef L_udivsi3 .text .global ___udivsi3 .type ___udivsi3,@function ___udivsi3: +#ifdef __v850__ mov 1,r12 mov 0,r10 cmp r6,r7 @@ -126,6 +143,16 @@ ___udivsi3: bne .L9 .L8: jmp [r31] + +#else /* defined(__v850e__) */ + + /* See comments at end of __mulsi3. */ + mov r6, r10 + divu r7, r10, r0 + jmp [r31] + +#endif /* __v850e__ */ + .size ___udivsi3,.-___udivsi3 #endif @@ -134,6 +161,7 @@ ___udivsi3: .globl ___divsi3 .type ___divsi3,@function ___divsi3: +#ifdef __v850__ add -8,sp st.w r31,4[sp] st.w r22,0[sp] @@ -157,6 +185,16 @@ ___divsi3: ld.w 4[sp],r31 add 8,sp jmp [r31] + +#else /* defined(__v850e__) */ + + /* See comments at end of __mulsi3. */ + mov r6, r10 + div r7, r10, r0 + jmp [r31] + +#endif /* __v850e__ */ + .size ___divsi3,.-___divsi3 #endif @@ -165,6 +203,7 @@ ___divsi3: .globl ___umodsi3 .type ___umodsi3,@function ___umodsi3: +#ifdef __v850__ add -12,sp st.w r31,8[sp] st.w r7,4[sp] @@ -178,6 +217,15 @@ ___umodsi3: ld.w 8[sp],r31 add 12,sp jmp [r31] + +#else /* defined(__v850e__) */ + + /* See comments at end of __mulsi3. */ + divu r7, r6, r10 + jmp [r31] + +#endif /* __v850e__ */ + .size ___umodsi3,.-___umodsi3 #endif /* L_umodsi3 */ @@ -186,6 +234,7 @@ ___umodsi3: .globl ___modsi3 .type ___modsi3,@function ___modsi3: +#ifdef __v850__ add -12,sp st.w r31,8[sp] st.w r7,4[sp] @@ -199,6 +248,15 @@ ___modsi3: ld.w 8[sp],r31 add 12,sp jmp [r31] + +#else /* defined(__v850e__) */ + + /* See comments at end of __mulsi3. */ + div r7, r6, r10 + jmp [r31] + +#endif /* __v850e__ */ + .size ___modsi3,.-___modsi3 #endif /* L_modsi3 */ @@ -1642,3 +1700,186 @@ __callt_return_r31c: .short ctoff(.L_callt_return_r31c) #endif #endif /* __v850e__ */ + +/* libgcc2 routines for NEC V850. */ +/* Double Integer Arithmetical Operation. */ + +#ifdef L_negdi2 + .text + .global ___negdi2 + .type ___negdi2, @function +___negdi2: + not r6, r10 + add 1, r10 + setf l, r6 + not r7, r11 + add r6, r11 + jmp [lp] + + .size ___negdi2,.-___negdi2 +#endif + +#ifdef L_cmpdi2 + .text + .global ___cmpdi2 + .type ___cmpdi2,@function +___cmpdi2: + # Signed comparison bitween each high word. + cmp r9, r7 + be .L_cmpdi_cmp_low + setf ge, r10 + setf gt, r6 + add r6, r10 + jmp [lp] +.L_cmpdi_cmp_low: + # Unsigned comparigon bitween each low word. + cmp r8, r6 + setf nl, r10 + setf h, r6 + add r6, r10 + jmp [lp] + .size ___cmpdi2, . - ___cmpdi2 +#endif + +#ifdef L_ucmpdi2 + .text + .global ___ucmpdi2 + .type ___ucmpdi2,@function +___ucmpdi2: + cmp r9, r7 # Check if each high word are same. + be .L_ucmpdi_check_psw + cmp r8, r6 # Compare the word. +.L_ucmpdi_check_psw: + setf nl, r10 # + setf h, r6 # + add r6, r10 # Add the result of comparison NL and comparison H. + jmp [lp] + .size ___ucmpdi2, . - ___ucmpdi2 +#endif + +#ifdef L_muldi3 + .text + .global ___muldi3 + .type ___muldi3,@function +___muldi3: +#ifdef __v850__ + jarl __save_r26_r31, r10 + addi 16, sp, sp + mov r6, r5 + shr 15, r5 + movea lo(32767), r0, r14 + and r14, r5 + mov r8, r10 + shr 15, r10 + and r14, r10 + mov r6, r19 + shr 30, r19 + mov r7, r12 + shl 2, r12 + or r12, r19 + and r14, r19 + mov r8, r13 + shr 30, r13 + mov r9, r12 + shl 2, r12 + or r12, r13 + and r14, r13 + mov r7, r11 + shr 13, r11 + and r14, r11 + mov r9, r31 + shr 13, r31 + and r14, r31 + mov r7, r29 + shr 28, r29 + and r14, r29 + mov r9, r12 + shr 28, r12 + and r14, r12 + and r14, r6 + and r14, r8 + mov r6, r14 + mulh r8, r14 + mov r6, r16 + mulh r10, r16 + mov r6, r18 + mulh r13, r18 + mov r6, r15 + mulh r31, r15 + mulh r12, r6 + mov r5, r17 + mulh r10, r17 + add -16, sp + mov r5, r12 + mulh r8, r12 + add r17, r18 + mov r5, r17 + mulh r31, r17 + add r12, r16 + mov r5, r12 + mulh r13, r12 + add r17, r6 + mov r19, r17 + add r12, r15 + mov r19, r12 + mulh r8, r12 + mulh r10, r17 + add r12, r18 + mov r19, r12 + mulh r13, r12 + add r17, r15 + mov r11, r13 + mulh r8, r13 + add r12, r6 + mov r11, r12 + mulh r10, r12 + add r13, r15 + mulh r29, r8 + add r12, r6 + mov r16, r13 + shl 15, r13 + add r14, r13 + mov r18, r12 + shl 30, r12 + mov r13, r26 + add r12, r26 + shr 15, r14 + movhi hi(131071), r0, r12 + movea lo(131071), r12, r13 + and r13, r14 + mov r16, r12 + and r13, r12 + add r12, r14 + mov r18, r12 + shl 15, r12 + and r13, r12 + add r12, r14 + shr 17, r14 + shr 17, r16 + add r14, r16 + shl 13, r15 + shr 2, r18 + add r18, r15 + add r15, r16 + mov r16, r27 + add r8, r6 + shl 28, r6 + add r6, r27 + mov r26, r10 + mov r27, r11 + jr __return_r26_r31 +#endif /* __v850__ */ +#if defined(__v850e__) || defined(__v850ea__) + /* (Ahi << 32 + Alo) * (Bhi << 32 + Blo) */ + /* r7 r6 r9 r8 */ + mov r8, r10 + mulu r7, r8, r0 /* Ahi * Blo */ + mulu r6, r9, r0 /* Alo * Bhi */ + mulu r6, r10, r11 /* Alo * Blo */ + add r8, r11 + add r9, r11 + jmp [r31] + +#endif /* defined(__v850e__) || defined(__v850ea__) */ + .size ___muldi3, . - ___muldi3 +#endif diff --git a/gcc/config/v850/t-v850 b/gcc/config/v850/t-v850 index 2030dc30d3e0..030f043f0713 100644 --- a/gcc/config/v850/t-v850 +++ b/gcc/config/v850/t-v850 @@ -56,7 +56,11 @@ LIB1ASMFUNCS = _mulsi3 \ _callt_save_all_interrupt \ _callt_save_r2_r29 \ _callt_save_r2_r31 \ - _callt_save_r6_r9 + _callt_save_r6_r9 \ + _negdi2 \ + _cmpdi2 \ + _ucmpdi2 \ + _muldi3 # We want fine grained libraries, so use the new code to build the # floating point emulation libraries. @@ -76,9 +80,12 @@ fp-bit.c: $(srcdir)/config/fp-bit.c echo '#endif' >> fp-bit.c cat $(srcdir)/config/fp-bit.c >> fp-bit.c -TCFLAGS = -Wa,-mwarn-signed-overflow -Wa,-mwarn-unsigned-overflow -# Create non-target specific versions of the libraries -TCFLAGS += -mno-app-regs -msmall-sld -mv850 -D__v850e__ -Wa,-mv850any +# Create target-specific versions of the libraries +MULTILIB_OPTIONS = mv850/mv850e +MULTILIB_DIRNAMES = v850 v850e +INSTALL_LIBGCC = install-multilib + +TCFLAGS = -mno-app-regs -msmall-sld -Wa,-mwarn-signed-overflow -Wa,-mwarn-unsigned-overflow v850-c.o: $(srcdir)/config/v850/v850-c.c $(RTL_H) $(TREE_H) $(CONFIG_H) $(CC) -c $(ALL_CFLAGS) $(ALL_CPPFLAGS) $(INCLUDES) $< diff --git a/gcc/config/v850/v850-protos.h b/gcc/config/v850/v850-protos.h index ed0a565eefbe..bab73ae7e562 100644 --- a/gcc/config/v850/v850-protos.h +++ b/gcc/config/v850/v850-protos.h @@ -1,22 +1,22 @@ /* Prototypes for v850.c functions used in the md file & elsewhere. - Copyright (C) 1999, 2000 Free Software Foundation, Inc. + Copyright (C) 1999, 2000, 2002 Free Software Foundation, Inc. -This file is part of GNU CC. + This file is part of GNU CC. -GNU CC is free software; you can redistribute it and/or modify -it under the terms of the GNU General Public License as published by -the Free Software Foundation; either version 2, or (at your option) -any later version. + GNU CC is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2, or (at your option) + any later version. -GNU CC is distributed in the hope that it will be useful, -but WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -GNU General Public License for more details. + GNU CC is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. -You should have received a copy of the GNU General Public License -along with GNU CC; see the file COPYING. If not, write to -the Free Software Foundation, 59 Temple Place - Suite 330, -Boston, MA 02111-1307, USA. */ + You should have received a copy of the GNU General Public License + along with GNU CC; see the file COPYING. If not, write to + the Free Software Foundation, 59 Temple Place - Suite 330, + Boston, MA 02111-1307, USA. */ /* Function prototypes that cannot exist in v850.h due to dependency complications. */ @@ -53,6 +53,8 @@ extern void notice_update_cc PARAMS ((rtx, rtx)); extern char * construct_save_jarl PARAMS ((rtx)); extern char * construct_restore_jr PARAMS ((rtx)); #ifdef HAVE_MACHINE_MODES +extern int reg_or_int9_operand PARAMS ((rtx, Mmode)); +extern int reg_or_const_operand PARAMS ((rtx, Mmode)); extern char * construct_dispose_instruction PARAMS ((rtx)); extern char * construct_prepare_instruction PARAMS ((rtx)); extern int pattern_is_ok_for_prepare PARAMS ((rtx, Mmode)); diff --git a/gcc/config/v850/v850.c b/gcc/config/v850/v850.c index 3190839e8eb5..86e80e9887ff 100644 --- a/gcc/config/v850/v850.c +++ b/gcc/config/v850/v850.c @@ -3,22 +3,22 @@ Free Software Foundation, Inc. Contributed by Jeff Law (law@cygnus.com). -This file is part of GNU CC. + This file is part of GNU CC. -GNU CC is free software; you can redistribute it and/or modify -it under the terms of the GNU General Public License as published by -the Free Software Foundation; either version 2, or (at your option) -any later version. + GNU CC is free software; you can redistribute it and/or modify it + under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2, or (at your option) + any later version. -GNU CC is distributed in the hope that it will be useful, -but WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -GNU General Public License for more details. + GNU CC is distributed in the hope that it will be useful, but WITHOUT + ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + for more details. -You should have received a copy of the GNU General Public License -along with GNU CC; see the file COPYING. If not, write to -the Free Software Foundation, 59 Temple Place - Suite 330, -Boston, MA 02111-1307, USA. */ + You should have received a copy of the GNU General Public License + along with GNU CC; see the file COPYING. If not, write to the Free + Software Foundation, 59 Temple Place - Suite 330, Boston, MA + 02111-1307, USA. */ #include "config.h" #include "system.h" @@ -2762,7 +2762,7 @@ v850_output_aligned_bss (file, decl, name, size, align) int align; { (*targetm.asm_out.globalize_label) (file, name); - + switch (v850_get_data_area (decl)) { case DATA_AREA_ZDA: diff --git a/gcc/config/v850/v850.h b/gcc/config/v850/v850.h index 4d89c982f938..e1c33f39937a 100644 --- a/gcc/config/v850/v850.h +++ b/gcc/config/v850/v850.h @@ -3,22 +3,22 @@ Free Software Foundation, Inc. Contributed by Jeff Law (law@cygnus.com). -This file is part of GNU CC. + This file is part of GNU CC. -GNU CC is free software; you can redistribute it and/or modify -it under the terms of the GNU General Public License as published by -the Free Software Foundation; either version 2, or (at your option) -any later version. + GNU CC is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2, or (at your option) + any later version. -GNU CC is distributed in the hope that it will be useful, -but WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -GNU General Public License for more details. + GNU CC is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. -You should have received a copy of the GNU General Public License -along with GNU CC; see the file COPYING. If not, write to -the Free Software Foundation, 59 Temple Place - Suite 330, -Boston, MA 02111-1307, USA. */ + You should have received a copy of the GNU General Public License + along with GNU CC; see the file COPYING. If not, write to + the Free Software Foundation, 59 Temple Place - Suite 330, + Boston, MA 02111-1307, USA. */ #ifndef GCC_V850_H #define GCC_V850_H @@ -86,6 +86,7 @@ extern int target_flags; #define MASK_BIG_SWITCH 0x00000100 #define MASK_NO_APP_REGS 0x00000200 #define MASK_DISABLE_CALLT 0x00000400 +#define MASK_STRICT_ALIGN 0x00000800 #define MASK_US_BIT_SET 0x00001000 #define MASK_US_MASK_SET 0x00002000 @@ -145,6 +146,8 @@ extern int target_flags; and r5 are to be fixed registers (for compatibility with GHS). */ #define TARGET_NO_APP_REGS (target_flags & MASK_NO_APP_REGS) +#define TARGET_STRICT_ALIGN (target_flags & MASK_STRICT_ALIGN) + /* Macro to define tables used to set the flags. This is a list in braces of pairs in braces, each pair being { "NAME", VALUE } @@ -182,6 +185,9 @@ extern int target_flags; { "app-regs", -MASK_NO_APP_REGS, "" }, \ { "no-app-regs", MASK_NO_APP_REGS, \ N_("Do not use registers r2 and r5") }, \ + { "strict-align", MASK_STRICT_ALIGN, \ + N_("Enfore strict alignment") }, \ + { "no-strict-align", -MASK_STRICT_ALIGN, "" }, \ { "big-switch", MASK_BIG_SWITCH, \ N_("Use 4 byte entries in switch tables") },\ { "", MASK_DEFAULT, ""}} @@ -255,6 +261,7 @@ extern struct small_memory_info small_memory[(int)SMALL_MEMORY_max]; #define OPTIMIZATION_OPTIONS(LEVEL,SIZE) \ { \ + target_flags |= MASK_STRICT_ALIGN; \ if (LEVEL) \ target_flags |= (MASK_EP | MASK_PROLOG_FUNCTION); \ } @@ -314,7 +321,7 @@ extern struct small_memory_info small_memory[(int)SMALL_MEMORY_max]; /* Define this if move instructions will actually fail to work when given unaligned data. */ -#define STRICT_ALIGNMENT 1 +#define STRICT_ALIGNMENT TARGET_STRICT_ALIGN /* Define this as 1 if `char' should by default be signed; else as 0. @@ -1048,8 +1055,27 @@ do { \ #define RTX_COSTS(RTX,CODE,OUTER_CODE) \ case MOD: \ case DIV: \ + case UMOD: \ + case UDIV: \ + if (TARGET_V850E && optimize_size) \ + return 6; \ return 60; \ case MULT: \ + if (TARGET_V850E \ + && ( GET_MODE (RTX) == SImode \ + || GET_MODE (RTX) == HImode \ + || GET_MODE (RTX) == QImode)) \ + { \ + if (GET_CODE (XEXP (RTX, 1)) == REG) \ + return 4; \ + else if (GET_CODE (XEXP (RTX, 1)) == CONST_INT) \ + { \ + if (CONST_OK_FOR_O (INTVAL (XEXP (RTX, 1)))) \ + return 6; \ + else if (CONST_OK_FOR_K (INTVAL (XEXP (RTX, 1)))) \ + return 10; \ + } \ + } \ return 20; /* All addressing modes have the same cost on the V850 series. */ @@ -1360,6 +1386,23 @@ zbss_section () \ #define STORE_FLAG_VALUE 1 +#define MULDI3_LIBCALL "__muldi3" +#define UCMPDI2_LIBCALL "__ucmpdi2" +#define CMPDI2_LIBCALL "__cmpdi2" +#define NEGDI2_LIBCALL "__negdi2" + +#define INIT_TARGET_OPTABS \ + do \ + { \ + cmp_optab->handlers[(int) DImode].libfunc \ + = init_one_libfunc (CMPDI2_LIBCALL); \ + ucmp_optab->handlers[(int) DImode].libfunc \ + = init_one_libfunc (UCMPDI2_LIBCALL); \ + neg_optab->handlers[(int) DImode].libfunc \ + = init_one_libfunc (NEGDI2_LIBCALL); \ + } \ + while (0) + /* Specify the machine mode that pointers have. After generation of rtl, the compiler makes no further distinction between pointers and any other objects of this machine mode. */ @@ -1470,6 +1513,8 @@ extern union tree_node * GHS_current_section_names [(int) COUNT_OF_GHS_SECTION_K #define PREDICATE_CODES \ { "reg_or_0_operand", { REG, SUBREG, CONST_INT, CONST_DOUBLE }}, \ { "reg_or_int5_operand", { REG, SUBREG, CONST_INT }}, \ +{ "reg_or_int9_operand", { REG, SUBREG, CONST_INT }}, \ +{ "reg_or_const_operand", { REG, CONST_INT }}, \ { "call_address_operand", { REG, SYMBOL_REF }}, \ { "movsi_source_operand", { LABEL_REF, SYMBOL_REF, CONST_INT, \ CONST_DOUBLE, CONST, HIGH, MEM, \ diff --git a/gcc/config/v850/v850.md b/gcc/config/v850/v850.md index 75d8662fdc9c..96ece9cfac60 100644 --- a/gcc/config/v850/v850.md +++ b/gcc/config/v850/v850.md @@ -409,7 +409,6 @@ (define_insn "mulsi3" [(set (match_operand:SI 0 "register_operand" "=r") (mult:SI (match_operand:SI 1 "register_operand" "%0") - ;; %redact changeone /reg_or_int9/ 'register' unless nec-no-copyright (match_operand:SI 2 "reg_or_int9_operand" "rO")))] "TARGET_V850E" "mul %2,%1,%." @@ -860,9 +859,7 @@ (if_then_else:SI (match_operator 1 "comparison_operator" [(match_dup 4) (match_dup 5)]) - ;; %redact changeone /const/ 'int5' unless nec-no-copyright (match_operand:SI 2 "reg_or_const_operand" "rJ") - ;; %redact changeone /const/ '0' unless nec-no-copyright (match_operand:SI 3 "reg_or_const_operand" "rI")))] "TARGET_V850E" "