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