lib1funcs.S: Add support for e3v5 architecture variant.

* config/v850/lib1funcs.S: Add support for e3v5 architecture
	variant.

	* config/v850/constraints.md (Q): Define as a memory constraint.
	* config/v850/predicates.md (label_ref_operand): New predicate.
	(e3v5_shift_operand): New predicate.
	(ior_operator): New predicate.
	* config/v850/t-v850: Add e3v5 multilib.
	* config/v850/v850-protos.h (v850_adjust_insn_length): Prototype.
	(v850_gen_movdi): Prototype.
	* config/v850/v850.c: Add support for e3v5 architecture.
	Rename all uses of TARGET_V850E || TARGET_V850E2_ALL to
	TARGET_V850E_UP.
	(construct_save_jarl): Add e3v5 long JARL support.
	(v850_adjust_insn_length): New function.  Adjust length of call
	insns when using e3v5 instructions.
	(v850_gen_movdi): New function: Generate instructions to move a
	DImode value.
	* config/v850/v850.h (TARGET_CPU_v850e3v5): Define.
	(CPP_SPEC): Define __v850e3v5__ as appropriate.
	(TARGET_USE_FPU): Enable for e3v5.
	(CONST_OK_FOR_W): New macro.
	(ADJUST_INSN_LENGTH): Define.
	* config/v850/v850.md (UNSPEC_LOOP): Define.
	(attr cpu): Add v850e3v5.
	Rename all uses of TARGET_V850E2 to TARGET_V850E2V3_UP.
	(movdi): New pattern.
	(movdi_internal): New pattern.
	(cbranchsf4): Conditionalize on TARGET_USE_FPU.
	(cbranchdf4): Conditionalize on TARGET_USE_FPU.
	(cstoresf4): Likewise.
	(cstoredf4): Likewise.
	(insv): New pattern.
	(rotlso3_a): New pattern.
	(rotlsi3_b): New pattern
	(rotlsi3_v850e3v5): New pattern.
	(doloop_begin): New pattern.
	(fix_loop_counter): New pattern.
	(doloop_end): New pattern.
	(branch_normal): Add e3v5 long branch support.
	(branch_invert): Likewise.
	(branch_z_normal): Likewise.
	(branch_z_invert): Likewise.
	(branch_nz_normal): Likewise.
	(branch_nz_invert): Likewise.
	(call_internal_short): Add e3v5 register-indirect JARL support.
	(call_internal_long): Likewise.
	(call_value_internal_short): Likewise.
	(call_value_internal_long): Likewise.
	* config/v850/v850.opt (mv850e3v5, mv850e2v4): New options.
	(mloop): New option.
	* config.gcc: Add support for configuring v840e3v5 target.
	* doc/invoke.texi: Document new v850 specific command line
	options.

From-SVN: r195623
This commit is contained in:
Nick Clifton 2013-01-31 18:36:02 +00:00
parent 73861a4142
commit dbdbd982df
13 changed files with 698 additions and 154 deletions

View file

@ -1,3 +1,58 @@
2013-01-31 Hiroyuki Ono <hiroyuki.ono.jc@renesas.com>
Nick Clifton <nickc@redhat.com>
* config/v850/constraints.md (Q): Define as a memory constraint.
* config/v850/predicates.md (label_ref_operand): New predicate.
(e3v5_shift_operand): New predicate.
(ior_operator): New predicate.
* config/v850/t-v850: Add e3v5 multilib.
* config/v850/v850-protos.h (v850_adjust_insn_length): Prototype.
(v850_gen_movdi): Prototype.
* config/v850/v850.c: Add support for e3v5 architecture.
Rename all uses of TARGET_V850E || TARGET_V850E2_ALL to
TARGET_V850E_UP.
(construct_save_jarl): Add e3v5 long JARL support.
(v850_adjust_insn_length): New function. Adjust length of call
insns when using e3v5 instructions.
(v850_gen_movdi): New function: Generate instructions to move a
DImode value.
* config/v850/v850.h (TARGET_CPU_v850e3v5): Define.
(CPP_SPEC): Define __v850e3v5__ as appropriate.
(TARGET_USE_FPU): Enable for e3v5.
(CONST_OK_FOR_W): New macro.
(ADJUST_INSN_LENGTH): Define.
* config/v850/v850.md (UNSPEC_LOOP): Define.
(attr cpu): Add v850e3v5.
Rename all uses of TARGET_V850E2 to TARGET_V850E2V3_UP.
(movdi): New pattern.
(movdi_internal): New pattern.
(cbranchsf4): Conditionalize on TARGET_USE_FPU.
(cbranchdf4): Conditionalize on TARGET_USE_FPU.
(cstoresf4): Likewise.
(cstoredf4): Likewise.
(insv): New pattern.
(rotlso3_a): New pattern.
(rotlsi3_b): New pattern
(rotlsi3_v850e3v5): New pattern.
(doloop_begin): New pattern.
(fix_loop_counter): New pattern.
(doloop_end): New pattern.
(branch_normal): Add e3v5 long branch support.
(branch_invert): Likewise.
(branch_z_normal): Likewise.
(branch_z_invert): Likewise.
(branch_nz_normal): Likewise.
(branch_nz_invert): Likewise.
(call_internal_short): Add e3v5 register-indirect JARL support.
(call_internal_long): Likewise.
(call_value_internal_short): Likewise.
(call_value_internal_long): Likewise.
* config/v850/v850.opt (mv850e3v5, mv850e2v4): New options.
(mloop): New option.
* config.gcc: Add support for configuring v840e3v5 target.
* doc/invoke.texi: Document new v850 specific command line
options.
2013-01-31 Paul Koning <ni1d@arrl.net> 2013-01-31 Paul Koning <ni1d@arrl.net>
PR debug/55059 PR debug/55059

View file

@ -2554,6 +2554,9 @@ v850-*-rtems*)
;; ;;
v850*-*-*) v850*-*-*)
case ${target} in case ${target} in
v850e3v5-*-*)
target_cpu_default="TARGET_CPU_v850e3v5"
;;
v850e2v3-*-*) v850e2v3-*-*)
target_cpu_default="TARGET_CPU_v850e2v3" target_cpu_default="TARGET_CPU_v850e2v3"
;; ;;
@ -3614,7 +3617,7 @@ case "${target}" in
v850*-*-*) v850*-*-*)
supported_defaults=cpu supported_defaults=cpu
case ${with_cpu} in case ${with_cpu} in
"" | v850e | v850e1 | v850e2 | v850es | v850e2v3) "" | v850e | v850e1 | v850e2 | v850es | v850e2v3 | v850e3v5)
# OK # OK
;; ;;
*) *)
@ -3741,7 +3744,7 @@ case ${target} in
case "x$with_cpu" in case "x$with_cpu" in
x) x)
;; ;;
xv850e | xv850e1 | xv850e2 | xv850e2v3) xv850e | xv850e1 | xv850e2 | xv850e2v3 | xv850e3v5)
target_cpu_default2="TARGET_CPU_$with_cpu" target_cpu_default2="TARGET_CPU_$with_cpu"
;; ;;
xv850es) xv850es)

View file

@ -76,7 +76,7 @@
(match_test "0"))) (match_test "0")))
;;; Extra constraints. ;;; Extra constraints.
(define_constraint "Q" (define_memory_constraint "Q"
"A memory address that does not contain a symbol address." "A memory address that does not contain a symbol address."
(and (match_code "mem") (and (match_code "mem")
(match_test "ep_memory_operand (op, mode, FALSE)"))) (match_test "ep_memory_operand (op, mode, FALSE)")))

View file

