]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
libgcc: Fix BIL_TYPE_SIZE == 32 support in _BitInt <-> dfp support
authorJakub Jelinek <jakub@redhat.com>
Sat, 10 Feb 2024 11:50:52 +0000 (12:50 +0100)
committerJakub Jelinek <jakub@redhat.com>
Sat, 10 Feb 2024 11:50:52 +0000 (12:50 +0100)
I've tried last night to enable _BitInt support for i?86-linux, and
a few spots in libgcc emitted -Wshift-count-overflow warnings and clearly
didn't do what it was supposed to do.

Fixed thusly.

2024-02-10  Jakub Jelinek  <jakub@redhat.com>

* soft-fp/fixddbitint.c (__bid_fixddbitint): Fix up
BIL_TYPE_SIZE == 32 shifts.
* soft-fp/fixsdbitint.c (__bid_fixsdbitint): Likewise.
* soft-fp/fixtdbitint.c (__bid_fixtdbitint): Likewise.
* soft-fp/floatbitintdd.c (__bid_floatbitintdd): Likewise.
* soft-fp/floatbitinttd.c (__bid_floatbitinttd): Likewise.

libgcc/soft-fp/fixddbitint.c
libgcc/soft-fp/fixsdbitint.c
libgcc/soft-fp/fixtdbitint.c
libgcc/soft-fp/floatbitintdd.c
libgcc/soft-fp/floatbitinttd.c

index bd212aec96875080eac50521ed33580d3e62fd1a..7b0162e9058a1d6154bddb5d86eb3adc3dbcb994 100644 (file)
@@ -103,7 +103,7 @@ __bid_fixddbitint (UBILtype *r, SItype rprec, _Decimal64 a)
 #if BIL_TYPE_SIZE == 64
       d = limbs[0];
 #elif BIL_TYPE_SIZE == 32
-      d = (limbs[BITINT_END (0, 1)] << 32) | limbs[BITINT_END (1, 0)];
+      d = (UDItype) limbs[BITINT_END (0, 1)] << 32 | limbs[BITINT_END (1, 0)];
 #else
 # error Unsupported BIL_TYPE_SIZE
 #endif
index 98e3ab9f13a3ccbe3e9e2cc3c826c23f15219b46..2ba550ff99fe96d7aeb16fa3f224a153d6343918 100644 (file)
@@ -104,7 +104,7 @@ __bid_fixsdbitint (UBILtype *r, SItype rprec, _Decimal32 a)
 #if BIL_TYPE_SIZE == 64
       d = limbs[0];
 #elif BIL_TYPE_SIZE == 32
-      d = (limbs[BITINT_END (0, 1)] << 32) | limbs[BITINT_END (1, 0)];
+      d = (UDItype) limbs[BITINT_END (0, 1)] << 32 | limbs[BITINT_END (1, 0)];
 #else
 # error Unsupported BIL_TYPE_SIZE
 #endif
index 6d33ec2a05d15465c057af10a53be9429085fbbe..66aca1cbdcce2e704f68445061bfd3259a85eacc 100644 (file)
@@ -126,9 +126,9 @@ __bid_fixtdbitint (UBILtype *r, SItype rprec, _Decimal128 a)
       mantissalo = limbs[BITINT_END (5, 4)];
       rem = limbs[6] | limbs[7];
 #elif BIL_TYPE_SIZE == 32
-      mantissahi = limbs[BITINT_END (8, 11)] << 32;
+      mantissahi = (UDItype) limbs[BITINT_END (8, 11)] << 32;
       mantissahi |= limbs[BITINT_END (9, 10)];
-      mantissalo = limbs[BITINT_END (10, 9)] << 32;
+      mantissalo = (UDItype) limbs[BITINT_END (10, 9)] << 32;
       mantissalo |= limbs[BITINT_END (11, 8)];
       rem = limbs[12] | limbs[13] | limbs[14] | limbs[15];
 #endif
index 0fcc845e1fdd786adf6ec1a82baf79eddbc6f3e4..77c5fd75e0e3db6ac163e5af3271c0f45dbce890 100644 (file)
@@ -132,7 +132,7 @@ __bid_floatbitintdd (const UBILtype *i, SItype iprec)
 #if BIL_TYPE_SIZE == 64
       m = buf[BITINT_END (1, 0)];
 #elif BIL_TYPE_SIZE == 32
-      m = ((UDItype) buf[1] << 32) | buf[BITINT_END (2, 0)];
+      m = (UDItype) buf[1] << 32 | buf[BITINT_END (2, 0)];
 #else
 # error Unsupported BIL_TYPE_SIZE
 #endif
