Yes,
this bug has been fixed months ago.
Check you're using most recent gcc.
~d
On Thursday 12 June 2003 20:53, Torfs Tom wrote:
> Hello All,
>
> I'm using msp430-gcc 3.2.2, which upto now worked fine, but is giving me
> strange behaviour now. The following code (which when compiled identically
> for the PC works perfectly), produces incorrect results when compiled by
> msp430-gcc -O2:
>
> #define GETBIT(d,n) (((d)>>(n))&1)
>
> // calculates 4 parity bits for (8,12) hamming
> unsigned char hamming_parity(unsigned char d)
> {
> unsigned char HP1,HP2,HP3,HP4;
>
> // calculate parity bits
> HP1 = GETBIT(d,0) ^ GETBIT(d,1) ^ GETBIT(d,3) ^ GETBIT(d,4) ^ GETBIT(d,6);
> HP2 = GETBIT(d,0) ^ GETBIT(d,2) ^ GETBIT(d,3) ^ GETBIT(d,5) ^ GETBIT(d,6);
> HP3 = GETBIT(d,1) ^ GETBIT(d,2) ^ GETBIT(d,3) ^ GETBIT(d,7);
> HP4 = GETBIT(d,4) ^ GETBIT(d,5) ^ GETBIT(d,6) ^ GETBIT(d,7);
>
> // combine into parity nibble
> return (HP4<<3)|(HP3<<2)|(HP2<<1)|HP1;
> }
>
> For example, for an input of d=0x05 it should produce parity bits 0x05, but
> instead it produces 0x09. When I look at the disassembly it says this:
>
> 00003072 <hamming_parity>:
> */
>
> // calculates 4 parity bits for (8,12) hamming
> unsigned char hamming_parity(unsigned char d)
> {
> 3072: 0b 12 push r11 ;
> 3074: 0a 12 push r10 ;
> 3076: 09 12 push r9 ;
> 3078: 08 12 push r8 ;
> 307a: 07 12 push r7 ;
> unsigned char HP1,HP2,HP3,HP4;
>
> // calculate parity bits
> HP1 = GETBIT(d,0) ^ GETBIT(d,1) ^ GETBIT(d,3) ^ GETBIT(d,4) ^
> GETBIT(d,6);
> 307c: 4c 4f mov.b r15, r12 ;
> 307e: 5c f3 and.b #1, r12 ;subst r3 with
> As==01
> 3080: 5f b3 bit.b #1, r15 ;subst r3 with
> As==01
> 3082: 4d 43 clr.b r13 ;
> 3084: 4d 63 adc.b r13 ;
> 3086: 48 4c mov.b r12, r8 ;
> 3088: 48 ed xor.b r13, r8 ;
> 308a: 7f b0 03 00 bit.b #3, r15 ;#0x0003
> 308e: 4b 43 clr.b r11 ;
> 3090: 4b 63 adc.b r11 ;
> 3092: 48 eb xor.b r11, r8 ;
> 3094: 6f b2 bit.b #4, r15 ;subst r2 with
> As==10
> 3096: 4e 43 clr.b r14 ;
> 3098: 4e 63 adc.b r14 ;
> 309a: 48 ee xor.b r14, r8 ;
> 309c: 7f b0 06 00 bit.b #6, r15 ;#0x0006
> 30a0: 4a 43 clr.b r10 ;
> 30a2: 4a 63 adc.b r10 ;
> 30a4: 48 ea xor.b r10, r8 ;
> HP2 = GETBIT(d,0) ^ GETBIT(d,2) ^ GETBIT(d,3) ^ GETBIT(d,5) ^
> GETBIT(d,6);
> 30a6: 6f b3 bit.b #2, r15 ;subst r3 with
> As==10
> 30a8: 49 43 clr.b r9 ;
> 30aa: 49 63 adc.b r9 ;
> 30ac: 4c e9 xor.b r9, r12 ;
> 30ae: 4c eb xor.b r11, r12 ;
> 30b0: 7f b0 05 00 bit.b #5, r15 ;#0x0005
> 30b4: 47 43 clr.b r7 ;
> 30b6: 47 63 adc.b r7 ;
> 30b8: 4c e7 xor.b r7, r12 ;
> 30ba: 4c ea xor.b r10, r12 ;
> HP3 = GETBIT(d,1) ^ GETBIT(d,2) ^ GETBIT(d,3) ^ GETBIT(d,7);
> 30bc: 4d e9 xor.b r9, r13 ;
> 30be: 4d eb xor.b r11, r13 ;
> 30c0: 4f 5f rla.b r15 ;
> 30c2: 4f 43 clr.b r15 ;
> 30c4: 4f 6f rlc.b r15 ;
> 30c6: 4d ef xor.b r15, r13 ;
> HP4 = GETBIT(d,4) ^ GETBIT(d,5) ^ GETBIT(d,6) ^ GETBIT(d,7);
> 30c8: 4e e7 xor.b r7, r14 ;
> 30ca: 4e ea xor.b r10, r14 ;
> 30cc: 4e ef xor.b r15, r14 ;
>
> // combine into parity nibble
> return (HP4<<3)|(HP3<<2)|(HP2<<1)|HP1;
> 30ce: 7e f3 and.b #-1, r14 ;subst r3 with
> As==11
> 30d0: 0e 5e rla r14 ;
> 30d2: 0e 5e rla r14 ;
> 30d4: 0e 5e rla r14 ;
> 30d6: 4f 4d mov.b r13, r15 ;
> 30d8: 0f 5f rla r15 ;
> 30da: 0f 5f rla r15 ;
> 30dc: 4e df bis.b r15, r14 ;
> 30de: 4f 4c mov.b r12, r15 ;
> 30e0: 0f 5f rla r15 ;
> 30e2: 4e df bis.b r15, r14 ;
> 30e4: 4e d8 bis.b r8, r14 ;
> 30e6: 4f 4e mov.b r14, r15 ;
> }
> 30e8: 37 41 pop r7 ;
> 30ea: 38 41 pop r8 ;
> 30ec: 39 41 pop r9 ;
> 30ee: 3a 41 pop r10 ;
> 30f0: 3b 41 pop r11 ;
> 30f2: 30 41 ret
>
> Maybe I'm missing something, but those bit.b instructions look messed up to
> me... e.g. to get bit #3 in the carry flag shouldn't it be bit.b #8,
> r15
> instead of:
> bit.b #3, r15
>
> ???
>
> greetings,
> Tom
>
>
> -------------------------------------------------------
> This SF.NET email is sponsored by: eBay
> Great deals on office technology -- on eBay now! Click here:
> http://adfarm.mediaplex.com/ad/ck/711-11697-6916-5
> _______________________________________________
> Mspgcc-users mailing list
> [email protected]
> https://lists.sourceforge.net/lists/listinfo/mspgcc-users
--
/********************************************************************
("`-''-/").___..--''"`-._ (\ Dimmy the Wild UA1ACZ
`6_ 6 ) `-. ( ).`-.__.`) Enterprise Information Sys
(_Y_.)' ._ ) `._ `. ``-..-' Nevsky prospekt, 20 / 44
_..`--'_..-_/ /--'_.' ,' Saint Petersburg, Russia
(il),-'' (li),' ((!.-' +7 (812) 3468202, 5585314
********************************************************************/