New delay(), more carefully coded:

- Use explicit assembly; don't want the compiler optimizing things too
  much here.
- Subtract 2 for each iteration of the loop, rather than 3.  The loop
  consists of only 2 instructions (even the C version compiled to a
  loop of 2 instructions).

The latter change has squashed a fairly annoying timing bug in the
mii_bitbang module as used by the `ex' driver on my AlphaStation 500.

XXX delay() should maybe be rewritten again, to use the rpcc instruction.
This commit is contained in:
thorpej 1999-12-03 07:29:57 +00:00
parent fafcf62fd6
commit 0aa48d5c55

View File

@ -1,4 +1,4 @@
/* $NetBSD: machdep.c,v 1.185 1999/11/30 19:31:56 thorpej Exp $ */
/* $NetBSD: machdep.c,v 1.186 1999/12/03 07:29:57 thorpej Exp $ */
/*-
* Copyright (c) 1998, 1999 The NetBSD Foundation, Inc.
@ -79,7 +79,7 @@
#include <sys/cdefs.h> /* RCS ID & Copyright macro defns */
__KERNEL_RCSID(0, "$NetBSD: machdep.c,v 1.185 1999/11/30 19:31:56 thorpej Exp $");
__KERNEL_RCSID(0, "$NetBSD: machdep.c,v 1.186 1999/12/03 07:29:57 thorpej Exp $");
#include <sys/param.h>
#include <sys/systm.h>
@ -2014,8 +2014,16 @@ delay(n)
{
long N = cycles_per_usec * (n);
while (N > 0) /* XXX */
N -= 3; /* XXX */
/*
* XXX Should be written to use RPCC?
*/
__asm __volatile(
"# The 2 corresponds to the insn count\n"
"1: subq %2, %1, %0 \n"
" bgt %0, 1b"
: "=r" (N)
: "i" (2), "0" (N));
}
#if defined(COMPAT_OSF1) || 1 /* XXX */