[rtems commit] bsp/virtex: Use ppc_count_leading_zeros()

Sebastian Huber sebh at rtems.org
Tue Jul 9 14:36:12 UTC 2013


Module:    rtems
Branch:    master
Commit:    d168079cecc6d4605e659fbe810b0f6fbc2683e0
Changeset: http://git.rtems.org/rtems/commit/?id=d168079cecc6d4605e659fbe810b0f6fbc2683e0

Author:    Sebastian Huber <sebastian.huber at embedded-brains.de>
Date:      Tue Jul  9 16:38:03 2013 +0200

bsp/virtex: Use ppc_count_leading_zeros()

Use ppc_count_leading_zeros() to optimize interrupt processing.

---

 c/src/lib/libbsp/powerpc/virtex/irq/irq_init.c |   21 ++++++++++-----------
 1 files changed, 10 insertions(+), 11 deletions(-)

diff --git a/c/src/lib/libbsp/powerpc/virtex/irq/irq_init.c b/c/src/lib/libbsp/powerpc/virtex/irq/irq_init.c
index 715dbd6..b863bc9 100644
--- a/c/src/lib/libbsp/powerpc/virtex/irq/irq_init.c
+++ b/c/src/lib/libbsp/powerpc/virtex/irq/irq_init.c
@@ -38,6 +38,8 @@
 #include <bsp/irq-generic.h>
 #include <bsp/vectors.h>
 
+#include <libcpu/powerpc-utility.h>
+
 /*
  * Acknowledge a mask of interrupts.
  */
@@ -86,21 +88,18 @@ static void BSP_irq_handle_at_opbintc(void)
   /* Get pending interrupts */
   ipr = get_ipr();
 
-  /* Acknowledge all pending interrupts now and service them afterwards */
-  set_iar(ipr);
+  if (ipr != 0) {
+    /* Acknowledge all pending interrupts now and service them afterwards */
+    set_iar(ipr);
 
-  for (i = 0;
-       (i < BSP_OPBINTC_PER_IRQ_NUMBER)
-	 && (ipr != 0);
-       i++) {
-    c = (1 << i);
+    do {
+      /* Get highest priority pending interrupt */
+      uint32_t i = 31 - ppc_count_leading_zeros(ipr);
 
-    if ((ipr & c) != 0) {
-      /* interrupt is asserted */
-      ipr &= ~c;
+      ipr &= ~(1U << i);
 
       bsp_interrupt_handler_dispatch(i+BSP_OPBINTC_IRQ_LOWEST_OFFSET);
-    }
+    } while (ipr != 0);
   }
 }
 




More information about the vc mailing list