]> gcc.gnu.org Git - gcc.git/blobdiff - gcc/config/alpha/alpha.h
(PREDICATE_CODES): Fix typos and add missing entries.
[gcc.git] / gcc / config / alpha / alpha.h
index 8de0adc37ec9a3bae310132459c5bb97afcf31d6..880cece20a1d59365779fc83e61b977eeb40f2cc 100644 (file)
@@ -1,5 +1,5 @@
 /* Definitions of target machine for GNU compiler, for DEC Alpha.
-   Copyright (C) 1992 Free Software Foundation, Inc.
+   Copyright (C) 1992, 1993 Free Software Foundation, Inc.
    Contributed by Richard Kenner (kenner@nyu.edu)
 
 This file is part of GNU CC.
@@ -49,6 +49,12 @@ the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.  */
 
 #define LIB_SPEC "-lc"
 
+/* Pass "-G 8" to ld because Alpha's CC does.  Pass -O2 if we are optimizing,
+   -O1 if we are not.  Pass -non_shared or -call_shared as appropriate.  */
+/* Disable -O2 to ld; it seems to have problems.  */
+#define LINK_SPEC  \
+  "-G 8 %{O*:-O1} %{!O*:-O1} %{static:-non_shared} %{!static:-call_shared}"
+
 /* Print subsidiary information on the compiler version in use.  */
 #define TARGET_VERSION
 
@@ -110,6 +116,9 @@ extern int target_flags;
 \f
 /* target machine storage layout */
 
+/* Define to enable software floating point emulation. */
+#define REAL_ARITHMETIC
+
 /* Define the size of `int'.  The default is the same as the word size.  */
 #define INT_TYPE_SIZE 32
 
