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++; }