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