[LLVMbugs] [Bug 12173] New: incorrect shrdq instruction from __asm__() directive

bugzilla-daemon at llvm.org bugzilla-daemon at llvm.org
Sat Mar 3 05:20:35 PST 2012


http://llvm.org/bugs/show_bug.cgi?id=12173

             Bug #: 12173
           Summary: incorrect shrdq instruction from __asm__() directive
           Product: clang
           Version: 3.0
          Platform: Macintosh
        OS/Version: MacOS X
            Status: NEW
          Severity: normal
          Priority: P
         Component: LLVM Codegen
        AssignedTo: unassignedclangbugs at nondot.org
        ReportedBy: shartwell at vmware.com
                CC: llvmbugs at cs.uiuc.edu
    Classification: Unclassified


Created attachment 8139
  --> http://llvm.org/bugs/attachment.cgi?id=8139
minimal c code to demonstrate __asm__() shrdq bug

This issue was discovered on clang 3.0, and reproduced on clang 3.1 in Xcode
4.3:
>>Apple clang version 3.1 (tags/Apple/clang-318.0.45) (based on LLVM 3.1svn)
>>Target: x86_64-apple-darwin11.3.0
/*
 * Using the 2-argument form of the shrdq instruction (i.e. with %cl implicit),
 * clang generates the following __asm__() directive as:
 *     shrdq $0x01,%rax,%rdx  // shift %rdx right 1 bit (immediate addressing!)
filling from %rax
 * Expected instruction:
 *     shrdq %cl,%rdx,%rax    // shift %rax right by %cl bits, filling from
%rdx
 *
 * Gcc generates the expected instruction from this __asm__() directive.
 */
unsigned long long
badshift(unsigned long long lo64,
         unsigned long long hi64,
         unsigned char shift)
{
   __asm__("shrdq   %1, %0"      /* XXX => shrdq $0x01,%rax,%rdx */
           : "=a" (lo64),
             "=d" (hi64)
           : "c"  (shift)
           : "cc");
   return lo64;
}

/*
 * Using the 3-argument form of the shrdq instruction (i.e. with %cl explicit),
 * clang correctly generates the following __asm__() directive as written.
 */
unsigned long long
goodshift(unsigned long long lo64,
          unsigned long long hi64,
          unsigned char shift)
{
   __asm__("shrdq   %2, %1, %0"  /* OK => shrdq %cl,%rdx,%rax */
           : "=a" (lo64),
             "=d" (hi64)
           : "c"  (shift)
           : "cc");
   return lo64;
}

-- 
Configure bugmail: http://llvm.org/bugs/userprefs.cgi?tab=email
------- You are receiving this mail because: -------
You are on the CC list for the bug.



More information about the llvm-bugs mailing list