I know this was an old post but thought that you might still be interested.
First of all I tried my later version of Codesourcery GCC and it has the identical output that you have. My version is:
m68k-elf-cpp (Sourcery CodeBench 2012.09-80) 4.7.2
Using the Codewarrior 10.2 for Linux which uses the Metrowerks compiler, with no optimisations:
0x00000000 _bitcount:
0x00000000 0x4E560000 link a6,#0
0x00000004 0x518F subq.l #8,a7
0x00000006 0x2D40FFF8 move.l d0,-8(a6)
0x0000000A 0x7000 moveq #0,d0
0x0000000C 0x2D40FFFC move.l d0,-4(a6)
0x00000010 0x202EFFF8 move.l -8(a6),d0
0x00000014 0x08000000 btst #0,d0
0x00000018 0x670A beq.s *+12 ; 0x00000024
0x0000001A 0x202EFFFC move.l -4(a6),d0
0x0000001E 0x5280 addq.l #1,d0
0x00000020 0x2D40FFFC move.l d0,-4(a6)
0x00000024 0x202EFFF8 move.l -8(a6),d0
0x00000028 0x08000001 btst #1,d0
0x0000002C 0x670A beq.s *+12 ; 0x00000038
0x0000002E 0x202EFFFC move.l -4(a6),d0
0x00000032 0x5280 addq.l #1,d0
0x00000034 0x2D40FFFC move.l d0,-4(a6)
0x00000038 0x202EFFF8 move.l -8(a6),d0
0x0000003C 0x08000002 btst #2,d0
0x00000040 0x670A beq.s *+12 ; 0x0000004c
0x00000042 0x202EFFFC move.l -4(a6),d0
0x00000046 0x5280 addq.l #1,d0
0x00000048 0x2D40FFFC move.l d0,-4(a6)
0x0000004C 0x202EFFF8 move.l -8(a6),d0
0x00000050 0x08000003 btst #3,d0
0x00000054 0x670A beq.s *+12 ; 0x00000060
0x00000056 0x202EFFFC move.l -4(a6),d0
0x0000005A 0x5280 addq.l #1,d0
0x0000005C 0x2D40FFFC move.l d0,-4(a6)
0x00000060 0x202EFFF8 move.l -8(a6),d0
0x00000064 0x08000004 btst #4,d0
0x00000068 0x670A beq.s *+12 ; 0x00000074
0x0000006A 0x202EFFFC move.l -4(a6),d0
0x0000006E 0x5280 addq.l #1,d0
0x00000070 0x2D40FFFC move.l d0,-4(a6)
0x00000074 0x202EFFFC move.l -4(a6),d0
0x00000078 0x4E5E unlk a6
0x0000007A 0x4E75 rts
Same again but with optimisation set to 2:
0x00000000 _bitcount:
0x00000000 0x4E560000 link a6,#0
0x00000004 0x518F subq.l #8,a7
0x00000006 0x2D40FFF8 move.l d0,-8(a6)
0x0000000A 0x7200 moveq #0,d1
0x0000000C 0x2D41FFFC move.l d1,-4(a6)
0x00000010 0x08000000 btst #0,d0
0x00000014 0x6708 beq.s *+10 ; 0x0000001e
0x00000016 0x7000 moveq #0,d0
0x00000018 0x7001 moveq #1,d0
0x0000001A 0x2D40FFFC move.l d0,-4(a6)
0x0000001E 0x202EFFF8 move.l -8(a6),d0
0x00000022 0x08000001 btst #1,d0
0x00000026 0x670A beq.s *+12 ; 0x00000032
0x00000028 0x202EFFFC move.l -4(a6),d0
0x0000002C 0x5280 addq.l #1,d0
0x0000002E 0x2D40FFFC move.l d0,-4(a6)
0x00000032 0x202EFFF8 move.l -8(a6),d0
0x00000036 0x08000002 btst #2,d0
0x0000003A 0x670A beq.s *+12 ; 0x00000046
0x0000003C 0x202EFFFC move.l -4(a6),d0
0x00000040 0x5280 addq.l #1,d0
0x00000042 0x2D40FFFC move.l d0,-4(a6)
0x00000046 0x202EFFF8 move.l -8(a6),d0
0x0000004A 0x08000003 btst #3,d0
0x0000004E 0x670A beq.s *+12 ; 0x0000005a
0x00000050 0x202EFFFC move.l -4(a6),d0
0x00000054 0x5280 addq.l #1,d0
0x00000056 0x2D40FFFC move.l d0,-4(a6)
0x0000005A 0x202EFFF8 move.l -8(a6),d0
0x0000005E 0x08000004 btst #4,d0
0x00000062 0x670A beq.s *+12 ; 0x0000006e
0x00000064 0x202EFFFC move.l -4(a6),d0
0x00000068 0x5280 addq.l #1,d0
0x0000006A 0x2D40FFFC move.l d0,-4(a6)
0x0000006E 0x202EFFFC move.l -4(a6),d0
0x00000072 0x4E5E unlk a6
0x00000074 0x4E75 rts
Same again with optimisation set to 4:
0x00000000 _bitcount:
0x00000000 0x4E560000 link a6,#0
0x00000004 0x518F subq.l #8,a7
0x00000006 0x2D40FFF8 move.l d0,-8(a6)
0x0000000A 0x7200 moveq #0,d1
0x0000000C 0x2D41FFFC move.l d1,-4(a6)
0x00000010 0x08000000 btst #0,d0
0x00000014 0x6706 beq.s *+8 ; 0x0000001c
0x00000016 0x7201 moveq #1,d1
0x00000018 0x2D41FFFC move.l d1,-4(a6)
0x0000001C 0x202EFFF8 move.l -8(a6),d0
0x00000020 0x08000001 btst #1,d0
0x00000024 0x670A beq.s *+12 ; 0x00000030
0x00000026 0x202EFFFC move.l -4(a6),d0
0x0000002A 0x5280 addq.l #1,d0
0x0000002C 0x2D40FFFC move.l d0,-4(a6)
0x00000030 0x202EFFF8 move.l -8(a6),d0
0x00000034 0x08000002 btst #2,d0
0x00000038 0x670A beq.s *+12 ; 0x00000044
0x0000003A 0x202EFFFC move.l -4(a6),d0
0x0000003E 0x5280 addq.l #1,d0
0x00000040 0x2D40FFFC move.l d0,-4(a6)
0x00000044 0x202EFFF8 move.l -8(a6),d0
0x00000048 0x08000003 btst #3,d0
0x0000004C 0x670A beq.s *+12 ; 0x00000058
0x0000004E 0x202EFFFC move.l -4(a6),d0
0x00000052 0x5280 addq.l #1,d0
0x00000054 0x2D40FFFC move.l d0,-4(a6)
0x00000058 0x202EFFF8 move.l -8(a6),d0
0x0000005C 0x08000004 btst #4,d0
0x00000060 0x670A beq.s *+12 ; 0x0000006c
0x00000062 0x202EFFFC move.l -4(a6),d0
0x00000066 0x5280 addq.l #1,d0
0x00000068 0x2D40FFFC move.l d0,-4(a6)
0x0000006C 0x202EFFFC move.l -4(a6),d0
0x00000070 0x4E5E unlk a6
0x00000072 0x4E75 rts
Interestly, I tried using the Netburner GCC based compiler and found this:
00000000 <bitcount>:
0: 4e56 0000 linkw %fp,#0
4: 222e 0008 movel %fp@(8),%d1
8: 7001 moveq #1,%d0
a: c081 andl %d1,%d0
c: 0801 0001 btst #1,%d1
10: 6702 beqs 14 <bitcount+0x14>
12: 5280 addql #1,%d0
14: 0801 0002 btst #2,%d1
18: 6702 beqs 1c <bitcount+0x1c>
1a: 5280 addql #1,%d0
1c: 0801 0003 btst #3,%d1
20: 6702 beqs 24 <bitcount+0x24>
22: 5280 addql #1,%d0
24: 0801 0004 btst #4,%d1
28: 6702 beqs 2c <bitcount+0x2c>
2a: 5280 addql #1,%d0
2c: 4e5e unlk %fp
2e: 4e75 rts
Netburner MacOS tools version string:
$ m68k-elf-gcc --version
m68k-elf-gcc (GCC) 4.2.1
The GCC option in the Codewarrior IDE is only for ARM targets.
Shaun