Module Name: src
Committed By: matt
Date: Tue Mar 16 02:34:48 UTC 2010
Modified Files:
src/sys/arch/sbmips/sbmips [matt-nb5-mips64]: sb1250_icu.c
Log Message:
Use dclz directly since gcc4.1 doesn't to with clzdi properly.
To generate a diff of this commit:
cvs rdiff -u -r1.9.36.10 -r1.9.36.11 src/sys/arch/sbmips/sbmips/sb1250_icu.c
Please note that diffs are not public domain; they are subject to the
copyright notices on the relevant files.
Modified files:
Index: src/sys/arch/sbmips/sbmips/sb1250_icu.c
diff -u src/sys/arch/sbmips/sbmips/sb1250_icu.c:1.9.36.10 src/sys/arch/sbmips/sbmips/sb1250_icu.c:1.9.36.11
--- src/sys/arch/sbmips/sbmips/sb1250_icu.c:1.9.36.10 Sat Mar 13 03:14:13 2010
+++ src/sys/arch/sbmips/sbmips/sb1250_icu.c Tue Mar 16 02:34:48 2010
@@ -1,4 +1,4 @@
-/* $NetBSD: sb1250_icu.c,v 1.9.36.10 2010/03/13 03:14:13 matt Exp $ */
+/* $NetBSD: sb1250_icu.c,v 1.9.36.11 2010/03/16 02:34:48 matt Exp $ */
/*
* Copyright 2000, 2001
@@ -33,7 +33,7 @@
*/
#include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: sb1250_icu.c,v 1.9.36.10 2010/03/13 03:14:13 matt Exp $");
+__KERNEL_RCSID(0, "$NetBSD: sb1250_icu.c,v 1.9.36.11 2010/03/16 02:34:48 matt Exp $");
#define __INTR_PRIVATE
@@ -295,12 +295,20 @@
uint64_t sstatus = ints_for_ipl[ipl];
sstatus &= READ_REG(imr_base + R_IMR_INTERRUPT_SOURCE_STATUS);
- for (int j = 63; sstatus != 0; j--) {
- u_int n = __builtin_clz(sstatus);
- KASSERT((sstatus >> (63-n)) & 1);
- sstatus <<= n + 1;
- j -= n;
+ while (sstatus != 0) {
+#ifndef __mips_o32
+ u_int n;
+ __asm("dclz %0,%1" : "=r"(n) : "r"(sstatus));
+#else
+ u_int n = (sstatus >> 32)
+ ? 0 + __builtin_clz(sstatus >> 32)
+ : 32 + __builtin_clz((uint32_t)sstatus);
+#endif
+ u_int j = 63 - n;
+ KASSERT(sstatus & (1ULL << j));
+ sstatus ^= (1ULL << j);
struct sb1250_ihand *ihp = &sb1250_ihands[j];
+ KASSERT(ihp->ih_fun);
(*ihp->ih_fun)(ihp->ih_arg, status, pc);
evcnts[j].ev_count++;
}