gas signed overflow fixes
[deliverable/binutils-gdb.git] / gas / config / tc-riscv.c
index 055d80c3444431d5b3305f72970fb96958cde4b4..7ec1028b283657687c577e2325b6c5f7bfe90d0d 100644 (file)
@@ -1043,9 +1043,9 @@ static void
 load_const (int reg, expressionS *ep)
 {
   int shift = RISCV_IMM_BITS;
-  bfd_vma upper_imm;
+  bfd_vma upper_imm, sign = (bfd_vma) 1 << (RISCV_IMM_BITS - 1);
   expressionS upper = *ep, lower = *ep;
-  lower.X_add_number = (int32_t) ep->X_add_number << (32-shift) >> (32-shift);
+  lower.X_add_number = ((ep->X_add_number & (sign + sign - 1)) ^ sign) - sign;
   upper.X_add_number -= lower.X_add_number;
 
   if (ep->X_op != O_constant)
This page took 0.02635 seconds and 4 git commands to generate.