Merge remote-tracking branch 'origin/GP-46_James_emulator_shifts'

This commit is contained in:
ghidravore 2020-08-18 18:35:17 -04:00
commit c3d3547249

View file

@ -381,6 +381,9 @@ uintb OpBehaviorIntOr::evaluateBinary(int4 sizeout,int4 sizein,uintb in1,uintb i
uintb OpBehaviorIntLeft::evaluateBinary(int4 sizeout,int4 sizein,uintb in1,uintb in2) const uintb OpBehaviorIntLeft::evaluateBinary(int4 sizeout,int4 sizein,uintb in1,uintb in2) const
{ {
if (in2 >= sizeout*8){
return 0;
}
uintb res = (in1 << in2) & calc_mask(sizeout); uintb res = (in1 << in2) & calc_mask(sizeout);
return res; return res;
} }
@ -388,9 +391,8 @@ uintb OpBehaviorIntLeft::evaluateBinary(int4 sizeout,int4 sizein,uintb in1,uintb
uintb OpBehaviorIntLeft::recoverInputBinary(int4 slot,int4 sizeout,uintb out,int4 sizein,uintb in) const uintb OpBehaviorIntLeft::recoverInputBinary(int4 slot,int4 sizeout,uintb out,int4 sizein,uintb in) const
{ {
if (slot!=0) if ((slot!=0) || (in >= sizeout*8))
return OpBehavior::recoverInputBinary(slot,sizeout,out,sizein,in); return OpBehavior::recoverInputBinary(slot,sizeout,out,sizein,in);
int4 sa = in; int4 sa = in;
if (((out<<(8*sizeout-sa))&calc_mask(sizeout))!=0) if (((out<<(8*sizeout-sa))&calc_mask(sizeout))!=0)
throw EvaluationError("Output is not in range of left shift operation"); throw EvaluationError("Output is not in range of left shift operation");
@ -400,6 +402,9 @@ uintb OpBehaviorIntLeft::recoverInputBinary(int4 slot,int4 sizeout,uintb out,int
uintb OpBehaviorIntRight::evaluateBinary(int4 sizeout,int4 sizein,uintb in1,uintb in2) const uintb OpBehaviorIntRight::evaluateBinary(int4 sizeout,int4 sizein,uintb in1,uintb in2) const
{ {
if (in2 >= sizeout*8){
return 0;
}
uintb res = (in1&calc_mask(sizeout)) >> in2; uintb res = (in1&calc_mask(sizeout)) >> in2;
return res; return res;
} }
@ -407,7 +412,7 @@ uintb OpBehaviorIntRight::evaluateBinary(int4 sizeout,int4 sizein,uintb in1,uint
uintb OpBehaviorIntRight::recoverInputBinary(int4 slot,int4 sizeout,uintb out,int4 sizein,uintb in) const uintb OpBehaviorIntRight::recoverInputBinary(int4 slot,int4 sizeout,uintb out,int4 sizein,uintb in) const
{ {
if (slot!=0) if ((slot!=0) || (in >= sizeout*8))
return OpBehavior::recoverInputBinary(slot,sizeout,out,sizein,in); return OpBehavior::recoverInputBinary(slot,sizeout,out,sizein,in);
int4 sa = in; int4 sa = in;
@ -419,6 +424,10 @@ uintb OpBehaviorIntRight::recoverInputBinary(int4 slot,int4 sizeout,uintb out,in
uintb OpBehaviorIntSright::evaluateBinary(int4 sizeout,int4 sizein,uintb in1,uintb in2) const uintb OpBehaviorIntSright::evaluateBinary(int4 sizeout,int4 sizein,uintb in1,uintb in2) const
{ {
if (in2 >= 8*sizeout){
return signbit_negative(in1,sizein) ? calc_mask(sizeout) : 0;
}
uintb res; uintb res;
if (signbit_negative(in1,sizein)) { if (signbit_negative(in1,sizein)) {
res = in1 >> in2; res = in1 >> in2;
@ -435,7 +444,7 @@ uintb OpBehaviorIntSright::evaluateBinary(int4 sizeout,int4 sizein,uintb in1,uin
uintb OpBehaviorIntSright::recoverInputBinary(int4 slot,int4 sizeout,uintb out,int4 sizein,uintb in) const uintb OpBehaviorIntSright::recoverInputBinary(int4 slot,int4 sizeout,uintb out,int4 sizein,uintb in) const
{ {
if (slot!=0) if ((slot!=0) || (in >= sizeout*8))
return OpBehavior::recoverInputBinary(slot,sizeout,out,sizein,in); return OpBehavior::recoverInputBinary(slot,sizeout,out,sizein,in);
int4 sa = in; int4 sa = in;