summary refs log tree commit diff stats
path: root/hw/apic.c
diff options
context:
space:
mode:
authoraurel32 <aurel32@c046a42c-6fe2-441c-8c8c-71466251a162>2008-10-12 00:53:17 +0000
committeraurel32 <aurel32@c046a42c-6fe2-441c-8c8c-71466251a162>2008-10-12 00:53:17 +0000
commite95f5491bc4172f76d98f79de40a36098152937c (patch)
tree507362983a693ab4b65fe4dae1233976946691ff /hw/apic.c
parent7d01998021e38363d53bc93f198023a05d8a52bf (diff)
downloadfocaccia-qemu-e95f5491bc4172f76d98f79de40a36098152937c.tar.gz
focaccia-qemu-e95f5491bc4172f76d98f79de40a36098152937c.zip
hw/apic.c: use __builtin funtions instead of assembly code
Suggested by malc.

Signed-off-by: Aurelien Jarno <aurelien@aurel32.net>

git-svn-id: svn://svn.savannah.nongnu.org/qemu/trunk@5465 c046a42c-6fe2-441c-8c8c-71466251a162
Diffstat (limited to 'hw/apic.c')
-rw-r--r--hw/apic.c18
1 files changed, 8 insertions, 10 deletions
diff --git a/hw/apic.c b/hw/apic.c
index 0f661b61fe..46daf8a33a 100644
--- a/hw/apic.c
+++ b/hw/apic.c
@@ -104,15 +104,14 @@ static void apic_init_ipi(APICState *s);
 static void apic_set_irq(APICState *s, int vector_num, int trigger_mode);
 static void apic_update_irq(APICState *s);
 
-/* Find first bit starting from msb. Return 0 if value = 0 */
+/* Find first bit starting from msb */
 static int fls_bit(uint32_t value)
 {
+#if defined(__GNUC__)
+    return 31 - __builtin_clz(value);
+#else
     unsigned int ret = 0;
 
-#if defined(HOST_I386) || defined(HOST_X86_64)
-    __asm__ __volatile__ ("bsr %1, %0\n" : "+r" (ret) : "rm" (value));
-    return ret;
-#else
     if (value > 0xffff)
         value >>= 16, ret = 16;
     if (value > 0xff)
@@ -125,15 +124,14 @@ static int fls_bit(uint32_t value)
 #endif
 }
 
-/* Find first bit starting from lsb. Return 0 if value = 0 */
+/* Find first bit starting from lsb */
 static int ffs_bit(uint32_t value)
 {
+#if defined(__GNUC__)
+    return __builtin_ffs(value) - 1;
+#else
     unsigned int ret = 0;
 
-#if defined(HOST_I386) || defined(HOST_X86_64)
-    __asm__ __volatile__ ("bsf %1, %0\n" : "+r" (ret) : "rm" (value));
-    return ret;
-#else
     if (!value)
         return 0;
     if (!(value & 0xffff))