Aarch64 sim fix for gcc-10 miscompilation.
authorJim Wilson <jimw@sifive.com>
Thu, 8 Apr 2021 01:51:52 +0000 (18:51 -0700)
committerJim Wilson <jimw@sifive.com>
Thu, 8 Apr 2021 01:51:52 +0000 (18:51 -0700)
This fixes a problem that occurs when compiled by gcc-10, as the code
is relying on undefined overflow behavior.  This is fixed by replacing
compares between 32-bit and 64-bit results with compares that just use
the 64-bit results with a cast.

PR sim/27483
* simulator.c (set_flags_for_add32): Compare uresult against
itself.  Compare sresult against itself.

sim/aarch64/ChangeLog
sim/aarch64/simulator.c

index e667c47533544387002b52ab69fb788e666a4971..d328fcddf6e4856132767990d8787da03d5a95c3 100644 (file)
@@ -1,3 +1,9 @@
+2021-04-07  Jim Wilson  <jimw@sifive.com>
+
+       PR sim/27483
+       * simulator.c (set_flags_for_add32): Compare uresult against
+       itself.  Compare sresult against itself.
+
 2021-04-02  Mike Frysinger  <vapier@gentoo.org>
 
        * aclocal.m4, configure: Regenerate.
index 6ba29a0ed57b7dd8c89291422a0a3e2599a03ad0..e0b428d26d9e474f87cb54dd9bb408f0cb8a59bd 100644 (file)
@@ -1650,10 +1650,10 @@ set_flags_for_add32 (sim_cpu *cpu, int32_t value1, int32_t value2)
   if (result & (1 << 31))
     flags |= N;
 
-  if (uresult != (uint32_t)result)
+  if (uresult != (uint32_t)uresult)
     flags |= C;
 
-  if (sresult != result)
+  if (sresult != (int32_t)sresult)
     flags |= V;
 
   aarch64_set_CPSR (cpu, flags);