bench-bc.sh 5.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219
  1. #!/bin/sh
  2. # With some bashisms
  3. rnd32(){
  4. printf "%d" $(printf "0x%x%x" $RANDOM $RANDOM)
  5. }
  6. #funcs="pow_2_2 pow_2_32 rshift lshift xor and rrot"
  7. funcs="pow_2_2 pow_2_32 rshift lshift or or2 and and2 xor xor2 rrot"
  8. export TIMEFORMAT="%3R"
  9. for fn in $funcs ; do
  10. case $fn in
  11. pow_2_2) body="y=2^2"; factor=".02" ;;
  12. pow_2_32) body="y=2^32"; factor=".02" ;;
  13. rshift)
  14. body="
  15. y = g($(rnd32),1)
  16. y = g($(rnd32),2)
  17. y = g($(rnd32),3)
  18. y = g($(rnd32),7)
  19. y = g($(rnd32),10)
  20. y = g($(rnd32),13)
  21. y = g($(rnd32),17)
  22. y = g($(rnd32),18)
  23. y = g($(rnd32),19)
  24. y = g($(rnd32),22)
  25. y = g($(rnd32),25)"
  26. factor="1" ;;
  27. lshift)
  28. body="
  29. y = f($(rnd32),31)
  30. y = f($(rnd32),30)
  31. y = f($(rnd32),29)
  32. y = f($(rnd32),25)
  33. y = f($(rnd32),22)
  34. y = f($(rnd32),19)
  35. y = f($(rnd32),15)
  36. y = f($(rnd32),14)
  37. y = f($(rnd32),13)
  38. y = f($(rnd32),10)
  39. y = f($(rnd32),7)"
  40. factor="1" ;;
  41. xor)
  42. body="
  43. y = x($(rnd32),$(rnd32))
  44. y = x($(rnd32),$(rnd32))
  45. y = x($(rnd32),$(rnd32))
  46. y = x($(rnd32),$(rnd32))
  47. y = x($(rnd32),$(rnd32))
  48. y = x($(rnd32),$(rnd32))
  49. y = x($(rnd32),$(rnd32))
  50. y = x($(rnd32),$(rnd32))
  51. y = x($(rnd32),$(rnd32))
  52. y = x($(rnd32),$(rnd32))"
  53. factor="10" ;;
  54. xor2)
  55. body="
  56. y = y($(rnd32),$(rnd32))
  57. y = y($(rnd32),$(rnd32))
  58. y = y($(rnd32),$(rnd32))
  59. y = y($(rnd32),$(rnd32))
  60. y = y($(rnd32),$(rnd32))
  61. y = y($(rnd32),$(rnd32))
  62. y = y($(rnd32),$(rnd32))
  63. y = y($(rnd32),$(rnd32))
  64. y = y($(rnd32),$(rnd32))
  65. y = y($(rnd32),$(rnd32))"
  66. factor="10" ;;
  67. and)
  68. body="
  69. y = a($(rnd32),$(rnd32))
  70. y = a($(rnd32),$(rnd32))
  71. y = a($(rnd32),$(rnd32))
  72. y = a($(rnd32),$(rnd32))
  73. y = a($(rnd32),$(rnd32))
  74. y = a($(rnd32),$(rnd32))
  75. y = a($(rnd32),$(rnd32))
  76. y = a($(rnd32),$(rnd32))
  77. y = a($(rnd32),$(rnd32))
  78. y = a($(rnd32),$(rnd32))"
  79. factor="10" ;;
  80. and2)
  81. body="
  82. y = b($(rnd32),$(rnd32))
  83. y = b($(rnd32),$(rnd32))
  84. y = b($(rnd32),$(rnd32))
  85. y = b($(rnd32),$(rnd32))
  86. y = b($(rnd32),$(rnd32))
  87. y = b($(rnd32),$(rnd32))
  88. y = b($(rnd32),$(rnd32))
  89. y = b($(rnd32),$(rnd32))
  90. y = b($(rnd32),$(rnd32))
  91. y = b($(rnd32),$(rnd32))"
  92. factor="10" ;;
  93. or)
  94. body="
  95. y = o($(rnd32),$(rnd32))
  96. y = o($(rnd32),$(rnd32))
  97. y = o($(rnd32),$(rnd32))
  98. y = o($(rnd32),$(rnd32))
  99. y = o($(rnd32),$(rnd32))
  100. y = o($(rnd32),$(rnd32))
  101. y = o($(rnd32),$(rnd32))
  102. y = o($(rnd32),$(rnd32))
  103. y = o($(rnd32),$(rnd32))
  104. y = o($(rnd32),$(rnd32))"
  105. factor="10" ;;
  106. or2)
  107. body="
  108. y = p($(rnd32),$(rnd32))
  109. y = p($(rnd32),$(rnd32))
  110. y = p($(rnd32),$(rnd32))
  111. y = p($(rnd32),$(rnd32))
  112. y = p($(rnd32),$(rnd32))
  113. y = p($(rnd32),$(rnd32))
  114. y = p($(rnd32),$(rnd32))
  115. y = p($(rnd32),$(rnd32))
  116. y = p($(rnd32),$(rnd32))
  117. y = p($(rnd32),$(rnd32))"
  118. factor="10" ;;
  119. rrot)
  120. body="
  121. y = r($(rnd32),1)
  122. y = r($(rnd32),2)
  123. y = r($(rnd32),3)
  124. y = r($(rnd32),7)
  125. y = r($(rnd32),10)
  126. y = r($(rnd32),13)
  127. y = r($(rnd32),17)
  128. y = r($(rnd32),18)
  129. y = r($(rnd32),19)
  130. y = r($(rnd32),22)
  131. y = r($(rnd32),25)"
  132. factor="11" ;;
  133. esac
  134. printf "%12s: " "$fn"
  135. time bc <<EOF
  136. scale = 0
  137. z = 2^32
  138. define p(x,y){ /* plus modulo 2^32 */
  139. scale=0; return (x + y) % z; }
  140. define g(x,n){ /* bitwise rightshift */
  141. scale=0; return x / 2^n; }
  142. define f(x,n){ /* bitwise leftshift */
  143. scale=0; return (x * 2^n) % z; }
  144. define q(x){ /* log2 */
  145. auto r, s
  146. s = scale; scale = 5
  147. r = l(x) / l(2);
  148. scale = s; return r; }
  149. define n(x){ /* bitwise NOT */
  150. return z - 1 - x; }
  151. define a(x,y){ /* bitwise AND */
  152. auto t, i
  153. if(x<y) { t = x; x = y; y = t; } /* ensure x>=y */
  154. t = 0
  155. for (i=0; i<32; ++i) {
  156. t += (g(x,i) % 2) * (g(y,i) % 2) * 2^i
  157. }
  158. return t; }
  159. define b(x,y){ /* bitwise AND */
  160. auto t, i, a, b, r
  161. if(x<y) { t = x; x = y; y = t; } /* ensure x>=y */
  162. t = 0; a = x; b = y; r = 1
  163. for (i=0; i<32; ++i) {
  164. t += (a % 2) * (b % 2) * r
  165. r *= 2; a /= 2; b /= 2
  166. }
  167. return t; }
  168. define o(x,y){ /* bitwise OR */
  169. auto t, i, z, w
  170. if(x<y) { t = x; x = y; y = t; } /* ensure x>=y */
  171. t = 0
  172. for (i=0; i<32; ++i) {
  173. z = g(x,i) % 2
  174. w = g(y,i) % 2
  175. t += ((z + w + z*w) % 2) * 2^i
  176. }
  177. return t; }
  178. define p(x,y){ /* bitwise OR (2) */
  179. auto t, i, z, w, r, a, b
  180. if(x<y) { t = x; x = y; y = t; } /* ensure x>=y */
  181. t = 0; a = x; b = y; r = 1
  182. for (i=0; i<32; ++i) {
  183. z = a % 2; w = b % 2
  184. t += ((z + w + z*w) % 2) * r
  185. /* print "i=",i," z=",z," w=",w," a=",a," b=", b," t=",t," r=",r,"\n" */
  186. r *= 2; a /= 2; b /= 2
  187. }
  188. return t; }
  189. define x(x, y){ /* bitwise XOR */
  190. auto t, i
  191. if(x<y) { t = x; x = y; y = t; } /* ensure x>=y */
  192. t = 0
  193. for (i=0; i<32; ++i) {
  194. t += ((g(x,i) + g(y,i)) % 2) * 2^i
  195. }
  196. return t; }
  197. define y(x, y){ /* bitwise XOR (2) */
  198. auto t, i, r, a, b, z, w
  199. if(x<y) { t = x; x = y; y = t; } /* ensure x>=y */
  200. t = 0; a = x; b = y; r = 1
  201. for (i=0; i<32; ++i) {
  202. z = a % 2; w = b % 2
  203. t += ((z + w) % 2) * r
  204. /* print "i=",i," z=",z," w=",w," a=",a," b=", b," t=",t," r=",r,"\n" */
  205. r *= 2; a /= 2; b /= 2
  206. }
  207. return t; }
  208. define r(x,n){ /* bitwise rightrotate */
  209. return p(f(x,32-n),g(x,n)); }
  210. for (i=0; i<(2000/$factor); ++i) {
  211. $body
  212. }
  213. EOF
  214. done