adjustments to pushForward

This commit is contained in:
caheckman 2019-06-07 15:50:57 -04:00
parent cbd385fb0b
commit fa37bf940e

View file

@ -1084,13 +1084,14 @@ bool CircleRange::pushForwardUnary(OpCode opc,const CircleRange &in1,int4 inSize
isempty = false; isempty = false;
step = in1.step; step = in1.step;
mask = calc_mask(outSize); mask = calc_mask(outSize);
if (in1.right < in1.left) { // Extending causes 2 pieces left = in1.left;
right = (in1.right - in1.step) & in1.mask;
if (right < left) { // Extending causes 2 pieces
left = 0; left = 0;
right = in1.mask; right = in1.mask;
} }
else { else {
left = in1.left; right += step; // Impossible for it to wrap with bigger mask
right = in1.right;
} }
break; break;
case CPUI_INT_SEXT: case CPUI_INT_SEXT:
@ -1098,12 +1099,14 @@ bool CircleRange::pushForwardUnary(OpCode opc,const CircleRange &in1,int4 inSize
step = in1.step; step = in1.step;
mask = calc_mask(outSize); mask = calc_mask(outSize);
left = sign_extend(in1.left, inSize, outSize); left = sign_extend(in1.left, inSize, outSize);
right = sign_extend(in1.right, inSize, outSize); right = sign_extend((in1.right - in1.step)&in1.mask, inSize, outSize);
if ((intb)right < (intb)left) { if ((intb)right < (intb)left) {
right = calc_mask(inSize); right = calc_mask(inSize);
left = calc_mask(outSize) ^ right; left = calc_mask(outSize) ^ right;
right += 1; right += 1;
} }
else
right += step;
break; break;
case CPUI_INT_2COMP: case CPUI_INT_2COMP:
isempty = false; isempty = false;
@ -1121,6 +1124,14 @@ bool CircleRange::pushForwardUnary(OpCode opc,const CircleRange &in1,int4 inSize
right = -in1.left & mask; right = -in1.left & mask;
normalize(); normalize();
break; break;
case CPUI_BOOL_NEGATE:
case CPUI_FLOAT_NAN:
isempty = false;
mask = 0xff;
step = 1;
left = 0;
right = 2;
break;
default: default:
return false; return false;
} }
@ -1298,6 +1309,29 @@ bool CircleRange::pushForwardBinary(OpCode opc,const CircleRange &in1,const Circ
right = (left + 1)&mask; right = (left + 1)&mask;
break; break;
} }
case CPUI_INT_EQUAL:
case CPUI_INT_NOTEQUAL:
case CPUI_INT_SLESS:
case CPUI_INT_SLESSEQUAL:
case CPUI_INT_LESS:
case CPUI_INT_LESSEQUAL:
case CPUI_INT_CARRY:
case CPUI_INT_SCARRY:
case CPUI_INT_SBORROW:
case CPUI_BOOL_XOR:
case CPUI_BOOL_AND:
case CPUI_BOOL_OR:
case CPUI_FLOAT_EQUAL:
case CPUI_FLOAT_NOTEQUAL:
case CPUI_FLOAT_LESS:
case CPUI_FLOAT_LESSEQUAL:
// Ops with boolean outcome. We don't try to eliminate outcomes here.
isempty = false;
mask = 0xff;
step = 1;
left = 0; // Both true and false are possible
right = 2;
break;
default: default:
return false; return false;
} }