|
|
@ -619,23 +619,29 @@ class Instruction: |
|
|
|
:param global_state: |
|
|
|
:param global_state: |
|
|
|
:return: |
|
|
|
:return: |
|
|
|
""" |
|
|
|
""" |
|
|
|
state = global_state.mstate |
|
|
|
mstate = global_state.mstate |
|
|
|
s0, s1 = state.stack.pop(), state.stack.pop() |
|
|
|
s0, s1 = mstate.stack.pop(), mstate.stack.pop() |
|
|
|
|
|
|
|
|
|
|
|
try: |
|
|
|
try: |
|
|
|
s0 = util.get_concrete_int(s0) |
|
|
|
s0 = util.get_concrete_int(s0) |
|
|
|
s1 = util.get_concrete_int(s1) |
|
|
|
s1 = util.get_concrete_int(s1) |
|
|
|
except TypeError: |
|
|
|
except TypeError: |
|
|
|
return [] |
|
|
|
log.debug("Unsupported symbolic argument for SIGNEXTEND") |
|
|
|
|
|
|
|
mstate.stack.append( |
|
|
|
|
|
|
|
global_state.new_bitvec( |
|
|
|
|
|
|
|
"SIGNEXTEND({},{})".format(hash(s0), hash(s1)), 256 |
|
|
|
|
|
|
|
) |
|
|
|
|
|
|
|
) |
|
|
|
|
|
|
|
return [global_state] |
|
|
|
|
|
|
|
|
|
|
|
if s0 <= 31: |
|
|
|
if s0 <= 31: |
|
|
|
testbit = s0 * 8 + 7 |
|
|
|
testbit = s0 * 8 + 7 |
|
|
|
if s1 & (1 << testbit): |
|
|
|
if s1 & (1 << testbit): |
|
|
|
state.stack.append(s1 | (TT256 - (1 << testbit))) |
|
|
|
mstate.stack.append(s1 | (TT256 - (1 << testbit))) |
|
|
|
else: |
|
|
|
else: |
|
|
|
state.stack.append(s1 & ((1 << testbit) - 1)) |
|
|
|
mstate.stack.append(s1 & ((1 << testbit) - 1)) |
|
|
|
else: |
|
|
|
else: |
|
|
|
state.stack.append(s1) |
|
|
|
mstate.stack.append(s1) |
|
|
|
|
|
|
|
|
|
|
|
return [global_state] |
|
|
|
return [global_state] |
|
|
|
|
|
|
|
|
|
|
|