diff options
-rw-r--r-- | fold.c | 6 | ||||
-rw-r--r-- | test/fold1.ssa | 26 |
2 files changed, 27 insertions, 5 deletions
diff --git a/fold.c b/fold.c index 521c911..0a3945f 100644 --- a/fold.c +++ b/fold.c @@ -373,14 +373,14 @@ foldint(Con *res, int op, int w, Con *cl, Con *cr) case Osub: x = l.u - r.u; break; case Odiv: x = w ? l.s / r.s : (int32_t)l.s / (int32_t)r.s; break; case Orem: x = w ? l.s % r.s : (int32_t)l.s % (int32_t)r.s; break; - case Oudiv: x = l.u / r.u; break; - case Ourem: x = l.u % r.u; break; + case Oudiv: x = w ? l.u / r.u : (uint32_t)l.u / (uint32_t)r.u; break; + case Ourem: x = w ? l.u % r.u : (uint32_t)l.u % (uint32_t)r.u; break; case Omul: x = l.u * r.u; break; case Oand: x = l.u & r.u; break; case Oor: x = l.u | r.u; break; case Oxor: x = l.u ^ r.u; break; case Osar: x = (w ? l.s : (int32_t)l.s) >> (r.u & 63); break; - case Oshr: x = l.u >> (r.u & 63); break; + case Oshr: x = (w ? l.u : (uint32_t)l.u) >> (r.u & 63); break; case Oshl: x = l.u << (r.u & 63); break; case Oextsb: x = (int8_t)l.u; break; case Oextub: x = (uint8_t)l.u; break; diff --git a/test/fold1.ssa b/test/fold1.ssa index 0ee2f91..9fb5d71 100644 --- a/test/fold1.ssa +++ b/test/fold1.ssa @@ -19,7 +19,29 @@ function w $f3() { ret %x } +export +function w $f4() { +@start + %x =w shr 4294967296, 1 # 2^32 >> 1 + ret %x +} + +export +function w $f5() { +@start + %x =w udiv 1, 4294967297 # 1 / (2^32 + 1) + ret %x +} + +export +function w $f6() { +@start + %x =w urem 4294967296, 7 # 2^32 % 7 + ret %x +} + # >>> driver -# extern int f1(), f2(), f3(); -# int main() { return !(f1() == -1 && f2() == -32 && f3() == -5); } +# extern int f1(), f2(), f3(), f4(), f5(), f6(); +# int main() { return !(f1() == -1 && f2() == -32 && f3() == -5 && +# f4() == 0 && f5() == 1 && f6() == 0); } # <<< |