In my backend (GCC 4.8.1), the compiler calls emit_move_insn from expand_value_return. The C-code is static char cnv(const char *str) { int i = strtol(str, ((void *)0), 10); if (i == -1) i = 127; return (char)i; } x is SImode and y is QImode (makes sense from looking at the C-code). Apparently the compiler doesn't call any sign or zero extend before that. I am running into the assertion in emit_move_insn gcc_assert (mode != BLKmode && (GET_MODE (y) == mode || GET_MODE (y) == VOIDmode)); because mode(x) != mode(y). Any idea what could causing this? Regards, Thanks, Hendrik Greving