diff options
Diffstat (limited to 'src/pkg/runtime/arm/vlrt.c')
-rwxr-xr-x | src/pkg/runtime/arm/vlrt.c | 12 |
1 files changed, 9 insertions, 3 deletions
diff --git a/src/pkg/runtime/arm/vlrt.c b/src/pkg/runtime/arm/vlrt.c index 276a91f20..8e3aa624c 100755 --- a/src/pkg/runtime/arm/vlrt.c +++ b/src/pkg/runtime/arm/vlrt.c @@ -291,9 +291,15 @@ _divv(Vlong *q, Vlong n, Vlong d) long nneg, dneg; if(n.hi == (((long)n.lo)>>31) && d.hi == (((long)d.lo)>>31)) { - q->lo = (long)n.lo / (long)d.lo; - q->hi = ((long)q->lo) >> 31; - return; + if((long)n.lo == -0x80000000 && (long)d.lo == -1) { + // special case: 32-bit -0x80000000 / -1 causes wrong sign + q->lo = 0x80000000; + q->hi = 0; + return; + } + q->lo = (long)n.lo / (long)d.lo; + q->hi = ((long)q->lo) >> 31; + return; } nneg = n.hi >> 31; if(nneg) |