Reply by Onestone July 14, 20052005-07-14
In asm this is even smaller/faster:_

       swpb   R15
       MOV.B   r15,r14  OR and.b  #-1,r15

Since asm doesn't understand 32 bit values there is no need to 
explicitly clear the MSW, your code simply works on the MSW, ignoring 
the LSW for this instant, however the question was about C. In C your 
compiler could, of course declare a union and do the same, building the 
value from a 32 bit data type, then calculating using only the upper 16 
bit data type, but that would be expecting too much.

Al

Paul Curtis wrote:

>All, 
>
>  
>
>>>... If
>>>you're trying to divide a 32 bit value by 65536, in the 
>>>      
>>>
>>second case,  
>>    
>>
>>>it would be quicker to simply move the MSW into the LSW, in 
>>>      
>>>
>>the first 
>>    
>>
>>>case you move MSW to LSW, byte swap using SWPB, then and the result 
>>>with 0x00FFH. Of course SWPB isn't C, but it's a damned 
>>>      
>>>
>>sight quicker 
>>    
>>
>>>than a chain of shifts.
>>>
>>>Al
>>>      
>>>
>>I would hope that most aq430 C compilers emit exactly the 
>>code you suggest for a long unsigned right shift by 24! The 
>>AQ430 C compiler does, anyway.
>>    
>>
>
>No, that's too slow by two words:
>
>  mov.w r15, r14  ; shift by 16
>  mov.w #0, r15   ; clear vacated bits
>  swpb  r14       ; shift by 8
>  and.w #255, r14 ; clear vacated bits
>
>This is 5 words.  Ok, can make it a little better:
>
>  mov.w r15, r14  ; shift by 16
>  mov.w #0, r15   ; clear vacated bits
>  swpb  r14       ; shift by 8
>  and.b #-1, r14  ; clear vacated bits
>
>Four words.  Still not good enough!
>
>  swpb  r15
>  mov.b r15, r14
>  mov.w #0, r15
>
>You gotta know your processor...  Of course, CrossWorks generates the
>last and even EW430 catches it.  :-)
>
>--
>Paul Curtis, Rowley Associates Ltd  http://www.rowley.co.uk
>CrossWorks for MSP430, ARM, AVR and now MAXQ processors
>
>
>.
>
> 
>Yahoo! Groups Links
>
>
>
> 
>
>
>
>
>  
>


Beginning Microcontrollers with the MSP430

Reply by Onestone July 14, 20052005-07-14
That's one for you compiler guys. If I were to write in C I would 
construct my code to force this translation if the compiler didn't do it 
anyway. thhis is where compilers can get VERY complex though (Hi Alex 
;?} )There are potentially so many of these optimisations that it would 
be difficult for any compiler to 'know' them all.

Al

Preston Gurd wrote:

>
>  
>
>>... If 
>>you're trying to divide a 32 bit value by 65536, in the second
case,  it 
>>would be quicker to simply move the MSW into the LSW, in the first case 
>>you move MSW to LSW, byte swap using SWPB, then and the result with 
>>0x00FFH. Of course SWPB isn't C, but it's a damned sight
quicker than a 
>>chain of shifts.
>>
>>Al
>>    
>>
>
>I would hope that most aq430 C compilers emit exactly the code you suggest
>for a long unsigned right shift by 24! The AQ430 C compiler does, anyway.
>
>Preston Gurd
>(the AQ430 C compiler guy)
>
>
>.
>
> 
>Yahoo! Groups Links
>
>
>
> 
>
>
>
>
>  
>


Reply by Preston Gurd July 14, 20052005-07-14
Thanks, Paul!

Preston

> 
>   swpb  r15
>   mov.b r15, r14
>   mov.w #0, r15
> 
> You gotta know your processor...  Of course, CrossWorks generates the
> last and even EW430 catches it.  :-)
> 

Reply by Paul Curtis July 14, 20052005-07-14
All, 

> > ... If
> > you're trying to divide a 32 bit value by 65536, in the 
> second case,  
> > it would be quicker to simply move the MSW into the LSW, in 
> the first 
> > case you move MSW to LSW, byte swap using SWPB, then and the result 
> > with 0x00FFH. Of course SWPB isn't C, but it's a damned 
> sight quicker 
> > than a chain of shifts.
> > 
> > Al
> 
> I would hope that most aq430 C compilers emit exactly the 
> code you suggest for a long unsigned right shift by 24! The 
> AQ430 C compiler does, anyway.

