OSDN Git Service

Ok, bad idea. didn't work.
authorEric Andersen <andersen@codepoet.org>
Fri, 9 Aug 2002 14:41:04 +0000 (14:41 -0000)
committerEric Andersen <andersen@codepoet.org>
Fri, 9 Aug 2002 14:41:04 +0000 (14:41 -0000)
 -Erik

ldso/ldso/arm/dl-sysdep.h
ldso/ldso/arm/ld_sysdep.h

index 74abb30..ef994ca 100644 (file)
 struct elf_resolve;
 unsigned long _dl_linux_resolver(struct elf_resolve * tpnt, int reloc_entry);
 
-#define do_rem(result, n, base)            result = (n % base)
+static inline unsigned long arm_modulus(unsigned long m, unsigned long p) {
+       unsigned long i,t,inc;
+        i=p; t=0;
+        while(!(i&(1<<31))) {
+                i<<=1;
+                t++;
+        }
+        t--;
+        for(inc=t;inc>2;inc--) {
+                i=p<<inc;
+                if(i&(1<<31))
+                        break;
+                while(m>=i) {
+                        m-=i;
+                        i<<=1;
+                        if(i&(1<<31))
+                                break;
+                        if(i<p)
+                                break;
+                }
+        }
+        while(m>=p) {
+                m-=p;
+        }
+        return m;
+}
+
+#define do_rem(result, n, base)  result=arm_modulus(n,base);
 
 /* 4096 bytes alignment */
 #define PAGE_ALIGN 0xfffff000
index 74abb30..ef994ca 100644 (file)
 struct elf_resolve;
 unsigned long _dl_linux_resolver(struct elf_resolve * tpnt, int reloc_entry);
 
-#define do_rem(result, n, base)            result = (n % base)
+static inline unsigned long arm_modulus(unsigned long m, unsigned long p) {
+       unsigned long i,t,inc;
+        i=p; t=0;
+        while(!(i&(1<<31))) {
+                i<<=1;
+                t++;
+        }
+        t--;
+        for(inc=t;inc>2;inc--) {
+                i=p<<inc;
+                if(i&(1<<31))
+                        break;
+                while(m>=i) {
+                        m-=i;
+                        i<<=1;
+                        if(i&(1<<31))
+                                break;
+                        if(i<p)
+                                break;
+                }
+        }
+        while(m>=p) {
+                m-=p;
+        }
+        return m;
+}
+
+#define do_rem(result, n, base)  result=arm_modulus(n,base);
 
 /* 4096 bytes alignment */
 #define PAGE_ALIGN 0xfffff000