Hello.
On 27-01-2011 12:20, loody wrote:
hi all:
I guess there seems be some differences about
"unsigned long long" and "ull" so I forward the letter to gcc-help.
If my guess is correct, what are the differences between them and why
"unsigned long long" cannot let compiler compile the 64-bits
operations as I want?
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...
thanks a lot,
miloody
I found my kernel will compile udelay(xx) as zero no matter what xx I filled in.
below are the dis-assemblies:
(as you can see the v0 = v1 = zero.)
My version is 2.6.30.9:
void __udelay(unsigned long us)
{
unsigned int lpj = current_cpu_data.udelay_val;
__delay(((unsigned long long)(us * 0x000010c7 * HZ * lpj)) >> 32);
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
|