------- Additional Comments From schlie at comcast dot net 2004-12-21 07:59 ------- Problems, with 4.0 avr test results (some good, some bad, some odd);
000000c6 <main>: int main (void){ c6: c8 ef ldi r28, 0xF8 ; 248 c8: d0 e1 ldi r29, 0x10 ; 16 ca: de bf out 0x3e, r29 ; 62 cc: cd bf out 0x3d, r28 ; 61 volatile char c; volatile int i; volatile long l; /* char tests */ c = (c & (1 << 4)); ce: 89 81 ldd r24, Y+1 ; 0x01 d0: 80 71 andi r24, 0x10 ; 16 ; good. d2: 89 83 std Y+1, r24 ; 0x01 if (c & (1 << 4)) d4: 89 81 ldd r24, Y+1 ; 0x01 d6: 84 ff sbrs r24, 4 ; good single bit test & branch d8: 03 c0 rjmp .+6 ; 0xe0 <main+0x1a> c = 1; da: 81 e0 ldi r24, 0x01 ; 1 dc: 89 83 std Y+1, r24 ; 0x01 de: 01 c0 rjmp .+2 ; 0xe2 <main+0x1c> else c = 0; e0: 19 82 std Y+1, r1 ; 0x01 c = (c & (1 << 4)) ? 1 : 0; e2: 89 81 ldd r24, Y+1 ; 0x01 e4: 99 27 eor r25, r25 e6: 44 e0 ldi r20, 0x04 ; 4 ; bad, using shift loop. although same as above. e8: 96 95 lsr r25 ea: 87 95 ror r24 ec: 4a 95 dec r20 ee: e1 f7 brne .-8 ; 0xe8 <main+0x22> f0: 81 70 andi r24, 0x01 ; 1 f2: 89 83 std Y+1, r24 ; 0x01 c = sizeof(char); f4: 81 e0 ldi r24, 0x01 ; 1 f6: 89 83 std Y+1, r24 ; 0x01 /* int tests */ i = i & (1 << 10); f8: 8a 81 ldd r24, Y+2 ; 0x02 fa: 9b 81 ldd r25, Y+3 ; 0x03 fc: 80 70 andi r24, 0x00 ; 0 ; ok, but nicer if recognized only highest byte significant. fe: 94 70 andi r25, 0x04 ; 4 100: 8a 83 std Y+2, r24 ; 0x02 102: 9b 83 std Y+3, r25 ; 0x03 if (i & (1 << 10)) 104: 8a 81 ldd r24, Y+2 ; 0x02 106: 9b 81 ldd r25, Y+3 ; 0x03 108: 9c 01 movw r18, r24 ; shouldn't be moving the operand? rest as above. 10a: 20 70 andi r18, 0x00 ; 0 10c: 34 70 andi r19, 0x04 ; 4 10e: 92 ff sbrs r25, 2 110: 05 c0 rjmp .+10 ; 0x11c <main+0x56> i = 1; 112: 81 e0 ldi r24, 0x01 ; 1 114: 90 e0 ldi r25, 0x00 ; 0 ; r1 = 0 already?, 116: 8a 83 std Y+2, r24 ; 0x02 118: 9b 83 std Y+3, r25 ; 0x03 11a: 02 c0 rjmp .+4 ; 0x120 <main+0x5a> else i = 0; 11c: 2a 83 std Y+2, r18 ; 0x02 11e: 3b 83 std Y+3, r19 ; 0x03 ; wrong, r19 = andi r19, 0x04 ? i = (i & (1 << 10)) ? 1 : 0; 120: 8a 81 ldd r24, Y+2 ; 0x02 122: 9b 81 ldd r25, Y+3 ; 0x03 124: 89 2f mov r24, r25 ; nice, shifts by 8 first. 126: 99 27 eor r25, r25 128: 86 95 lsr r24 12a: 86 95 lsr r24 12c: 81 70 andi r24, 0x01 ; 1 12e: 90 70 andi r25, 0x00 ; 0 ; but then fogets it already set r25 to 0? 130: 8a 83 std Y+2, r24 ; 0x02 132: 9b 83 std Y+3, r25 ; 0x03 i = sizeof(int); 134: 82 e0 ldi r24, 0x02 ; 2 136: 90 e0 ldi r25, 0x00 ; 0 138: 8a 83 std Y+2, r24 ; 0x02 13a: 9b 83 std Y+3, r25 ; 0x03 /* long tests */ l = (l & ((long)1 << 26)); 13c: 8c 81 ldd r24, Y+4 ; 0x04 13e: 9d 81 ldd r25, Y+5 ; 0x05 140: ae 81 ldd r26, Y+6 ; 0x06 142: bf 81 ldd r27, Y+7 ; 0x07 144: 80 70 andi r24, 0x00 ; 0 ; ok. 146: 90 70 andi r25, 0x00 ; 0 148: a0 70 andi r26, 0x00 ; 0 14a: b4 70 andi r27, 0x04 ; 4 14c: 8c 83 std Y+4, r24 ; 0x04 14e: 9d 83 std Y+5, r25 ; 0x05 150: ae 83 std Y+6, r26 ; 0x06 152: bf 83 std Y+7, r27 ; 0x07 if (l & ((long)1 << 26)) 154: 8c 81 ldd r24, Y+4 ; 0x04 156: 9d 81 ldd r25, Y+5 ; 0x05 158: ae 81 ldd r26, Y+6 ; 0x06 15a: bf 81 ldd r27, Y+7 ; 0x07 15c: 9c 01 movw r18, r24 ; again unnessisarily moving things? 15e: ad 01 movw r20, r26 160: 20 70 andi r18, 0x00 ; 0 ; very odd, both &'s 162: 30 70 andi r19, 0x00 ; 0 164: 40 70 andi r20, 0x00 ; 0 166: 54 70 andi r21, 0x04 ; 4 168: b2 ff sbrs r27, 2 ; and tests the significant bit, didn't need to do above. 16a: 09 c0 rjmp .+18 ; 0x17e <main+0xb8> l = 1; 16c: 81 e0 ldi r24, 0x01 ; 1 16e: 90 e0 ldi r25, 0x00 ; 0 ; again r1 = 0 already? 170: a0 e0 ldi r26, 0x00 ; 0 172: b0 e0 ldi r27, 0x00 ; 0 174: 8c 83 std Y+4, r24 ; 0x04 176: 9d 83 std Y+5, r25 ; 0x05 178: ae 83 std Y+6, r26 ; 0x06 17a: bf 83 std Y+7, r27 ; 0x07 17c: 04 c0 rjmp .+8 ; 0x186 <main+0xc0> else l = 0; 17e: 2c 83 std Y+4, r18 ; 0x04 180: 3d 83 std Y+5, r19 ; 0x05 182: 4e 83 std Y+6, r20 ; 0x06 184: 5f 83 std Y+7, r21 ; 0x07 ; wrong r21 = andi r21, 0x04 l = (l & ((long)1 << 26)) ? 1 : 0; 186: 8c 81 ldd r24, Y+4 ; 0x04 188: 9d 81 ldd r25, Y+5 ; 0x05 18a: ae 81 ldd r26, Y+6 ; 0x06 18c: bf 81 ldd r27, Y+7 ; 0x07 18e: 2a e1 ldi r18, 0x1A ; 26 190: b6 95 lsr r27 ; not good, big shift loop, should & or just test most sig. byte. 192: a7 95 ror r26 194: 97 95 ror r25 196: 87 95 ror r24 198: 2a 95 dec r18 19a: d1 f7 brne .-12 ; 0x190 <main+0xca> 19c: aa 27 eor r26, r26 19e: 97 fd sbrc r25, 7 1a0: a0 95 com r26 1a2: ba 2f mov r27, r26 1a4: 81 70 andi r24, 0x01 ; 1 1a6: 90 70 andi r25, 0x00 ; 0 1a8: a0 70 andi r26, 0x00 ; 0 1aa: b0 70 andi r27, 0x00 ; 0 1ac: 8c 83 std Y+4, r24 ; 0x04 1ae: 9d 83 std Y+5, r25 ; 0x05 1b0: ae 83 std Y+6, r26 ; 0x06 1b2: bf 83 std Y+7, r27 ; 0x07 l = sizeof(long); 1a8: 84 e0 ldi r24, 0x04 ; 4 1aa: 90 e0 ldi r25, 0x00 ; 0 1ac: a0 e0 ldi r26, 0x00 ; 0 1ae: b0 e0 ldi r27, 0x00 ; 0 1b0: 8c 83 std Y+4, r24 ; 0x04 1b2: 9d 83 std Y+5, r25 ; 0x05 1b4: ae 83 std Y+6, r26 ; 0x06 1b6: bf 83 std Y+7, r27 ; 0x07 return 0; } 1b8: 80 e0 ldi r24, 0x00 ; 0 1ba: 90 e0 ldi r25, 0x00 ; 0 1bc: 0c 94 e0 00 jmp 0x1c0 <_exit> -- What |Removed |Added ---------------------------------------------------------------------------- Status|RESOLVED |REOPENED Resolution|FIXED | http://gcc.gnu.org/bugzilla/show_bug.cgi?id=18424