H. Peter Anvin | 70730bc | 2013-02-14 15:13:55 -0800 | [diff] [blame] | 1 | scale=0 |
| 2 | |
| 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 | |
| 13 | /* Division by reciprocal multiplication. */ |
| 14 | define 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) */ |
| 20 | define 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. */ |
| 31 | define 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 | |
| 41 | define 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 | |
| 108 | timeconst(hz) |