Hi, I'm doing a port of gcc 4.3.3 on a custom architecture and I'm having trouble when initializing the bit fields of a structure.
The testcase is based on a modified gcc torture testcase, the natural registers are 16 bits, and long long is defined to be 64 bit wide: struct itmp { long long int pad : 30; long long int field : 34; }; struct itmp itmp = {0x123LL, 0x123456LL}; int main(void) { itmp.field = 0x42; return 1; } Running the above example gives (compiled with -O0...): 12 itmp.field = 0x42; (gdb) p/x itmp $1 = {pad = 0x123, field = 0x123456} (gdb) n 13 return 1; (gdb) p/x itmp $2 = {pad = 0x123, field = 0x0} If I use 32 bits for pad and 32 bits for field, the result is correct. Also, if I use 'long' instead of 'long long' (and change the bit lengths of course), it works too. Looking at the RTL shows the problem right from the beginning, in the expand pass (there is no reference to the constant 66 = 0x42 in the RTL below): ;; itmp.field = 66 (insn 5 4 6 991118-1.c:12 (set (reg/f:HI 25) (symbol_ref:HI ("itmp") [flags 0x2] <var_decl 0xb7c460b0 itmp>)) -1 (nil)) (insn 6 5 7 991118-1.c:12 (set (reg:HI 26) (reg/f:HI 25)) -1 (nil)) (insn 7 6 8 991118-1.c:12 (set (reg/f:HI 27) (plus:HI (reg/f:HI 25) (const_int 6 [0x6]))) -1 (nil)) (insn 8 7 9 991118-1.c:12 (set (reg:HI 28) (const_int 0 [0x0])) -1 (nil)) (insn 9 8 10 991118-1.c:12 (set (mem/s/j/c:HI (reg/f:HI 27) [0+6 S2 A16]) (reg:HI 28)) -1 (nil)) (insn 10 9 11 991118-1.c:12 (set (reg:HI 29) (reg/f:HI 25)) -1 (nil)) (insn 11 10 12 991118-1.c:12 (set (reg/f:HI 30) (plus:HI (reg/f:HI 25) (const_int 4 [0x4]))) -1 (nil)) (insn 12 11 13 991118-1.c:12 (set (reg:HI 31) (const_int 0 [0x0])) -1 (nil)) (insn 13 12 14 991118-1.c:12 (set (mem/s/j/c:HI (reg/f:HI 30) [0+4 S2 A16]) (reg:HI 31)) -1 (nil)) (insn 14 13 15 991118-1.c:12 (set (reg:HI 32) (reg/f:HI 25)) -1 (nil)) (insn 15 14 16 991118-1.c:12 (set (reg/f:HI 33) (plus:HI (reg/f:HI 25) (const_int 2 [0x2]))) -1 (nil)) (insn 16 15 17 991118-1.c:12 (set (reg:HI 34) (mem/s/j/c:HI (reg/f:HI 33) [0+2 S2 A16])) -1 (nil)) (insn 17 16 18 991118-1.c:12 (set (reg:HI 36) (const_int -4 [0xfffffffc])) -1 (nil)) (insn 18 17 19 991118-1.c:12 (set (reg:HI 35) (and:HI (reg:HI 34) (reg:HI 36))) -1 (nil)) (insn 19 18 0 991118-1.c:12 (set (mem/s/j/c:HI (reg/f:HI 33) [0+2 S2 A16]) (reg:HI 35)) -1 (nil)) Any idea on what is happenning here ? Am I missing some standard patterns in my .md file ? Thanks ! -- Stelian Pop <stel...@popies.net>