| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191 |
- // RUN: --target solana --emit cfg -Onone --no-cse
- uint128 constant global_cte = 5;
- contract testing {
- // BEGIN-CHECK: testing::testing::function::boolLiteral
- function boolLiteral() public pure {
- assembly {
- // CHECK: ty:uint256 %x = uint256(true)
- let x := true
- // CHECK: ty:bool %ss = (uint256 0 != uint256 5)
- let ss : bool := 5
- // CHECK: ty:uint256 %y = uint256(false)
- let y := false
- // CHECK: uint64(false)
- let r : u64 := false
- // CHECK: uint256 1
- let s := true :u128
- // CHECK: ty:uint32 %p = uint32 0
- let p :u32 := false :u64
- }
- }
- // BEGIN-CHECK: testing::testing::function::numberLiteral
- function numberLiteral() public pure {
- assembly {
- // CHECK: ty:int32 %x = int32 90
- let x : s32 := 90
- // CHECK: ty:uint256 %y = uint256 128
- let y := 0x80
- // ty:uint256 %y = uint256 128
- let z := 0x80 : u8
- }
- }
- // BEGIN-CHECK: testing::testing::function::stringLiteral
- function stringLiteral() public pure {
- assembly {
- // CHECK: ty:uint256 %x = uint256 427070744165
- let x := "coffe"
- // CHECK: ty:uint256 %y = uint256 831486
- let y := hex"0caffe"
- }
- }
- struct LocalTest {
- uint32 c;
- }
- // BEGIN-CHECK: testing::testing::function::yulLocalVariable__uint256
- function yulLocalVariable(uint256 a) public pure {
- assembly {
- // CHECK: ty:uint256 %x = (overflowing uint256 2 + (arg #0))
- let x := add(2, a)
- // CHECK: ty:uint256 %y = (overflowing uint256 2 + (arg #0))
- let y := x
- }
- }
- uint32 constant contract_cte = 787;
- // BEGIN-CHECK: testing::testing::function::constantVariable
- function constantVariable() public pure {
- assembly {
- // CHECK: ty:uint256 %p1 = uint256 5
- let p1 := global_cte
- // CHECK: ty:uint256 %p2 = uint256 787
- let p2 := contract_cte
- }
- }
- // BEGIN-CHECK: testing::testing::function::solidityLocalVariable
- function solidityLocalVariable() public pure {
- int32 a = 1;
- int[] vec;
- int[] memory mem_vec = vec;
- int[4] cte_vec = [int(1), 2, 3, 4];
- int[4] memory mem_cte_vec = [int(1), 2, 3, 4];
- string b = "abc";
- LocalTest struct_test = LocalTest({c: 2});
- LocalTest memory mem_struct_test = LocalTest({c: 2});
- assembly {
- // CHECK: ty:uint256 %k = uint256 1
- let k := a
- // CHECK: ty:uint256 %l = (zext uint256 uint64(%vec))
- let l := vec
- // CHECK: ty:uint256 %m = (zext uint256 uint64(%mem_vec))
- let m := mem_vec
- // CHECK: ty:uint256 %n = (zext uint256 uint64(%cte_vec))
- let n := cte_vec
- // CHECK: ty:uint256 %o = (zext uint256 uint64(%mem_cte_vec))
- let o := mem_cte_vec
- // CHECK: ty:uint256 %p = (zext uint256 uint64(%b))
- let p := b
- // CHECK: ty:uint256 %r = (zext uint256 uint64(%struct_test))
- let r := struct_test
- // CHECK: ty:uint256 %s = (zext uint256 uint64(%mem_struct_test))
- let s := mem_struct_test
- }
- }
- int[] storage_vec;
- int[] storage_vec_2;
- // BEGIN-CHECK: testing::testing::function::memberAccess__uint64:_uint64:3
- function memberAccess(uint64[] calldata vl, uint64[3] calldata vl_2) public view {
- int[] storage l_storage_vec = storage_vec_2;
- function () external fPtr = this.solidityLocalVariable;
- assembly {
- // CHECK: ty:uint256 %k = uint256 16
- let k := storage_vec.slot
- // CHECK: ty:uint256 %l = uint32 20
- let l := l_storage_vec.slot
- // CHECK: ty:uint256 %m = uint256 0
- let m := storage_vec.offset
- // CHECK: ty:uint256 %n = uint256 0
- let n := l_storage_vec.offset
- // CHECK: ty:uint256 %o = uint256((arg #0))
- let o := vl.offset
- // CHECK: ty:uint256 %p = (zext uint256 (builtin ArrayLength ((arg #0))))
- let p := vl.length
- // CHECK: ty:uint256 %q = uint256((load (struct %fPtr field 1)))
- let q := fPtr.address
- // CHECK: ty:uint256 %r = (zext uint256 bytes8((load (struct %fPtr field 0))))
- let r := fPtr.selector
- // CHECK: ty:uint256 %s = (zext uint256 uint64((arg #1)))
- let s := vl_2
- }
- }
- // BEGIN-CHECK: testing::testing::function::exprFuncCall__uint32
- function exprFuncCall(uint32 a) public pure {
- assembly {
- function get(a) -> ret {
- ret := sub(a, 2)
- }
- function doSmth() {
- let y := 9
- }
- // CHECK: ty:int32 %k = (trunc int32 (overflowing (zext uint256 (arg #0)) + uint256 2))
- let k : s32 := add(a, 2)
- // CHECK: %ret.temp.58 = call testing::yul_function_0::get (sext uint256 (trunc int32 (overflowing (zext uint256 (arg #0)) + uint256 2)))
- let x := get(k)
- // CHECK: ty:uint256 %x = %ret.temp.58
- // CHECK: %ret1.temp.59, %ret2.temp.60 = call testing::yul_function_2::multipleReturns %x, (trunc int32 (overflowing (zext uint256 (arg #0)) + uint256 2))
- let l, m := multipleReturns(x, k)
- // CHECK: ty:uint256 %l = (zext uint256 %ret1.temp.59)
- // CHECK: ty:uint256 %m = (sext uint256 %ret2.temp.60)
- // CHECK: = call testing::yul_function_1::doSmth
- doSmth()
- function multipleReturns(a, v : s32) -> ret1 : u8, ret2 : s64 {
- ret1 := add(a, v)
- ret2 := mul(a, v)
- }
- }
- }
- }
|