On x86, CX is used for shift. If CX is used for a variable, it may not be preserved with shift:
[...@gnu-9 reg-1]$ cat r.c extern void abort (void); void foo (int x) { if (x != 8) abort (); } void bar (int g) { register int x __asm__("ecx"); x = 5; foo (1 << g); if (x != 5) abort (); } int main () { bar (3); return 0; } [...@gnu-9 reg-1]$ make r0 /export/build/gnu/gcc/build-i686-linux/gcc/xgcc -B/export/build/gnu/gcc/build-i686-linux/gcc/ -m32 -O0 r.c -o r0 [...@gnu-9 reg-1]$ ./r0 Aborted [...@gnu-9 reg-1]$ -- Summary: CX isn't preserved with shift Product: gcc Version: 4.4.0 Status: UNCONFIRMED Keywords: ra Severity: normal Priority: P3 Component: target AssignedTo: unassigned at gcc dot gnu dot org ReportedBy: hjl dot tools at gmail dot com http://gcc.gnu.org/bugzilla/show_bug.cgi?id=38941