@ -498,6 +498,26 @@
return op == CONST0_RTX(mode); return op == CONST0_RTX(mode);
}) })
(define_predicate "label_ref_operand"
(match_code "label_ref")
)
(define_predicate "e3v5_shift_operand"
(match_code "const_int,reg")
{
if (CONST_INT_P (op))
return IN_RANGE (INTVAL (op), 0, 31);
return true;
}
)
(define_predicate "ior_operator"
(match_code "ior")
{
return (GET_CODE (op) == IOR);
})
;; Return true if the floating point comparison operation ;; Return true if the floating point comparison operation
;; given produces a canonical answer. ;; given produces a canonical answer.
(define_predicate "v850_float_z_comparison_operator" (define_predicate "v850_float_z_comparison_operator"

View file

@ -20,6 +20,9 @@
MULTILIB_OPTIONS = m8byte-align mgcc-abi msoft-float MULTILIB_OPTIONS = m8byte-align mgcc-abi msoft-float
MULTILIB_DIRNAMES = 8byte gcc-abi soft-float MULTILIB_DIRNAMES = 8byte gcc-abi soft-float
MULTILIB_OPTIONS += mv850e3v5
MULTILIB_DIRNAMES += v850e3v5
TCFLAGS = -mno-app-regs -msmall-sld -Wa,-mwarn-signed-overflow -Wa,-mwarn-unsigned-overflow TCFLAGS = -mno-app-regs -msmall-sld -Wa,-mwarn-signed-overflow -Wa,-mwarn-unsigned-overflow
v850-c.o: $(srcdir)/config/v850/v850-c.c $(CONFIG_H) $(SYSTEM_H) coretypes.h \ v850-c.o: $(srcdir)/config/v850/v850-c.c $(CONFIG_H) $(SYSTEM_H) coretypes.h \

View file

@ -39,6 +39,8 @@ extern char * construct_restore_jr (rtx);
extern char * construct_dispose_instruction (rtx); extern char * construct_dispose_instruction (rtx);
extern char * construct_prepare_instruction (rtx); extern char * construct_prepare_instruction (rtx);
extern int ep_memory_operand (rtx, enum machine_mode, int); extern int ep_memory_operand (rtx, enum machine_mode, int);
extern int v850_adjust_insn_length (rtx, int);
extern const char * v850_gen_movdi (rtx *);
extern rtx v850_gen_compare (enum rtx_code, enum machine_mode, extern rtx v850_gen_compare (enum rtx_code, enum machine_mode,
rtx, rtx); rtx, rtx);
extern enum machine_mode v850_gen_float_compare (enum rtx_code, extern enum machine_mode v850_gen_float_compare (enum rtx_code,

View file

@ -824,7 +824,7 @@ output_move_single (rtx * operands)
return "movhi hi0(%1),%.,%0"; return "movhi hi0(%1),%.,%0";
/* A random constant. */ /* A random constant. */
else if (TARGET_V850E || TARGET_V850E2_ALL) else if (TARGET_V850E_UP)
return "mov %1,%0"; return "mov %1,%0";
else else
return "movhi hi(%1),%.,%0\n\tmovea lo(%1),%0,%0"; return "movhi hi(%1),%.,%0\n\tmovea lo(%1),%0,%0";
@ -846,7 +846,7 @@ output_move_single (rtx * operands)
return "movhi hi0(%F1),%.,%0"; return "movhi hi0(%F1),%.,%0";
/* A random constant. */ /* A random constant. */
else if (TARGET_V850E || TARGET_V850E2_ALL) else if (TARGET_V850E_UP)
return "mov %F1,%0"; return "mov %F1,%0";
else else
@ -863,7 +863,7 @@ output_move_single (rtx * operands)
|| GET_CODE (src) == SYMBOL_REF || GET_CODE (src) == SYMBOL_REF
|| GET_CODE (src) == CONST) || GET_CODE (src) == CONST)
{ {
if (TARGET_V850E || TARGET_V850E2_ALL) if (TARGET_V850E_UP)
return "mov hilo(%1),%0"; return "mov hilo(%1),%0";
else else
return "movhi hi(%1),%.,%0\n\tmovea lo(%1),%0,%0"; return "movhi hi(%1),%.,%0\n\tmovea lo(%1),%0,%0";
@ -1018,7 +1018,7 @@ ep_memory_offset (enum machine_mode mode, int unsignedp ATTRIBUTE_UNUSED)
case QImode: case QImode:
if (TARGET_SMALL_SLD) if (TARGET_SMALL_SLD)
max_offset = (1 << 4); max_offset = (1 << 4);
else if ((TARGET_V850E || TARGET_V850E2_ALL) else if ((TARGET_V850E_UP)
&& unsignedp) && unsignedp)
max_offset = (1 << 4); max_offset = (1 << 4);
else else
@ -1028,7 +1028,7 @@ ep_memory_offset (enum machine_mode mode, int unsignedp ATTRIBUTE_UNUSED)
case HImode: case HImode:
if (TARGET_SMALL_SLD) if (TARGET_SMALL_SLD)
max_offset = (1 << 5); max_offset = (1 << 5);
else if ((TARGET_V850E || TARGET_V850E2_ALL) else if ((TARGET_V850E_UP)
&& unsignedp) && unsignedp)
max_offset = (1 << 5); max_offset = (1 << 5);
else else
@ -1656,7 +1656,7 @@ expand_prologue (void)
/* Save/setup global registers for interrupt functions right now. */ /* Save/setup global registers for interrupt functions right now. */
if (interrupt_handler) if (interrupt_handler)
{ {
if (! TARGET_DISABLE_CALLT && (TARGET_V850E || TARGET_V850E2_ALL)) if (! TARGET_DISABLE_CALLT && (TARGET_V850E_UP))
emit_insn (gen_callt_save_interrupt ()); emit_insn (gen_callt_save_interrupt ());
else else
emit_insn (gen_save_interrupt ()); emit_insn (gen_save_interrupt ());
@ -1759,7 +1759,7 @@ expand_prologue (void)
/* Special case interrupt functions that save all registers for a call. */ /* Special case interrupt functions that save all registers for a call. */
if (interrupt_handler && ((1L << LINK_POINTER_REGNUM) & reg_saved) != 0) if (interrupt_handler && ((1L << LINK_POINTER_REGNUM) & reg_saved) != 0)
{ {
if (! TARGET_DISABLE_CALLT && (TARGET_V850E || TARGET_V850E2_ALL)) if (! TARGET_DISABLE_CALLT && (TARGET_V850E_UP))
emit_insn (gen_callt_save_all_interrupt ()); emit_insn (gen_callt_save_all_interrupt ());
else else
emit_insn (gen_save_all_interrupt ()); emit_insn (gen_save_all_interrupt ());
@ -1967,7 +1967,7 @@ expand_epilogue (void)
/* And return or use reti for interrupt handlers. */ /* And return or use reti for interrupt handlers. */
if (interrupt_handler) if (interrupt_handler)
{ {
if (! TARGET_DISABLE_CALLT && (TARGET_V850E || TARGET_V850E2_ALL)) if (! TARGET_DISABLE_CALLT && (TARGET_V850E_UP))
emit_insn (gen_callt_return_interrupt ()); emit_insn (gen_callt_return_interrupt ());
else else
emit_jump_insn (gen_return_interrupt ()); emit_jump_insn (gen_return_interrupt ());
@ -2437,6 +2437,9 @@ construct_save_jarl (rtx op)
else else
sprintf (name, "__save_%s_%s", reg_names [first], reg_names [last]); sprintf (name, "__save_%s_%s", reg_names [first], reg_names [last]);
if (TARGET_V850E3V5_UP)
sprintf (buff, "mov hilo(%s), r11\n\tjarl [r11], r10", name);
else
sprintf (buff, "movhi hi(%s), r0, r11\n\tmovea lo(%s), r11, r11\n\tjarl .+4, r10\n\tadd 4, r10\n\tjmp r11", sprintf (buff, "movhi hi(%s), r0, r11\n\tmovea lo(%s), r11, r11\n\tjarl .+4, r10\n\tadd 4, r10\n\tjmp r11",
name, name); name, name);
} }
@ -3048,7 +3051,7 @@ v850_trampoline_init (rtx m_tramp, tree fndecl, rtx chain_value)
static int static int
v850_issue_rate (void) v850_issue_rate (void)
{ {
return (TARGET_V850E2_ALL? 2 : 1); return (TARGET_V850E2_UP ? 2 : 1);
} }
/* Implement TARGET_LEGITIMATE_CONSTANT_P. */ /* Implement TARGET_LEGITIMATE_CONSTANT_P. */
@ -3082,6 +3085,32 @@ v850_memory_move_cost (enum machine_mode mode,
return (GET_MODE_SIZE (mode) / 2) * (in ? 3 : 1); return (GET_MODE_SIZE (mode) / 2) * (in ? 3 : 1);
} }
} }
int
v850_adjust_insn_length (rtx insn, int length)
{
if (TARGET_V850E3V5_UP)
{
if (CALL_P (insn))
{
if (TARGET_LONG_CALLS)
{
/* call_internal_long, call_value_internal_long. */
if (length == 8)
length = 4;
if (length == 16)
length = 10;
}
else
{
/* call_internal_short, call_value_internal_short. */
if (length == 8)
length = 4;
}
}
}
return length;
}
/* V850 specific attributes. */ /* V850 specific attributes. */
@ -3102,7 +3131,6 @@ static const struct attribute_spec v850_attribute_table[] =
{ NULL, 0, 0, false, false, false, NULL, false } { NULL, 0, 0, false, false, false, NULL, false }
}; };
static void static void
v850_option_override (void) v850_option_override (void)
{ {
@ -3114,6 +3142,40 @@ v850_option_override (void)
target_flags |= MASK_DISABLE_CALLT; target_flags |= MASK_DISABLE_CALLT;
} }
const char *
v850_gen_movdi (rtx * operands)
{
if (REG_P (operands[0]))
{
if (REG_P (operands[1]))
{
if (REGNO (operands[0]) == (REGNO (operands[1]) - 1))
return "mov %1, %0; mov %R1, %R0";
return "mov %R1, %R0; mov %1, %0";
}
if (MEM_P (operands[1]))
{
if (REGNO (operands[0]) & 1)
/* Use two load word instructions to synthesise a load double. */
return "ld.w %1, %0 ; ld.w %R1, %R0" ;
return "ld.dw %1, %0";
}
return "mov %1, %0; mov %R1, %R0";
}
gcc_assert (REG_P (operands[1]));
if (REGNO (operands[1]) & 1)
/* Use two store word instructions to synthesise a store double. */
return "st.w %1, %0 ; st.w %R1, %R0 ";
return "st.dw %1, %0";
}
/* Initialize the GCC target structure. */ /* Initialize the GCC target structure. */
#undef TARGET_OPTION_OVERRIDE #undef TARGET_OPTION_OVERRIDE

View file

@ -37,7 +37,7 @@ extern GTY(()) rtx v850_compare_op1;
#define TARGET_CPU_v850e1 3 #define TARGET_CPU_v850e1 3
#define TARGET_CPU_v850e2 4 #define TARGET_CPU_v850e2 4
#define TARGET_CPU_v850e2v3 5 #define TARGET_CPU_v850e2v3 5
#define TARGET_CPU_v850e3v5 6
#ifndef TARGET_CPU_DEFAULT #ifndef TARGET_CPU_DEFAULT
#define TARGET_CPU_DEFAULT TARGET_CPU_generic #define TARGET_CPU_DEFAULT TARGET_CPU_generic
@ -86,7 +86,22 @@ extern GTY(()) rtx v850_compare_op1;
#define SUBTARGET_CPP_SPEC "%{!mv*:-D__v850e2v3__} %{mv850e2v3:-D__v850e2v3__}" #define SUBTARGET_CPP_SPEC "%{!mv*:-D__v850e2v3__} %{mv850e2v3:-D__v850e2v3__}"
#endif #endif
#define TARGET_V850E2_ALL (TARGET_V850E2 || TARGET_V850E2V3) #if TARGET_CPU_DEFAULT == TARGET_CPU_v850e3v5
#undef MASK_DEFAULT
#define MASK_DEFAULT MASK_V850E3V5
#undef SUBTARGET_ASM_SPEC
#define SUBTARGET_ASM_SPEC "%{!mv*:-mv850e3v5}"
#undef SUBTARGET_CPP_SPEC
#define SUBTARGET_CPP_SPEC "%{!mv*:-D__v850e3v5__} %{mv850e3v5:-D__v850e3v5__}"
#undef TARGET_VERSION
#define TARGET_VERSION fprintf (stderr, " (Renesas V850E3V5)");
#endif
#define TARGET_V850E3V5_UP ((TARGET_V850E3V5))
#define TARGET_V850E2V3_UP ((TARGET_V850E2V3) || TARGET_V850E3V5_UP)
#define TARGET_V850E2_UP ((TARGET_V850E2) || TARGET_V850E2V3_UP)
#define TARGET_V850E_UP ((TARGET_V850E) || TARGET_V850E2_UP)
#define TARGET_ALL ((TARGET_V850) || TARGET_V850E_UP)
#define ASM_SPEC "%{m850es:-mv850e1}%{!mv850es:%{mv*:-mv%*}} \ #define ASM_SPEC "%{m850es:-mv850e1}%{!mv850es:%{mv*:-mv%*}} \
%{mrelax:-mrelax} \ %{mrelax:-mrelax} \
@ -96,14 +111,15 @@ extern GTY(()) rtx v850_compare_op1;
#define LINK_SPEC "%{mgcc-abi:-m v850}" #define LINK_SPEC "%{mgcc-abi:-m v850}"
#define CPP_SPEC "\ #define CPP_SPEC "\
%{mv850e3v5:-D__v850e3v5__} \
%{mv850e2v3:-D__v850e2v3__} \ %{mv850e2v3:-D__v850e2v3__} \
%{mv850e2:-D__v850e2__} \ %{mv850e2:-D__v850e2__} \
%{mv850es:-D__v850e1__} \ %{mv850es:-D__v850e1__} \
%{mv850e1:-D__v850e1__} \ %{mv850e1:-D__v850e1__} \
%{mv850e:-D__v850e__} \ %{mv850e:-D__v850e__} \
%{mv850:-D__v850__} \ %{mv850:-D__v850__} \
%(subtarget_cpp_spec)" \ %(subtarget_cpp_spec) \
" %{mep:-D__EP__}" %{mep:-D__EP__}"
#define EXTRA_SPECS \ #define EXTRA_SPECS \
{ "subtarget_asm_spec", SUBTARGET_ASM_SPEC }, \ { "subtarget_asm_spec", SUBTARGET_ASM_SPEC }, \
@ -111,7 +127,7 @@ extern GTY(()) rtx v850_compare_op1;
/* Macro to decide when FPU instructions can be used. */ /* Macro to decide when FPU instructions can be used. */
#define TARGET_USE_FPU (TARGET_V850E2V3 && ! TARGET_SOFT_FLOAT) #define TARGET_USE_FPU (TARGET_V850E2V3_UP && ! TARGET_SOFT_FLOAT)
#define TARGET_CPU_CPP_BUILTINS() \ #define TARGET_CPU_CPP_BUILTINS() \
do \ do \
@ -136,7 +152,7 @@ extern GTY(()) rtx v850_compare_op1;
} \ } \
while(0) while(0)
#define MASK_CPU (MASK_V850 | MASK_V850E | MASK_V850E1 | MASK_V850E2 | MASK_V850E2V3) #define MASK_CPU (MASK_V850 | MASK_V850E | MASK_V850E1 | MASK_V850E2 | MASK_V850E2V3 | MASK_V850E3V5)
/* Target machine storage layout */ /* Target machine storage layout */
@ -380,7 +396,8 @@ enum reg_class
insn_const_int_ok_for_constraint (VALUE, CONSTRAINT_N) insn_const_int_ok_for_constraint (VALUE, CONSTRAINT_N)
#define CONST_OK_FOR_O(VALUE) \ #define CONST_OK_FOR_O(VALUE) \
insn_const_int_ok_for_constraint (VALUE, CONSTRAINT_O) insn_const_int_ok_for_constraint (VALUE, CONSTRAINT_O)
#define CONST_OK_FOR_W(VALUE) \
insn_const_int_ok_for_constraint (VALUE, CONSTRAINT_W)
/* Stack layout; function entry, exit and calling. */ /* Stack layout; function entry, exit and calling. */
@ -797,9 +814,9 @@ typedef enum
#define ASM_OUTPUT_ADDR_DIFF_ELT(FILE, BODY, VALUE, REL) \ #define ASM_OUTPUT_ADDR_DIFF_ELT(FILE, BODY, VALUE, REL) \
fprintf (FILE, "\t%s %s.L%d-.L%d%s\n", \ fprintf (FILE, "\t%s %s.L%d-.L%d%s\n", \
(TARGET_BIG_SWITCH ? ".long" : ".short"), \ (TARGET_BIG_SWITCH ? ".long" : ".short"), \
(0 && ! TARGET_BIG_SWITCH && (TARGET_V850E || TARGET_V850E2_ALL) ? "(" : ""), \ (0 && ! TARGET_BIG_SWITCH && (TARGET_V850E_UP) ? "(" : ""), \
VALUE, REL, \ VALUE, REL, \
(0 && ! TARGET_BIG_SWITCH && (TARGET_V850E || TARGET_V850E2_ALL) ? ")>>1" : "")) (0 && ! TARGET_BIG_SWITCH && (TARGET_V850E_UP) ? ")>>1" : ""))
#define ASM_OUTPUT_ALIGN(FILE, LOG) \ #define ASM_OUTPUT_ALIGN(FILE, LOG) \
if ((LOG) != 0) \ if ((LOG) != 0) \
@ -960,4 +977,7 @@ extern tree GHS_current_section_names [(int) COUNT_OF_GHS_SECTION_KINDS];
-isystem <path-to-build-dir>. */ -isystem <path-to-build-dir>. */
#define NO_IMPLICIT_EXTERN_C #define NO_IMPLICIT_EXTERN_C
#define ADJUST_INSN_LENGTH(INSN, LENGTH) \
((LENGTH) = v850_adjust_insn_length ((INSN), (LENGTH)))
#endif /* ! GCC_V850_H */ #endif /* ! GCC_V850_H */

View file

@ -43,6 +43,7 @@
(LP_REGNUM 31) ; Return address register (LP_REGNUM 31) ; Return address register
(CC_REGNUM 32) ; Condition code pseudo register (CC_REGNUM 32) ; Condition code pseudo register
(FCC_REGNUM 33) ; Floating Condition code pseudo register (FCC_REGNUM 33) ; Floating Condition code pseudo register
(UNSPEC_LOOP 200) ; loop counter
] ]
) )
@ -59,7 +60,7 @@
(define_attr "type" "load,store,bit1,mult,macc,div,fpu,single,other" (define_attr "type" "load,store,bit1,mult,macc,div,fpu,single,other"
(const_string "other")) (const_string "other"))
(define_attr "cpu" "none,v850,v850e,v850e1,v850e2,v850e2v3" (define_attr "cpu" "none,v850,v850e,v850e1,v850e2,v850e2v3,v850e3v5"
(cond [(match_test "TARGET_V850") (cond [(match_test "TARGET_V850")
(const_string "v850") (const_string "v850")
(match_test "TARGET_V850E") (match_test "TARGET_V850E")
@ -68,8 +69,10 @@
(const_string "v850e1") (const_string "v850e1")
(match_test "TARGET_V850E2") (match_test "TARGET_V850E2")
(const_string "v850e2") (const_string "v850e2")
(match_test "TARGET_V850E2") (match_test "TARGET_V850E2V3")
(const_string "v850e2v3")] (const_string "v850e2v3")
(match_test "TARGET_V850E3V5")
(const_string "v850e3v5")]
(const_string "none"))) (const_string "none")))
;; Condition code settings. ;; Condition code settings.
@ -109,7 +112,7 @@
(sign_extend:SI (sign_extend:SI
(mem:QI (plus:SI (match_operand:SI 1 "register_operand" "r") (mem:QI (plus:SI (match_operand:SI 1 "register_operand" "r")
(match_operand 2 "disp23_operand" "W")))))] (match_operand 2 "disp23_operand" "W")))))]
"TARGET_V850E2V3" "TARGET_V850E2V3_UP"
"ld.b %2[%1],%0" "ld.b %2[%1],%0"
[(set_attr "length" "4") [(set_attr "length" "4")
(set_attr "cc" "none_0hit")]) (set_attr "cc" "none_0hit")])
@ -119,7 +122,7 @@
(zero_extend:SI (zero_extend:SI
(mem:QI (plus:SI (match_operand:SI 1 "register_operand" "r") (mem:QI (plus:SI (match_operand:SI 1 "register_operand" "r")
(match_operand 2 "disp23_operand" "W")))))] (match_operand 2 "disp23_operand" "W")))))]
"TARGET_V850E2V3" "TARGET_V850E2V3_UP"
"ld.bu %2[%1],%0" "ld.bu %2[%1],%0"
[(set_attr "length" "4") [(set_attr "length" "4")
(set_attr "cc" "none_0hit")]) (set_attr "cc" "none_0hit")])
@ -129,7 +132,7 @@
(sign_extend:SI (sign_extend:SI
(mem:HI (plus:SI (match_operand:SI 1 "register_operand" "r") (mem:HI (plus:SI (match_operand:SI 1 "register_operand" "r")
(match_operand 2 "disp23_operand" "W")))))] (match_operand 2 "disp23_operand" "W")))))]
"TARGET_V850E2V3" "TARGET_V850E2V3_UP"
"ld.h %2[%1],%0" "ld.h %2[%1],%0"
[(set_attr "length" "4") [(set_attr "length" "4")
(set_attr "cc" "none_0hit")]) (set_attr "cc" "none_0hit")])
@ -139,7 +142,7 @@
(zero_extend:SI (zero_extend:SI
(mem:HI (plus:SI (match_operand:SI 1 "register_operand" "r") (mem:HI (plus:SI (match_operand:SI 1 "register_operand" "r")
(match_operand 2 "disp23_operand" "W")))))] (match_operand 2 "disp23_operand" "W")))))]
"TARGET_V850E2V3" "TARGET_V850E2V3_UP"
"ld.hu %2[%1],%0" "ld.hu %2[%1],%0"
[(set_attr "length" "4") [(set_attr "length" "4")
(set_attr "cc" "none_0hit")]) (set_attr "cc" "none_0hit")])
@ -148,7 +151,7 @@
[(set (match_operand:SI 0 "register_operand" "=r") [(set (match_operand:SI 0 "register_operand" "=r")
(mem:SI (plus:SI (match_operand:SI 1 "register_operand" "r") (mem:SI (plus:SI (match_operand:SI 1 "register_operand" "r")
(match_operand 2 "disp23_operand" "W"))))] (match_operand 2 "disp23_operand" "W"))))]
"TARGET_V850E2V3" "TARGET_V850E2V3_UP"
"ld.w %2[%1],%0" "ld.w %2[%1],%0"
[(set_attr "length" "4") [(set_attr "length" "4")
(set_attr "cc" "none_0hit")]) (set_attr "cc" "none_0hit")])
@ -157,7 +160,7 @@
[(set (mem:QI (plus:SI (match_operand:SI 0 "register_operand" "r") [(set (mem:QI (plus:SI (match_operand:SI 0 "register_operand" "r")
(match_operand 1 "disp23_operand" "W"))) (match_operand 1 "disp23_operand" "W")))
(match_operand:QI 2 "register_operand" "r"))] (match_operand:QI 2 "register_operand" "r"))]
"TARGET_V850E2V3" "TARGET_V850E2V3_UP"
"st.b %2,%1[%0]" "st.b %2,%1[%0]"
[(set_attr "length" "4") [(set_attr "length" "4")
(set_attr "cc" "none_0hit")]) (set_attr "cc" "none_0hit")])
@ -166,7 +169,7 @@
[(set (mem:HI (plus:SI (match_operand:SI 0 "register_operand" "r") [(set (mem:HI (plus:SI (match_operand:SI 0 "register_operand" "r")
(match_operand 1 "disp23_operand" "W"))) (match_operand 1 "disp23_operand" "W")))
(match_operand:HI 2 "register_operand" "r"))] (match_operand:HI 2 "register_operand" "r"))]
"TARGET_V850E2V3" "TARGET_V850E2V3_UP"
"st.h %2,%1[%0]" "st.h %2,%1[%0]"
[(set_attr "length" "4") [(set_attr "length" "4")
(set_attr "cc" "none_0hit")]) (set_attr "cc" "none_0hit")])
@ -175,11 +178,47 @@
[(set (mem:SI (plus:SI (match_operand:SI 0 "register_operand" "r") [(set (mem:SI (plus:SI (match_operand:SI 0 "register_operand" "r")
(match_operand 1 "disp23_operand" "W"))) (match_operand 1 "disp23_operand" "W")))
(match_operand:SI 2 "register_operand" "r"))] (match_operand:SI 2 "register_operand" "r"))]
"TARGET_V850E2V3" "TARGET_V850E2V3_UP"
"st.w %2,%1[%0]" "st.w %2,%1[%0]"
[(set_attr "length" "4") [(set_attr "length" "4")
(set_attr "cc" "none_0hit")]) (set_attr "cc" "none_0hit")])
;; movdi
(define_expand "movdi"
[(set (match_operand:DI 0 "general_operand")
(match_operand:DI 1 "general_operand"))]
"TARGET_V850E3V5_UP"
{
/* One of the ops has to be in a register or 0. */
if (!register_operand (operand0, DImode)
&& !register_operand (operand1, DImode))
operands[1] = copy_to_mode_reg (DImode, operand1);
if (register_operand (operand0, DImode)
&& (CONST_INT_P (operands[1]) || CONST_DOUBLE_P (operands[1])))
{
int i;
for (i = 0; i < UNITS_PER_WORD * 2; i += UNITS_PER_WORD)
emit_move_insn (simplify_gen_subreg (SImode, operands[0], DImode, i),
simplify_gen_subreg (SImode, operands[1], DImode, i));
DONE;
}
}
)
(define_insn "*movdi_internal"
[(set (match_operand:DI 0 "nonimmediate_operand" "=r,e!r,m")
(match_operand:DI 1 "nonimmediate_operand" "r,m,e!r"))]
"TARGET_V850E3V5_UP
|| (register_operand (operands[0], DImode) && register_operand (operands[1], DImode))"
{ return v850_gen_movdi (operands); }
[(set_attr "length" "4,12,12")
(set_attr "cc" "none_0hit")
(set_attr "type" "other,load,store")]
)
;; movqi ;; movqi
(define_expand "movqi" (define_expand "movqi"
@ -265,7 +304,7 @@
must be done with HIGH & LO_SUM patterns. */ must be done with HIGH & LO_SUM patterns. */
if (CONSTANT_P (operands[1]) if (CONSTANT_P (operands[1])
&& GET_CODE (operands[1]) != HIGH && GET_CODE (operands[1]) != HIGH
&& ! (TARGET_V850E || TARGET_V850E2_ALL) && ! (TARGET_V850E_UP)
&& !special_symbolref_operand (operands[1], VOIDmode) && !special_symbolref_operand (operands[1], VOIDmode)
&& !(GET_CODE (operands[1]) == CONST_INT && !(GET_CODE (operands[1]) == CONST_INT
&& (CONST_OK_FOR_J (INTVAL (operands[1])) && (CONST_OK_FOR_J (INTVAL (operands[1]))
@ -297,7 +336,7 @@
(define_insn "*movsi_internal_v850e" (define_insn "*movsi_internal_v850e"
[(set (match_operand:SI 0 "general_operand" "=r,r,r,r,Q,r,r,m,m,r") [(set (match_operand:SI 0 "general_operand" "=r,r,r,r,Q,r,r,m,m,r")
(match_operand:SI 1 "general_operand" "Jr,K,L,Q,Ir,m,R,r,I,i"))] (match_operand:SI 1 "general_operand" "Jr,K,L,Q,Ir,m,R,r,I,i"))]
"(TARGET_V850E || TARGET_V850E2_ALL) "(TARGET_V850E_UP)
&& (register_operand (operands[0], SImode) && (register_operand (operands[0], SImode)
|| reg_or_0_operand (operands[1], SImode))" || reg_or_0_operand (operands[1], SImode))"
{ {
@ -412,17 +451,17 @@
(label_ref (match_operand 3 "")) (label_ref (match_operand 3 ""))
(pc))) (pc)))
(clobber (cc0))] (clobber (cc0))]
"TARGET_V850E2V3" "TARGET_USE_FPU"
{ {
v850_compare_op0 = operands[1];
v850_compare_op1 = operands[2];
enum rtx_code cond = GET_CODE (operands[0]); enum rtx_code cond = GET_CODE (operands[0]);
enum machine_mode mode; enum machine_mode mode;
rtx fcc_reg; rtx fcc_reg;
rtx cc_reg; rtx cc_reg;
rtx tmp; rtx tmp;
v850_compare_op0 = operands[1];
v850_compare_op1 = operands[2];
if (GET_MODE_CLASS (GET_MODE (v850_compare_op0)) != MODE_FLOAT) if (GET_MODE_CLASS (GET_MODE (v850_compare_op0)) != MODE_FLOAT)
FAIL; FAIL;
@ -442,7 +481,7 @@
(match_operator:SI 1 "ordered_comparison_operator" (match_operator:SI 1 "ordered_comparison_operator"
[(match_operand:SF 2 "register_operand" "r") [(match_operand:SF 2 "register_operand" "r")
(match_operand:SF 3 "register_operand" "r")]))] (match_operand:SF 3 "register_operand" "r")]))]
"TARGET_V850E2V3" "TARGET_USE_FPU"
{ {
if (GET_CODE (operands[1]) == GT || GET_CODE (operands[1]) == GE) if (GET_CODE (operands[1]) == GT || GET_CODE (operands[1]) == GE)
return "cmpf.s %c1, %z2, %z3 ; trfsr ; setf nz, %0"; return "cmpf.s %c1, %z2, %z3 ; trfsr ; setf nz, %0";
@ -466,17 +505,17 @@
(label_ref (match_operand 3 "")) (label_ref (match_operand 3 ""))
(pc))) (pc)))
(clobber (cc0))] (clobber (cc0))]
"TARGET_V850E2V3" "TARGET_USE_FPU"
{ {
v850_compare_op0 = operands[1];
v850_compare_op1 = operands[2];
enum rtx_code cond = GET_CODE (operands[0]); enum rtx_code cond = GET_CODE (operands[0]);
enum machine_mode mode; enum machine_mode mode;
rtx fcc_reg; rtx fcc_reg;
rtx cc_reg; rtx cc_reg;
rtx tmp; rtx tmp;
v850_compare_op0 = operands[1];
v850_compare_op1 = operands[2];
if (GET_MODE_CLASS (GET_MODE (v850_compare_op0)) != MODE_FLOAT) if (GET_MODE_CLASS (GET_MODE (v850_compare_op0)) != MODE_FLOAT)
FAIL; FAIL;
@ -496,7 +535,7 @@
(match_operator:SI 1 "ordered_comparison_operator" (match_operator:SI 1 "ordered_comparison_operator"
[(match_operand:DF 2 "even_reg_operand" "r") [(match_operand:DF 2 "even_reg_operand" "r")
(match_operand:DF 3 "even_reg_operand" "r")]))] (match_operand:DF 3 "even_reg_operand" "r")]))]
"TARGET_V850E2V3" "TARGET_USE_FPU"
{ {
if (GET_CODE (operands[1]) == GT || GET_CODE (operands[1]) == GE) if (GET_CODE (operands[1]) == GT || GET_CODE (operands[1]) == GE)
return "cmpf.d %c1, %z2, %z3 ; trfsr ; setf nz, %0"; return "cmpf.d %c1, %z2, %z3 ; trfsr ; setf nz, %0";
@ -633,7 +672,7 @@
[(set (match_operand:SI 0 "register_operand" "=r") [(set (match_operand:SI 0 "register_operand" "=r")
(mult:SI (match_operand:SI 1 "register_operand" "%0") (mult:SI (match_operand:SI 1 "register_operand" "%0")
(match_operand:SI 2 "reg_or_int9_operand" "rO")))] (match_operand:SI 2 "reg_or_int9_operand" "rO")))]
"(TARGET_V850E || TARGET_V850E2_ALL)" "(TARGET_V850E_UP)"
"mul %2,%1,%." "mul %2,%1,%."
[(set_attr "length" "4") [(set_attr "length" "4")
(set_attr "cc" "none_0hit") (set_attr "cc" "none_0hit")
@ -657,9 +696,9 @@
(mod:SI (match_dup 1) (mod:SI (match_dup 1)
(match_dup 2))) (match_dup 2)))
(clobber (reg:CC CC_REGNUM))] (clobber (reg:CC CC_REGNUM))]
"TARGET_V850E || TARGET_V850E2_ALL" "TARGET_V850E_UP"
{ {
if (TARGET_V850E2_ALL) if (TARGET_V850E2_UP)
return "divq %2,%0,%3"; return "divq %2,%0,%3";
else else
return "div %2,%0,%3"; return "div %2,%0,%3";
@ -676,9 +715,9 @@
(umod:SI (match_dup 1) (umod:SI (match_dup 1)
(match_dup 2))) (match_dup 2)))
(clobber (reg:CC CC_REGNUM))] (clobber (reg:CC CC_REGNUM))]
"TARGET_V850E || TARGET_V850E2_ALL" "TARGET_V850E_UP"
{ {
if (TARGET_V850E2_ALL) if (TARGET_V850E2_UP)
return "divqu %2,%0,%3"; return "divqu %2,%0,%3";
else else
return "divu %2,%0,%3"; return "divu %2,%0,%3";
@ -698,7 +737,7 @@
(mod:HI (match_dup 1) (mod:HI (match_dup 1)
(match_dup 2))) (match_dup 2)))
(clobber (reg:CC CC_REGNUM))] (clobber (reg:CC CC_REGNUM))]
"TARGET_V850E || TARGET_V850E2_ALL" "TARGET_V850E_UP"
"divh %2,%0,%3" "divh %2,%0,%3"
[(set_attr "length" "4") [(set_attr "length" "4")
(set_attr "cc" "clobber") (set_attr "cc" "clobber")
@ -715,7 +754,7 @@
(umod:HI (match_dup 1) (umod:HI (match_dup 1)
(match_dup 2))) (match_dup 2)))
(clobber (reg:CC CC_REGNUM))] (clobber (reg:CC CC_REGNUM))]
"TARGET_V850E || TARGET_V850E2_ALL" "TARGET_V850E_UP"
"zxh %0 ; divhu %2,%0,%3" "zxh %0 ; divhu %2,%0,%3"
[(set_attr "length" "4") [(set_attr "length" "4")
(set_attr "cc" "clobber") (set_attr "cc" "clobber")
@ -984,6 +1023,17 @@
;; optimize_bitfield_compare in fold-const usually converts single ;; optimize_bitfield_compare in fold-const usually converts single
;; bit extracts into an AND with a mask. ;; bit extracts into an AND with a mask.
(define_insn "insv"
[(set (zero_extract:SI (match_operand:SI 0 "register_operand" "+r")
(match_operand:SI 1 "immediate_operand" "n")
(match_operand:SI 2 "immediate_operand" "n"))
(match_operand:SI 3 "register_operand" "r"))]
"TARGET_V850E3V5_UP"
"bins %3, %2, %1, %0"
[(set_attr "length" "4")
(set_attr "cc" "set_zn")]
)
;; ----------------------------------------------------------------- ;; -----------------------------------------------------------------
;; Scc INSTRUCTIONS ;; Scc INSTRUCTIONS
;; ----------------------------------------------------------------- ;; -----------------------------------------------------------------
@ -1018,7 +1068,7 @@
(define_insn "set_z_insn" (define_insn "set_z_insn"
[(set (match_operand:SI 0 "register_operand" "=r") [(set (match_operand:SI 0 "register_operand" "=r")
(match_operand 1 "v850_float_z_comparison_operator" ""))] (match_operand 1 "v850_float_z_comparison_operator" ""))]
"TARGET_V850E2V3" "TARGET_V850E2V3_UP"
"setf z,%0" "setf z,%0"
[(set_attr "length" "4") [(set_attr "length" "4")
(set_attr "cc" "none_0hit")]) (set_attr "cc" "none_0hit")])
@ -1026,7 +1076,7 @@
(define_insn "set_nz_insn" (define_insn "set_nz_insn"
[(set (match_operand:SI 0 "register_operand" "=r") [(set (match_operand:SI 0 "register_operand" "=r")
(match_operand 1 "v850_float_nz_comparison_operator" ""))] (match_operand 1 "v850_float_nz_comparison_operator" ""))]
"TARGET_V850E2V3" "TARGET_V850E2V3_UP"
"setf nz,%0" "setf nz,%0"
[(set_attr "length" "4") [(set_attr "length" "4")
(set_attr "cc" "none_0hit")]) (set_attr "cc" "none_0hit")])
@ -1045,7 +1095,7 @@
(match_operand 1 "comparison_operator") (match_operand 1 "comparison_operator")
(match_operand:SI 2 "reg_or_const_operand" "rJ") (match_operand:SI 2 "reg_or_const_operand" "rJ")
(match_operand:SI 3 "reg_or_const_operand" "rI")))] (match_operand:SI 3 "reg_or_const_operand" "rI")))]
"(TARGET_V850E || TARGET_V850E2_ALL)" "(TARGET_V850E_UP)"
{ {
/* Make sure that we have an integer comparison... */ /* Make sure that we have an integer comparison... */
if (GET_MODE (XEXP (operands[1], 0)) != CCmode if (GET_MODE (XEXP (operands[1], 0)) != CCmode
@ -1093,7 +1143,7 @@
[(reg:CC CC_REGNUM) (const_int 0)]) [(reg:CC CC_REGNUM) (const_int 0)])
(match_operand:SI 2 "reg_or_int5_operand" "rJ") (match_operand:SI 2 "reg_or_int5_operand" "rJ")
(match_operand:SI 3 "reg_or_0_operand" "rI")))] (match_operand:SI 3 "reg_or_0_operand" "rI")))]
"(TARGET_V850E || TARGET_V850E2_ALL)" "(TARGET_V850E_UP)"
"cmov %c1,%2,%z3,%0"; "cmov %c1,%2,%z3,%0";
[(set_attr "length" "6") [(set_attr "length" "6")
(set_attr "cc" "compare")]) (set_attr "cc" "compare")])
@ -1105,7 +1155,7 @@
[(reg:CC CC_REGNUM) (const_int 0)]) [(reg:CC CC_REGNUM) (const_int 0)])
(match_operand:SI 2 "reg_or_0_operand" "rI") (match_operand:SI 2 "reg_or_0_operand" "rI")
(match_operand:SI 3 "reg_or_int5_operand" "rJ")))] (match_operand:SI 3 "reg_or_int5_operand" "rJ")))]
"(TARGET_V850E || TARGET_V850E2_ALL)" "(TARGET_V850E_UP)"
"cmov %C1,%3,%z2,%0" "cmov %C1,%3,%z2,%0"
[(set_attr "length" "6") [(set_attr "length" "6")
(set_attr "cc" "compare")]) (set_attr "cc" "compare")])
@ -1118,7 +1168,7 @@
(match_operand:SI 5 "reg_or_int5_operand" "rJ")]) (match_operand:SI 5 "reg_or_int5_operand" "rJ")])
(match_operand:SI 2 "reg_or_int5_operand" "rJ") (match_operand:SI 2 "reg_or_int5_operand" "rJ")
(match_operand:SI 3 "reg_or_0_operand" "rI")))] (match_operand:SI 3 "reg_or_0_operand" "rI")))]
"(TARGET_V850E || TARGET_V850E2_ALL)" "(TARGET_V850E_UP)"
"cmp %5,%4 ; cmov %c1,%2,%z3,%0" "cmp %5,%4 ; cmov %c1,%2,%z3,%0"
[(set_attr "length" "6") [(set_attr "length" "6")
(set_attr "cc" "clobber")]) (set_attr "cc" "clobber")])
@ -1131,7 +1181,7 @@
(match_operand:SI 5 "reg_or_int5_operand" "rJ")]) (match_operand:SI 5 "reg_or_int5_operand" "rJ")])
(match_operand:SI 2 "reg_or_0_operand" "rI") (match_operand:SI 2 "reg_or_0_operand" "rI")
(match_operand:SI 3 "reg_or_int5_operand" "rJ")))] (match_operand:SI 3 "reg_or_int5_operand" "rJ")))]
"(TARGET_V850E || TARGET_V850E2_ALL)" "(TARGET_V850E_UP)"
"cmp %5,%4 ; cmov %C1,%3,%z2,%0" "cmp %5,%4 ; cmov %C1,%3,%z2,%0"
[(set_attr "length" "6") [(set_attr "length" "6")
(set_attr "cc" "clobber")]) (set_attr "cc" "clobber")])
@ -1147,7 +1197,7 @@
(const_int 0)]) (const_int 0)])
(match_operand:SI 4 "reg_or_int5_operand" "rJ") (match_operand:SI 4 "reg_or_int5_operand" "rJ")
(match_operand:SI 5 "reg_or_0_operand" "rI")))] (match_operand:SI 5 "reg_or_0_operand" "rI")))]
"(TARGET_V850E || TARGET_V850E2_ALL)" "(TARGET_V850E_UP)"
"tst1 %3,%2 ; cmov %c1,%4,%z5,%0" "tst1 %3,%2 ; cmov %c1,%4,%z5,%0"
[(set_attr "length" "8") [(set_attr "length" "8")
(set_attr "cc" "clobber")]) (set_attr "cc" "clobber")])
@ -1163,7 +1213,7 @@
(const_int 0)]) (const_int 0)])
(match_operand:SI 4 "reg_or_0_operand" "rI") (match_operand:SI 4 "reg_or_0_operand" "rI")
(match_operand:SI 5 "reg_or_int5_operand" "rJ")))] (match_operand:SI 5 "reg_or_int5_operand" "rJ")))]
"(TARGET_V850E || TARGET_V850E2_ALL)" "(TARGET_V850E_UP)"
"tst1 %3,%2 ; cmov %C1,%5,%z4,%0" "tst1 %3,%2 ; cmov %C1,%5,%z4,%0"
[(set_attr "length" "8") [(set_attr "length" "8")
(set_attr "cc" "clobber")]) (set_attr "cc" "clobber")])
@ -1182,7 +1232,7 @@
(ashift:SI (match_operand:SI 2 "register_operand" "0") (ashift:SI (match_operand:SI 2 "register_operand" "0")
(const_int 1)))) (const_int 1))))
(clobber (reg:CC CC_REGNUM))] (clobber (reg:CC CC_REGNUM))]
"(TARGET_V850E || TARGET_V850E2_ALL)" "(TARGET_V850E_UP)"
"cmp %4,%3 ; sasf %c1,%0" "cmp %4,%3 ; sasf %c1,%0"
[(set_attr "length" "6") [(set_attr "length" "6")
(set_attr "cc" "clobber")]) (set_attr "cc" "clobber")])
@ -1196,7 +1246,7 @@
(match_operand:SI 2 "const_int_operand" "") (match_operand:SI 2 "const_int_operand" "")
(match_operand:SI 3 "const_int_operand" ""))) (match_operand:SI 3 "const_int_operand" "")))
(clobber (reg:CC CC_REGNUM))] (clobber (reg:CC CC_REGNUM))]
"(TARGET_V850E || TARGET_V850E2_ALL) "(TARGET_V850E_UP)
&& ((INTVAL (operands[2]) ^ INTVAL (operands[3])) == 1) && ((INTVAL (operands[2]) ^ INTVAL (operands[3])) == 1)
&& ((INTVAL (operands[2]) + INTVAL (operands[3])) != 1) && ((INTVAL (operands[2]) + INTVAL (operands[3])) != 1)
&& (GET_CODE (operands[5]) == CONST_INT && (GET_CODE (operands[5]) == CONST_INT
@ -1225,7 +1275,7 @@
(rotate:HI (match_operand:HI 1 "register_operand" "") (rotate:HI (match_operand:HI 1 "register_operand" "")
(match_operand:HI 2 "const_int_operand" ""))) (match_operand:HI 2 "const_int_operand" "")))
(clobber (reg:CC CC_REGNUM))])] (clobber (reg:CC CC_REGNUM))])]
"(TARGET_V850E || TARGET_V850E2_ALL)" "(TARGET_V850E_UP)"
{ {
if (INTVAL (operands[2]) != 8) if (INTVAL (operands[2]) != 8)
FAIL; FAIL;
@ -1236,7 +1286,7 @@
(rotate:HI (match_operand:HI 1 "register_operand" "r") (rotate:HI (match_operand:HI 1 "register_operand" "r")
(const_int 8))) (const_int 8)))
(clobber (reg:CC CC_REGNUM))] (clobber (reg:CC CC_REGNUM))]
"(TARGET_V850E || TARGET_V850E2_ALL)" "(TARGET_V850E_UP)"
"bsh %1,%0" "bsh %1,%0"
[(set_attr "length" "4") [(set_attr "length" "4")
(set_attr "cc" "clobber")]) (set_attr "cc" "clobber")])
@ -1246,18 +1296,55 @@
(rotate:SI (match_operand:SI 1 "register_operand" "") (rotate:SI (match_operand:SI 1 "register_operand" "")
(match_operand:SI 2 "const_int_operand" ""))) (match_operand:SI 2 "const_int_operand" "")))
(clobber (reg:CC CC_REGNUM))])] (clobber (reg:CC CC_REGNUM))])]
"(TARGET_V850E || TARGET_V850E2_ALL)" "(TARGET_V850E_UP)"
{ {
if (INTVAL (operands[2]) != 16) if (INTVAL (operands[2]) != 16)
FAIL; FAIL;
}) })
(define_insn "rotlsi3_a"
[(set (match_operand:SI 0 "register_operand" "=r")
(match_operator:SI 4 "ior_operator"
[(ashift:SI (match_operand:SI 1 "register_operand" "r")
(match_operand:SI 2 "const_int_operand" "n"))
(lshiftrt:SI (match_dup 1)
(match_operand:SI 3 "const_int_operand" "n"))]))]
"TARGET_V850E3V5_UP && (INTVAL (operands[2]) + INTVAL (operands[3]) == 32)"
"rotl %2, %1, %0"
[(set_attr "length" "4")
(set_attr "cc" "set_zn")]
)
(define_insn "rotlsi3_b"
[(set (match_operand:SI 0 "register_operand" "=r")
(match_operator:SI 4 "ior_operator"
[(lshiftrt:SI (match_operand:SI 1 "register_operand" "r")
(match_operand:SI 3 "const_int_operand" "n"))
(ashift:SI (match_dup 1)
(match_operand:SI 2 "const_int_operand" "n"))]))]
"TARGET_V850E3V5_UP && (INTVAL (operands[2]) + INTVAL (operands[3]) == 32)"
"rotl %2, %1, %0"
[(set_attr "length" "4")
(set_attr "cc" "set_zn")]
)
(define_insn "rotlsi3_v850e3v5"
[(set (match_operand:SI 0 "register_operand" "=r")
(rotate:SI (match_operand:SI 1 "register_operand" "r")
(match_operand:SI 2 "e3v5_shift_operand" "rn")))
(clobber (reg:CC CC_REGNUM))]
"TARGET_V850E3V5_UP"
"rotl %2, %1, %0"
[(set_attr "length" "4")
(set_attr "cc" "set_zn")]
)
(define_insn "*rotlsi3_16" (define_insn "*rotlsi3_16"
[(set (match_operand:SI 0 "register_operand" "=r") [(set (match_operand:SI 0 "register_operand" "=r")
(rotate:SI (match_operand:SI 1 "register_operand" "r") (rotate:SI (match_operand:SI 1 "register_operand" "r")
(const_int 16))) (const_int 16)))
(clobber (reg:CC CC_REGNUM))] (clobber (reg:CC CC_REGNUM))]
"(TARGET_V850E || TARGET_V850E2_ALL)" "(TARGET_V850E_UP)"
"hsw %1,%0" "hsw %1,%0"
[(set_attr "length" "4") [(set_attr "length" "4")
(set_attr "cc" "clobber")]) (set_attr "cc" "clobber")])
@ -1266,6 +1353,99 @@
;; JUMP INSTRUCTIONS ;; JUMP INSTRUCTIONS
;; ---------------------------------------------------------------------- ;; ----------------------------------------------------------------------
;; Doloop
(define_expand "doloop_begin"
[(use (match_operand 0 "" "")) ; loop pseudo
(use (match_operand 1 "" "")) ; iterations; zero if unknown
(use (match_operand 2 "" "")) ; max iterations
(use (match_operand 3 "" "")) ; loop level
(use (match_operand 4 "" ""))] ; condition
"TARGET_V850E3V5_UP && TARGET_LOOP"
{
rtx loop_cnt = operands[0];
rtx loop_level = operands[3];
if (INTVAL (loop_level) > 1)
FAIL;
if (GET_MODE (loop_cnt) != SImode)
FAIL;
emit_insn (gen_fix_loop_counter (loop_cnt));
DONE;
}
)
(define_insn "fix_loop_counter"
[(unspec:SI [(match_operand:SI 0 "register_operand" "+r,!m")
(clobber (match_scratch:SI 1 "=X,r"))] UNSPEC_LOOP)]
"TARGET_V850E3V5_UP && TARGET_LOOP"
{
switch (which_alternative)
{
case 0: return "add 1, %0 # LOOP_BEGIN";
case 1: return "ld.w %0, %1; add 1, %1; st.w %1, %0 # LOOP_BEGIN";
default: gcc_unreachable ();
}
}
[(set_attr "length" "2,6")
(set_attr "cc" "none")]
)
(define_expand "doloop_end"
[(use (match_operand 0 "" "")) ; loop pseudo
(use (match_operand 1 "" "")) ; iterations; zero if unknown
(use (match_operand 2 "" "")) ; max iterations
(use (match_operand 3 "" "")) ; loop level
(use (match_operand 4 "" "")) ; label
(use (match_operand 5 "" ""))] ; entered at top
"TARGET_V850E3V5_UP && TARGET_LOOP"
{
rtx loop_cnt = operands[0];
rtx loop_level = operands[3];
rtx label = operands[4];
if (INTVAL (loop_level) > 1)
FAIL;
if (GET_MODE (loop_cnt) != SImode)
FAIL;
emit_jump_insn (gen_doloop_end_internal_loop (label, loop_cnt));
DONE;
}
)
(define_insn "doloop_end_internal_loop"
[(set (pc)
(if_then_else (ne (match_operand:SI 1 "register_operand" "+r,!m")
(const_int 0))
(label_ref (match_operand 0 "" ""))
(pc)))
(set (match_dup 1) (plus:SI (match_dup 1) (const_int -1)))
(clobber (match_scratch:SI 2 "=X,r"))
(clobber (reg:CC CC_REGNUM))]
"TARGET_V850E3V5_UP && TARGET_LOOP"
{
switch (which_alternative)
{
case 0:
if (get_attr_length (insn) == 4)
return "loop %1, %0 # LOOP.1.0";
return "add -1, %1; bne %l0 # LOOP.1.1";
case 1:
return "ld.w %1, %2; add -1, %2; st.w %2, %1; bne %l0 # LOOP.2.1";
default:
gcc_unreachable ();
}
}
[(set (attr "length")
(if_then_else (lt (abs (minus (match_dup 0) (pc)))
(const_int 65534))
(const_int 4)
(const_int 14)))
(set_attr "cc" "none")])
;; Conditional jump instructions ;; Conditional jump instructions
(define_insn "*branch_normal" (define_insn "*branch_normal"
@ -1285,14 +1465,18 @@
if (get_attr_length (insn) == 2) if (get_attr_length (insn) == 2)
return "b%b1 %l0"; return "b%b1 %l0";
else if (TARGET_V850E3V5_UP && get_attr_length (insn) == 4)
return "b%b1 %l0";
return "b%B1 .+6 ; jr %l0"; return "b%B1 .+6 ; jr %l0";
} }
[(set (attr "length") [(set (attr "length")
(if_then_else (lt (abs (minus (match_dup 0) (pc))) (if_then_else (lt (abs (minus (match_dup 0) (pc)))
(const_int 256)) (const_int 256))
(const_int 2) (const_int 2)
(const_int 6))) (if_then_else (lt (abs (minus (match_dup 0) (pc)))
(const_int 65536))
(const_int 4)
(const_int 6))))
(set_attr "cc" "none")]) (set_attr "cc" "none")])
(define_insn "*branch_invert" (define_insn "*branch_invert"
@ -1308,17 +1492,24 @@
|| GET_CODE (operands[1]) == GE || GET_CODE (operands[1]) == GE
|| GET_CODE (operands[1]) == LE || GET_CODE (operands[1]) == LE
|| GET_CODE (operands[1]) == LT)) || GET_CODE (operands[1]) == LT))
return 0; return NULL;
if (get_attr_length (insn) == 2) if (get_attr_length (insn) == 2)
return "b%B1 %l0"; return "b%B1 %l0";
else
if (TARGET_V850E3V5_UP && get_attr_length (insn) == 4)
return "b%B1 %l0";
return "b%b1 .+6 ; jr %l0"; return "b%b1 .+6 ; jr %l0";
} }
[(set (attr "length") [(set (attr "length")
(if_then_else (lt (abs (minus (match_dup 0) (pc))) (if_then_else (lt (abs (minus (match_dup 0) (pc)))
(const_int 256)) (const_int 256))
(const_int 2) (const_int 2)
(const_int 6))) (if_then_else (lt (abs (minus (match_dup 0) (pc)))
(const_int 65536))
(const_int 4)
(const_int 6))))
(set_attr "cc" "none")]) (set_attr "cc" "none")])
(define_insn "branch_z_normal" (define_insn "branch_z_normal"
@ -1326,18 +1517,24 @@
(if_then_else (match_operand 1 "v850_float_z_comparison_operator" "") (if_then_else (match_operand 1 "v850_float_z_comparison_operator" "")
(label_ref (match_operand 0 "" "")) (label_ref (match_operand 0 "" ""))
(pc)))] (pc)))]
"TARGET_V850E2V3" "TARGET_V850E2V3_UP"
{ {
if (get_attr_length (insn) == 2) if (get_attr_length (insn) == 2)
return "bz %l0"; return "bz %l0";
else
if (TARGET_V850E3V5_UP && get_attr_length (insn) == 4)
return "bz %l0";
return "bnz 1f ; jr %l0 ; 1:"; return "bnz 1f ; jr %l0 ; 1:";
} }
[(set (attr "length") [(set (attr "length")
(if_then_else (lt (abs (minus (match_dup 0) (pc))) (if_then_else (lt (abs (minus (match_dup 0) (pc)))
(const_int 256)) (const_int 256))
(const_int 2) (const_int 2)
(const_int 6))) (if_then_else (lt (abs (minus (match_dup 0) (pc)))
(const_int 65536))
(const_int 4)
(const_int 6))))
(set_attr "cc" "none")]) (set_attr "cc" "none")])
(define_insn "*branch_z_invert" (define_insn "*branch_z_invert"
@ -1345,18 +1542,24 @@
(if_then_else (match_operand 1 "v850_float_z_comparison_operator" "") (if_then_else (match_operand 1 "v850_float_z_comparison_operator" "")
(pc) (pc)
(label_ref (match_operand 0 "" ""))))] (label_ref (match_operand 0 "" ""))))]
"TARGET_V850E2V3" "TARGET_V850E2V3_UP"
{ {
if (get_attr_length (insn) == 2) if (get_attr_length (insn) == 2)
return "bnz %l0"; return "bnz %l0";
else
if (TARGET_V850E3V5_UP && get_attr_length (insn) == 4)
return "bnz %l0";
return "bz 1f ; jr %l0 ; 1:"; return "bz 1f ; jr %l0 ; 1:";
} }
[(set (attr "length") [(set (attr "length")
(if_then_else (lt (abs (minus (match_dup 0) (pc))) (if_then_else (lt (abs (minus (match_dup 0) (pc)))
(const_int 256)) (const_int 256))
(const_int 2) (const_int 2)
(const_int 6))) (if_then_else (lt (abs (minus (match_dup 0) (pc)))
(const_int 65536))
(const_int 4)
(const_int 6))))
(set_attr "cc" "none")]) (set_attr "cc" "none")])
(define_insn "branch_nz_normal" (define_insn "branch_nz_normal"
@ -1364,18 +1567,24 @@
(if_then_else (match_operand 1 "v850_float_nz_comparison_operator" "") (if_then_else (match_operand 1 "v850_float_nz_comparison_operator" "")
(label_ref (match_operand 0 "" "")) (label_ref (match_operand 0 "" ""))
(pc)))] (pc)))]
"TARGET_V850E2V3" "TARGET_V850E2V3_UP"
{ {
if (get_attr_length (insn) == 2) if (get_attr_length (insn) == 2)
return "bnz %l0"; return "bnz %l0";
else
if (TARGET_V850E3V5_UP && get_attr_length (insn) == 4)
return "bnz %l0";
return "bz 1f ; jr %l0 ; 1:"; return "bz 1f ; jr %l0 ; 1:";
} }
[(set (attr "length") [(set (attr "length")
(if_then_else (lt (abs (minus (match_dup 0) (pc))) (if_then_else (lt (abs (minus (match_dup 0) (pc)))
(const_int 256)) (const_int 256))
(const_int 2) (const_int 2)
(const_int 6))) (if_then_else (lt (abs (minus (match_dup 0) (pc)))
(const_int 65536))
(const_int 4)
(const_int 6))))
(set_attr "cc" "none")]) (set_attr "cc" "none")])
(define_insn "*branch_nz_invert" (define_insn "*branch_nz_invert"
@ -1383,18 +1592,24 @@
(if_then_else (match_operand 1 "v850_float_nz_comparison_operator" "") (if_then_else (match_operand 1 "v850_float_nz_comparison_operator" "")
(pc) (pc)
(label_ref (match_operand 0 "" ""))))] (label_ref (match_operand 0 "" ""))))]
"TARGET_V850E2V3" "TARGET_V850E2V3_UP"
{ {
if (get_attr_length (insn) == 2) if (get_attr_length (insn) == 2)
return "bz %l0"; return "bz %l0";
else
if (TARGET_V850E3V5_UP && get_attr_length (insn) == 4)
return "bz %l0";
return "bnz 1f ; jr %l0 ; 1:"; return "bnz 1f ; jr %l0 ; 1:";
} }
[(set (attr "length") [(set (attr "length")
(if_then_else (lt (abs (minus (match_dup 0) (pc))) (if_then_else (lt (abs (minus (match_dup 0) (pc)))
(const_int 256)) (const_int 256))
(const_int 2) (const_int 2)
(const_int 6))) (if_then_else (lt (abs (minus (match_dup 0) (pc)))
(const_int 65536))
(const_int 4)
(const_int 6))))
(set_attr "cc" "none")]) (set_attr "cc" "none")])
;; Unconditional and other jump instructions. ;; Unconditional and other jump instructions.
@ -1440,7 +1655,7 @@
(const_int 1)) (const_int 1))
(label_ref (match_operand 1 "" ""))))) (label_ref (match_operand 1 "" "")))))
(label_ref (match_dup 1))))] (label_ref (match_dup 1))))]
"(TARGET_V850E || TARGET_V850E2_ALL)" "(TARGET_V850E_UP)"
"switch %0" "switch %0"
[(set_attr "length" "2") [(set_attr "length" "2")
(set_attr "cc" "none")]) (set_attr "cc" "none")])
@ -1512,9 +1727,17 @@
(match_operand:SI 1 "general_operand" "g,g")) (match_operand:SI 1 "general_operand" "g,g"))
(clobber (reg:SI 31))] (clobber (reg:SI 31))]
"! TARGET_LONG_CALLS" "! TARGET_LONG_CALLS"
"@ {
jarl %0,r31 if (which_alternative == 1)
jarl .+4,r31 ; add 4,r31 ; jmp %0" {
if (TARGET_V850E3V5_UP)
return "jarl [%0], r31";
return "jarl .+4, r31 ; add 4, r31 ; jmp %0";
}
return "jarl %0, r31";
}
[(set_attr "length" "4,8") [(set_attr "length" "4,8")
(set_attr "cc" "clobber,clobber")] (set_attr "cc" "clobber,clobber")]
) )
@ -1529,10 +1752,16 @@
{ {
if (GET_CODE (operands[0]) == REG) if (GET_CODE (operands[0]) == REG)
return "jarl %0,r31"; return "jarl %0,r31";
else
if (TARGET_V850E3V5_UP)
return "mov hilo(%0), r11 ; jarl [r11], r31";
return "movhi hi(%0), r0, r11 ; movea lo(%0), r11, r11 ; jarl .+4,r31 ; add 4, r31 ; jmp r11"; return "movhi hi(%0), r0, r11 ; movea lo(%0), r11, r11 ; jarl .+4,r31 ; add 4, r31 ; jmp r11";
} }
else
if (TARGET_V850E3V5_UP)
return "jarl [%0], r31";
return "jarl .+4,r31 ; add 4,r31 ; jmp %0"; return "jarl .+4,r31 ; add 4,r31 ; jmp %0";
} }
[(set_attr "length" "16,8") [(set_attr "length" "16,8")
@ -1568,9 +1797,17 @@
(match_operand:SI 2 "general_operand" "g,g"))) (match_operand:SI 2 "general_operand" "g,g")))
(clobber (reg:SI 31))] (clobber (reg:SI 31))]
"! TARGET_LONG_CALLS" "! TARGET_LONG_CALLS"
"@ {
jarl %1,r31 if (which_alternative == 1)
jarl .+4,r31 ; add 4,r31 ; jmp %1" {
if (TARGET_V850E3V5_UP)
return "jarl [%1], r31";
return "jarl .+4, r31 ; add 4, r31 ; jmp %1";
}
return "jarl %1, r31";
}
[(set_attr "length" "4,8") [(set_attr "length" "4,8")
(set_attr "cc" "clobber,clobber")] (set_attr "cc" "clobber,clobber")]
) )
@ -1586,11 +1823,17 @@
{ {
if (GET_CODE (operands[1]) == REG) if (GET_CODE (operands[1]) == REG)
return "jarl %1, r31"; return "jarl %1, r31";
else
/* Reload can generate this pattern.... */ /* Reload can generate this pattern.... */
if (TARGET_V850E3V5_UP)
return "mov hilo(%1), r11 ; jarl [r11], r31";
return "movhi hi(%1), r0, r11 ; movea lo(%1), r11, r11 ; jarl .+4, r31 ; add 4, r31 ; jmp r11"; return "movhi hi(%1), r0, r11 ; movea lo(%1), r11, r11 ; jarl .+4, r31 ; add 4, r31 ; jmp r11";
} }
else
if (TARGET_V850E3V5_UP)
return "jarl [%1], r31";
return "jarl .+4, r31 ; add 4, r31 ; jmp %1"; return "jarl .+4, r31 ; add 4, r31 ; jmp %1";
} }
[(set_attr "length" "16,8") [(set_attr "length" "16,8")
@ -1613,7 +1856,7 @@
(zero_extend:SI (zero_extend:SI
(match_operand:HI 1 "nonimmediate_operand" "0,r,T,m"))) (match_operand:HI 1 "nonimmediate_operand" "0,r,T,m")))
(clobber (reg:CC CC_REGNUM))] (clobber (reg:CC CC_REGNUM))]
"(TARGET_V850E || TARGET_V850E2_ALL)" "(TARGET_V850E_UP)"
"@ "@
zxh %0 zxh %0
andi 65535,%1,%0 andi 65535,%1,%0
@ -1639,7 +1882,7 @@
(clobber (reg:CC CC_REGNUM))])] (clobber (reg:CC CC_REGNUM))])]
"" ""
{ {
if (! (TARGET_V850E || TARGET_V850E2_ALL)) if (! (TARGET_V850E_UP))
operands[1] = force_reg (HImode, operands[1]); operands[1] = force_reg (HImode, operands[1]);
}) })
@ -1648,7 +1891,7 @@
(zero_extend:SI (zero_extend:SI
(match_operand:QI 1 "nonimmediate_operand" "0,r,T,m"))) (match_operand:QI 1 "nonimmediate_operand" "0,r,T,m")))
(clobber (reg:CC CC_REGNUM))] (clobber (reg:CC CC_REGNUM))]
"(TARGET_V850E || TARGET_V850E2_ALL)" "(TARGET_V850E_UP)"
"@ "@
zxb %0 zxb %0
andi 255,%1,%0 andi 255,%1,%0
@ -1674,7 +1917,7 @@
(clobber (reg:CC CC_REGNUM))])] (clobber (reg:CC CC_REGNUM))])]
"" ""
{ {
if (! (TARGET_V850E || TARGET_V850E2_ALL)) if (! (TARGET_V850E_UP))
operands[1] = force_reg (QImode, operands[1]); operands[1] = force_reg (QImode, operands[1]);
}) })
@ -1686,7 +1929,7 @@
[(set (match_operand:SI 0 "register_operand" "=r,r,r") [(set (match_operand:SI 0 "register_operand" "=r,r,r")
(sign_extend:SI (match_operand:HI 1 "nonimmediate_operand" "0,Q,m"))) (sign_extend:SI (match_operand:HI 1 "nonimmediate_operand" "0,Q,m")))
(clobber (reg:CC CC_REGNUM))] (clobber (reg:CC CC_REGNUM))]
"(TARGET_V850E || TARGET_V850E2_ALL)" "(TARGET_V850E_UP)"
"@ "@
sxh %0 sxh %0
sld.h %1,%0 sld.h %1,%0
@ -1718,7 +1961,7 @@
[(set (match_operand:SI 0 "register_operand" "=r,r,r") [(set (match_operand:SI 0 "register_operand" "=r,r,r")
(sign_extend:SI (match_operand:QI 1 "nonimmediate_operand" "0,Q,m"))) (sign_extend:SI (match_operand:QI 1 "nonimmediate_operand" "0,Q,m")))
(clobber (reg:CC CC_REGNUM))] (clobber (reg:CC CC_REGNUM))]
"(TARGET_V850E || TARGET_V850E2_ALL)" "(TARGET_V850E_UP)"
"@ "@
sxb %0 sxb %0
sld.b %1,%0 sld.b %1,%0
@ -1767,7 +2010,7 @@
(match_operand:SI 1 "register_operand" "r") (match_operand:SI 1 "register_operand" "r")
(match_operand:SI 2 "nonmemory_operand" "r"))) (match_operand:SI 2 "nonmemory_operand" "r")))
(clobber (reg:CC CC_REGNUM))] (clobber (reg:CC CC_REGNUM))]
"TARGET_V850E2_ALL" "TARGET_V850E2_UP"
"shl %2,%1,%0" "shl %2,%1,%0"
[(set_attr "length" "4") [(set_attr "length" "4")
(set_attr "cc" "set_znv")]) (set_attr "cc" "set_znv")])
@ -1791,7 +2034,7 @@
(match_operand:SI 1 "register_operand" "r") (match_operand:SI 1 "register_operand" "r")
(match_operand:SI 2 "nonmemory_operand" "r"))) (match_operand:SI 2 "nonmemory_operand" "r")))
(clobber (reg:CC CC_REGNUM))] (clobber (reg:CC CC_REGNUM))]
"TARGET_V850E2_ALL" "TARGET_V850E2_UP"
"shr %2,%1,%0" "shr %2,%1,%0"
[(set_attr "length" "4") [(set_attr "length" "4")
(set_attr "cc" "set_zn")]) (set_attr "cc" "set_zn")])
@ -1815,7 +2058,7 @@
(match_operand:SI 1 "register_operand" "r") (match_operand:SI 1 "register_operand" "r")
(match_operand:SI 2 "nonmemory_operand" "r"))) (match_operand:SI 2 "nonmemory_operand" "r")))
(clobber (reg:CC CC_REGNUM))] (clobber (reg:CC CC_REGNUM))]
"TARGET_V850E2_ALL" "TARGET_V850E2_UP"
"sar %2,%1,%0" "sar %2,%1,%0"
[(set_attr "length" "4") [(set_attr "length" "4")
(set_attr "cc" "set_zn")]) (set_attr "cc" "set_zn")])
@ -1828,7 +2071,7 @@
[(set (match_operand:SI 0 "register_operand" "=r") [(set (match_operand:SI 0 "register_operand" "=r")
(ffs:SI (match_operand:SI 1 "register_operand" "r"))) (ffs:SI (match_operand:SI 1 "register_operand" "r")))
(clobber (reg:CC CC_REGNUM))] (clobber (reg:CC CC_REGNUM))]
"TARGET_V850E2_ALL" "TARGET_V850E2_UP"
"sch1r %1,%0" "sch1r %1,%0"
[(set_attr "length" "4") [(set_attr "length" "4")
(set_attr "cc" "clobber")]) (set_attr "cc" "clobber")])
@ -2529,7 +2772,7 @@
(set (mem:SI (plus:SI (reg:SI 3) (set (mem:SI (plus:SI (reg:SI 3)
(match_operand:SI 2 "immediate_operand" "i"))) (match_operand:SI 2 "immediate_operand" "i")))
(match_operand:SI 3 "register_is_ok_for_epilogue" "r"))])] (match_operand:SI 3 "register_is_ok_for_epilogue" "r"))])]
"TARGET_PROLOG_FUNCTION && (TARGET_V850E || TARGET_V850E2_ALL)" "TARGET_PROLOG_FUNCTION && (TARGET_V850E_UP)"
{ {
return construct_prepare_instruction (operands[0]); return construct_prepare_instruction (operands[0]);
} }
@ -2563,7 +2806,7 @@
(set (match_operand:SI 2 "register_is_ok_for_epilogue" "=r") (set (match_operand:SI 2 "register_is_ok_for_epilogue" "=r")
(mem:SI (plus:SI (reg:SI 3) (mem:SI (plus:SI (reg:SI 3)
(match_operand:SI 3 "immediate_operand" "i"))))])] (match_operand:SI 3 "immediate_operand" "i"))))])]
"TARGET_PROLOG_FUNCTION && (TARGET_V850E || TARGET_V850E2_ALL)" "TARGET_PROLOG_FUNCTION && (TARGET_V850E_UP)"
{ {
return construct_dispose_instruction (operands[0]); return construct_dispose_instruction (operands[0]);
} }
@ -2594,7 +2837,7 @@
;; Initialize an interrupt function. Do not depend on TARGET_PROLOG_FUNCTION. ;; Initialize an interrupt function. Do not depend on TARGET_PROLOG_FUNCTION.
(define_insn "callt_save_interrupt" (define_insn "callt_save_interrupt"
[(unspec_volatile [(const_int 0)] 2)] [(unspec_volatile [(const_int 0)] 2)]
"(TARGET_V850E || TARGET_V850E2_ALL) && !TARGET_DISABLE_CALLT" "(TARGET_V850E_UP) && !TARGET_DISABLE_CALLT"
;; The CALLT instruction stores the next address of CALLT to CTPC register ;; The CALLT instruction stores the next address of CALLT to CTPC register
;; without saving its previous value. So if the interrupt handler ;; without saving its previous value. So if the interrupt handler
;; or its caller could possibly execute the CALLT insn, save_interrupt ;; or its caller could possibly execute the CALLT insn, save_interrupt
@ -2616,7 +2859,7 @@
(define_insn "callt_return_interrupt" (define_insn "callt_return_interrupt"
[(unspec_volatile [(const_int 0)] 3)] [(unspec_volatile [(const_int 0)] 3)]
"(TARGET_V850E || TARGET_V850E2_ALL) && !TARGET_DISABLE_CALLT" "(TARGET_V850E_UP) && !TARGET_DISABLE_CALLT"
"callt ctoff(__callt_return_interrupt)" "callt ctoff(__callt_return_interrupt)"
[(set_attr "length" "2") [(set_attr "length" "2")
(set_attr "cc" "clobber")]) (set_attr "cc" "clobber")])
@ -2693,7 +2936,7 @@
(define_insn "callt_save_all_interrupt" (define_insn "callt_save_all_interrupt"
[(unspec_volatile [(const_int 0)] 0)] [(unspec_volatile [(const_int 0)] 0)]
"(TARGET_V850E || TARGET_V850E2_ALL) && !TARGET_DISABLE_CALLT" "(TARGET_V850E_UP) && !TARGET_DISABLE_CALLT"
"callt ctoff(__callt_save_all_interrupt)" "callt ctoff(__callt_save_all_interrupt)"
[(set_attr "length" "2") [(set_attr "length" "2")
(set_attr "cc" "none")]) (set_attr "cc" "none")])
@ -2793,7 +3036,7 @@
(define_insn "callt_restore_all_interrupt" (define_insn "callt_restore_all_interrupt"
[(unspec_volatile [(const_int 0)] 1)] [(unspec_volatile [(const_int 0)] 1)]
"(TARGET_V850E || TARGET_V850E2_ALL) && !TARGET_DISABLE_CALLT" "(TARGET_V850E_UP) && !TARGET_DISABLE_CALLT"
"callt ctoff(__callt_restore_all_interrupt)" "callt ctoff(__callt_restore_all_interrupt)"
[(set_attr "length" "2") [(set_attr "length" "2")
(set_attr "cc" "none")]) (set_attr "cc" "none")])

View file

@ -112,6 +112,17 @@ mv850e2v3
Target Report RejectNegative Mask(V850E2V3) Target Report RejectNegative Mask(V850E2V3)
Compile for the v850e2v3 processor Compile for the v850e2v3 processor
mv850e3v5
Target Report RejectNegative Mask(V850E3V5)
Compile for the v850e3v5 processor
mv850e2v4
Target RejectNegative Mask(V850E3V5) MaskExists
mloop
Target Report Mask(LOOP)
Enable v850e3v5 loop instructions
mzda= mzda=
Target RejectNegative Joined UInteger Target RejectNegative Joined UInteger
Set the max size of data eligible for the ZDA area Set the max size of data eligible for the ZDA area

View file

@ -956,11 +956,16 @@ See RS/6000 and PowerPC Options.
-mtda=@var{n} -msda=@var{n} -mzda=@var{n} @gol -mtda=@var{n} -msda=@var{n} -mzda=@var{n} @gol
-mapp-regs -mno-app-regs @gol -mapp-regs -mno-app-regs @gol
-mdisable-callt -mno-disable-callt @gol -mdisable-callt -mno-disable-callt @gol
-mv850e2v3 @gol -mv850e2v3 -mv850e2 -mv850e1 -mv850es @gol
-mv850e2 @gol -mv850e -mv850 -mv850e3v5 @gol
-mv850e1 -mv850es @gol -mloop @gol
-mv850e @gol -mrelax @gol
-mv850 -mbig-switch} -mlong-jumps @gol
-msoft-float @gol
-mhard-float @gol
-mgcc-abi @gol
-mrh850-abi @gol
-mbig-switch}
@emph{VAX Options} @emph{VAX Options}
@gccoptlist{-mg -mgnu -munix} @gccoptlist{-mg -mgnu -munix}
@ -6083,7 +6088,7 @@ vectorizer passes print the source location of loops which got
successfully vectorized. successfully vectorized.
@item missed @item missed
Print information about missed optimizations. Individual passes Print information about missed optimizations. Individual passes
control which informations to include in the output. For example, control which information to include in the output. For example,
@smallexample @smallexample
gcc -O2 -ftree-vectorize -fopt-info-vec-missed gcc -O2 -ftree-vectorize -fopt-info-vec-missed
@ -8401,7 +8406,7 @@ requires the complete toolchain to be aware of LTO. It requires a linker with
linker plugin support for basic functionality. Additionally, linker plugin support for basic functionality. Additionally,
@command{nm}, @command{ar} and @command{ranlib} @command{nm}, @command{ar} and @command{ranlib}
need to support linker plugins to allow a full-featured build environment need to support linker plugins to allow a full-featured build environment
(capable of building static libraries etc). gcc provides the @command{gcc-ar}, (capable of building static libraries etc). GCC provides the @command{gcc-ar},
@command{gcc-nm}, @command{gcc-ranlib} wrappers to pass the right options @command{gcc-nm}, @command{gcc-ranlib} wrappers to pass the right options
to these tools. With non fat LTO makefiles need to be modified to use them. to these tools. With non fat LTO makefiles need to be modified to use them.
@ -19591,26 +19596,20 @@ the first 32 kilobytes of memory.
@opindex mv850 @opindex mv850
Specify that the target processor is the V850. Specify that the target processor is the V850.
@item -mbig-switch @item -mv850e3v5
@opindex mbig-switch @opindex mv850e3v5
Generate code suitable for big switch tables. Use this option only if Specify that the target processor is the V850E3V5. The preprocessor
the assembler/linker complain about out of range branches within a switch constant @samp{__v850e3v5__} is defined if this option is used.
table.
@item -mapp-regs @item -mv850e2v4
@opindex mapp-regs @opindex mv850e2v4
This option causes r2 and r5 to be used in the code generated by Specify that the target processor is the V850E3V5. This is an alias for
the compiler. This setting is the default. the @option{-mv850e3v5} option.
@item -mno-app-regs
@opindex mno-app-regs
This option causes r2 and r5 to be treated as fixed registers.
@item -mv850e2v3 @item -mv850e2v3
@opindex mv850e2v3 @opindex mv850e2v3
Specify that the target processor is the V850E2V3. The preprocessor Specify that the target processor is the V850E2V3. The preprocessor
constant @samp{__v850e2v3__} is defined if constant @samp{__v850e2v3__} is defined if this option is used.
this option is used.
@item -mv850e2 @item -mv850e2
@opindex mv850e2 @opindex mv850e2
@ -19634,7 +19633,7 @@ Specify that the target processor is the V850E@. The preprocessor
constant @samp{__v850e__} is defined if this option is used. constant @samp{__v850e__} is defined if this option is used.
If neither @option{-mv850} nor @option{-mv850e} nor @option{-mv850e1} If neither @option{-mv850} nor @option{-mv850e} nor @option{-mv850e1}
nor @option{-mv850e2} nor @option{-mv850e2v3} nor @option{-mv850e2} nor @option{-mv850e2v3} nor @option{-mv850e3v5}
are defined then a default target processor is chosen and the are defined then a default target processor is chosen and the
relevant @samp{__v850*__} preprocessor constant is defined. relevant @samp{__v850*__} preprocessor constant is defined.
@ -19642,10 +19641,131 @@ The preprocessor constants @samp{__v850} and @samp{__v851__} are always
defined, regardless of which processor variant is the target. defined, regardless of which processor variant is the target.
@item -mdisable-callt @item -mdisable-callt
@itemx -mno-disable-callt
@opindex mdisable-callt @opindex mdisable-callt
@opindex mno-disable-callt
This option suppresses generation of the @code{CALLT} instruction for the This option suppresses generation of the @code{CALLT} instruction for the
v850e, v850e1, v850e2 and v850e2v3 flavors of the v850 architecture. The default is v850e, v850e1, v850e2, v850e2v3 and v850e3v5 flavors of the v850
@option{-mno-disable-callt} which allows the @code{CALLT} instruction to be used. architecture.
This option is enabled by default when the RH850 ABI is
in use (see @option{-mrh850-abi}), and disabled by default when the
GCC ABI is in use. If @code{CALLT} instructions are being generated
then the C preprocessor symbol @code{__V850_CALLT__} will be defined.
@item -mrelax
@itemx -mno-relax
@opindex mrelax
@opindex mno-relax
Pass on (or do not pass on) the @option{-mrelax} command line option
to the assembler.
@item -mlong-jumps
@itemx -mno-long-jumps
@opindex mlong-jumps
@opindex mno-long-jumps
Disable (or re-enable) the generation of PC-relative jump instructions.
@item -msoft-float
@itemx -mhard-float
@opindex msoft-float
@opindex mhard-float
Disable (or re-enable) the generation of hardware floating point
instructions. This option is only significant when the target
architecture is @samp{V850E2V3} or higher. If hardware floating point
instructions are being generated then the C preprocessor symbol
@code{__FPU_OK__} will be defined, otherwise the symbol
@code{__NO_FPU__} will be defined.
@item -mloop
@opindex mloop
Enables the use of the e3v5 LOOP instruction. The use of this
instruction is not enabled by default when the e3v5 architecture is
selected because its use is still experimental.
@item -mrh850-abi
@itemx -mghs
@opindex mrh850-abi
@opindex mghs
Enables support for the RH850 version of the V850 ABI. This is the
default. With this version of the ABI the following rules apply:
@itemize
@item
Integer sized structures and unions are returned via a memory pointer
rather than a register.
@item
Large structures and unions (more than 8 bytes in size) are passed by
value.
@item
Functions are aligned to 16-bit boundaries.
@item
The @option{-m8byte-align} command line option is supported.
@item
The @option{-mdisable-callt} command line option is enabled by
default. The @option{-mno-disable-callt} command line option is not
supported.
@end itemize
When this version of the ABI is enabled the C preprocessor symbol
@code{__V850_RH850_ABI__} is defined.
@item -mgcc-abi
@opindex mgcc-abi
Enables support for the old GCC version of the V850 ABI. With this
version of the ABI the following rules apply:
@itemize
@item
Integer sized structures and unions are returned in register @code{r10}.
@item
Large structures and unions (more than 8 bytes in size) are passed by
reference.
@item
Functions are aligned to 32-bit boundaries, unless optimizing for
size.
@item
The @option{-m8byte-align} command line option is not supported.
@item
The @option{-mdisable-callt} command line option is supported but not
enabled by default.
@end itemize
When this version of the ABI is enabled the C preprocessor symbol
@code{__V850_GCC_ABI__} is defined.
@item -m8byte-align
@itemx -mno-8byte-align
@opindex m8byte-align
@opindex mno-8byte-align
Enables support for @code{doubles} and @code{long long} types to be
aligned on 8-byte boundaries. The default is to restrict the
alignment of all objects to at most 4-bytes. When
@option{-m8byte-align} is in effect the C preprocessor symbol
@code{__V850_8BYTE_ALIGN__} will be defined.
@item -mbig-switch
@opindex mbig-switch
Generate code suitable for big switch tables. Use this option only if
the assembler/linker complain about out of range branches within a switch
table.
@item -mapp-regs
@opindex mapp-regs
This option causes r2 and r5 to be used in the code generated by
the compiler. This setting is the default.
@item -mno-app-regs
@opindex mno-app-regs
This option causes r2 and r5 to be treated as fixed registers.
@end table @end table

