loader: Build the preloader for ARM
Peter Rosin
peda at lysator.liu.se
Fri Feb 4 13:36:49 CST 2011
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 at 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;
...
More information about the wine-devel
mailing list