h8300.c (h8300_init_once): Allow -mn switch only if -mh or -ms present.
authorVijay L. Khuspe <vijayk1@kpit.com>
Wed, 20 Nov 2002 04:54:39 +0000 (04:54 +0000)
committerKazu Hirata <kazu@gcc.gnu.org>
Wed, 20 Nov 2002 04:54:39 +0000 (04:54 +0000)
* 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

gcc/ChangeLog
gcc/config/h8300/h8300.c
gcc/config/h8300/h8300.h
gcc/config/h8300/h8300.md
gcc/config/h8300/t-h8300
gcc/doc/invoke.texi

index 3fa0f79a28e6d13442c2fa028ee85c2b67cc58bb..64cedde103d34b2ac0e047717dd9bef1cd5e0449 100644 (file)
@@ -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.
index c5bfb137fe42901c5aed170bc0964586d4300043..c31bab60f284c831d741b96400b17f618d845e8d 100644 (file)
@@ -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))));
 }
index 79898aab4e989fbee9064d5c4dd9b9da826fc50c..7d3a986c90347fa888e3e2e923ce8ad3516f6871 100644 (file)
@@ -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"
index 6c7c26dc569ad436338ef53e44137a0e0c73cac5..5e9f114d3ec761f32acffd0b09f4197254637205 100644 (file)
   [(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"
   [(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.
index ad7a657489603696b144f8f2c3867c2cc339fe9c..d8cbd4f12932f5c958cb7deec4c7d4bb05023469 100644 (file)
@@ -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
index 45fee6f0fbf08fcf4149b3246262bbd7710c38da..36ca755119678de48b57786f9de6b4bdc52f492c 100644 (file)
@@ -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}.