h8300.c (h8300_init_once): Allow -mn switch only if -mh or -ms present.
* config/h8300/h8300.c (h8300_init_once): Allow -mn switch only if -mh or -ms present. (h8300_eightbit_constant_address_p): Support the normal mode. (h8300_tiny_constant_address_p): Likewise. * config/h8300/h8300.h (TARGET_NORMAL_MODE): New. (POINTER_SIZE): Add 16 bit pointer for the normal mode. (Pmode): Evaluate to HImode for the normal mode. (SIZE_TYPE): Evaluate to unsigned int for normal mode. (PTRDIFF_TYPE): Evaluate to int for the normal mode. (ASM_WORD_OP): Evaluate to word for the normal mode. * config/h8300/h8300.md (tablejump_normal_mode): New. (indirect_jump_normal_mode): New. * config/h8300/t-h8300 (MULTILIB_OPTIONS): Pass -mn option to directory. (MULTILIB_DIRNAMES): Create target dependent directory 'normal'. (MULTILIB_EXCEPTIONS): Don't turn on -mn on H8/300. * doc/invoke.texi (gccoptlist): Describe the new switch -mn. From-SVN: r59285
This commit is contained in:
parent
dd768f5f25
commit
39ba95b5e1
@ -1,3 +1,24 @@
|
||||
2002-11-07 Vijay L. Khuspe <vijayk1@kpit.com>
|
||||
|
||||
* config/h8300/h8300.c (h8300_init_once): Allow -mn switch
|
||||
only if -mh or -ms present.
|
||||
(h8300_eightbit_constant_address_p): Support the normal mode.
|
||||
(h8300_tiny_constant_address_p): Likewise.
|
||||
* config/h8300/h8300.h (TARGET_NORMAL_MODE): New.
|
||||
(POINTER_SIZE): Add 16 bit pointer for the normal mode.
|
||||
(Pmode): Evaluate to HImode for the normal mode.
|
||||
(SIZE_TYPE): Evaluate to unsigned int for normal mode.
|
||||
(PTRDIFF_TYPE): Evaluate to int for the normal mode.
|
||||
(ASM_WORD_OP): Evaluate to word for the normal mode.
|
||||
* config/h8300/h8300.md (tablejump_normal_mode): New.
|
||||
(indirect_jump_normal_mode): New.
|
||||
* config/h8300/t-h8300 (MULTILIB_OPTIONS): Pass -mn option to
|
||||
directory.
|
||||
(MULTILIB_DIRNAMES): Create target dependent directory
|
||||
'normal'.
|
||||
(MULTILIB_EXCEPTIONS): Don't turn on -mn on H8/300.
|
||||
* doc/invoke.texi (gccoptlist): Describe the new switch -mn.
|
||||
|
||||
Tue Nov 19 23:50:56 CET 2002 Jan Hubicka <jh@suse.cz>
|
||||
|
||||
* i386.md (length_immediate): Do not refer to insn address.
|
||||
|
@ -314,6 +314,12 @@ h8300_init_once ()
|
||||
error ("-ms2600 is used without -ms");
|
||||
target_flags |= 1;
|
||||
}
|
||||
|
||||
if (TARGET_H8300 && TARGET_NORMAL_MODE)
|
||||
{
|
||||
error ("-mn used without -mh or -ms");
|
||||
target_flags ^= MASK_NORMAL_MODE;
|
||||
}
|
||||
|
||||
/* Some of the shifts are optimized for speed by default.
|
||||
See http://gcc.gnu.org/ml/gcc-patches/2002-07/msg01858.html
|
||||
@ -1637,6 +1643,10 @@ h8300_initial_elimination_offset (from, to)
|
||||
if (from == ARG_POINTER_REGNUM && to == STACK_POINTER_REGNUM)
|
||||
offset += UNITS_PER_WORD; /* Skip saved PC */
|
||||
}
|
||||
|
||||
if ((TARGET_H8300H || TARGET_H8300S) && TARGET_NORMAL_MODE)
|
||||
offset -= 2;
|
||||
|
||||
return offset;
|
||||
}
|
||||
|
||||
@ -3882,7 +3892,7 @@ h8300_eightbit_constant_address_p (x)
|
||||
addr = INTVAL (x);
|
||||
|
||||
return (0
|
||||
|| (TARGET_H8300 && IN_RANGE (addr, n1, n2))
|
||||
|| ((TARGET_H8300 || TARGET_NORMAL_MODE) && IN_RANGE (addr, n1, n2))
|
||||
|| (TARGET_H8300H && IN_RANGE (addr, h1, h2))
|
||||
|| (TARGET_H8300S && IN_RANGE (addr, s1, s2)));
|
||||
}
|
||||
@ -3909,8 +3919,8 @@ h8300_tiny_constant_address_p (x)
|
||||
addr = INTVAL (x);
|
||||
|
||||
return (0
|
||||
|| (TARGET_H8300H
|
||||
|| ((TARGET_H8300H && !TARGET_NORMAL_MODE)
|
||||
&& (IN_RANGE (addr, h1, h2) || IN_RANGE (addr, h3, h4)))
|
||||
|| (TARGET_H8300S
|
||||
|| ((TARGET_H8300S && !TARGET_NORMAL_MODE)
|
||||
&& (IN_RANGE (addr, s1, s2) || IN_RANGE (addr, s3, s4))));
|
||||
}
|
||||
|
@ -46,12 +46,20 @@ extern const char * const *h8_reg_names;
|
||||
builtin_define ("__H8300H__"); \
|
||||
builtin_assert ("cpu=h8300h"); \
|
||||
builtin_assert ("machine=h8300h"); \
|
||||
if (TARGET_NORMAL_MODE) \
|
||||
{ \
|
||||
builtin_define ("__NORMAL_MODE__"); \
|
||||
} \
|
||||
} \
|
||||
else if (TARGET_H8300S) \
|
||||
{ \
|
||||
builtin_define ("__H8300S__"); \
|
||||
builtin_assert ("cpu=h8300s"); \
|
||||
builtin_assert ("machine=h8300s"); \
|
||||
if (TARGET_NORMAL_MODE) \
|
||||
{ \
|
||||
builtin_define ("__NORMAL_MODE__"); \
|
||||
} \
|
||||
} \
|
||||
else \
|
||||
{ \
|
||||
@ -91,6 +99,7 @@ extern int target_flags;
|
||||
#define MASK_ADDRESSES 0x00000040
|
||||
#define MASK_QUICKCALL 0x00000080
|
||||
#define MASK_SLOWBYTE 0x00000100
|
||||
#define MASK_NORMAL_MODE 0x00000200
|
||||
#define MASK_RELAX 0x00000400
|
||||
#define MASK_RTL_DUMP 0x00000800
|
||||
#define MASK_H8300H 0x00001000
|
||||
@ -119,6 +128,7 @@ extern int target_flags;
|
||||
#define TARGET_H8300 (! TARGET_H8300H && ! TARGET_H8300S)
|
||||
#define TARGET_H8300H (target_flags & MASK_H8300H)
|
||||
#define TARGET_H8300S (target_flags & MASK_H8300S)
|
||||
#define TARGET_NORMAL_MODE (target_flags & MASK_NORMAL_MODE)
|
||||
|
||||
/* mac register and relevant instructions are available. */
|
||||
#define TARGET_MAC (target_flags & MASK_MAC)
|
||||
@ -152,6 +162,7 @@ extern int target_flags;
|
||||
{"relax", MASK_RELAX, N_("Enable linker relaxing")}, \
|
||||
{"rtl-dump", MASK_RTL_DUMP, NULL}, \
|
||||
{"h", MASK_H8300H, N_("Generate H8/300H code")}, \
|
||||
{"n", MASK_NORMAL_MODE, N_("Enable the normal mode")}, \
|
||||
{"no-h", -MASK_H8300H, N_("Do not generate H8/300H code")}, \
|
||||
{"align-300", MASK_ALIGN_300, N_("Use H8/300 alignment rules")}, \
|
||||
{ "", TARGET_DEFAULT, NULL}}
|
||||
@ -159,6 +170,7 @@ extern int target_flags;
|
||||
#ifdef IN_LIBGCC2
|
||||
#undef TARGET_H8300H
|
||||
#undef TARGET_H8300S
|
||||
#undef TARGET_NORMAL_MODE
|
||||
/* If compiling libgcc2, make these compile time constants based on what
|
||||
flags are we actually compiling with. */
|
||||
#ifdef __H8300H__
|
||||
@ -171,6 +183,11 @@ extern int target_flags;
|
||||
#else
|
||||
#define TARGET_H8300S 0
|
||||
#endif
|
||||
#ifdef __NORMAL_MODE__
|
||||
#define TARGET_NORMAL_MODE 1
|
||||
#else
|
||||
#define TARGET_NORMAL_MODE 0
|
||||
#endif
|
||||
#endif /* !IN_LIBGCC2 */
|
||||
|
||||
/* Do things that must be done once at start up. */
|
||||
@ -974,13 +991,19 @@ struct cum_arg
|
||||
/* 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. */
|
||||
#define Pmode (TARGET_H8300H || TARGET_H8300S ? SImode : HImode)
|
||||
#define Pmode \
|
||||
((TARGET_H8300H || TARGET_H8300S) && !TARGET_NORMAL_MODE ? SImode : HImode)
|
||||
|
||||
/* ANSI C types.
|
||||
We use longs for the H8/300H and the H8S because ints can be 16 or 32.
|
||||
GCC requires SIZE_TYPE to be the same size as pointers. */
|
||||
#define SIZE_TYPE (TARGET_H8300 ? "unsigned int" : "long unsigned int")
|
||||
#define PTRDIFF_TYPE (TARGET_H8300 ? "int" : "long int")
|
||||
#define SIZE_TYPE \
|
||||
(TARGET_H8300 || TARGET_NORMAL_MODE ? "unsigned int" : "long unsigned int")
|
||||
#define PTRDIFF_TYPE \
|
||||
(TARGET_H8300 || TARGET_NORMAL_MODE ? "int" : "long int")
|
||||
|
||||
#define POINTER_SIZE \
|
||||
((TARGET_H8300H || TARGET_H8300S) && !TARGET_NORMAL_MODE ? 32 : 16)
|
||||
|
||||
#define WCHAR_TYPE "short unsigned int"
|
||||
#define WCHAR_TYPE_SIZE 16
|
||||
@ -1068,7 +1091,8 @@ struct cum_arg
|
||||
#define IDENT_ASM_OP "\t.ident\n"
|
||||
|
||||
/* The assembler op to get a word, 2 bytes for the H8/300, 4 for H8/300H. */
|
||||
#define ASM_WORD_OP (TARGET_H8300 ? "\t.word\t" : "\t.long\t")
|
||||
#define ASM_WORD_OP \
|
||||
(TARGET_H8300 || TARGET_NORMAL_MODE ? "\t.word\t" : "\t.long\t")
|
||||
|
||||
#define TEXT_SECTION_ASM_OP "\t.section .text"
|
||||
#define DATA_SECTION_ASM_OP "\t.section .data"
|
||||
|
@ -1580,6 +1580,14 @@
|
||||
[(set_attr "cc" "none")
|
||||
(set_attr "length" "2")])
|
||||
|
||||
(define_insn "tablejump_normal_mode"
|
||||
[(set (pc) (match_operand:HI 0 "register_operand" "r"))
|
||||
(use (label_ref (match_operand 1 "" "")))]
|
||||
"(TARGET_H8300H || TARGET_H8300S) && TARGET_NORMAL_MODE"
|
||||
"jmp @%S0"
|
||||
[(set_attr "cc" "none")
|
||||
(set_attr "length" "2")])
|
||||
|
||||
;; This is a define expand, because pointers may be either 16 or 32 bits.
|
||||
|
||||
(define_expand "indirect_jump"
|
||||
@ -1601,6 +1609,13 @@
|
||||
[(set_attr "cc" "none")
|
||||
(set_attr "length" "2")])
|
||||
|
||||
(define_insn "indirect_jump_normal_mode"
|
||||
[(set (pc) (match_operand:HI 0 "jump_address_operand" "Vr"))]
|
||||
"(TARGET_H8300H || TARGET_H8300S) && TARGET_NORMAL_MODE"
|
||||
"jmp @%S0"
|
||||
[(set_attr "cc" "none")
|
||||
(set_attr "length" "2")])
|
||||
|
||||
;; Call subroutine with no return value.
|
||||
|
||||
;; ??? Even though we use HImode here, this works on the H8/300H and H8S.
|
||||
|
@ -25,9 +25,9 @@ fp-bit.c: $(srcdir)/config/fp-bit.c
|
||||
echo '#endif' >> fp-bit.c
|
||||
cat $(srcdir)/config/fp-bit.c >> fp-bit.c
|
||||
|
||||
MULTILIB_OPTIONS = mh/ms mint32
|
||||
MULTILIB_DIRNAMES = h8300h h8300s int32
|
||||
MULTILIB_EXCEPTIONS = mint32
|
||||
MULTILIB_OPTIONS = mh/ms mn mint32
|
||||
MULTILIB_DIRNAMES = h8300h h8300s normal int32
|
||||
MULTILIB_EXCEPTIONS = mint32 mn mn/mint32
|
||||
|
||||
LIBGCC = stmp-multilib
|
||||
INSTALL_LIBGCC = install-multilib
|
||||
|
@ -550,7 +550,7 @@ in the following sections.
|
||||
|
||||
@emph{H8/300 Options}
|
||||
@gccoptlist{
|
||||
-mrelax -mh -ms -mint32 -malign-300}
|
||||
-mrelax -mh -ms -mn -mint32 -malign-300}
|
||||
|
||||
@emph{SH Options}
|
||||
@gccoptlist{
|
||||
@ -8632,6 +8632,11 @@ Generate code for the H8/300H@.
|
||||
@opindex ms
|
||||
Generate code for the H8S@.
|
||||
|
||||
@item -mn
|
||||
@opindex mn
|
||||
Generate code for the H8S and H8/300H in the normal mode. This switch
|
||||
must be used either with -mh or -ms.
|
||||
|
||||
@item -ms2600
|
||||
@opindex ms2600
|
||||
Generate code for the H8S/2600. This switch must be used with @option{-ms}.
|
||||
|
Loading…
Reference in New Issue
Block a user