diff --git a/ethutil/big.go b/ethutil/big.go
index bdcf86421fc9fb1c7987a4f4417d732880ce7b6e..8d7b3fe70e918a748e383c1dc3f1db686db67370 100644
--- a/ethutil/big.go
+++ b/ethutil/big.go
@@ -34,6 +34,10 @@ func BigD(data []byte) *big.Int {
 	return n
 }
 
+func BitTest(num *big.Int, i int) bool {
+	return num.Bit(i) > 0
+}
+
 // To256
 //
 // "cast" the big int to a 256 big int (i.e., limit to)
diff --git a/vm/vm_debug.go b/vm/vm_debug.go
index 0abfa098d045a1bf2a94307a602b30dc50a39be9..129ea1a59061465d6a36fd15886376d8590065a7 100644
--- a/vm/vm_debug.go
+++ b/vm/vm_debug.go
@@ -392,6 +392,20 @@ func (self *DebugVm) RunClosure(closure *Closure) (ret []byte, err error) {
 			self.Printf(" = %v", base)
 
 			stack.Push(base)
+		case SIGNEXTEND:
+			back := stack.Pop().Uint64()
+			if back.Cmp(big.NewInt(31)) < 0 {
+				bit := uint(back*8 + 7)
+				num := stack.Pop()
+				mask := new(big.Int).Lsh(ethutil.Big1, bit)
+				mask.Sub(mask, ethutil.Big1)
+				if ethutil.BitTest(num, int(bit)) {
+					num.Or(num, mask.Not(mask))
+				} else {
+					num.And(num, mask)
+				}
+				stack.Push(num)
+			}
 		case NOT:
 			base.Sub(Pow256, stack.Pop()).Sub(base, ethutil.Big1)