summaryrefslogtreecommitdiffstats
path: root/sys
diff options
context:
space:
mode:
authorkato <kato@FreeBSD.org>1997-01-30 10:44:05 +0000
committerkato <kato@FreeBSD.org>1997-01-30 10:44:05 +0000
commitdec8fc0e49c43b2be22598f816de9f077f3c8c24 (patch)
tree5f592102d06512332c009ad5add85c6b60183fd7 /sys
parentbdeeed7f594f0d5c0904e48b0a7928d90bb72da6 (diff)
downloadFreeBSD-src-dec8fc0e49c43b2be22598f816de9f077f3c8c24.zip
FreeBSD-src-dec8fc0e49c43b2be22598f816de9f077f3c8c24.tar.gz
Synchronize with sys/i386/isa/clock.c revision 1.75.
Diffstat (limited to 'sys')
-rw-r--r--sys/pc98/cbus/clock.c31
-rw-r--r--sys/pc98/cbus/pcrtc.c31
-rw-r--r--sys/pc98/pc98/clock.c31
3 files changed, 63 insertions, 30 deletions
diff --git a/sys/pc98/cbus/clock.c b/sys/pc98/cbus/clock.c
index 7f2af5a..7345338 100644
--- a/sys/pc98/cbus/clock.c
+++ b/sys/pc98/cbus/clock.c
@@ -456,7 +456,7 @@ getit(void)
void
DELAY(int n)
{
- int delta, prev_tick, tick, ticks_left, sec, usec;
+ int delta, prev_tick, tick, ticks_left;
#ifdef DELAYDEBUG
int getit_calls = 1;
@@ -487,19 +487,30 @@ DELAY(int n)
* multiplications and divisions to scale the count take a while).
*/
prev_tick = getit();
- n -= 20;
+ n -= 0; /* XXX actually guess no initial overhead */
/*
* Calculate (n * (timer_freq / 1e6)) without using floating point
* and without any avoidable overflows.
*/
- sec = n / 1000000;
- usec = n - sec * 1000000;
- ticks_left = sec * timer_freq
- + usec * (timer_freq / 1000000)
- + usec * ((timer_freq % 1000000) / 1000) / 1000
- + usec * (timer_freq % 1000) / 1000000;
- if (n < 0)
- ticks_left = 0; /* XXX timer_freq is unsigned */
+ if (n <= 0)
+ ticks_left = 0;
+ else if (n < 256)
+ /*
+ * Use fixed point to avoid a slow division by 1000000.
+ * 39099 = 1193182 * 2^15 / 10^6 rounded to nearest.
+ * 2^15 is the first power of 2 that gives exact results
+ * for n between 0 and 256.
+ */
+ ticks_left = ((u_int)n * 39099 + (1 << 15) - 1) >> 15;
+ else
+ /*
+ * Don't bother using fixed point, although gcc-2.7.2
+ * generates particularly poor code for the long long
+ * division, since even the slow way will complete long
+ * before the delay is up (unless we're interrupted).
+ */
+ ticks_left = ((u_int)n * (long long)timer_freq + 999999)
+ / 1000000;
while (ticks_left > 0) {
tick = getit();
diff --git a/sys/pc98/cbus/pcrtc.c b/sys/pc98/cbus/pcrtc.c
index 7f2af5a..7345338 100644
--- a/sys/pc98/cbus/pcrtc.c
+++ b/sys/pc98/cbus/pcrtc.c
@@ -456,7 +456,7 @@ getit(void)
void
DELAY(int n)
{
- int delta, prev_tick, tick, ticks_left, sec, usec;
+ int delta, prev_tick, tick, ticks_left;
#ifdef DELAYDEBUG
int getit_calls = 1;
@@ -487,19 +487,30 @@ DELAY(int n)
* multiplications and divisions to scale the count take a while).
*/
prev_tick = getit();
- n -= 20;
+ n -= 0; /* XXX actually guess no initial overhead */
/*
* Calculate (n * (timer_freq / 1e6)) without using floating point
* and without any avoidable overflows.
*/
- sec = n / 1000000;
- usec = n - sec * 1000000;
- ticks_left = sec * timer_freq
- + usec * (timer_freq / 1000000)
- + usec * ((timer_freq % 1000000) / 1000) / 1000
- + usec * (timer_freq % 1000) / 1000000;
- if (n < 0)
- ticks_left = 0; /* XXX timer_freq is unsigned */
+ if (n <= 0)
+ ticks_left = 0;
+ else if (n < 256)
+ /*
+ * Use fixed point to avoid a slow division by 1000000.
+ * 39099 = 1193182 * 2^15 / 10^6 rounded to nearest.
+ * 2^15 is the first power of 2 that gives exact results
+ * for n between 0 and 256.
+ */
+ ticks_left = ((u_int)n * 39099 + (1 << 15) - 1) >> 15;
+ else
+ /*
+ * Don't bother using fixed point, although gcc-2.7.2
+ * generates particularly poor code for the long long
+ * division, since even the slow way will complete long
+ * before the delay is up (unless we're interrupted).
+ */
+ ticks_left = ((u_int)n * (long long)timer_freq + 999999)
+ / 1000000;
while (ticks_left > 0) {
tick = getit();
diff --git a/sys/pc98/pc98/clock.c b/sys/pc98/pc98/clock.c
index 7f2af5a..7345338 100644
--- a/sys/pc98/pc98/clock.c
+++ b/sys/pc98/pc98/clock.c
@@ -456,7 +456,7 @@ getit(void)
void
DELAY(int n)
{
- int delta, prev_tick, tick, ticks_left, sec, usec;
+ int delta, prev_tick, tick, ticks_left;
#ifdef DELAYDEBUG
int getit_calls = 1;
@@ -487,19 +487,30 @@ DELAY(int n)
* multiplications and divisions to scale the count take a while).
*/
prev_tick = getit();
- n -= 20;
+ n -= 0; /* XXX actually guess no initial overhead */
/*
* Calculate (n * (timer_freq / 1e6)) without using floating point
* and without any avoidable overflows.
*/
- sec = n / 1000000;
- usec = n - sec * 1000000;
- ticks_left = sec * timer_freq
- + usec * (timer_freq / 1000000)
- + usec * ((timer_freq % 1000000) / 1000) / 1000
- + usec * (timer_freq % 1000) / 1000000;
- if (n < 0)
- ticks_left = 0; /* XXX timer_freq is unsigned */
+ if (n <= 0)
+ ticks_left = 0;
+ else if (n < 256)
+ /*
+ * Use fixed point to avoid a slow division by 1000000.
+ * 39099 = 1193182 * 2^15 / 10^6 rounded to nearest.
+ * 2^15 is the first power of 2 that gives exact results
+ * for n between 0 and 256.
+ */
+ ticks_left = ((u_int)n * 39099 + (1 << 15) - 1) >> 15;
+ else
+ /*
+ * Don't bother using fixed point, although gcc-2.7.2
+ * generates particularly poor code for the long long
+ * division, since even the slow way will complete long
+ * before the delay is up (unless we're interrupted).
+ */
+ ticks_left = ((u_int)n * (long long)timer_freq + 999999)
+ / 1000000;
while (ticks_left > 0) {
tick = getit();
OpenPOWER on IntegriCloud