mirror of
https://github.com/NationalSecurityAgency/ghidra.git
synced 2025-10-04 10:19:23 +02:00
GP-46 fix shifts in emulator
This commit is contained in:
parent
6e487bd248
commit
34646e45dc
1 changed files with 15 additions and 6 deletions
|
@ -381,16 +381,18 @@ uintb OpBehaviorIntOr::evaluateBinary(int4 sizeout,int4 sizein,uintb in1,uintb i
|
|||
uintb OpBehaviorIntLeft::evaluateBinary(int4 sizeout,int4 sizein,uintb in1,uintb in2) const
|
||||
|
||||
{
|
||||
uintb res = (in1 << in2) & calc_mask(sizeout);
|
||||
return res;
|
||||
if (in2 >= sizeout*8){
|
||||
return 0;
|
||||
}
|
||||
uintb res = (in1 << in2) & calc_mask(sizeout);
|
||||
return res;
|
||||
}
|
||||
|
||||
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);
|
||||
|
||||
int4 sa = in;
|
||||
if (((out<<(8*sizeout-sa))&calc_mask(sizeout))!=0)
|
||||
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
|
||||
|
||||
{
|
||||
if (in2 >= sizeout*8){
|
||||
return 0;
|
||||
}
|
||||
uintb res = (in1&calc_mask(sizeout)) >> in2;
|
||||
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
|
||||
|
||||
{
|
||||
if (slot!=0)
|
||||
if ((slot!=0) || (in >= sizeout*8))
|
||||
return OpBehavior::recoverInputBinary(slot,sizeout,out,sizein,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
|
||||
|
||||
{
|
||||
if (in2 >= 8*sizeout){
|
||||
return signbit_negative(in1,sizein) ? calc_mask(sizeout) : 0;
|
||||
}
|
||||
|
||||
uintb res;
|
||||
if (signbit_negative(in1,sizein)) {
|
||||
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
|
||||
|
||||
{
|
||||
if (slot!=0)
|
||||
if ((slot!=0) || (in >= sizeout*8))
|
||||
return OpBehavior::recoverInputBinary(slot,sizeout,out,sizein,in);
|
||||
|
||||
int4 sa = in;
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue