From c7f84b67634330763d3d531f4433581ac29c987e Mon Sep 17 00:00:00 2001 From: Michael Sevakis Date: Mon, 30 Apr 2007 08:16:25 +0000 Subject: [PATCH] ARM/PP: more optimized set_irq_level() git-svn-id: svn://svn.rockbox.org/rockbox/trunk@13291 a1c6a512-1295-4272-9138-f99709370657 --- firmware/target/arm/system-arm.h | 16 +++++++++++----- 1 file changed, 11 insertions(+), 5 deletions(-) diff --git a/firmware/target/arm/system-arm.h b/firmware/target/arm/system-arm.h index 7126350a64..5cacc4cf62 100644 --- a/firmware/target/arm/system-arm.h +++ b/firmware/target/arm/system-arm.h @@ -87,16 +87,22 @@ static inline uint32_t swap_odd_even32(uint32_t value) return value; } -#define HIGHEST_IRQ_LEVEL (1) +#define HIGHEST_IRQ_LEVEL (0x80) static inline int set_irq_level(int level) { unsigned long cpsr; + int oldlevel; /* Read the old level and set the new one */ - asm volatile ("mrs %0,cpsr" : "=r" (cpsr)); - asm volatile ("msr cpsr_c,%0" - : : "r" ((cpsr & ~0x80) | (level << 7))); - return (cpsr >> 7) & 1; + asm volatile ( + "mrs %1, cpsr \n" + "bic %0, %1, #0x80 \n" + "and %2, %2, #0x80 \n" + "orr %0, %0, %2 \n" + "msr cpsr_c, %0 \n" + : "=&r"(cpsr), "=&r"(oldlevel), "+&r"(level) + ); + return oldlevel; } static inline void set_fiq_handler(void(*fiq_handler)(void))