Ok, well, that's no problem.  I have no problem with telling the
compiler that I'm only interested in the lower words (explicitly).

However the second "if" test _Doesn't_ do what I want.   I want to
remove the extra R15 loads that are not even being used.
Example: 
        int16 = (unsigned int)int32;
    1184:       1e 42 04 02             mov     &0x0204,r14     
    1188:       1f 42 06 02             mov     &0x0206,r15     <<-- not
needed!!
    118c:       82 4e 02 02             mov     r14,    &0x0202

I also want the assignments and compares to perform on the RAM directly,
since it can.  This would save the register loads. Example:

    1184:       92 42 04 02 02 02       mov     &0x0204,&0x0202 ;src
addr 0x0204

Would do the same thing w/o any extra register loads

-Mark


-----Original Message-----
From: [email protected]
[mailto:[email protected]] On Behalf Of Dmitry
Sent: Friday, January 03, 2003 4:34 PM
To: [email protected]
Subject: Re: [Mspgcc-users] Byte/word compare optomizations


Probably, the compiler is not intellegent enough to make some
suggestions like 
you (or somebody else do) and gcc does the thing it can (or how it's
been 
written ...)

 However:

> 1) In the first example, the compiler is adding a bunch of extra
loads.
> Not to mention it is projecting the int to a long by clearing R13 and
> including it in the comaprison (this is silly and actually incorrect).
> I don't want the compiler to assume that high word is zero, if I
wanted
> that I would've asked for that.  Also, in the assignment (int16 =
> int32;), it loads R15 for absolutely no reason.

How will you compare two different things - like diving and skydiving?
Is there any reason to do that?
Even if you would, you have to extend first one to another one - say
assume 
you have some extra SCUBA diving equipment picularities like ability to
work 
at 12000ft, or assume that skydiving can stop at 150 ft below the sea
level.
The first one is Ok - nothing gonna happen at 12K with mask. 
Another one is a bit tricky... I personally do not want to clean my rig
after 
landing the way I'll be somehow below the sea level :)

Therefore, when comparing two things - the common approach is to
_extend_ one 
thing to another, not cut! You have to _extend_ 16-bits var to 32-bits
var, 
not to cut 32-bits one half. 

So, the thing you see is zero_extend one _unsigned_ 16-bits to
_unsigned_ 
32-bits. In case they are signed - you'll get sign_extend of 16-bits to 
32-bits var.

So, the compiler just makes your life easier - you do not want to say
that you 
want to extend 16 to 32 bits - it does it for you, cause most people
think 
this way (how many actually will say that this is incorrect?).
However, if you do not want to do this way, you'll have to say, that I
would 
personally prefer to compare two different things the way one of them is

broken - 32 -> 16 bits.
So, your second
>
> 2) In the second if, I was able to force it to ignore the upper byte
in
> the compare by including the explicit type cast.  However, it still
> loads R15 unnecessarily (it's not even being used anywhere!).  It also
> loads R15 again unneccessarily in the assignment.
>
does the thing you want.

The third is a bit tricky:
> 3) In the third if, in an attempt to understand why a simple memory to
> memory test is not being performed (which is possible).  I had the
> compiler test two regular int's.  Amazingly, this resulted in the
> compiler loading both values into registers and comparing registers.
> This really doesn't make any sense to me.  However, the compiler is
> vedicated with the final assignment (int16 = int16;) because it
finally
> does what I'm expecting, it does a memory to memory assignment.

Probably, I have to check operation cost again cause it seems to me that
more 
and more people tend to use -O3 .. -O15932 (or whatever the number they
do 
not understand)
Just be... simple... try -O1. Do not try to amaze yourself. 


>
> This example was compiled w/ the -O2 option.  When I tried the -O3
> option I received the following error:
> "testif.c:29: Internal compiler error in verify_local_live_at_start,
at
> flow.c:583
... hm... see above and I will check this tomorrow.
From the top of my brain - this code confuses gcc a lot - you assign
volatiles 
and then compare them right away... well, this is perfectly correct,
but...
I'll check this anyway.

cheers,
~d




> Please submit a full bug report,
> with preprocessed source if appropriate.
> See <URL:http://www.gnu.org/software/gcc/bugs.html> for instructions."
>
> The version of the msp430-gcc.exe compiler I have is:
> Length: 84,992 bytes
> Date: 12/18/02
>
> Thanks
> -Mark Stokes

-- 
*********************************************************************
   ("`-''-/").___..--''"`-._     (\       Dimmy the Wild      UA1ACZ
    `6_ 6  )   `-.  (     ).`-.__.`)      Enterprise Information Sys 
    (_Y_.)'  ._   )  `._ `. ``-..-'       Nevsky prospekt,   20 / 44
  _..`--'_..-_/  /--'_.' ,'               Saint Petersburg,   Russia
 (il),-''  (li),'  ((!.-'                 +7 (812) 314-8860, 5585314
*********************************************************************





-------------------------------------------------------
This sf.net email is sponsored by:ThinkGeek
Welcome to geek heaven.
http://thinkgeek.com/sf
_______________________________________________
Mspgcc-users mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/mspgcc-users


Reply via email to