Hi,
i've got a problem with code generation by CW 7.1 build 14.
Some settings:
- __fourbyteints__ 0 (defined 0, by clearing ' 4-byte integers' checkbox on the setting panel )
- MCF52235
Very simple clearing of a bit:
Enable int. by clearing corresp. bit mask:
MCF_INTC0_IMRL &= ~(MCF_INTC_IMRL_INT_MASK15 | MCF_INTC_IMRL_MASKALL );
Used definitions:
#define MCF_INTC0_IMRL (*(vuint32*)(&__IPSBAR[0xC0C]))
#define MCF_INTC_IMRL_INT_MASK15 (0x8000)
#define MCF_INTC_IMRL_MASKALL (0x1)
MCF_INTC0_IMRL &= ~ (MCF_INTC_IMRL_INT_MASK15 | MCF_INTC_IMRL_MASKALL );
Generated code:
; 398: MCF_INTC0_IMRL &= ~(MCF_INTC_IMRL_INT_MASK15 | MCF_INTC_IMRL_MASKALL );
;
0x000000D4 0x41F900000000 lea ___IPSBAR+3084,a0
0x000000DA 0x203C00007FFE move.l #32766,d0 ; '....'
0x000000E0 0xC190 and.l d0,(a0)
This also clears b31...16; and THAT was not intended. It seems that 'it' generated the mask 16 bit wide.
When you clear f.e. b14 then there's no problem.
MCF_INTC0_IMRL &= ~ (MCF_INTC_IMRL_INT_MASK14 | MCF_INTC_IMRL_MASKALL );
;397: MCF_INTC0_IMRL &= ~ (MCF_INTC_IMRL_INT_MASK14 | MCF_INTC_IMRL_MASKALL );
;
0x000000C6 0x41F900000000 lea ___IPSBAR+3084,a0
0x000000CC 0x203CFFFFBFFE move.l #-16386,d0 ; '....'
0x000000D2 0xC190 and.l d0,(a0)
Also when you cast to a uint32 the code is correct.
MCF_INTC0_IMRL &= ~ (uint32)(MCF_INTC_IMRL_INT_MASK15 | MCF_INTC_IMRL_MASKALL );
;399:MCF_INTC0_IMRL & = ~(uint32 (MCF_INTC_IMRL_INT_MASK15 | MCF_INTC_IMRL_MASKALL );
;
0x000000E2 0x41F900000000 lea ___IPSBAR+3084,a0
0x000000E8 0x203CFFFF7FFE move.l #-32770,d0 ; '....'
0x000000EE 0xC190 and.l d0,(a0)
Also when you try to clear b31, the compiler uses 64 bit sizes??
;400: MCF_INTC0_IMRL &= ~ (MCF_INTC_IMRL_INT_MASK31 | MCF_INTC_IMRL_MASKALL );
;
0x000000F0 0x4DF900000000 lea ___IPSBAR+3084,a6
0x000000F6 0x2F560004 move.l (a6),4(a7)
0x000000FA 0x41EF0014 lea 20(a7),a0
0x000000FE 0x2E88 move.l a0,(a7)
0x00000100 0x4EB900000000 jsr ___rt_ultoi64
0x00000106 0x72FF moveq #-1,d1
0x00000108 0x203C7FFFFFFE move.l #2147483646,d0 ; '....'
0x0000010E 0x2F400010 move.l d0,16(a7)
0x00000112 0x2F41000C move.l d1,12(a7)
0x00000116 0x2010 move.l (a0),d0
0x00000118 0x2F6800040008 move.l 4(a0),8(a7)
0x0000011E 0x2F400004 move.l d0,4(a7)
0x00000122 0x41EF001C lea 28(a7),a0
0x00000126 0x2E88 move.l a0,(a7)
0x00000128 0x4EB900000000 jsr ___rt_and64
0x0000012E 0x2CA80004 move.l 4(a0),(a6)
;
; 401: MCF_INTC0_IMRL &= ~ (uint32)(MCF_INTC_IMRL_INT_MASK31 | MCF_INTC_IMRL_MASKALL );
;
0x00000132 0x41F900000000 lea ___IPSBAR+3084,a0
0x00000138 0x203C7FFFFFFE move.l #2147483646,d0 ; '....'
0x0000013E 0xC190 and.l d0,(a0)
;
But when you: #define __fourbyteints__ 1
then the generated code is ok.
My question is, how can avoid this code generation error without the need of
explicitly casting when there seems no need to do so.
thanks,
René