core/vm: optimize MSTORE and SLOAD (#16939)
* vm/test: add tests+benchmarks for mstore * core/vm: less alloc and copying for mstore * core/vm: less allocs in sload * vm: check for errors more correctly
This commit is contained in:
		
				
					committed by
					
						 Péter Szilágyi
						Péter Szilágyi
					
				
			
			
				
	
			
			
			
						parent
						
							1836366ac1
						
					
				
				
					commit
					947e0afeb3
				
			| @@ -425,3 +425,42 @@ func BenchmarkOpIsZero(b *testing.B) { | ||||
| 	x := "FBCDEF090807060504030201ffffffffFBCDEF090807060504030201ffffffff" | ||||
| 	opBenchmark(b, opIszero, x) | ||||
| } | ||||
|  | ||||
| func TestOpMstore(t *testing.T) { | ||||
| 	var ( | ||||
| 		env   = NewEVM(Context{}, nil, params.TestChainConfig, Config{}) | ||||
| 		stack = newstack() | ||||
| 		mem   = NewMemory() | ||||
| 	) | ||||
| 	mem.Resize(64) | ||||
| 	pc := uint64(0) | ||||
| 	v := "abcdef00000000000000abba000000000deaf000000c0de00100000000133700" | ||||
| 	stack.pushN(new(big.Int).SetBytes(common.Hex2Bytes(v)), big.NewInt(0)) | ||||
| 	opMstore(&pc, env, nil, mem, stack) | ||||
| 	if got := common.Bytes2Hex(mem.Get(0, 32)); got != v { | ||||
| 		t.Fatalf("Mstore fail, got %v, expected %v", got, v) | ||||
| 	} | ||||
| 	stack.pushN(big.NewInt(0x1), big.NewInt(0)) | ||||
| 	opMstore(&pc, env, nil, mem, stack) | ||||
| 	if common.Bytes2Hex(mem.Get(0, 32)) != "0000000000000000000000000000000000000000000000000000000000000001" { | ||||
| 		t.Fatalf("Mstore failed to overwrite previous value") | ||||
| 	} | ||||
| } | ||||
|  | ||||
| func BenchmarkOpMstore(bench *testing.B) { | ||||
| 	var ( | ||||
| 		env   = NewEVM(Context{}, nil, params.TestChainConfig, Config{}) | ||||
| 		stack = newstack() | ||||
| 		mem   = NewMemory() | ||||
| 	) | ||||
| 	mem.Resize(64) | ||||
| 	pc := uint64(0) | ||||
| 	memStart := big.NewInt(0) | ||||
| 	value := big.NewInt(0x1337) | ||||
|  | ||||
| 	bench.ResetTimer() | ||||
| 	for i := 0; i < bench.N; i++ { | ||||
| 		stack.pushN(value, memStart) | ||||
| 		opMstore(&pc, env, nil, mem, stack) | ||||
| 	} | ||||
| } | ||||
|   | ||||
		Reference in New Issue
	
	Block a user