[LLVMbugs] [Bug 8874] New: Needs to support "register uint64_t foo asm("r8")"

bugzilla-daemon at llvm.org bugzilla-daemon at llvm.org
Wed Dec 29 21:32:41 PST 2010


           Summary: Needs to support "register uint64_t foo asm("r8")"
           Product: clang
           Version: unspecified
          Platform: PC
        OS/Version: All
            Status: NEW
          Severity: normal
          Priority: P
         Component: LLVM Codegen
        AssignedTo: unassignedclangbugs at nondot.org
        ReportedBy: rafael.espindola at gmail.com
                CC: llvmbugs at cs.uiuc.edu

Unfortunately there is no simple constraint for using r8 (or higher) on x86-64,
and therefore one has to write code like

uint64_t foo(uint64_t addr, uint64_t a0, uint64_t a1, uint64_t a2,
             uint64_t a3, uint64_t a4, uint64_t a5) {
  register uint64_t result asm("rax");
  register uint64_t b0 asm("rdi");
  register uint64_t b1 asm("rsi");
  register uint64_t b2 asm("rdx");
  register uint64_t b3 asm("rcx");
  register uint64_t b4 asm("r8");
  register uint64_t b5 asm("r9");

  b0 = a0;
  b1 = a1;
  b2 = a2;
  b3 = a3;
  b4 = a4;
  b5 = a5;

  asm("call *%0" : "=r" (result)
      : "r"(addr), "r" (a0), "r" (b1), "r" (b2), "r" (b3), "r" (b4), "r" (b5));
  return result;

Which gcc compiles to

        movq    %rsi, %rax
        movq    %rdx, %rsi
        movq    %rcx, %rdx
        movq    %r8, %rcx
        movq    %r9, %r8
        movq    8(%rsp), %r9
        call *%rax

This is all that has implemented, so hopefully it can be done by transforming
that asm("register") in a note that does nothing unless the variable is used in
inline assembly.

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