rs6000.md (absdi2 define_split): Swap operands of MINUS.
authorDavid Edelsohn <edelsohn@mhpcc.edu>
Wed, 29 Jul 1998 19:35:05 +0000 (19:35 +0000)
committerDavid Edelsohn <dje@gcc.gnu.org>
Wed, 29 Jul 1998 19:35:05 +0000 (15:35 -0400)
        * rs6000/rs6000.md (absdi2 define_split): Swap operands of MINUS.
        * rs6000/rs6000.c (mask64_operand): Use HOST_BITS_PER_WIDE_INT.
        (print_operand, case 'B'): Don't fall through.
        (print_operand, case 'S'): Correct mask begin/end computation.
        Use HOST_BITS_PER_WIDE_INT.
        * rs6000/rs6000.h (CPP_PREDEFINES): Define _LONG_LONG.
        (CONDITIONAL_REGISTER_USAGE): GPR13 fixed if TARGET_64BIT.
        * rs6000/aix41.h (CPP_PREDEFINES): Same.
        * rs6000/aix43.h (CPP_PREDEFINES): Same.

From-SVN: r21474

gcc/ChangeLog
gcc/config/rs6000/aix41.h
gcc/config/rs6000/aix43.h
gcc/config/rs6000/rs6000.c
gcc/config/rs6000/rs6000.h
gcc/config/rs6000/rs6000.md

index 0b87938..5ea6d86 100644 (file)
@@ -1,3 +1,15 @@
+Wed Jul 29 22:18:14 1998  David Edelsohn  <edelsohn@mhpcc.edu>
+
+       * rs6000/rs6000.md (absdi2 define_split): Swap operands of MINUS.
+       * rs6000/rs6000.c (mask64_operand): Use HOST_BITS_PER_WIDE_INT.
+       (print_operand, case 'B'): Don't fall through.
+       (print_operand, case 'S'): Correct mask begin/end computation.
+       Use HOST_BITS_PER_WIDE_INT.
+       * rs6000/rs6000.h (CPP_PREDEFINES): Define _LONG_LONG.
+       (CONDITIONAL_REGISTER_USAGE): GPR13 fixed if TARGET_64BIT.
+       * rs6000/aix41.h (CPP_PREDEFINES): Same.
+       * rs6000/aix43.h (CPP_PREDEFINES): Same.
+
 Wed Jul 29 11:47:10 1998  Nick Clifton  <nickc@cygnus.com>
 
        * config/arm/thumb.md (extendqisi2_insn): Remove earlyclobber
index a7664be..b35fe93 100644 (file)
@@ -70,7 +70,7 @@ Boston, MA 02111-1307, USA.  */
 
 #undef CPP_PREDEFINES
 #define CPP_PREDEFINES "-D_IBMR2 -D_POWER -D_AIX -D_AIX32 -D_AIX41 \
--Asystem(unix) -Asystem(aix)"
+-D_LONG_LONG -Asystem(unix) -Asystem(aix)"
 
 #undef CPP_SPEC
 #define CPP_SPEC "%{posix: -D_POSIX_SOURCE}\
