diff --git a/core/vm/stack.go b/core/vm/stack.go index e1a957e244..160d8f1883 100644 --- a/core/vm/stack.go +++ b/core/vm/stack.go @@ -68,6 +68,39 @@ func (st *Stack) swap(n int) { st.data[st.len()-n], st.data[st.len()-1] = st.data[st.len()-1], st.data[st.len()-n] } +func (s *Stack) swap1() { s.data[s.len()-2], s.data[s.len()-1] = s.data[s.len()-1], s.data[s.len()-2] } +func (s *Stack) swap2() { s.data[s.len()-3], s.data[s.len()-1] = s.data[s.len()-1], s.data[s.len()-3] } +func (s *Stack) swap3() { s.data[s.len()-4], s.data[s.len()-1] = s.data[s.len()-1], s.data[s.len()-4] } +func (s *Stack) swap4() { s.data[s.len()-5], s.data[s.len()-1] = s.data[s.len()-1], s.data[s.len()-5] } +func (s *Stack) swap5() { s.data[s.len()-6], s.data[s.len()-1] = s.data[s.len()-1], s.data[s.len()-6] } +func (s *Stack) swap6() { s.data[s.len()-7], s.data[s.len()-1] = s.data[s.len()-1], s.data[s.len()-7] } +func (s *Stack) swap7() { s.data[s.len()-8], s.data[s.len()-1] = s.data[s.len()-1], s.data[s.len()-8] } +func (s *Stack) swap8() { s.data[s.len()-9], s.data[s.len()-1] = s.data[s.len()-1], s.data[s.len()-9] } +func (s *Stack) swap9() { + s.data[s.len()-10], s.data[s.len()-1] = s.data[s.len()-1], s.data[s.len()-10] +} +func (s *Stack) swap10() { + s.data[s.len()-11], s.data[s.len()-1] = s.data[s.len()-1], s.data[s.len()-11] +} +func (s *Stack) swap11() { + s.data[s.len()-12], s.data[s.len()-1] = s.data[s.len()-1], s.data[s.len()-12] +} +func (s *Stack) swap12() { + s.data[s.len()-13], s.data[s.len()-1] = s.data[s.len()-1], s.data[s.len()-13] +} +func (s *Stack) swap13() { + s.data[s.len()-14], s.data[s.len()-1] = s.data[s.len()-1], s.data[s.len()-14] +} +func (s *Stack) swap14() { + s.data[s.len()-15], s.data[s.len()-1] = s.data[s.len()-1], s.data[s.len()-15] +} +func (s *Stack) swap15() { + s.data[s.len()-16], s.data[s.len()-1] = s.data[s.len()-1], s.data[s.len()-16] +} +func (s *Stack) swap16() { + s.data[s.len()-17], s.data[s.len()-1] = s.data[s.len()-1], s.data[s.len()-17] +} + func (st *Stack) dup(n int) { st.push(&st.data[st.len()-n]) } diff --git a/core/vm/stack_test.go b/core/vm/stack_test.go new file mode 100644 index 0000000000..a5d2856057 --- /dev/null +++ b/core/vm/stack_test.go @@ -0,0 +1,25 @@ +package vm + +import ( + "testing" + + "github.com/holiman/uint256" +) + +func BenchmarkStackSwap(b *testing.B) { + stack := newstack() + stack.push(new(uint256.Int)) + stack.push(new(uint256.Int)) + + b.Run("swap(1)", func(b *testing.B) { + for i := 0; i < b.N; i++ { + stack.swap(1) + } + }) + + b.Run("swap1()", func(b *testing.B) { + for i := 0; i < b.N; i++ { + stack.swap1() + } + }) +}