No, that's too slow by two words:

  mov.w r15, r14  ; shift by 16
  mov.w #0, r15   ; clear vacated bits
  swpb  r14       ; shift by 8
  and.w #255, r14 ; clear vacated bits

This is 5 words.  Ok, can make it a little better:

  mov.w r15, r14  ; shift by 16
  mov.w #0, r15   ; clear vacated bits
  swpb  r14       ; shift by 8
  and.b #-1, r14  ; clear vacated bits

Four words.  Still not good enough!

  swpb  r15
  mov.b r15, r14
  mov.w #0, r15

You gotta know your processor...  Of course, CrossWorks generates the
last and even EW430 catches it.  :-)

--
Paul Curtis, Rowley Associates Ltd  http://www.rowley.co.uk
CrossWorks for MSP430, ARM, AVR and now MAXQ processors

Reply by Preston Gurd July 14, 20052005-07-14


> 
> ... If 
> you're trying to divide a 32 bit value by 65536, in the second case, 
it 
> would be quicker to simply move the MSW into the LSW, in the first case 
> you move MSW to LSW, byte swap using SWPB, then and the result with 
> 0x00FFH. Of course SWPB isn't C, but it's a damned sight quicker
than a 
> chain of shifts.
> 
> Al

I would hope that most aq430 C compilers emit exactly the code you suggest
for a long unsigned right shift by 24! The AQ430 C compiler does, anyway.

Preston Gurd
(the AQ430 C compiler guy)

Reply by colin_garlick July 14, 20052005-07-14
 
I'm sorry, this is far too painful for me to watch unraveling.

Just because #define preprocessor calculations are evaluated to 
32bits on ALL IAR compiler's doesn't mean to say a C-integer is 
necessarily 32bits. Depending upon the target architecture, C-
integers are sometimes 16bit and sometimes 32bits. For MSP430 the 
register size is 16bits so the size of an integer will be 16bits on 
all MSP430 compilers.

PS You can use the IAR intrinsic function (one assembler instruction)
unsigned short __swap_bytes(unsigned short);
from within C-langauage to shift data up or down 8 bits at a time.
Don't forget to MASK and OR the result back together again.

Hope this helps.

Colin,