@@ -310,7 +319,7 @@ extern int target_flags;
 
 #define REG_ALLOC_ORDER                \
   {33,                                 \
-   42, 43, 44, 45,                     \
+   42, 43, 44, 45, 46, 47,             \
    54, 55, 56, 57, 58, 59, 60, 61, 62, \
    53, 52, 51, 50, 49, 48,             \
    32,                                 \
@@ -593,7 +602,7 @@ enum reg_class { NO_REGS, GENERAL_REGS, FLOAT_REGS, ALL_REGS,
 
 /* Definitions for register eliminations.
 
-   We have two registers that can be eliminated on the i386.  First, the
+   We have two registers that can be eliminated on the Alpha.  First, the
    frame pointer register can often be eliminated in favor of the stack
    pointer register.  Secondly, the argument pointer register can always be
    eliminated; it is replaced with either the stack or frame pointer. */
@@ -622,9 +631,14 @@ enum reg_class { NO_REGS, GENERAL_REGS, FLOAT_REGS, ALL_REGS,
 { if ((FROM) == FRAME_POINTER_REGNUM && (TO) == STACK_POINTER_REGNUM)  \
     (OFFSET) = 0;                                                      \
   else                                                                 \
-    (OFFSET) = (get_frame_size () + current_function_outgoing_args_size \
-               + current_function_pretend_args_size                    \
-               + alpha_sa_size () + 15) & ~ 15;                        \
+    {                                                                  \
+      (OFFSET) = ((get_frame_size () + current_function_outgoing_args_size \
+                  + current_function_pretend_args_size                 \
+                  + alpha_sa_size () + 15)                             \
+                 & ~ 15);                                              \
+      if ((FROM) == ARG_POINTER_REGNUM)                                        \
+       (OFFSET) -= current_function_pretend_args_size;                 \
+    }                                                                  \
 }
 
 /* Define this if stack space is still allocated for a parameter passed
@@ -673,7 +687,7 @@ enum reg_class { NO_REGS, GENERAL_REGS, FLOAT_REGS, ALL_REGS,
    are integers whose size is larger than 64 bits.  */
 
 #define RETURN_IN_MEMORY(TYPE) \
-  (TREE_CODE (TYPE) == RECORD_TYPE || TREE_CODE (TYPE) == UNION_TYPE  \
+  (TYPE_MODE (TYPE) == BLKmode \
    || (TREE_CODE (TYPE) == INTEGER_TYPE && TYPE_PRECISION (TYPE) > 64))
 
 /* 1 if N is a possible register number for a function value
@@ -791,14 +805,14 @@ enum reg_class { NO_REGS, GENERAL_REGS, FLOAT_REGS, ALL_REGS,
            (16 + CUM,                                                  \
             gen_rtx (MEM, BLKmode,                                     \
                      plus_constant (virtual_incoming_args_rtx,         \
-                                    ((CUM) - 6) * UNITS_PER_WORD)),    \
-            6 - (CUM));                                                \
+                                    ((CUM) + 6)* UNITS_PER_WORD)),     \
+            6 - (CUM), (6 - (CUM)) * UNITS_PER_WORD);                  \
          move_block_from_reg                                           \
            (16 + 32 + CUM,                                             \
             gen_rtx (MEM, BLKmode,                                     \
                      plus_constant (virtual_incoming_args_rtx,         \
-                                    ((CUM) - 12) * UNITS_PER_WORD)),   \
-            6 - (CUM));                                                \
+                                    (CUM) * UNITS_PER_WORD)),          \
+            6 - (CUM), (6 - (CUM)) * UNITS_PER_WORD);                  \
         }                                                              \
       PRETEND_SIZE = 12 * UNITS_PER_WORD;                              \
     }                                                                  \
@@ -1104,7 +1118,7 @@ extern char *current_function_name;
       HOST_WIDE_INT highpart = val - lowpart;                  \
       rtx high = GEN_INT (highpart);                           \
       rtx temp = expand_binop (Pmode, add_optab, XEXP (x, 0),  \
-                              high, 0, OPTAB_LIB_WIDEN);       \
+                              high, NULL_RTX, 1, OPTAB_LIB_WIDEN); \
                                                                \
       (X) = plus_constant (temp, lowpart);                     \
       goto WIN;                                                        \
@@ -1139,7 +1153,7 @@ extern char *current_function_name;
                                                                \
       high = expand_binop (Pmode, add_optab, XEXP (X, 0),      \
                           force_reg (Pmode, high),             \
-                          high, OPTAB_LIB_WIDEN);              \
+                          high, 1, OPTAB_LIB_WIDEN);           \
       (X) = plus_constant (high, lowpart);                     \
       goto WIN;                                                        \
     }                                                          \
@@ -1215,6 +1229,9 @@ extern char *current_function_name;
    the rest of the bits in the register.  */
 #define BYTE_LOADS_SIGN_EXTEND
 
+/* Define if loading short immediate values into registers sign extends.  */
+#define SHORT_IMMEDIATES_SIGN_EXTEND
+
 /* We aren't doing ANYTHING about debugging for now.  */
 /* #define SDB_DEBUGGING_INFO */
 
@@ -1289,12 +1306,26 @@ extern char *current_function_name;
   case MINUS:                                          \
     if (GET_MODE_CLASS (GET_MODE (X)) == MODE_FLOAT)   \
       return COSTS_N_INSNS (6);                                \
+    else if (GET_CODE (XEXP (X, 0)) == MULT            \
+            && const48_operand (XEXP (XEXP (X, 0), 1), VOIDmode)) \
+      return 2 + rtx_cost (XEXP (XEXP (X, 0), 0)) + rtx_cost (XEXP (X, 1)); \
     break;                                             \
   case MULT:                                           \
     if (GET_MODE_CLASS (GET_MODE (X)) == MODE_FLOAT)   \
       return COSTS_N_INSNS (6);                                \
-    else                                               \
+    else if (GET_CODE (XEXP (X, 1)) != CONST_INT       \
+            || exact_log2 (INTVAL (XEXP (X, 1))) < 0)  \
       return COSTS_N_INSNS (21);                       \
+    else if (const48_operand (XEXP (X, 1), VOIDmode))  \
+      break;                                           \
+    return COSTS_N_INSNS (2);                          \
+  case ASHIFT:                                         \
+    if (GET_CODE (XEXP (X, 1)) == CONST_INT            \
+       && INTVAL (XEXP (X, 1)) <= 3)                   \
+      break;                                           \
+    /* ... fall through ... */                         \
+  case ASHIFTRT:  case LSHIFTRT:  case IF_THEN_ELSE:   \
+    return COSTS_N_INSNS (2);                          \
   case DIV:                                            \
   case UDIV:                                           \
   case MOD:                                            \
@@ -1436,20 +1467,51 @@ literal_section ()                                              \
 
 /* This is how to output an assembler line defining a `double' constant.  */
 
-#define ASM_OUTPUT_DOUBLE(FILE,VALUE)          \
-  fprintf (FILE, "\t.t_floating %.20e\n", (VALUE))
+#define ASM_OUTPUT_DOUBLE(FILE,VALUE)                                  \
+  {                                                                    \
+    if (REAL_VALUE_ISINF (VALUE)                                       \
+        || REAL_VALUE_ISNAN (VALUE)                                    \
+       || REAL_VALUE_MINUS_ZERO (VALUE))                               \
+      {                                                                        \
+       long t[2];                                                      \
+       REAL_VALUE_TO_TARGET_DOUBLE ((VALUE), t);                       \
+       fprintf (FILE, "\t.quad 0x%lx%08lx\n",                          \
+               t[1] & 0xffffffff, t[0] & 0xffffffff);                  \
+      }                                                                        \
+    else                                                               \
+      {                                                                        \
+       char str[30];                                                   \
+       REAL_VALUE_TO_DECIMAL (VALUE, "%.20e", str);                    \
+       fprintf (FILE, "\t.t_floating %s\n", str);                      \
+      }                                                                        \
+  }
 
 /* This is how to output an assembler line defining a `float' constant.  */
 
-#define ASM_OUTPUT_FLOAT(FILE,VALUE)           \
-  fprintf (FILE, "\t.s_floating %.20e\n", (VALUE))
-
+#define ASM_OUTPUT_FLOAT(FILE,VALUE)                                   \
+  {                                                                    \
+    if (REAL_VALUE_ISINF (VALUE)                                       \
+        || REAL_VALUE_ISNAN (VALUE)                                    \
+       || REAL_VALUE_MINUS_ZERO (VALUE))                               \
+      {                                                                        \
+       long t;                                                         \
+       REAL_VALUE_TO_TARGET_SINGLE ((VALUE), t);                       \
+       fprintf (FILE, "\t.long 0x%lx\n", t & 0xffffffff);              \
+      }                                                                        \
+    else                                                               \
+      {                                                                        \
+       char str[30];                                                   \
+       REAL_VALUE_TO_DECIMAL ((VALUE), "%.20e", str);                  \
+       fprintf (FILE, "\t.s_floating %s\n", str);                      \
+      }                                                                        \
+  }
+  
 /* This is how to output an assembler line defining an `int' constant.  */
 
 #define ASM_OUTPUT_INT(FILE,VALUE)             \
-( fprintf (FILE, "\t.long "),                  \
-  output_addr_const (FILE, (VALUE)),           \
-  fprintf (FILE, "\n"))
+  fprintf (FILE, "\t.long %d\n",               \
+    (GET_CODE (VALUE) == CONST_INT             \
+     ? INTVAL (VALUE) & 0xffffffff : (abort (), 0)))
 
 /* This is how to output an assembler line defining a `long' constant.  */
 
@@ -1461,14 +1523,14 @@ literal_section ()                                              \
 /* Likewise for `char' and `short' constants.  */
 
 #define ASM_OUTPUT_SHORT(FILE,VALUE)  \
-( fprintf (FILE, "\t.word "),                  \
-  output_addr_const (FILE, (VALUE)),           \
-  fprintf (FILE, "\n"))
+  fprintf (FILE, "\t.word %d\n",               \
+    (GET_CODE (VALUE) == CONST_INT             \
+     ? INTVAL (VALUE) & 0xffff : (abort (), 0)))
 
 #define ASM_OUTPUT_CHAR(FILE,VALUE)            \
-( fprintf (FILE, "\t.byte "),                  \
-  output_addr_const (FILE, (VALUE)),           \
-  fprintf (FILE, "\n"))
+  fprintf (FILE, "\t.byte %d\n",               \
+    (GET_CODE (VALUE) == CONST_INT             \
+     ? INTVAL (VALUE) & 0xff : (abort (), 0)))
 
 /* We use the default ASCII-output routine, except that we don't write more
    than 50 characters since the assembler doesn't support very long lines.  */
@@ -1533,7 +1595,7 @@ literal_section ()                                                \
 /* This is how to output an assembler line for a numeric constant byte.  */
 
 #define ASM_OUTPUT_BYTE(FILE,VALUE)  \
-  fprintf (FILE, "\t.byte 0x%x\n", (VALUE))
+  fprintf (FILE, "\t.byte 0x%x\n", (VALUE) & 0xff)
 
 /* This is how to output an element of a case-vector that is absolute.  */
 
@@ -1635,6 +1697,7 @@ literal_section ()                                                \
 
 #define PREDICATE_CODES \
   {"reg_or_0_operand", {SUBREG, REG, CONST_INT}},      \
+  {"reg_or_6bit_operand", {SUBREG, REG, CONST_INT}},   \
   {"reg_or_8bit_operand", {SUBREG, REG, CONST_INT}},   \
   {"reg_or_cint_operand", {SUBREG, REG, CONST_INT}},   \
   {"add_operand", {SUBREG, REG, CONST_INT}},           \
@@ -1647,7 +1710,9 @@ literal_section ()                                                \
   {"reg_or_fp0_operand", {SUBREG, REG, CONST_DOUBLE}}, \
   {"alpha_comparison_operator", {EQ, LE, LT, LEU, LTU}}, \
   {"signed_comparison_operator", {EQ, NE, LE, LT, GE, GT}}, \
+  {"divmod_operator", {DIV, MOD, UDIV, UMOD}},         \
   {"fp0_operand", {CONST_DOUBLE}},                     \
+  {"current_file_function_operand", {SYMBOL_REF}},     \
   {"input_operand", {SUBREG, REG, MEM, CONST_INT, CONST_DOUBLE,        \
                     SYMBOL_REF, CONST, LABEL_REF}},    \
   {"aligned_memory_operand", {MEM}},                   \
This page took 0.034917 seconds and 5 git commands to generate.