OSDN Git Service

* doc/invoke.texi: Add mcmodel to powerpc options.
[pf3gnuchains/gcc-fork.git] / gcc / config / rs6000 / rs6000.h
index 6be51cc..cd7b928 100644 (file)
@@ -293,6 +293,20 @@ extern const char *host_detect_local_cpu (int argc, const char **argv);
 #define TARGET_SECURE_PLT 0
 #endif
 
+/* Code model for 64-bit linux.
+   small: 16-bit toc offsets.
+   medium: 32-bit toc offsets, static data and code within 2G of TOC pointer.
+   large: 32-bit toc offsets, no limit on static data and code.  */
+enum rs6000_cmodel {
+  CMODEL_SMALL,
+  CMODEL_MEDIUM,
+  CMODEL_LARGE
+};
+
+#ifndef TARGET_CMODEL
+#define TARGET_CMODEL CMODEL_SMALL
+#endif
+
 #define TARGET_32BIT           (! TARGET_64BIT)
 
 #ifndef HAVE_AS_TLS
@@ -543,6 +557,46 @@ extern int rs6000_vector_align[];
 /* E500 processors only support plain "sync", not lwsync.  */
 #define TARGET_NO_LWSYNC TARGET_E500
 
+/* Which machine supports the various reciprocal estimate instructions.  */
+#define TARGET_FRES    (TARGET_HARD_FLOAT && TARGET_PPC_GFXOPT \
+                        && TARGET_FPRS && TARGET_SINGLE_FLOAT)
+
+#define TARGET_FRE     (TARGET_HARD_FLOAT && TARGET_FPRS \
+                        && TARGET_DOUBLE_FLOAT \
+                        && (TARGET_POPCNTB || VECTOR_UNIT_VSX_P (DFmode)))
+
+#define TARGET_FRSQRTES        (TARGET_HARD_FLOAT && TARGET_POPCNTB \
+                        && TARGET_FPRS && TARGET_SINGLE_FLOAT)
+
+#define TARGET_FRSQRTE (TARGET_HARD_FLOAT && TARGET_FPRS \
+                        && TARGET_DOUBLE_FLOAT \
+                        && (TARGET_PPC_GFXOPT || VECTOR_UNIT_VSX_P (DFmode)))
+
+/* Whether the various reciprocal divide/square root estimate instructions
+   exist, and whether we should automatically generate code for the instruction
+   by default.  */
+#define RS6000_RECIP_MASK_HAVE_RE      0x1     /* have RE instruction.  */
+#define RS6000_RECIP_MASK_AUTO_RE      0x2     /* generate RE by default.  */
+#define RS6000_RECIP_MASK_HAVE_RSQRTE  0x4     /* have RSQRTE instruction.  */
+#define RS6000_RECIP_MASK_AUTO_RSQRTE  0x8     /* gen. RSQRTE by default.  */
+
+extern unsigned char rs6000_recip_bits[];
+
+#define RS6000_RECIP_HAVE_RE_P(MODE) \
+  (rs6000_recip_bits[(int)(MODE)] & RS6000_RECIP_MASK_HAVE_RE)
+
+#define RS6000_RECIP_AUTO_RE_P(MODE) \
+  (rs6000_recip_bits[(int)(MODE)] & RS6000_RECIP_MASK_AUTO_RE)
+
+#define RS6000_RECIP_HAVE_RSQRTE_P(MODE) \
+  (rs6000_recip_bits[(int)(MODE)] & RS6000_RECIP_MASK_HAVE_RSQRTE)
+
+#define RS6000_RECIP_AUTO_RSQRTE_P(MODE) \
+  (rs6000_recip_bits[(int)(MODE)] & RS6000_RECIP_MASK_AUTO_RSQRTE)
+
+#define RS6000_RECIP_HIGH_PRECISION_P(MODE) \
+  ((MODE) == SFmode || (MODE) == V4SFmode || TARGET_RECIP_PRECISION)
+
 /* Sometimes certain combinations of command options do not make sense
    on a particular target machine.  You can define a macro
    `OVERRIDE_OPTIONS' to take account of this.  This macro, if
@@ -946,7 +1000,7 @@ extern unsigned rs6000_pointer_size;
        mq              (not saved; best to use it if we can)
        ctr             (not saved; when we have the choice ctr is better)
        lr              (saved)
-       cr5, r1, r2, ap, xer (fixed)
+       cr5, r1, r2, ap, ca (fixed)
        v0 - v1         (not saved or used for anything)
        v13 - v3        (not saved; incoming vector arg registers)
        v2              (not saved; incoming vector arg reg; return value)
@@ -1008,8 +1062,8 @@ extern unsigned rs6000_pointer_size;
 /* PAIRED SIMD registers are just the FPRs.  */
 #define PAIRED_SIMD_REGNO_P(N) ((N) >= 32 && (N) <= 63)
 
