[PATCH v3 5/5] powernv:cpufreq: Implement the driver->get() method
Gautham R Shenoy
ego at linux.vnet.ibm.com
Sat Mar 22 01:25:55 EST 2014
On Fri, Mar 21, 2014 at 06:42:50PM +0530, Viresh Kumar wrote:
> On 21 March 2014 18:34, Gautham R Shenoy <ego at linux.vnet.ibm.com> wrote:
> > Consider the case when pmspr = 0x00feffffffffffff;
> >
> > We are interested in extracting the value 'fe'. And ensure that when
> > we store this value into an int, we get the sign extension right.
> >
> > So the following doesn't work:
> >
> > pstate_id = (pmspr_val >> 48) & 0xFFFFFFFF;
>
> What about pstate_id = (pmspr_val >> 48) & 0xFF; ??
Nope.
Suppose the pmspr_val is contained in the register
%rax, and pstate_id corresponds to the address -20(%rbp) then:
pstate_id = (pmspr_val >> 48) & 0xFF;
would corrspond to
shrq $48, %rax // Left shift by 48 bits
andl $255, %eax // Mask the lower 32 bits of %rax with 0x000000FF
movl %eax, -20(%rbp) // Store the lower 32 bits of %rax
into pstate_id
On the other hand,
pstate_id = (int)((s8)((pmspr_val >> 48) & 0xFF));
would correspond to:
shrq $48, %rax // Left shift by 48 bits.
movsbl %al, %eax // Move the lower 8 bits of %rax to %eax
with sign-extension.
movl %eax, -20(%rbp) // store the result in pstate_id;
So with this, we are getting the sign extension due to the use of movsbl.
And if local_pstate_id corresponds to the address -1(%rbp) then:
local_pstate_id = (pmspr_val >> 48) & 0xFF;
pstate_id = local_pstate_id;
would correspond to:
shrq $48, %rax // Left shift by 48 bits
movb %al, -1(%rbp) //copy the lower 8 bits to local_pstate_id
movsbl -1(%rbp), %eax //move the contents of
local_pstate_id to %eax with sign extension.
movl %eax, -20(%rbp) // Store the result in pstate_id
Hope this helps :-)
--
Thanks and Regards
gautham.
More information about the Linuxppc-dev
mailing list