C++ 对参数'的引用无效;N';在GASM内联中

C++ 对参数'的引用无效;N';在GASM内联中,c++,solaris,sunstudio,suncc,C++,Solaris,Sunstudio,Suncc,我正在使用Developer Studio 12.5附带的SunCC编译器构建Solaris 11.3。我对库或Solaris不太熟悉,因此需要花费一些精力来跟踪问题 编译正在一个相对良性的文件上消亡,该文件名为。我已经把它简化为下面的测试用例。根据甲骨文的说法,ASM格式良好。Clang、GCC和ICC愉快地使用代码 $ /opt/developerstudio12.5/bin/CC -m64 -std=c++11 test.cxx -c "test.cxx", [main]:ube: err

我正在使用Developer Studio 12.5附带的SunCC编译器构建Solaris 11.3。我对库或Solaris不太熟悉,因此需要花费一些精力来跟踪问题

编译正在一个相对良性的文件上消亡,该文件名为。我已经把它简化为下面的测试用例。根据甲骨文的说法,ASM格式良好。Clang、GCC和ICC愉快地使用代码

$ /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;
}
结果是:

$ /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
$/opt/developerstudio12.5/bin/CC-m64-std=c++11 test.cxx-c
汇编程序:test.cxx
“”第205行:指令参数无效
近行:“mulq%rcx”
“”第206行:指令参数无效
近行:“添加%rbx,%rax”
“”第207行:指令参数无效
近行:“adcq$0,%rdx”
CC:test.cxx的ube失败
错误消息表明了什么

不幸的是,不知道

如果有人购买了支持合同并有时间,请向Oracle寻求答复

如何让SunCC提供源文件和行号

不幸的是,不知道

我如何解决这个问题

David Wohlferd怀疑
[b]“=rm”(b)
输出操作数。看起来需要将一个ASM块拆分为两个块。这是一个可怕的黑客行为,但我们还没有找到另一种方法

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;
}

如果这是gcc,我建议使用
-S
构建。它可能也支持这一点吗?在这里,准确地看到生成的内容将非常有帮助。我还想知道如何使用
mull
addl
。最后一个
l
应该表示一个4字节的int,但您正在传递(我假设是2字节)字?而你所提供的博客链接说明Sun的C++没有很好地处理“立即”操作数。code>g可能意味着
i
。不过,我不明白这是什么“论点1”。较小的案例会有所帮助。你能把它做得更小吗?对asm字符串使用
怎么样?我的猜测是,您至少需要
mull%[b]
。因为问题发生在编译过程中,所以实际上不需要块工作或产生相同的结果。一旦将所需的asm削减到仍然产生错误的最小值,就可以开始删除参数。我期望:
asm(“mull%[b]:[b]”=rm“(b):“0”(b))嗯。前几天我刚给你发了一封关于矢量提取的电子邮件。IAC,从您最近的帖子中可以清楚地看到问题:
mull%rcx
是一个无效语句。这很奇怪,有几个原因:1)mull(目标值为32位),无法使用rcx(64位值)。2) 如果我们处理的是
单词
,为什么它会使用rcx(而不是cx)?3) 为什么要执行这段代码?当你最初发布它时,我以为你发布了来自
BOTAN\u MP\u USE\u X86\u 32\u ASM
,而不是
BOTAN\u MP\u USE\u X86\u 64\u ASM
。您打算瞄准哪一个?可能将
mull%[b]
更改为
mulw%w[b]
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;
}