ubsan: tc-mips.c:9606 shift exponent 32 is too large
authorAlan Modra <amodra@gmail.com>
Wed, 2 Sep 2020 00:50:53 +0000 (10:20 +0930)
committerAlan Modra <amodra@gmail.com>
Wed, 2 Sep 2020 07:00:43 +0000 (16:30 +0930)
* config/tc-mips.c (load_register): Avoid too large shift.

gas/ChangeLog
gas/config/tc-mips.c

index 052c9541ff9ca45e5484e6344eeab8c8b845a970..fece8b594120e4bfa1b1b03b977dcbddc10bfd76 100644 (file)
@@ -1,3 +1,7 @@
+2020-09-02  Alan Modra  <amodra@gmail.com>
+
+       * config/tc-mips.c (load_register): Avoid too large shift.
+
 2020-09-02  Alan Modra  <amodra@gmail.com>
 
        * config/tc-d30v.c (parallel_ok): Use 1UL for left shift expression.
index 7d0d5a1991845bef354ac01cfbe96df5968787ef..81e2370eee6826b161b0673a3573da5f76072586 100644 (file)
@@ -9603,8 +9603,11 @@ load_register (int reg, expressionS *ep, int dbl)
              lo >>= 1;
              ++bit;
            }
-         lo |= (hi & (((unsigned long) 1 << bit) - 1)) << (32 - bit);
-         hi >>= bit;
+         if (bit != 0)
+           {
+             lo |= (hi & ((2UL << (bit - 1)) - 1)) << (32 - bit);
+             hi >>= bit;
+           }
        }
       else
        {