From: Vangelis R. <vr...@ot...> - 2003-12-17 11:37:38
|
Hello all, I have a question about the iCode generator... I try to compile the following source ------------------------------------ volatile struct { unsigned RA0:1; unsigned RA1:1; unsigned RA2:1; unsigned RA3:1; unsigned RA4:1; unsigned RA5:1; unsigned RA6:1; unsigned RA7:1; } TEST; sfr at 0xf80 PORTA; sfr at 0xf81 PORTB; char a; //, c=0x1; void main(void) { char b; char c=0xc1; TEST.RA4 = (char)0x01; a = TEST.RA0; PORTB = TEST.RA0; b = PORTB; c += a | b; PORTB = c+0x25; } ------------------------------------- Its use, like many other major projects, is of now use, but it helps to identify a problem. Lets see the iCodes generated after the register allocation pass (the .dumprassign file): ------------------------------------- s7.c(l18:s1:k0:d0:s0) _entry($2) : s7.c(l18:s2:k1:d0:s0) proc _main [k1 lr0:0 so:0]{ ia0 re0 rm0 nos0 ru0 dp0}{void function ( ) } s7.c(l23:s3:k3:d0:s0) iTemp2 [k7 lr3:4 so:0]{ ia0 re0 rm1 nos0 ru0 dp0}{volatile-unsigned-bitfield {4,1} near* }[remat] = &[_TEST [k4 lr0:0 so:0]{ ia0 re0 rm0 nos0 ru0 dp0}{volatile-struct __00010000}] s7.c(l23:s4:k5:d0:s0) *(iTemp2 [k7 lr3:4 so:0]{ ia1 re0 rm1 nos0 ru0 dp0}{volatile-unsigned-bitfield {4,1} near* }[remat]) := 0x1 {literal-volatile-unsigned-bitfield {4,1}} ------------------------------------- (note that I have deleted some lines from the beginning and the end of the file to isolate the lines in request, but I attach the whole file for those interested) Lets isolate lines 3 and 4 and remove some useless stuff: line 2: iTemp2 {volatile-unsigned-bitfield {4,1} near* }[remat] = &[_TEST {volatile-struct __00010000}] line 3: *(iTemp2 {volatile-unsigned-bitfield {4,1} near* }[remat]) := 0x1 {literal-volatile-unsigned-bitfield {4,1}} I remind you that the line above represent the assignment: TEST.RA4 = (char)0x01; Question No1: What does 'remat' means? And what is its use in the iCode generator? (i.e. why it is used? what is its purpose?) Question No2: As far as I have understood the 8051 architecture has a bit space, so one can acquire a pointer to a specific bit and assign a value to it. That's what the currect iCode generator does. But, there are other processors, like the PICs (and AVR I think) that do not have this feature. On the other hand they have commands like SET_BIT and CLEAR_BIT, that could be used for such purposes. The above implementation is not suitable for these processors. So is there a way to handle such a problem, or all the wight should be thrown to the port code generator? I would be nice if there was an option in the port structure that informs the iCode generator to create a different iCode series that the above. Thanks in advance, Vangelis Rokas |