index fa7b716..124fc17 100644 (file)
@@ -92,7 +92,7 @@ do {                                                                  \
 
 #undef CPP_PREDEFINES
 #define CPP_PREDEFINES "-D_IBMR2 -D_POWER -D_AIX -D_AIX32 -D_AIX41 -D_AIX43 \
--Asystem(unix) -Asystem(aix)"
+-D_LONG_LONG -Asystem(unix) -Asystem(aix)"
 
 #undef CPP_SPEC
 #define CPP_SPEC "%{posix: -D_POSIX_SOURCE}\
index 98a2237..d4cb695 100644 (file)
@@ -938,7 +938,7 @@ mask64_operand (op, mode)
        if (((c >>= 1) & 1) != last_bit_value)
          last_bit_value ^= 1, transitions++;
 
-#if HOST_BITS_PER_INT == 32
+#if HOST_BITS_PER_WIDE_INT == 32
       /* Consider CONST_INT sign-extended.  */
       transitions += (last_bit_value != 1);
 #endif
@@ -949,7 +949,7 @@ mask64_operand (op, mode)
           && (mode == VOIDmode || mode == DImode))
     {
       HOST_WIDE_INT low = CONST_DOUBLE_LOW (op);
-#if HOST_BITS_PER_INT == 32
+#if HOST_BITS_PER_WIDE_INT == 32
       HOST_WIDE_INT high = CONST_DOUBLE_HIGH (op);
 #endif
       int i;
@@ -957,12 +957,12 @@ mask64_operand (op, mode)
       int transitions = 0;
 
       if ((low == 0
-#if HOST_BITS_PER_INT == 32
+#if HOST_BITS_PER_WIDE_INT == 32
          && high == 0
 #endif
           )
          || (low == ~0
-#if HOST_BITS_PER_INT == 32
+#if HOST_BITS_PER_WIDE_INT == 32
              && high == ~0
 #endif
              ))
@@ -974,7 +974,7 @@ mask64_operand (op, mode)
        if (((low >>= 1) & 1) != last_bit_value)
          last_bit_value ^= 1, transitions++;
 
-#if HOST_BITS_PER_INT == 32
+#if HOST_BITS_PER_WIDE_INT == 32
       if ((high & 1) != last_bit_value)
        last_bit_value ^= 1, transitions++;
 
@@ -2544,6 +2544,7 @@ print_operand (file, x, code)
       /* If the low-order bit is zero, write 'r'; otherwise, write 'l'
         for 64-bit mask direction.  */
       putc (((INT_LOWPART(x) & 1) == 0 ? 'r' : 'l'), file);
+      return;
 
     case 'C':
       /* This is an optional cror needed for LE or GE floating-point
@@ -2824,58 +2825,54 @@ print_operand (file, x, code)
 
       if (val & 1)      /* Clear Left */
        {
-         if (val == 1)
-           i = 0;
-         else
-           for (i = 1; i < HOST_BITS_PER_WIDE_INT; i++)
-             if (!((val >>= 1) & 1))
-               break;
+         for (i = 0; i < HOST_BITS_PER_WIDE_INT; i++)
+           if (!((val >>= 1) & 1))
+             break;
 
-#if HOST_BITS_PER_INT == 32
-       if (GET_CODE (x) == CONST_DOUBLE && i == 32)
-         {
-           val = CONST_DOUBLE_HIGH (x);
+#if HOST_BITS_PER_WIDE_INT == 32
+         if (GET_CODE (x) == CONST_DOUBLE && i == 32)
+           {
+             val = CONST_DOUBLE_HIGH (x);
 
-           if (val == 0)
-             --i;
-           else if (val == 1)
-             ;
-           else
-             for (i = 33; i < 64; i++)
-               if (!((val >>= 1) & 1))
-                 break;
-         }
+             if (val == 0)
+               --i;
+             else
+               for (i = 32; i < 64; i++)
+                 if (!((val >>= 1) & 1))
+                   break;
+           }
 #endif
+       /* i = index of last set bit from right
+          mask begins at 63 - i from left */
+         if (i > 63)
+           output_operand_lossage ("%%S computed all 1's mask");
          fprintf (file, "%d", 63 - i);
          return;
        }
       else     /* Clear Right */
        {
-         val = (GET_CODE (x) == CONST_INT ? INTVAL (x) : CONST_DOUBLE_HIGH (x));
-
-         if (val == (-1 << (HOST_BITS_PER_WIDE_INT-1)))
-           i = 0;
-         else
-           for (i = 1; i < HOST_BITS_PER_WIDE_INT; i++)
-             if ((val <<= 1) < 0)
-               break;
+         for (i = 0; i < HOST_BITS_PER_WIDE_INT; i++)
+           if ((val >>= 1) & 1)
+             break;
 
-#if HOST_BITS_PER_INT == 32
+#if HOST_BITS_PER_WIDE_INT == 32
        if (GET_CODE (x) == CONST_DOUBLE && i == 32)
          {
-           val = CONST_DOUBLE_LOW (x);
+           val = CONST_DOUBLE_HIGH (x);
 
-           if (val == 0)
+           if (val == (HOST_WIDE_INT) -1)
              --i;
-           else if (val == (-1 << (HOST_BITS_PER_WIDE_INT-1)))
-             ;
            else
-             for (i = 33; i < 64; i++)
-               if ((val <<= 1) < 0)
+             for (i = 32; i < 64; i++)
+               if ((val >>= 1) & 1)
                  break;
          }
 #endif
-         fprintf (file, "%d", i);
+       /* i = index of last clear bit from right
+          mask ends at 62 - i from left */
+         if (i > 62)
+           output_operand_lossage ("%%S computed all 0's mask");
+         fprintf (file, "%d", 62 - i);
          return;
        }
 
index 16e4acd..6aa8256 100644 (file)
@@ -26,7 +26,7 @@ Boston, MA 02111-1307, USA.  */
 
 /* Names to predefine in the preprocessor for this target machine.  */
 
-#define CPP_PREDEFINES "-D_IBMR2 -D_POWER -D_AIX -D_AIX32 \
+#define CPP_PREDEFINES "-D_IBMR2 -D_POWER -D_AIX -D_AIX32 -D_LONG_LONG \
 -Asystem(unix) -Asystem(aix) -Acpu(rs6000) -Amachine(rs6000)"
 
 /* Print subsidiary information on the compiler version in use.  */
@@ -841,12 +841,15 @@ extern int rs6000_debug_arg;              /* debug argument handling */
 /* Define this macro to change register usage conditional on target flags.
    Set MQ register fixed (already call_used) if not POWER architecture
    (RIOS1, RIOS2, RSC, and PPC601) so that it will not be allocated.
+   64-bit AIX reserves GPR13 for thread-private data.
    Conditionally disable FPRs.  */
 
 #define CONDITIONAL_REGISTER_USAGE     \
 {                                      \
   if (! TARGET_POWER)                  \
     fixed_regs[64] = 1;                        \
+  if (TARGET_64BIT)                    \
+    fixed_regs[13] = call_used_regs[13] = 1; \
   if (TARGET_SOFT_FLOAT)               \
     for (i = 32; i < 64; i++)          \
       fixed_regs[i] = call_used_regs[i] = 1; \
index 5c3cda5..d203e49 100644 (file)
   "TARGET_POWERPC64 && reload_completed"
   [(set (match_dup 2) (ashiftrt:DI (match_dup 1) (const_int 63)))
    (set (match_dup 0) (xor:DI (match_dup 2) (match_dup 1)))
-   (set (match_dup 0) (minus:DI (match_dup 2) (match_dup 0)))]
+   (set (match_dup 0) (minus:DI (match_dup 0) (match_dup 2)))]
   "")
 
 (define_insn ""