mirror of
https://github.com/NationalSecurityAgency/ghidra.git
synced 2025-10-04 18:29:37 +02:00
adjustments to pushForward
This commit is contained in:
parent
cbd385fb0b
commit
fa37bf940e
1 changed files with 38 additions and 4 deletions
|
@ -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;
|
||||||
}
|
}
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue