> If you could implement the second option, it would be appreciated.

Could you please test this for me?  It builds as a powerpc-elf
cross-compiler (at least the host half) but I don't have a power
machine here to test on.

Index: rs6000-c.c
===================================================================
--- rs6000-c.c  (revision 216241)
+++ rs6000-c.c  (working copy)
@@ -157,12 +157,29 @@ init_vector_keywords (void)
     {
       __int128_type = get_identifier ("__int128_t");
       __uint128_type = get_identifier ("__uint128_t");
     }
 }
 
+/* Helper function to find out which RID_INT_N_* code is the one for
+   __int128, if any.  Returns RID_MAX+1 if none apply, which is safe
+   (for our purposes, since we always expect to have __int128) to
+   compare against.  */
+static int
+rid_int128(void)
+{
+  int i;
+
+  for (i = 0; i < NUM_INT_N_ENTS; i ++)
+    if (int_n_enabled_p[i]
+       && int_n_data[i].bitsize == 128)
+      return RID_INT_N_0 + i;
+
+  return RID_MAX + 1;
+}
+
 /* Called to decide whether a conditional macro should be expanded.
    Since we have exactly one such macro (i.e, 'vector'), we do not
    need to examine the 'tok' parameter.  */
 
 static cpp_hashnode *
 rs6000_macro_to_expand (cpp_reader *pfile, const cpp_token *tok)
@@ -231,13 +248,13 @@ rs6000_macro_to_expand (cpp_reader *pfil
 
          if (rid_code == RID_UNSIGNED || rid_code == RID_LONG
              || rid_code == RID_SHORT || rid_code == RID_SIGNED
              || rid_code == RID_INT || rid_code == RID_CHAR
              || rid_code == RID_FLOAT
              || (rid_code == RID_DOUBLE && TARGET_VSX)
-             || (rid_code == RID_INT128 && TARGET_VADDUQM))
+             || (rid_code == rid_int128 () && TARGET_VADDUQM))
            {
              expand_this = C_CPP_HASHNODE (__vector_keyword);
              /* If the next keyword is bool or pixel, it
                 will need to be expanded as well.  */
              do
                tok = cpp_peek_token (pfile, idx++);

Reply via email to