------- Comment #7 from amylaar at gcc dot gnu dot org 2006-07-07 13:50 ------- (In reply to comment #3) > When I disable the offending code (by altering add_cost[DImode] at the right > moment), I get the right result for little endian. However, compiling for > big endian gives wrong code: > > _expand64: > mov #0,r5 > mov r4,r0 > rts > mov r5,r1 > .size _expand64, .-_expand64 > .ident "GCC: (GNU) 4.2.0 20060620 (experimental)" > > 3.4.0 was sane: > _expand64: > mov r4,r5 > mov #0,r4 > mov r4,r0 > rts > mov r5,r1 > .size _expand64, .-_expand64 > .ident "GCC: (GNU) 3.4.0 20040113 (experimental)" > Oops, I got mixed up here - I somehow thought the argument was long long, i.e. the lowpart in r5. Since the argument is actually unsigned int, it is passed in r4.
And the 3.4.0 code for big endian is actually: _expand64: mov #0,r5 mov r4,r0 rts mov r5,r1 .size _expand64, .-_expand64 .ident "GCC: (GNU) 3.4.0 20040113 (experimental)" -- http://gcc.gnu.org/bugzilla/show_bug.cgi?id=28283