OS: Ubuntu 7.04
GCC version: 4.2.1

I try to play the inline assembly function. Here I use "rep movsb" to copy a
string.

// Code begin
char input[] = {"GCC Version Number"};
char output[30];
int  length = 28;

asm (
  "cld\n\t"
  "rep movsb"
  :
  : "c"(length), "S"(input), "D"(output));

printf("%s\n", output);
// Code end

  While compiled without "-O", everything is okay. However, if compiled with
"-O", the compiler will generate incorrect code as if the %edi never changes
during the assembly code execution.

Compile with "-S" will see the corresponding generated assembly codes are:

// code begin
# APP
  cld
  rep movsb
# NO_APP
  movl %edi, -4(%esp)  # BAD CODE HERE
  movl $.LC1, (%esp)
  call printf 
// code end

The problem is, movsb changes the value of %esi and %edi, and I told the
compiler about this in the "input" section in the asm directive. The compiler
didn't notice this and believe the value of %edi unchanged. 

I think this is a bug.


-- 
           Summary: GCC doesn't protect %edi when using inline assembly
           Product: gcc
           Version: 4.1.2
            Status: UNCONFIRMED
          Severity: normal
          Priority: P3
         Component: c
        AssignedTo: unassigned at gcc dot gnu dot org
        ReportedBy: meng dot yan at gmail dot com


http://gcc.gnu.org/bugzilla/show_bug.cgi?id=33527

Reply via email to