@@ -212,7 +212,8 @@ __bid_floatbitintdd (const UBILtype *i, SItype iprec)
          mantissa = buf[q_limbs + pow10_limbs * 2 + 1];
 #else
          mantissa
-           = ((buf[q_limbs + pow10_limbs * 2 + 1 + BITINT_END (0, 1)] << 32)
+           = ((UDItype)
+              buf[q_limbs + pow10_limbs * 2 + 1 + BITINT_END (0, 1)] << 32
               | buf[q_limbs + pow10_limbs * 2 + 1 + BITINT_END (1, 0)]);
 #endif
        }
@@ -220,8 +221,7 @@ __bid_floatbitintdd (const UBILtype *i, SItype iprec)
 #if BIL_TYPE_SIZE == 64
        mantissa = buf[BITINT_END (1, 0)];
 #else
-       mantissa
-         = ((buf[1] << 32) | buf[BITINT_END (2, 0)]);
+       mantissa = (UDItype) buf[1] << 32 | buf[BITINT_END (2, 0)];
 #endif
     }
   else
@@ -232,7 +232,7 @@ __bid_floatbitintdd (const UBILtype *i, SItype iprec)
       if (in == 1)
        mantissa = iprec < 0 ? (UDItype) (BILtype) msb : (UDItype) msb;
       else
-       mantissa = ((msb << 32) | i[BITINT_END (1, 0)]);
+       mantissa = (UDItype) msb << 32 | i[BITINT_END (1, 0)];
 #endif
       if (iprec < 0)
        mantissa = -mantissa;
index 329ce1b2844e786d1c8afbfec1203272257bf947..3bc18e20102197b6b1fa278c64b7b46e75b03ed3 100644 (file)
@@ -196,10 +196,12 @@ __bid_floatbitinttd (const UBILtype *i, SItype iprec)
          mantissalo = buf[q_limbs + pow10_limbs * 2 + 1 + BITINT_END (1, 0)];
 #else
          mantissahi
-           = ((buf[q_limbs + pow10_limbs * 2 + 1 + BITINT_END (0, 3)] << 32)
+           = ((UDItype)
+              buf[q_limbs + pow10_limbs * 2 + 1 + BITINT_END (0, 3)] << 32
               | buf[q_limbs + pow10_limbs * 2 + 1 + BITINT_END (1, 2)]);
          mantissalo
-           = ((buf[q_limbs + pow10_limbs * 2 + 1 + BITINT_END (2, 1)] << 32)
+           = ((UDItype)
+              buf[q_limbs + pow10_limbs * 2 + 1 + BITINT_END (2, 1)] << 32
               | buf[q_limbs + pow10_limbs * 2 + 1 + BITINT_END (3, 0)]);
 #endif
        }
@@ -209,8 +211,10 @@ __bid_floatbitinttd (const UBILtype *i, SItype iprec)
          mantissahi = buf[BITINT_END (0, 1)];
          mantissalo = buf[BITINT_END (1, 0)];
 #else
-         mantissahi = (buf[BITINT_END (0, 3)] << 32) | buf[BITINT_END (1, 2)];
-         mantissalo = (buf[BITINT_END (2, 1)] << 32) | buf[BITINT_END (3, 0)];
+         mantissahi = ((UDItype) buf[BITINT_END (0, 3)] << 32
+                       | buf[BITINT_END (1, 2)]);
+         mantissalo = ((UDItype) buf[BITINT_END (2, 1)] << 32
+                       | buf[BITINT_END (3, 0)]);
 #endif
        }
     }
@@ -231,15 +235,15 @@ __bid_floatbitinttd (const UBILtype *i, SItype iprec)
          if (in == 1)
            mantissalo = iprec < 0 ? (UDItype) (BILtype) msb : (UDItype) msb;
          else
-           mantissalo = (msb << 32) | i[BITINT_END (1, 0)];
+           mantissalo = (UDItype) msb << 32 | i[BITINT_END (1, 0)];
        }
       else
        {
          if (in == 3)
            mantissahi = iprec < 0 ? (UDItype) (BILtype) msb : (UDItype) msb;
          else
-           mantissahi = (msb << 32) | i[BITINT_END (1, 2)];
-         mantissalo = ((i[BITINT_END (in - 2, 1)] << 32)
+           mantissahi = (UDItype) msb << 32 | i[BITINT_END (1, 2)];
+         mantissalo = ((UDItype) i[BITINT_END (in - 2, 1)] << 32
                        | i[BITINT_END (in - 1, 0)]);
        }
 #endif