Re: loader: Build the preloader for ARM
André Hentschel <nerv(a)dawncrow.de> writes:
+unsigned int wld_modulo( const unsigned int a, const Elf32_Word b ) +{ +#ifdef __ARM_EABI__ + unsigned int i; + if(b > a) return a; + for(i = 0; i * b < a + b; i++) + if(i * b > a - b) return (a - i * b); + return 0;
That's very inefficient, there are better ways... -- Alexandre Julliard julliard(a)winehq.org
Am 04.02.2011 16:31, schrieb Alexandre Julliard:
André Hentschel <nerv(a)dawncrow.de> writes:
+unsigned int wld_modulo( const unsigned int a, const Elf32_Word b ) +{ +#ifdef __ARM_EABI__ + unsigned int i; + if(b > a) return a; + for(i = 0; i * b < a + b; i++) + if(i * b > a - b) return (a - i * b); + return 0;
That's very inefficient, there are better ways...
Thanks for having a look at it. The Problem is that i also can't use '/', otherwise it wants to link to __aeabi_uidiv . That leads to some Problems, so i'll try to find some better math solution and if that fails i maybe try it the assembler way... -- Best Regards, André Hentschel
On Fri, Feb 04, 2011 at 04:51:46PM +0100, André Hentschel wrote:
Am 04.02.2011 16:31, schrieb Alexandre Julliard:
André Hentschel <nerv(a)dawncrow.de> writes:
+unsigned int wld_modulo( const unsigned int a, const Elf32_Word b ) +{ +#ifdef __ARM_EABI__ + unsigned int i; + if(b > a) return a; + for(i = 0; i * b < a + b; i++) + if(i * b > a - b) return (a - i * b); + return 0;
That's very inefficient, there are better ways...
Thanks for having a look at it. The Problem is that i also can't use '/', otherwise it wants to link to __aeabi_uidiv . That leads to some Problems, so i'll try to find some better math solution and if that fails i maybe try it the assembler way...
modulo would be "%" btw, return a%b; but this might generate external functions too... hmm, try -Os as option? Ciao, Marcus
Am 04.02.2011 17:26, schrieb Marcus Meissner:
On Fri, Feb 04, 2011 at 04:51:46PM +0100, André Hentschel wrote:
Am 04.02.2011 16:31, schrieb Alexandre Julliard:
André Hentschel <nerv(a)dawncrow.de> writes:
+unsigned int wld_modulo( const unsigned int a, const Elf32_Word b ) +{ +#ifdef __ARM_EABI__ + unsigned int i; + if(b > a) return a; + for(i = 0; i * b < a + b; i++) + if(i * b > a - b) return (a - i * b); + return 0;
That's very inefficient, there are better ways...
Thanks for having a look at it. The Problem is that i also can't use '/', otherwise it wants to link to __aeabi_uidiv . That leads to some Problems, so i'll try to find some better math solution and if that fails i maybe try it the assembler way...
modulo would be "%" btw,
return a%b;
but this might generate external functions too... hmm, try -Os as option?
Ciao, Marcus
% and / both lead to external dependencies here... maybe the euclidean algorithm helps, because -Os would need ugly changes to configure i guess. -- Best Regards, André Hentschel
Den 2011-02-04 17:41 skrev André Hentschel:
Am 04.02.2011 17:26, schrieb Marcus Meissner:
On Fri, Feb 04, 2011 at 04:51:46PM +0100, André Hentschel wrote:
Am 04.02.2011 16:31, schrieb Alexandre Julliard:
André Hentschel <nerv(a)dawncrow.de> writes:
+unsigned int wld_modulo( const unsigned int a, const Elf32_Word b ) +{ +#ifdef __ARM_EABI__ + unsigned int i; + if(b > a) return a; + for(i = 0; i * b < a + b; i++) + if(i * b > a - b) return (a - i * b); + return 0;
That's very inefficient, there are better ways...
Thanks for having a look at it. The Problem is that i also can't use '/', otherwise it wants to link to __aeabi_uidiv . That leads to some Problems, so i'll try to find some better math solution and if that fails i maybe try it the assembler way...
modulo would be "%" btw,
return a%b;
but this might generate external functions too... hmm, try -Os as option?
Ciao, Marcus
% and / both lead to external dependencies here... maybe the euclidean algorithm helps, because -Os would need ugly changes to configure i guess.
Finding gcd is a bit over the top... How about something like the following? Cheers, Peter unsigned int wld_modulo( const unsigned int a, const Elf32_Word b ) { #ifdef __ARM_EABI__ unsigned int r = 0; int i; for (i = sizeof(a) * 8 - 1; i >= 0; --i) { r <<= 1; if (a & (1U << i)) r |= 1; if (r > b) r -= b; } return r; ...
Den 2011-02-04 20:36 skrev Peter Rosin:
Den 2011-02-04 17:41 skrev André Hentschel:
% and / both lead to external dependencies here... maybe the euclidean algorithm helps, because -Os would need ugly changes to configure i guess.
Finding gcd is a bit over the top...
How about something like the following?
Cheers, Peter
unsigned int wld_modulo( const unsigned int a, const Elf32_Word b ) { #ifdef __ARM_EABI__ unsigned int r = 0; int i;
for (i = sizeof(a) * 8 - 1; i >= 0; --i) { r <<= 1; if (a & (1U << i)) r |= 1; if (r > b)
Ooops, bug. Should be "if (r >= b)"
r -= b; }
return r; ...
Cheers, Peter
participants (4)
-
Alexandre Julliard -
André Hentschel -
Marcus Meissner -
Peter Rosin