timeconst.bc 3.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117
  1. /* SPDX-License-Identifier: GPL-2.0 */
  2. scale=0
  3. define gcd(a,b) {
  4. auto t;
  5. while (b) {
  6. t = b;
  7. b = a % b;
  8. a = t;
  9. }
  10. return a;
  11. }
  12. /* Division by reciprocal multiplication. */
  13. define fmul(b,n,d) {
  14. return (2^b*n+d-1)/d;
  15. }
  16. /* Adjustment factor when a ceiling value is used. Use as:
  17. (imul * n) + (fmulxx * n + fadjxx) >> xx) */
  18. define fadj(b,n,d) {
  19. auto v;
  20. d = d/gcd(n,d);
  21. v = 2^b*(d-1)/d;
  22. return v;
  23. }
  24. /* Compute the appropriate mul/adj values as well as a shift count,
  25. which brings the mul value into the range 2^b-1 <= x < 2^b. Such
  26. a shift value will be correct in the signed integer range and off
  27. by at most one in the upper half of the unsigned range. */
  28. define fmuls(b,n,d) {
  29. auto s, m;
  30. for (s = 0; 1; s++) {
  31. m = fmul(s,n,d);
  32. if (m >= 2^(b-1))
  33. return s;
  34. }
  35. return 0;
  36. }
  37. define timeconst(hz) {
  38. print "/* Automatically generated by kernel/time/timeconst.bc */\n"
  39. print "/* Time conversion constants for HZ == ", hz, " */\n"
  40. print "\n"
  41. print "#ifndef KERNEL_TIMECONST_H\n"
  42. print "#define KERNEL_TIMECONST_H\n\n"
  43. print "#include <linux/param.h>\n"
  44. print "#include <linux/types.h>\n\n"
  45. print "#if HZ != ", hz, "\n"
  46. print "#error \qinclude/generated/timeconst.h has the wrong HZ value!\q\n"
  47. print "#endif\n\n"
  48. if (hz < 2) {
  49. print "#error Totally bogus HZ value!\n"
  50. } else {
  51. s=fmuls(32,1000,hz)
  52. obase=16
  53. print "#define HZ_TO_MSEC_MUL32\tU64_C(0x", fmul(s,1000,hz), ")\n"
  54. print "#define HZ_TO_MSEC_ADJ32\tU64_C(0x", fadj(s,1000,hz), ")\n"
  55. obase=10
  56. print "#define HZ_TO_MSEC_SHR32\t", s, "\n"
  57. s=fmuls(32,hz,1000)
  58. obase=16
  59. print "#define MSEC_TO_HZ_MUL32\tU64_C(0x", fmul(s,hz,1000), ")\n"
  60. print "#define MSEC_TO_HZ_ADJ32\tU64_C(0x", fadj(s,hz,1000), ")\n"
  61. obase=10
  62. print "#define MSEC_TO_HZ_SHR32\t", s, "\n"
  63. obase=10
  64. cd=gcd(hz,1000)
  65. print "#define HZ_TO_MSEC_NUM\t\t", 1000/cd, "\n"
  66. print "#define HZ_TO_MSEC_DEN\t\t", hz/cd, "\n"
  67. print "#define MSEC_TO_HZ_NUM\t\t", hz/cd, "\n"
  68. print "#define MSEC_TO_HZ_DEN\t\t", 1000/cd, "\n"
  69. print "\n"
  70. s=fmuls(32,1000000,hz)
  71. obase=16
  72. print "#define HZ_TO_USEC_MUL32\tU64_C(0x", fmul(s,1000000,hz), ")\n"
  73. print "#define HZ_TO_USEC_ADJ32\tU64_C(0x", fadj(s,1000000,hz), ")\n"
  74. obase=10
  75. print "#define HZ_TO_USEC_SHR32\t", s, "\n"
  76. s=fmuls(32,hz,1000000)
  77. obase=16
  78. print "#define USEC_TO_HZ_MUL32\tU64_C(0x", fmul(s,hz,1000000), ")\n"
  79. print "#define USEC_TO_HZ_ADJ32\tU64_C(0x", fadj(s,hz,1000000), ")\n"
  80. obase=10
  81. print "#define USEC_TO_HZ_SHR32\t", s, "\n"
  82. obase=10
  83. cd=gcd(hz,1000000)
  84. print "#define HZ_TO_USEC_NUM\t\t", 1000000/cd, "\n"
  85. print "#define HZ_TO_USEC_DEN\t\t", hz/cd, "\n"
  86. print "#define USEC_TO_HZ_NUM\t\t", hz/cd, "\n"
  87. print "#define USEC_TO_HZ_DEN\t\t", 1000000/cd, "\n"
  88. cd=gcd(hz,1000000000)
  89. print "#define HZ_TO_NSEC_NUM\t\t", 1000000000/cd, "\n"
  90. print "#define HZ_TO_NSEC_DEN\t\t", hz/cd, "\n"
  91. print "#define NSEC_TO_HZ_NUM\t\t", hz/cd, "\n"
  92. print "#define NSEC_TO_HZ_DEN\t\t", 1000000000/cd, "\n"
  93. print "\n"
  94. print "#endif /* KERNEL_TIMECONST_H */\n"
  95. }
  96. halt
  97. }
  98. hz = read();
  99. timeconst(hz)