-/* True if register is the XER register.  */
-#define XER_REGNO_P(N) ((N) == XER_REGNO)
+/* True if register is the CA register.  */
+#define CA_REGNO_P(N) ((N) == CA_REGNO)
 
 /* True if register is an AltiVec register.  */
 #define ALTIVEC_REGNO_P(N) ((N) >= FIRST_ALTIVEC_REGNO && (N) <= LAST_ALTIVEC_REGNO)
@@ -1229,7 +1283,7 @@ enum reg_class
   CR0_REGS,
   CR_REGS,
   NON_FLOAT_REGS,
-  XER_REGS,
+  CA_REGS,
   ALL_REGS,
   LIM_REG_CLASSES
 };
@@ -1260,7 +1314,7 @@ enum reg_class
   "CR0_REGS",                                                          \
   "CR_REGS",                                                           \
   "NON_FLOAT_REGS",                                                    \
-  "XER_REGS",                                                          \
+  "CA_REGS",                                                           \
   "ALL_REGS"                                                           \
 }
 
@@ -1290,7 +1344,7 @@ enum reg_class
   { 0x00000000, 0x00000000, 0x00000010, 0x00000000 }, /* CR0_REGS */        \
   { 0x00000000, 0x00000000, 0x00000ff0, 0x00000000 }, /* CR_REGS */         \
   { 0xffffffff, 0x00000000, 0x0000efff, 0x00020000 }, /* NON_FLOAT_REGS */   \
-  { 0x00000000, 0x00000000, 0x00001000, 0x00000000 }, /* XER_REGS */        \
+  { 0x00000000, 0x00000000, 0x00001000, 0x00000000 }, /* CA_REGS */         \
   { 0xffffffff, 0xffffffff, 0xffffffff, 0x0003ffff }  /* ALL_REGS */        \
 }
 
@@ -1311,7 +1365,7 @@ enum reg_class
   GENERAL_REGS, SPECIAL_REGS, FLOAT_REGS, ALTIVEC_REGS, /* VSX_REGS, */             \
   /* VRSAVE_REGS,*/ VSCR_REGS, SPE_ACC_REGS, SPEFSCR_REGS,                  \
   /* MQ_REGS, LINK_REGS, CTR_REGS, */                                       \
-  CR_REGS, XER_REGS, LIM_REG_CLASSES                                        \
+  CR_REGS, CA_REGS, LIM_REG_CLASSES                                         \
 }
 
 #define IRA_COVER_CLASSES_VSX                                               \
@@ -1319,7 +1373,7 @@ enum reg_class
   GENERAL_REGS, SPECIAL_REGS, /* FLOAT_REGS, ALTIVEC_REGS, */ VSX_REGS,             \
   /* VRSAVE_REGS,*/ VSCR_REGS, SPE_ACC_REGS, SPEFSCR_REGS,                  \
   /* MQ_REGS, LINK_REGS, CTR_REGS, */                                       \
-  CR_REGS, XER_REGS, LIM_REG_CLASSES                                        \
+  CR_REGS, CA_REGS, LIM_REG_CLASSES                                         \
 }
 
 /* The same information, inverted:
@@ -2259,7 +2313,7 @@ extern char rs6000_reg_names[][8];        /* register names (0 vs. %r0).  */
   &rs6000_reg_names[74][0],    /* cr6  */                              \
   &rs6000_reg_names[75][0],    /* cr7  */                              \
                                                                        \
-  &rs6000_reg_names[76][0],    /* xer  */                              \
+  &rs6000_reg_names[76][0],    /* ca  */                               \
                                                                        \
   &rs6000_reg_names[77][0],    /* v0  */                               \
   &rs6000_reg_names[78][0],    /* v1  */                               \
@@ -2333,6 +2387,8 @@ extern char rs6000_reg_names[][8];        /* register names (0 vs. %r0).  */
   {"cr0",  68}, {"cr1",  69}, {"cr2",  70}, {"cr3",  71},      \
   {"cr4",  72}, {"cr5",  73}, {"cr6",  74}, {"cr7",  75},      \
   {"cc",   68}, {"sp",    1}, {"toc",   2},                    \
+  /* CA is only part of XER, but we do not model the other parts (yet).  */ \
+  {"xer",  76},                                                        \
   /* VSX registers overlaid on top of FR, Altivec registers */ \
   {"vs0",  32}, {"vs1",  33}, {"vs2",  34}, {"vs3",  35},      \
   {"vs4",  36}, {"vs5",  37}, {"vs6",  38}, {"vs7",  39},      \