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
|