~mcf/qbe

055e7a7cf74defaee32a5e3e17cb91ec70da144c — Michael Forney 9 months ago dbd4c01
fold: Make sure 32-bit constants get sign extended when necessary
2 files changed, 28 insertions(+), 3 deletions(-)

M fold.c
A test/fold1.ssa
M fold.c => fold.c +3 -3
@@ 371,15 371,15 @@ foldint(Con *res, int op, int w, Con *cl, Con *cr)
	switch (op) {
	case Oadd:  x = l.u + r.u; break;
	case Osub:  x = l.u - r.u; break;
	case Odiv:  x = l.s / r.s; break;
	case Orem:  x = l.s % r.s; 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 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 = l.s >> (r.u & 63); 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 Oshl:  x = l.u << (r.u & 63); break;
	case Oextsb: x = (int8_t)l.u;   break;

A test/fold1.ssa => test/fold1.ssa +25 -0
@@ 0,0 1,25 @@
export
function w $f1() {
@start
	%x =w sar 2147483648, 31
	ret %x
}

export
function w $f2() {
@start
	%x =w div 4294967040, 8  # -256 / 8
	ret %x
}

export
function w $f3() {
@start
	%x =w rem 4294967284, 7  # -12 % 7
	ret %x
}

# >>> driver
# extern int f1(), f2(), f3();
# int main() { return !(f1() == -1 && f2() == -32 && f3() == -5); }
# <<<