View file

@ -1,3 +1,8 @@
2013-01-31 Nick Clifton <nickc@redhat.com>
* config/v850/lib1funcs.S: Add support for e3v5 architecture
variant.
2013-01-29 Georg-Johann Lay <avr@gjlay.de> 2013-01-29 Georg-Johann Lay <avr@gjlay.de>
PR target/54222 PR target/54222

View file

@ -81,7 +81,7 @@ ___mulsi3:
add r7, r10 add r7, r10
jmp [r31] jmp [r31]
#endif /* __v850__ */ #endif /* __v850__ */
#if defined(__v850e__) || defined(__v850ea__) || defined(__v850e2__) || defined(__v850e2v3__) #if defined(__v850e__) || defined(__v850ea__) || defined(__v850e2__) || defined(__v850e2v3__) || defined(__v850e3v5__)
/* This routine is almost unneccesarry because gcc /* This routine is almost unneccesarry because gcc
generates the MUL instruction for the RTX mulsi3. generates the MUL instruction for the RTX mulsi3.
But if someone wants to link his application with But if someone wants to link his application with
@ -1765,7 +1765,7 @@ __restore_all_interrupt:
#endif /* L_save_all_interrupt */ #endif /* L_save_all_interrupt */
#if defined __V850_CALLT__ #if defined __V850_CALLT__
#if defined(__v850e__) || defined(__v850e1__) || defined(__v850e2__) || defined(__v850e2v3__) #if defined(__v850e__) || defined(__v850e1__) || defined(__v850e2__) || defined(__v850e2v3__) || defined(__v850e3v5__)
#ifdef L_callt_save_r2_r29 #ifdef L_callt_save_r2_r29
/* Put these functions into the call table area. */ /* Put these functions into the call table area. */
.call_table_text .call_table_text
@ -2146,7 +2146,7 @@ __callt_save_r31c: .short ctoff(.L_callt_save_r31c)
__callt_return_r31c: .short ctoff(.L_callt_return_r31c) __callt_return_r31c: .short ctoff(.L_callt_return_r31c)
#endif #endif
#endif /* __v850e__ */ #endif /* __v850e__ + */
#endif /* __V850_CALLT__ */ #endif /* __V850_CALLT__ */
/* libgcc2 routines for NEC V850. */ /* libgcc2 routines for NEC V850. */