www.digitalmars.com         C & C++   DMDScript  

digitalmars.D.bugs - [Issue 13007] New: Wrong x86 code: long negate


          Issue ID: 13007
           Summary: Wrong x86 code: long negate
           Product: D
           Version: D2
          Hardware: x86
                OS: Linux
            Status: NEW
          Severity: major
          Priority: P1
         Component: DMD
          Assignee: nobody puremagic.com
          Reporter: dragoscarp gmail.com

Created attachment 1367
  --> https://issues.dlang.org/attachment.cgi?id=1367&action=edit
sample code

The attached example compiled with dmd 2.065 (flags: -m32 -O -inline) generates
wrong code for negative of a SysTime value:

 8093c76:       89 c2                   mov    %eax,%edx
 8093c78:       8b 45 f8                mov    -0x8(%ebp),%eax   <-- lower part
in eax
 8093c7b:       f7 d8                   neg    %eax
 8093c7d:       89 55 c4                mov    %edx,-0x3c(%ebp)
 8093c80:       8b 55 fc                mov    -0x4(%ebp),%edx   <-- higher
part in eax
 8093c83:       f7 da                   neg    %edx
 8093c85:       19 da                   sbb    %ebx,%edx  <-- ERROR: eax carry
was overwritten by the previous negation

Even Baz is not used in foo, the error is present only if foo.d is compiled
together with baz.d (foo.d baz.d -c).

With DMD master/HEAD the bug is not reproducible, because the generated code is
quite different.

Jun 29 2014