binary_arithmetic_builtins.sol 6.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164
  1. // RUN: --target solana --emit cfg -Onone --no-cse
  2. contract testing {
  3. // BEGIN-CHECK: testing::testing::function::add_sub_mul__int16_int32_uint256_uint128
  4. function add_sub_mul(int16 a, int32 b, uint256 c, uint128 d) public pure {
  5. assembly {
  6. // CHECK: ty:uint256 %e = (sext uint256 ((sext int32 (arg #0)) + (arg #1)))
  7. let e := add(a, b)
  8. // CHECK: ty:uint256 %f = uint256(((sext int256 (arg #1)) + int256((arg #2))))
  9. let f := add(b, c)
  10. // CHECK: ty:uint256 %g = ((arg #2) + (zext uint256 (arg #3)))
  11. let g := add(c, d)
  12. // CHECK: ty:uint256 %h = (sext uint256 ((sext int136 (arg #0)) + (zext int136 (arg #3))))
  13. let h := add(a, d)
  14. // CHECK: ty:uint256 %i = uint256(((sext int256 (arg #0)) + int256((arg #2))))
  15. let i := add(a, c)
  16. // CHECK: ty:uint256 %j = (sext uint256 ((sext int136 (arg #1)) + (zext int136 (arg #3))))
  17. let j := add(b, d)
  18. // CHECK: ty:int32 %k = ((sext int32 (arg #0)) - (arg #1))
  19. let k : s32 := sub(a, b)
  20. // CHECK: ty:int256 %l = int256(((arg #2) - (zext uint256 (arg #3))))
  21. let l : s256 := sub(c, d)
  22. // CHECK: ty:uint256 %m = ((arg #2) * (zext uint256 (arg #3)))
  23. let m := mul(c, d)
  24. // CHECK: ty:uint256 %n = uint256 43981
  25. let n := hex"abcd"
  26. // CHECK: ty:uint256 %o = uint256 1667327589
  27. let o := "cafe"
  28. // CHECK: ty:uint256 %p = uint256 73330734691809
  29. let p := mul(n, o)
  30. // CHECK: ty:uint256 %q = uint256 22193982385802470
  31. let q := mul("cofe", hex"caffee")
  32. // CHECK: ty:bool %r = false
  33. let r : bool := false
  34. // CHECK: ty:bool %s = true
  35. let s : bool := true
  36. // CHECK: ty:uint256 %t = (uint256 22193982385802470 + uint256(false))
  37. let t := add(q, r)
  38. // CHECK: ty:uint256 %u = uint256 -1
  39. let u := sub(false, true)
  40. // CHECK: ty:uint256 %v = uint256((true + false))
  41. let v := add(s, r)
  42. }
  43. }
  44. // BEGIN-CHECK: testing::testing::function::op_that_branch__uint256_uint256_int256_int256
  45. function op_that_branch(uint256 a, uint256 b, int256 c, int256 d) public view {
  46. assembly {
  47. let e := div(a, b)
  48. // CHECK: branchcond ((arg #1) == uint256 0), block1, block2
  49. // CHECK: block1: # then
  50. // CHECK: ty:uint256 %temp.49 = uint256 0
  51. // CHECK: branch block3
  52. // CHECK: block2: # else
  53. // CHECK: ty:uint256 %temp.49 = (unsigned divide (arg #0) / (arg #1))
  54. // CHECK: branch block3
  55. // CHECK: block3: # endif
  56. // CHECK: # phis: temp.49
  57. // CHECK: ty:uint256 %e = %temp.49
  58. let f := sdiv(c, d)
  59. // CHECK: branchcond ((arg #3) == int256 0), block4, block5
  60. // CHECK: block4: # then
  61. // CHECK: ty:uint256 %temp.50 = uint256 0
  62. // CHECK: branch block6
  63. // CHECK: block5: # else
  64. // CHECK: ty:uint256 %temp.50 = (signed divide (arg #2) / (arg #3))
  65. // CHECK: branch block6
  66. // CHECK: block6: # endif
  67. // CHECK: # phis: temp.50
  68. // CHECK: ty:uint256 %f = %temp.50
  69. let g := mod(a, b)
  70. // CHECK: branchcond ((arg #1) == uint256 0), block7, block8
  71. // CHECK: block7: # then
  72. // CHECK: ty:uint256 %temp.51 = uint256 0
  73. // CHECK: branch block9
  74. // CHECK: block8: # else
  75. // CHECK: ty:uint256 %temp.51 = (unsigned modulo (arg #0) % (arg #1))
  76. // CHECK: branch block9
  77. // CHECK: block9: # endif
  78. // CHECK: # phis: temp.51
  79. // CHECK: ty:uint256 %g = %temp.51
  80. let h := smod(c, d)
  81. // CHECK: branchcond ((arg #3) == int256 0), block10, block11
  82. // CHECK: block10: # then
  83. // CHECK: ty:uint256 %temp.52 = uint256 0
  84. // CHECK: branch block12
  85. // CHECK: block11: # else
  86. // CHECK: ty:uint256 %temp.52 = (signed modulo (arg #2) % (arg #3))
  87. // CHECK: branch block12
  88. // CHECK: block12: # endif
  89. // CHECK: # phis: temp.52
  90. // CHECK: ty:uint256 %h = %temp.52
  91. }
  92. }
  93. // BEGIN-CHECK: testing::testing::function::exponential__int128_int8
  94. function exponential(int128 a, int8 b) public pure {
  95. assembly {
  96. // CHECK: ty:uint256 %x = (sext uint256 ((arg #0) ** (sext int128 (arg #1))))
  97. let x := exp(a, b)
  98. }
  99. }
  100. // BEGIN-CHECK: testing::testing::function::compare__uint64_uint64_int64_int64
  101. function compare(uint64 a, uint64 b, int64 c, int64 d) public pure {
  102. assembly {
  103. // CHECK: ty:bool %e = (unsigned less (arg #0) < (arg #1))
  104. let e : bool := lt(a, b)
  105. // CHECK: ty:uint8 %f = uint8((unsigned more (arg #0) > (arg #1)))
  106. let f : u8 := gt(a, b)
  107. // CHECK: ty:int8 %h = int8((signed less (arg #2) < (arg #3)))
  108. let h : s8 := slt(c, d)
  109. // CHECK: ty:uint256 %i = uint256((signed more (arg #0) > (arg #1)))
  110. let i := sgt(a, b)
  111. // CHECK: ty:uint256 %j = uint256(((zext int72 (arg #0)) == (sext int72 (arg #3))))
  112. let j := eq(a, d)
  113. }
  114. }
  115. // BEGIN-CHECK: testing::testing::function::bitwise_op__uint256_int256
  116. function bitwise_op(uint256 a, int256 b) public pure {
  117. assembly {
  118. // CHECK: ty:uint256 %c = uint256((int256((arg #0)) | (arg #1)))
  119. let c := or(a, b)
  120. // CHECK: ty:uint256 %d = uint256(((arg #1) ^ int256((arg #0))))
  121. let d := xor(b, a)
  122. // CHECK: ty:uint256 %e = uint256(((arg #1) << int256((arg #0))))
  123. let e := shl(a, b)
  124. // CHECK: ty:uint256 %f = uint256((int256((arg #0)) >> (arg #1)))
  125. let f := shr(b, a)
  126. // CHECK: ty:uint256 %g = uint256(((arg #1) >> int256((arg #0))))
  127. let g := sar(a, b)
  128. }
  129. }
  130. }