mirror of
				https://github.com/ethereum/solidity
				synced 2023-10-03 13:03:40 +00:00 
			
		
		
		
	
		
			
				
	
	
		
			45 lines
		
	
	
		
			979 B
		
	
	
	
		
			Solidity
		
	
	
	
	
	
			
		
		
	
	
			45 lines
		
	
	
		
			979 B
		
	
	
	
		
			Solidity
		
	
	
	
	
	
| // This tests the optimizer rule
 | |
| // byte(A, shl(B, X))
 | |
| // ->
 | |
| // byte(A + B / 8, X)
 | |
| // given A <= 32 && B % 8 == 0 && B <= 256
 | |
| //
 | |
| // and the respective rule about shr
 | |
| contract C {
 | |
|   function f(uint a) public returns (uint, uint, uint) {
 | |
|     uint x = a << (256 - 8);
 | |
|     assembly {
 | |
|       x := byte(0, x)
 | |
|     }
 | |
|     uint y = a << 8;
 | |
|     assembly {
 | |
|       y := byte(30, y)
 | |
|     }
 | |
|     uint z = a << 16;
 | |
|     assembly {
 | |
|       z := byte(1, z)
 | |
|     }
 | |
|     return (x, y, z);
 | |
|   }
 | |
|   function g(uint a) public returns (uint, uint, uint) {
 | |
|     uint x = a >> (256 - 16);
 | |
|     assembly {
 | |
|       x := byte(31, x)
 | |
|     }
 | |
|     uint y = a >> 8;
 | |
|     assembly {
 | |
|       y := byte(4, y)
 | |
|     }
 | |
|     uint z = a >> 16;
 | |
|     assembly {
 | |
|       z := byte(7, z)
 | |
|     }
 | |
|     return (x, y, z);
 | |
|   }
 | |
| }
 | |
| // ====
 | |
| // compileViaYul: also
 | |
| // ----
 | |
| // f(uint256): 0x0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f -> 0x1f, 0x1f, 3
 | |
| // g(uint256): 0x0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f -> 1, 3, 5
 |