http://gcc.gnu.org/bugzilla/show_bug.cgi?id=60991
--- Comment #1 from johnst...@inn-soft.com --- I don't really know GCC source code well enough to feel comfortable changing and testing this myself, but I suspect the problem lies with this code? gcc/config/avr/avr.c: avr_out_store_psi function: revision 209767: 3992 return avr_asm_len ("adiw r28,%o0-61" CR_TAB 3993 "std Y+61,%A1" CR_TAB 3994 "std Y+62,%B1" CR_TAB 3995 "std Y+63,%C1" CR_TAB 3996 "sbiw r28,%o0-60", op, plen, -5); Notice the top line has "%o0-61" and bottom line has "%o0-60", which must be some kind of offset. I suspect this code was copied and pasted from the out_movsi_mr_r function, while forgetting to update the last line here since it is 24-bit integer and not the 32-bit integer it was copied from. It appears that this code was introduced with the new __int24 support and nothing changed since then.