Root/kernel/timeconst.bc

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

Archive Download this file



interactive