mirror of
https://github.com/nspcc-dev/neo-go.git
synced 2025-01-11 11:20:38 +00:00
vm: implement SQRT opcode
This commit is contained in:
parent
6496782736
commit
d255c4a517
5 changed files with 59 additions and 38 deletions
|
@ -163,6 +163,7 @@ var coefficients = map[opcode.Opcode]int64{
|
||||||
opcode.DIV: 1 << 3,
|
opcode.DIV: 1 << 3,
|
||||||
opcode.MOD: 1 << 3,
|
opcode.MOD: 1 << 3,
|
||||||
opcode.POW: 1 << 6,
|
opcode.POW: 1 << 6,
|
||||||
|
opcode.SQRT: 1 << 11,
|
||||||
opcode.SHL: 1 << 3,
|
opcode.SHL: 1 << 3,
|
||||||
opcode.SHR: 1 << 3,
|
opcode.SHR: 1 << 3,
|
||||||
opcode.NOT: 1 << 2,
|
opcode.NOT: 1 << 2,
|
||||||
|
|
|
@ -178,6 +178,7 @@ const (
|
||||||
DIV Opcode = 0xA1
|
DIV Opcode = 0xA1
|
||||||
MOD Opcode = 0xA2
|
MOD Opcode = 0xA2
|
||||||
POW Opcode = 0xA3
|
POW Opcode = 0xA3
|
||||||
|
SQRT Opcode = 0xA4
|
||||||
SHL Opcode = 0xA8
|
SHL Opcode = 0xA8
|
||||||
SHR Opcode = 0xA9
|
SHR Opcode = 0xA9
|
||||||
NOT Opcode = 0xAA
|
NOT Opcode = 0xAA
|
||||||
|
|
|
@ -160,6 +160,7 @@ func _() {
|
||||||
_ = x[DIV-161]
|
_ = x[DIV-161]
|
||||||
_ = x[MOD-162]
|
_ = x[MOD-162]
|
||||||
_ = x[POW-163]
|
_ = x[POW-163]
|
||||||
|
_ = x[SQRT-164]
|
||||||
_ = x[SHL-168]
|
_ = x[SHL-168]
|
||||||
_ = x[SHR-169]
|
_ = x[SHR-169]
|
||||||
_ = x[NOT-170]
|
_ = x[NOT-170]
|
||||||
|
@ -199,7 +200,7 @@ func _() {
|
||||||
_ = x[CONVERT-219]
|
_ = x[CONVERT-219]
|
||||||
}
|
}
|
||||||
|
|
||||||
const _Opcode_name = "PUSHINT8PUSHINT16PUSHINT32PUSHINT64PUSHINT128PUSHINT256PUSHAPUSHNULLPUSHDATA1PUSHDATA2PUSHDATA4PUSHM1PUSH0PUSH1PUSH2PUSH3PUSH4PUSH5PUSH6PUSH7PUSH8PUSH9PUSH10PUSH11PUSH12PUSH13PUSH14PUSH15PUSH16NOPJMPJMP_LJMPIFJMPIF_LJMPIFNOTJMPIFNOT_LJMPEQJMPEQ_LJMPNEJMPNE_LJMPGTJMPGT_LJMPGEJMPGE_LJMPLTJMPLT_LJMPLEJMPLE_LCALLCALL_LCALLACALLTABORTASSERTTHROWTRYTRY_LENDTRYENDTRY_LENDFINALLYRETSYSCALLDEPTHDROPNIPXDROPCLEARDUPOVERPICKTUCKSWAPROTROLLREVERSE3REVERSE4REVERSENINITSSLOTINITSLOTLDSFLD0LDSFLD1LDSFLD2LDSFLD3LDSFLD4LDSFLD5LDSFLD6LDSFLDSTSFLD0STSFLD1STSFLD2STSFLD3STSFLD4STSFLD5STSFLD6STSFLDLDLOC0LDLOC1LDLOC2LDLOC3LDLOC4LDLOC5LDLOC6LDLOCSTLOC0STLOC1STLOC2STLOC3STLOC4STLOC5STLOC6STLOCLDARG0LDARG1LDARG2LDARG3LDARG4LDARG5LDARG6LDARGSTARG0STARG1STARG2STARG3STARG4STARG5STARG6STARGNEWBUFFERMEMCPYCATSUBSTRLEFTRIGHTINVERTANDORXOREQUALNOTEQUALSIGNABSNEGATEINCDECADDSUBMULDIVMODPOWSHLSHRNOTBOOLANDBOOLORNZNUMEQUALNUMNOTEQUALLTLTEGTGTEMINMAXWITHINPACKUNPACKNEWARRAY0NEWARRAYNEWARRAY_TNEWSTRUCT0NEWSTRUCTNEWMAPSIZEHASKEYKEYSVALUESPICKITEMAPPENDSETITEMREVERSEITEMSREMOVECLEARITEMSPOPITEMISNULLISTYPECONVERT"
|
const _Opcode_name = "PUSHINT8PUSHINT16PUSHINT32PUSHINT64PUSHINT128PUSHINT256PUSHAPUSHNULLPUSHDATA1PUSHDATA2PUSHDATA4PUSHM1PUSH0PUSH1PUSH2PUSH3PUSH4PUSH5PUSH6PUSH7PUSH8PUSH9PUSH10PUSH11PUSH12PUSH13PUSH14PUSH15PUSH16NOPJMPJMP_LJMPIFJMPIF_LJMPIFNOTJMPIFNOT_LJMPEQJMPEQ_LJMPNEJMPNE_LJMPGTJMPGT_LJMPGEJMPGE_LJMPLTJMPLT_LJMPLEJMPLE_LCALLCALL_LCALLACALLTABORTASSERTTHROWTRYTRY_LENDTRYENDTRY_LENDFINALLYRETSYSCALLDEPTHDROPNIPXDROPCLEARDUPOVERPICKTUCKSWAPROTROLLREVERSE3REVERSE4REVERSENINITSSLOTINITSLOTLDSFLD0LDSFLD1LDSFLD2LDSFLD3LDSFLD4LDSFLD5LDSFLD6LDSFLDSTSFLD0STSFLD1STSFLD2STSFLD3STSFLD4STSFLD5STSFLD6STSFLDLDLOC0LDLOC1LDLOC2LDLOC3LDLOC4LDLOC5LDLOC6LDLOCSTLOC0STLOC1STLOC2STLOC3STLOC4STLOC5STLOC6STLOCLDARG0LDARG1LDARG2LDARG3LDARG4LDARG5LDARG6LDARGSTARG0STARG1STARG2STARG3STARG4STARG5STARG6STARGNEWBUFFERMEMCPYCATSUBSTRLEFTRIGHTINVERTANDORXOREQUALNOTEQUALSIGNABSNEGATEINCDECADDSUBMULDIVMODPOWSQRTSHLSHRNOTBOOLANDBOOLORNZNUMEQUALNUMNOTEQUALLTLTEGTGTEMINMAXWITHINPACKUNPACKNEWARRAY0NEWARRAYNEWARRAY_TNEWSTRUCT0NEWSTRUCTNEWMAPSIZEHASKEYKEYSVALUESPICKITEMAPPENDSETITEMREVERSEITEMSREMOVECLEARITEMSPOPITEMISNULLISTYPECONVERT"
|
||||||
|
|
||||||
var _Opcode_map = map[Opcode]string{
|
var _Opcode_map = map[Opcode]string{
|
||||||
0: _Opcode_name[0:8],
|
0: _Opcode_name[0:8],
|
||||||
|
@ -352,43 +353,44 @@ var _Opcode_map = map[Opcode]string{
|
||||||
161: _Opcode_name[859:862],
|
161: _Opcode_name[859:862],
|
||||||
162: _Opcode_name[862:865],
|
162: _Opcode_name[862:865],
|
||||||
163: _Opcode_name[865:868],
|
163: _Opcode_name[865:868],
|
||||||
168: _Opcode_name[868:871],
|
164: _Opcode_name[868:872],
|
||||||
169: _Opcode_name[871:874],
|
168: _Opcode_name[872:875],
|
||||||
170: _Opcode_name[874:877],
|
169: _Opcode_name[875:878],
|
||||||
171: _Opcode_name[877:884],
|
170: _Opcode_name[878:881],
|
||||||
172: _Opcode_name[884:890],
|
171: _Opcode_name[881:888],
|
||||||
177: _Opcode_name[890:892],
|
172: _Opcode_name[888:894],
|
||||||
179: _Opcode_name[892:900],
|
177: _Opcode_name[894:896],
|
||||||
180: _Opcode_name[900:911],
|
179: _Opcode_name[896:904],
|
||||||
181: _Opcode_name[911:913],
|
180: _Opcode_name[904:915],
|
||||||
182: _Opcode_name[913:916],
|
181: _Opcode_name[915:917],
|
||||||
183: _Opcode_name[916:918],
|
182: _Opcode_name[917:920],
|
||||||
184: _Opcode_name[918:921],
|
183: _Opcode_name[920:922],
|
||||||
185: _Opcode_name[921:924],
|
184: _Opcode_name[922:925],
|
||||||
186: _Opcode_name[924:927],
|
185: _Opcode_name[925:928],
|
||||||
187: _Opcode_name[927:933],
|
186: _Opcode_name[928:931],
|
||||||
192: _Opcode_name[933:937],
|
187: _Opcode_name[931:937],
|
||||||
193: _Opcode_name[937:943],
|
192: _Opcode_name[937:941],
|
||||||
194: _Opcode_name[943:952],
|
193: _Opcode_name[941:947],
|
||||||
195: _Opcode_name[952:960],
|
194: _Opcode_name[947:956],
|
||||||
196: _Opcode_name[960:970],
|
195: _Opcode_name[956:964],
|
||||||
197: _Opcode_name[970:980],
|
196: _Opcode_name[964:974],
|
||||||
198: _Opcode_name[980:989],
|
197: _Opcode_name[974:984],
|
||||||
200: _Opcode_name[989:995],
|
198: _Opcode_name[984:993],
|
||||||
202: _Opcode_name[995:999],
|
200: _Opcode_name[993:999],
|
||||||
203: _Opcode_name[999:1005],
|
202: _Opcode_name[999:1003],
|
||||||
204: _Opcode_name[1005:1009],
|
203: _Opcode_name[1003:1009],
|
||||||
205: _Opcode_name[1009:1015],
|
204: _Opcode_name[1009:1013],
|
||||||
206: _Opcode_name[1015:1023],
|
205: _Opcode_name[1013:1019],
|
||||||
207: _Opcode_name[1023:1029],
|
206: _Opcode_name[1019:1027],
|
||||||
208: _Opcode_name[1029:1036],
|
207: _Opcode_name[1027:1033],
|
||||||
209: _Opcode_name[1036:1048],
|
208: _Opcode_name[1033:1040],
|
||||||
210: _Opcode_name[1048:1054],
|
209: _Opcode_name[1040:1052],
|
||||||
211: _Opcode_name[1054:1064],
|
210: _Opcode_name[1052:1058],
|
||||||
212: _Opcode_name[1064:1071],
|
211: _Opcode_name[1058:1068],
|
||||||
216: _Opcode_name[1071:1077],
|
212: _Opcode_name[1068:1075],
|
||||||
217: _Opcode_name[1077:1083],
|
216: _Opcode_name[1075:1081],
|
||||||
219: _Opcode_name[1083:1090],
|
217: _Opcode_name[1081:1087],
|
||||||
|
219: _Opcode_name[1087:1094],
|
||||||
}
|
}
|
||||||
|
|
||||||
func (i Opcode) String() string {
|
func (i Opcode) String() string {
|
||||||
|
|
|
@ -918,6 +918,14 @@ func (v *VM) execute(ctx *Context, op opcode.Opcode, parameter []byte) (err erro
|
||||||
}
|
}
|
||||||
v.estack.PushVal(new(big.Int).Exp(a, exp, nil))
|
v.estack.PushVal(new(big.Int).Exp(a, exp, nil))
|
||||||
|
|
||||||
|
case opcode.SQRT:
|
||||||
|
a := v.estack.Pop().BigInt()
|
||||||
|
if a.Sign() == -1 {
|
||||||
|
panic("negative value")
|
||||||
|
}
|
||||||
|
|
||||||
|
v.estack.PushVal(new(big.Int).Sqrt(a))
|
||||||
|
|
||||||
case opcode.SHL, opcode.SHR:
|
case opcode.SHL, opcode.SHR:
|
||||||
b := v.estack.Pop().BigInt().Int64()
|
b := v.estack.Pop().BigInt().Int64()
|
||||||
if b == 0 {
|
if b == 0 {
|
||||||
|
|
|
@ -946,6 +946,15 @@ func TestPOW(t *testing.T) {
|
||||||
t.Run("too big exponent", getTestFuncForVM(prog, nil, 1, math.MaxInt32+1))
|
t.Run("too big exponent", getTestFuncForVM(prog, nil, 1, math.MaxInt32+1))
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func TestSQRT(t *testing.T) {
|
||||||
|
prog := makeProgram(opcode.SQRT)
|
||||||
|
t.Run("good, positive", getTestFuncForVM(prog, 3, 9))
|
||||||
|
t.Run("good, round down", getTestFuncForVM(prog, 2, 8))
|
||||||
|
t.Run("one", getTestFuncForVM(prog, 1, 1))
|
||||||
|
t.Run("zero", getTestFuncForVM(prog, 0, 0))
|
||||||
|
t.Run("negative value", getTestFuncForVM(prog, nil, -1))
|
||||||
|
}
|
||||||
|
|
||||||
func TestSHR(t *testing.T) {
|
func TestSHR(t *testing.T) {
|
||||||
prog := makeProgram(opcode.SHR)
|
prog := makeProgram(opcode.SHR)
|
||||||
t.Run("Good", getTestFuncForVM(prog, 1, 4, 2))
|
t.Run("Good", getTestFuncForVM(prog, 1, 4, 2))
|
||||||
|
|
Loading…
Reference in a new issue