dev-arm: Correct cast of template parameter
authorAndrea Mondelli <Andrea.Mondelli@ucf.edu>
Thu, 14 Mar 2019 22:20:54 +0000 (18:20 -0400)
committerAndrea Mondelli <Andrea.Mondelli@ucf.edu>
Mon, 1 Apr 2019 15:55:58 +0000 (15:55 +0000)
Clang with -Wconstant-conversion is _very_ restrictive on casting.
The shift operator results in an incorrect promotion.

This patch add a compile-time static cast that remove the error
when clang is used.

Change-Id: I3aa1e77da2565799feadc32317d5faa111b2de86
Reviewed-on: https://gem5-review.googlesource.com/c/public/gem5/+/17308
Reviewed-by: Giacomo Travaglini <giacomo.travaglini@arm.com>
Maintainer: Andreas Sandberg <andreas.sandberg@arm.com>

src/arch/arm/isa/insts/sve.isa
src/base/bitfield.hh

index 647ceafe36166694751dc9090180923fa5591e21..e5e9e245045e2f3e67bdced7209a6ca0269b3d9b 100644 (file)
@@ -4278,7 +4278,9 @@ let {{
             bool negSrc1 = (srcElem1 < 0);
             bool negSrc2 = (srcElem2 < 0);
             if ((negDest != negSrc1) && (negSrc1 == negSrc2)) {
-                destElem = (Element)1 << (sizeof(Element) * 8 - 1);
+                destElem = static_cast<Element>(
+                    (Element)1 << (sizeof(Element) * 8 - 1)
+                    );
                 if (negDest)
                     destElem -= 1;
             }
@@ -4293,7 +4295,9 @@ let {{
         bool negSrc = (srcElem1 < 0);
         bool posCount = ((count * imm) >= 0);
         if ((negDest != negSrc) && (negSrc == posCount)) {
-            destElem = (%(dstType)s)1 << (sizeof(%(dstType)s) * 8 - 1);
+            destElem = static_cast<%(dstType)s>(
+                (%(dstType)s)1 << (sizeof(%(dstType)s) * 8 - 1)
+                );
             if (negDest)
                 destElem -= 1;
         }
@@ -4350,7 +4354,9 @@ let {{
         bool negSrc = (srcElem1 < 0);
         bool negCount = ((count * imm) < 0);
         if ((negDest != negSrc) && (negSrc == negCount)) {
-            destElem = (%(dstType)s)1 << (sizeof(%(dstType)s) * 8 - 1);
+            destElem = static_cast<%(dstType)s>(
+                (%(dstType)s)1 << (sizeof(%(dstType)s) * 8 - 1)
+                );
             if (negDest)
                 destElem -= 1;
         }
@@ -4407,7 +4413,9 @@ let {{
         bool negSrc1 = (srcElem1 < 0);
         bool posSrc2 = (srcElem2 >= 0);
         if ((negDest != negSrc1) && (negSrc1 == posSrc2)) {
-            destElem = (Element)1 << (sizeof(Element) * 8 - 1);
+            destElem = static_cast<Element>(
+                (Element)1 << (sizeof(Element) * 8 - 1)
+                );
             if (negDest)
                 destElem -= 1;
         }
index d696715b3006536edbc759dc3f44c372c48425ea..ec1ffce501c3bbcd1ccd5b732f5f0ad138ea660d 100644 (file)
@@ -182,7 +182,7 @@ reverseBits(T val, std::size_t size = sizeof(T))
     assert(size <= sizeof(T));
 
     T output = 0;
-    for (auto byte = 0; byte < size; byte++, val >>= 8) {
+    for (auto byte = 0; byte < size; byte++, val = static_cast<T>(val >> 8)) {
         output = (output << 8) | reverseLookUpTable[val & 0xFF];
     }