Re: Fwd: about udelay in mips

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



hi:
>   Probably because in 2.6.30 you only cast the result of 32-bit multiplies
> to 64 bits. In the 2.6.33 kernel, the mutliplies are 64-bit as the
> 0x000010c7ull constant is 64-bit...

>> void __udelay(unsigned long us)
>> {
>>        unsigned int lpj = current_cpu_data.udelay_val;
>>
>>        __delay(((unsigned long long)(us * 0x000010c7 * HZ * lpj)) >> 32);
so that means (us * 0x000010c7 * HZ * lpj)  is calculated at 32-bits and finally
(unsigned long long) cast it as 64-bits?
if i remember correctly, "64bit cast to 32-bits" is possible get 0
value, since high bits cast out.
But how 34-bits cast to 64-bits will make the value as 0 if original
low 32-bits value is non-zero?
appreciate your reply,
miloody

>> 80306ed0:       00001821        move    v1,zero
>> 80306ed4:       00601021        move    v0,v1
>> #include<asm/compiler.h>
>> #include<asm/war.h>
>>
>> inline void __delay(unsigned int loops)
>> {
>>        __asm__ __volatile__ (
>> 80306ed8:       1440ffff        bnez    v0,80306ed8 <__udelay+0x8>
>> 80306edc:       2442ffff        addiu   v0,v0,-1
>> void __udelay(unsigned long us)
>
>> I have double checked the __delay source code of 2.6.33.4
>> and the dis-assemblies:
>
>> void __udelay(unsigned long us)
>> {
>>        unsigned int lpj = current_cpu_data.udelay_val;
>>
>>        __delay((us * 0x000010c7ull * HZ * lpj) >> 32);
>> 802f7310:       3c02804f        lui     v0,0x804f
>> 802f7314:       8c429360        lw      v0,-27808(v0)
>> 802f7318:       3c050010        lui     a1,0x10
>> 802f731c:       34a56256        ori     a1,a1,0x6256
>> 802f7320:       00450019        multu   v0,a1
>> 802f7324:       00002821        move    a1,zero
>> 802f7328:       00001012        mflo    v0
>> 802f732c:       00001810        mfhi    v1
>> 802f7330:       00a20018        mult    a1,v0
>> 802f7334:       70640000        madd    v1,a0
>> 802f7338:       00003012        mflo    a2
>> 802f733c:       00440019        multu   v0,a0
>> 802f7340:       00001810        mfhi    v1
>> 802f7344:       00c31021        addu    v0,a2,v1
>> #include<asm/compiler.h>
>> #include<asm/war.h>
>>
>> inline void __delay(unsigned int loops)
>> {
>>        __asm__ __volatile__ (
>> 802f7348:       1440ffff        bnez    v0,802f7348 <__udelay+0x38>
>> 802f734c:       2442ffff        addiu   v0,v0,-1
>> void __udelay(unsigned long us)
>> {
>>        unsigned int lpj = current_cpu_data.udelay_val;
>>
>>        __delay((us * 0x000010c7ull * HZ * lpj)>>  32);
>> }
>> 802f7350:       03e00008        jr      ra
>
> WBR, Sergei
>



-- 
Regards,



[Index of Archives]     [Linux MIPS Home]     [LKML Archive]     [Linux ARM Kernel]     [Linux ARM]     [Linux]     [Git]     [Yosemite News]     [Linux SCSI]     [Linux Hams]

  Powered by Linux