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

Reply via email to