--- In msp430@msp4..., Onestone <onestone@b...> wrote:
> Exactly what I said. IAR does support 32 bit
values but YOU have 
to 
> declare them as such. RTFM
> 
> Al
> 
> Bharat Kumar.V wrote:
> 
> > 
> >
> >Hi,
> >
> >Thanks for ur reply
> >
> > 
> >
> >Actually I have a code(Encryption algorithm) working on PC.
> >
> >Now I am trying port the same code on msp430  using IAR.
> >
> >I think that IAR C compiler supports 32 bit compilation.
> >
> >So I thought that the same code which was working on 32 bit 
processor
> >would work fine.
> >
> >I am getting warnings which I told earlier.
> >
> >Can any body tell me what I am doing is right or wrong. 
> >
> > 
> >
> >B
> >
> >-----Original Message-----
> >From: msp430@msp4... [mailto:msp430@msp4...] On 
Behalf
> >Of Onestone
> >Sent: Thursday, July 14, 2005 2:44 PM
> >To: msp430@msp4...
> >Subject: Re: [msp430] SHIFT OPERATION IN 'C' PROGRAM COMPILED
BY 
IAR
> >COMPILER
> >
> > 
> >
> >You're trying to shift a 16 bit value by 24 or 16 bits? Of course 
the 
> >compiler will complain. If you read the
compiler manual first it 
will 
> >tell you the size of the default  types. The
compiler probably 
supports 
> >the shifting, but you'll have to use it
on  a long integer. What 
on 
> >earth are you trying to achieve? Engage your
brain and think 
about it 
> >for a minute or two. You are just assuming
that a shift will be 
the 
> >quick way to do this (either that or you
don't understand whjat 
you're 
> >doing. There comes a point when shifting is no
longer efficient. 
If 
> >you're trying to divide a 32 bit value by
65536, in the second 
case,  it
> >
> >would be quicker to simply move the MSW into the LSW, in the 
first case 
> >you move MSW to LSW, byte swap using SWPB,
then and the result 
with 
> >0x00FFH. Of course SWPB isn't C, but
it's a damned sight quicker 
than a 
> >chain of shifts.
> >
> >Al
> >
> >Bharat Kumar.V wrote:
> >
> >  
> >
> >>Hi,
> >>
> >>
> >>
> >>I am using shift in my C program (>>24, >>16)
> >>
> >>My program is giving me warning saying that "shift count is
too 
large".
> >>
> >>Does this IAR compiler support that shifting?
> >>
> >>Please give some suggestion on this. 
> >>
> >>Regards,
> >>
> >>
> >>
> >>B
> >>
> >>
> >>
> >>
> >>
> >>
> >>
> >>
> >>
> >>.
> >>
> >>
> >>>  Terms of Service. 
> >
> > 
> >
> >  _____  
> >
> >
> >
> >
> >
> >
> >
> >.
> >
> > 
> >Yahoo! Groups Links
> >
> >
> >
> > 
> >
> >
> >
> >
> >  
> >



Reply by Onestone July 14, 20052005-07-14
Exactly what I said. IAR does support 32 bit values but YOU have to 
declare them as such. RTFM

Al

Bharat Kumar.V wrote:

> 
>
>Hi,
>
>Thanks for ur reply
>
> 
>
>Actually I have a code(Encryption algorithm) working on PC.
>
>Now I am trying port the same code on msp430  using IAR.
>
>I think that IAR C compiler supports 32 bit compilation.
>
>So I thought that the same code which was working on 32 bit processor
>would work fine.
>
>I am getting warnings which I told earlier.
>
>Can any body tell me what I am doing is right or wrong. 
>
> 
>
>B
>
>-----Original Message-----
>From: msp430@msp4... [mailto:msp430@msp4...] On Behalf
>Of Onestone
>Sent: Thursday, July 14, 2005 2:44 PM
>To: msp430@msp4...
>Subject: Re: [msp430] SHIFT OPERATION IN 'C' PROGRAM COMPILED BY
IAR
>COMPILER
>
> 
>
>You're trying to shift a 16 bit value by 24 or 16 bits? Of course the 
>compiler will complain. If you read the compiler manual first it will 
>tell you the size of the default  types. The compiler probably supports 
>the shifting, but you'll have to use it on  a long integer. What on 
>earth are you trying to achieve? Engage your brain and think about it 
>for a minute or two. You are just assuming that a shift will be the 
>quick way to do this (either that or you don't understand whjat
you're 
>doing. There comes a point when shifting is no longer efficient. If 
>you're trying to divide a 32 bit value by 65536, in the second case, 
it
>
>would be quicker to simply move the MSW into the LSW, in the first case 
>you move MSW to LSW, byte swap using SWPB, then and the result with 
>0x00FFH. Of course SWPB isn't C, but it's a damned sight quicker
than a 
>chain of shifts.
>
>Al
>
>Bharat Kumar.V wrote:
>
>  
>
>>Hi,
>>
>>
>>
>>I am using shift in my C program (>>24, >>16)
>>
>>My program is giving me warning saying that "shift count is too
large".
>>
>>Does this IAR compiler support that shifting?
>>
>>Please give some suggestion on this. 
>>
>>Regards,
>>
>>
>>
>>B
>>
>>
>>
>>
>>
>>
>>
>>
>>
>>.
>>
>>
>>>  Terms of Service. 
>
> 
>
>  _____  
>
>
>
>
>
>
>
>.
>
> 
>Yahoo! Groups Links
>
>
>
> 
>
>
>
>
>  
>


Reply by michelqv July 14, 20052005-07-14
I would look into the definition of variabl;e types between the two 
compilers. Sounds like the "int" type for the 32 bit processor was 
32 bits longs, whereas it is 16 bits long for MSP430.

Michel

--- In msp430@msp4..., "Bharat Kumar.V" <bharatv@e...> wrote:
>  
> 
> Hi,
> 
> Thanks for ur reply
> 
>  
> 
> Actually I have a code(Encryption algorithm) working on PC.
> 
> Now I am trying port the same code on msp430  using IAR.
> 
> I think that IAR C compiler supports 32 bit compilation.
> 
> So I thought that the same code which was working on 32 bit 
processor
> would work fine.
> 
> I am getting warnings which I told earlier.
> 
> Can any body tell me what I am doing is right or wrong. 
> 
>  
> 
> B
> 
> -----Original Message-----
> From: msp430@msp4... [mailto:msp430@msp4...] On 
Behalf
> Of Onestone
> Sent: Thursday, July 14, 2005 2:44 PM
> To: msp430@msp4...
> Subject: Re: [msp430] SHIFT OPERATION IN 'C' PROGRAM COMPILED BY 
IAR
> COMPILER
> 
>  
> 
> You're trying to shift a 16 bit value by 24 or 16 bits? Of course 
the 
> compiler will complain. If you read the compiler
manual first it 
will 
> tell you the size of the default  types. The
compiler probably 
supports 
> the shifting, but you'll have to use it on  a
long integer. What 
on 
> earth are you trying to achieve? Engage your brain
and think about 
it 
> for a minute or two. You are just assuming that a
shift will be 
the 
> quick way to do this (either that or you
don't understand whjat 
you're 
> doing. There comes a point when shifting is no
longer efficient. 
If 
> you're trying to divide a 32 bit value by
65536, in the second 
case,  it
> 
> would be quicker to simply move the MSW into the LSW, in the first 
case 
> you move MSW to LSW, byte swap using SWPB, then
and the result 
with 
> 0x00FFH. Of course SWPB isn't C, but
it's a damned sight quicker 
than a 
> chain of shifts.
> 
> Al
> 
> Bharat Kumar.V wrote:
> 
> >Hi,
> >
> > 
> >
> >I am using shift in my C program (>>24, >>16)
> >
> >My program is giving me warning saying that "shift count is too 
large".
> >
> >Does this IAR compiler support that shifting?
> >
> >Please give some suggestion on this. 
> >
> >Regards,
> >
> > 
> >
> >B
> >
> > 
> >
> >
> >
> >
> >
> >
> >
> >.
> >
> > 
> >>  Terms of Service. 
> 
>  
> 
>   _____  
> 
> 
> 
> 



Reply by michelqv July 14, 20052005-07-14
Which type of variable are you trying to shift? If it's 16 bits or 
less, there are faster ways to accomplish that shift!

Michel

--- In msp430@msp4..., "Bharat Kumar.V" <bharatv@e...> wrote:
> Hi,
> 
>  
> 
> I am using shift in my C program (>>24, >>16)
> 
> My program is giving me warning saying that "shift count is too 
large".
> 
> Does this IAR compiler support that shifting?
> 
> Please give some suggestion on this. 
> 
> Regards,
> 
>  
> 
> B
> 
>  
> 
> 
> 
> 




Reply by Onestone July 14, 20052005-07-14
You're trying to shift a 16 bit value by 24 or 16 bits? Of course the 
compiler will complain. If you read the compiler manual first it will 
tell you the size of the default  types. The compiler probably supports 
the shifting, but you'll have to use it on  a long integer. What on 
earth are you trying to achieve? Engage your brain and think about it 
for a minute or two. You are just assuming that a shift will be the 
quick way to do this (either that or you don't understand whjat you're

doing. There comes a point when shifting is no longer efficient. If 
you're trying to divide a 32 bit value by 65536, in the second case,  it 
would be quicker to simply move the MSW into the LSW, in the first case 
you move MSW to LSW, byte swap using SWPB, then and the result with 
0x00FFH. Of course SWPB isn't C, but it's a damned sight quicker than
a 
chain of shifts.

Al

Bharat Kumar.V wrote:

>Hi,
>
> 
>
>I am using shift in my C program (>>24, >>16)
>
>My program is giving me warning saying that "shift count is too
large".
>
>Does this IAR compiler support that shifting?
>
>Please give some suggestion on this. 
>
>Regards,
>
> 
>
>B
>
> 
>
>
>
>
>
>
>
>.
>
> 
>Yahoo! Groups Links
>
>
>
> 
>
>
>
>
>  
>