c++solarissunstudiosuncc

Invalid reference to argument 'N' in GASM Inlining


I'm building Botan on Solaris 11.3 with the SunCC compiler that comes with Developer Studio 12.5. I'm not too familiar with the library or Solaris, and it takes me some effort to track down issues.

The compile is dying on a relatively benign file called divide.cpp. I've got it reduced to the following test case. According to Oracle's GCC-style asm inlining support in Sun Studio 12 compilers, the ASM is well formed. Clang, GCC and ICC happily consume the code.

$ /opt/developerstudio12.5/bin/CC -m64 -std=c++11 test.cxx -c
"test.cxx", [main]:ube: error: Invalid reference to argument '1' in GASM Inlining
CC: ube failed for test.cxx

$ cat test.cxx
#include <iostream>
#include <stdint.h>    
typedef uint64_t word;

inline word multadd(word a, word b, word* c)
{
    asm(
        "mulq %[b]          \n\t"
        "addq %[c],%[a]     \n\t"
        "adcq $0,%[carry]   \n\t" 

      : [a]"=a"(a), [b]"=rm"(b), [carry]"=&d"(*c)
      : "0"(a), "1"(b), [c]"g"(*c) : "cc");

   return a;
}

int main(int argc, char* argv[])
{
    word a, b, c, d;
    std::cin >> a >> b >> c;

    d = multadd(a, b, &c);

    return 0;
}

I can't find useful information on the error string Invalid reference to argument 'N' in GASM Inlining. I found sunCC chokes on inline assembler on the Oracle boards. But the answer is UBE is buggy and buy a support contract to learn more.

I have three questions:


If I change the b parameter to just =m, then the same error is produced. If I change the b parameter to just =r, then a different error is generated:

asm(
    "mulq %[b]          \n\t"
    "addq %[c],%[a]     \n\t"
    "adcq $0,%[carry]   \n\t"

    : [a]"=a"(a), [b]"=r"(b), [carry]"=&d"(*c)
    : "0"(a), "1"(b), [c]"g"(*c) : "cc");

And the result:

$ /opt/developerstudio12.5/bin/CC  -m64 -std=c++11 test.cxx -c
Assembler: test.cxx
        "<null>", line 205 : Invalid instruction argument
        Near line: "mulq %rcx          "
        "<null>", line 206 : Invalid instruction argument
        Near line: "    addq %rbx,%rax     "
        "<null>", line 207 : Invalid instruction argument
        Near line: "    adcq $0,%rdx   "
CC: ube failed for test.cxx

Solution

  • What does the error message indicate?

    Unfortunately, no idea.

    If someone buys a support contract and has the time, then please solicit Oracle for an answer .

    How can I get SunCC to provide a source file and line number?

    Unfortunately, no idea.

    How can I work around the issue?

    David Wohlferd suspected the [b]"=rm"(b) output operand. It looks like the one ASM block needs to be split into two blocks. Its an awful hack, but we have not figured out another way to do it.

    inline word multadd(word a, word b, word* c)
    {
        asm(
          "mulq %[b]            \n\t"
    
          : [a]"+a"(a), [b]"=&d"(b)
          : "0"(a), "1"(b));
        asm(
          "addq %[c],%[a]"      \n\t"
          "adcq $0,%[carry]     \n\t"
    
          : [a]"=a"(a), [carry]"=&d"(*c)
          : "a"(a), "d"(b), [c]"g"(*c) : "cc");
    
        return a;
    }