linux/kernel/timeconst.bc
<<
>>
Prefs
   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