http://gcc.gnu.org/bugzilla/show_bug.cgi?id=46393
Summary: m68k code size regression Product: gcc Version: 4.5.1 Status: UNCONFIRMED Severity: normal Priority: P3 Component: target AssignedTo: unassig...@gcc.gnu.org ReportedBy: anders.monto...@iki.fi The following code snippet compiles to 112 bytes using GCC 4.4.0 and 154 bytes using GCC 4.5.1. Host is OS X 10.6, target is m68k-elf bare-metal toolchain using newlib. The code was compiled with -m68000 -Os -c. unpack.c: #include <stdint.h> uint8_t ChannelMap[32]; typedef struct { uint8_t note; uint8_t instrument; uint8_t volume; uint8_t command; uint8_t info; } Channeldata_t; Channeldata_t RowBuffer[16]; uint8_t UnpackRow(const uint8_t *pRowData) { uint8_t count = 0, byte, channel, mappedchannel; Channeldata_t *pChannelData; while ((byte = *pRowData++) != 0) { ++count; channel = byte & 0x1f; mappedchannel = ChannelMap[channel]; pChannelData = &RowBuffer[mappedchannel]; if (byte & 0x20) { pChannelData->note = *pRowData++; pChannelData->instrument = *pRowData++; ++count; } if (byte & 0x40) { pChannelData->volume = *pRowData++; ++count; } if (byte & 0x80) { pChannelData->command = *pRowData++; pChannelData->info = *pRowData++; count += 2; } } return count; } GCC 4.4.0-produced code: 00000000 <UnpackRow>: 0: 4e56 0000 linkw %fp,#0 4: 48e7 3820 moveml %d2-%d4/%a2,%...@- 8: 206e 0008 moveal %fp@(8),%a0 c: 4200 clrb %d0 e: 45f9 0000 0000 lea 0 <UnpackRow>,%a2 14: 604e bras 64 <UnpackRow+0x64> 16: 5288 addql #1,%a0 18: 5200 addqb #1,%d0 1a: 7400 moveq #0,%d2 1c: 1401 moveb %d1,%d2 1e: 761f moveq #31,%d3 20: c682 andl %d2,%d3 22: 1632 3800 moveb %a2@(0000000000000000,%d3:l),%d3 26: 0283 0000 00ff andil #255,%d3 2c: 2803 movel %d3,%d4 2e: d883 addl %d3,%d4 30: d884 addl %d4,%d4 32: 2244 moveal %d4,%a1 34: d3c3 addal %d3,%a1 36: d3fc 0000 0000 addal #0,%a1 3c: 0802 0005 btst #5,%d2 40: 6708 beqs 4a <UnpackRow+0x4a> 42: 1298 moveb %...@+,%a1@ 44: 1358 0001 moveb %...@+,%a1@(1) 48: 5200 addqb #1,%d0 4a: 0802 0006 btst #6,%d2 4e: 6706 beqs 56 <UnpackRow+0x56> 50: 1358 0002 moveb %...@+,%a1@(2) 54: 5200 addqb #1,%d0 56: 4a01 tstb %d1 58: 6c0a bges 64 <UnpackRow+0x64> 5a: 1358 0003 moveb %...@+,%a1@(3) 5e: 1358 0004 moveb %...@+,%a1@(4) 62: 5400 addqb #2,%d0 64: 1210 moveb %a0@,%d1 66: 66ae bnes 16 <UnpackRow+0x16> 68: 4cdf 041c moveml %...@+,%d2-%d4/%a2 6c: 4e5e unlk %fp 6e: 4e75 rts GCC 4.5.1-produced code: 00000000 <UnpackRow>: 0: 4e56 0000 linkw %fp,#0 4: 48e7 383c moveml %d2-%d4/%a2-%a5,%...@- 8: 206e 0008 moveal %fp@(8),%a0 c: 4200 clrb %d0 e: 49f9 0000 0000 lea 0 <UnpackRow>,%a4 14: 47f9 0000 0000 lea 0 <UnpackRow>,%a3 1a: 45f9 0000 0000 lea 0 <UnpackRow>,%a2 20: 606c bras 8e <UnpackRow+0x8e> 22: 5288 addql #1,%a0 24: 5200 addqb #1,%d0 26: 721f moveq #31,%d1 28: c282 andl %d2,%d1 2a: 1234 1800 moveb %a4@(0000000000000000,%d1:l),%d1 2e: 0281 0000 00ff andil #255,%d1 34: 7600 moveq #0,%d3 36: 1602 moveb %d2,%d3 38: 0803 0005 btst #5,%d3 3c: 6714 beqs 52 <UnpackRow+0x52> 3e: 2801 movel %d1,%d4 40: d881 addl %d1,%d4 42: d884 addl %d4,%d4 44: 2244 moveal %d4,%a1 46: d3c1 addal %d1,%a1 48: 1398 b800 moveb %...@+,%a1@(0000000000000000,%a3:l) 4c: 1398 a800 moveb %...@+,%a1@(0000000000000000,%a2:l) 50: 5200 addqb #1,%d0 52: 0803 0006 btst #6,%d3 56: 6714 beqs 6c <UnpackRow+0x6c> 58: 2601 movel %d1,%d3 5a: d681 addl %d1,%d3 5c: d683 addl %d3,%d3 5e: 2243 moveal %d3,%a1 60: d3c1 addal %d1,%a1 62: d3fc 0000 0000 addal #0,%a1 68: 1298 moveb %...@+,%a1@ 6a: 5200 addqb #1,%d0 6c: 4a02 tstb %d2 6e: 6c1e bges 8e <UnpackRow+0x8e> 70: 2401 movel %d1,%d2 72: d481 addl %d1,%d2 74: d482 addl %d2,%d2 76: 2242 moveal %d2,%a1 78: d3c1 addal %d1,%a1 7a: 2a49 moveal %a1,%a5 7c: dbfc 0000 0000 addal #0,%a5 82: 1a98 moveb %...@+,%a5@ 84: d3fc 0000 0000 addal #0,%a1 8a: 1298 moveb %...@+,%a1@ 8c: 5400 addqb #2,%d0 8e: 1410 moveb %a0@,%d2 90: 6690 bnes 22 <UnpackRow+0x22> 92: 4cdf 3c1c moveml %...@+,%d2-%d4/%a2-%a5 96: 4e5e unlk %fp 98: 4e75 rts