mirror of
				https://github.com/ethereum/solidity
				synced 2023-10-03 13:03:40 +00:00 
			
		
		
		
	Merge pull request #260 from chriseth/stackrotation
Simplify and optimise stack rotation.
This commit is contained in:
		
						commit
						8cbe99fd1f
					
				| @ -695,18 +695,31 @@ void CompilerUtils::copyToStackTop(unsigned _stackDepth, unsigned _itemSize) | ||||
| 
 | ||||
| void CompilerUtils::moveToStackTop(unsigned _stackDepth, unsigned _itemSize) | ||||
| { | ||||
| 	solAssert(_stackDepth <= 15, "Stack too deep, try removing local variables."); | ||||
| 	for (unsigned j = 0; j < _itemSize; ++j) | ||||
| 		for (unsigned i = 0; i < _stackDepth + _itemSize - 1; ++i) | ||||
| 			m_context << eth::swapInstruction(1 + i); | ||||
| 	moveIntoStack(_itemSize, _stackDepth); | ||||
| } | ||||
| 
 | ||||
| void CompilerUtils::moveIntoStack(unsigned _stackDepth, unsigned _itemSize) | ||||
| { | ||||
| 	solAssert(_stackDepth <= 16, "Stack too deep, try removing local variables."); | ||||
| 	for (unsigned j = 0; j < _itemSize; ++j) | ||||
| 		for (unsigned i = _stackDepth; i > 0; --i) | ||||
| 			m_context << eth::swapInstruction(i + _itemSize - 1); | ||||
| 	if (_stackDepth <= _itemSize) | ||||
| 		for (unsigned i = 0; i < _stackDepth; ++i) | ||||
| 			rotateStackDown(_stackDepth + _itemSize); | ||||
| 	else | ||||
| 		for (unsigned i = 0; i < _itemSize; ++i) | ||||
| 			rotateStackUp(_stackDepth + _itemSize); | ||||
| } | ||||
| 
 | ||||
| void CompilerUtils::rotateStackUp(unsigned _items) | ||||
| { | ||||
| 	solAssert(_items - 1 <= 16, "Stack too deep, try removing local variables."); | ||||
| 	for (unsigned i = 1; i < _items; ++i) | ||||
| 		m_context << eth::swapInstruction(_items - i); | ||||
| } | ||||
| 
 | ||||
| void CompilerUtils::rotateStackDown(unsigned _items) | ||||
| { | ||||
| 	solAssert(_items - 1 <= 16, "Stack too deep, try removing local variables."); | ||||
| 	for (unsigned i = 1; i < _items; ++i) | ||||
| 		m_context << eth::swapInstruction(i); | ||||
| } | ||||
| 
 | ||||
| void CompilerUtils::popStackElement(Type const& _type) | ||||
|  | ||||
| @ -134,6 +134,12 @@ public: | ||||
| 	void moveToStackTop(unsigned _stackDepth, unsigned _itemSize = 1); | ||||
| 	/// Moves @a _itemSize elements past @a _stackDepth other stack elements
 | ||||
| 	void moveIntoStack(unsigned _stackDepth, unsigned _itemSize = 1); | ||||
| 	/// Rotates the topmost @a _items items on the stack, such that the previously topmost element
 | ||||
| 	/// is bottom-most.
 | ||||
| 	void rotateStackUp(unsigned _items); | ||||
| 	/// Rotates the topmost @a _items items on the stack, such that the previously bottom-most element
 | ||||
| 	/// is now topmost.
 | ||||
| 	void rotateStackDown(unsigned _items); | ||||
| 	/// Removes the current value from the top of the stack.
 | ||||
| 	void popStackElement(Type const& _type); | ||||
| 	/// Removes element from the top of the stack _amount times.
 | ||||
|  | ||||
		Loading…
	
		Reference in New Issue
	
	Block a user