我正在Solaris 11.3上使用DeveloperStudio12.5附带的博坦编译器构建SunCC。我不太熟悉这个库或Solaris,我需要一些努力才能找到问题。
在一个相对良性的名为divide.cpp的文件上,编译即将结束。我把它简化为下面的测试用例。根据甲骨文的Sun Studio 12编译器中GCC风格的asm内联支持,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;
}我找不到关于错误字符串Invalid reference to argument 'N' in GASM Inlining.的有用信息我在甲骨文板上找到了内联汇编程序上的sunCC卡。但答案是,UBE是错误的,并购买了一个支持合同,以了解更多。
我有三个问题:
如果我将b参数更改为=m,,则会产生相同的错误。如果我将b参数更改为=r,,则会生成不同的错误:
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");其结果是:
$ /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发布于 2017-01-26 04:45:55
错误信息指出了什么?
不幸的是,不知道。
如果有人购买了一个支持合同,并有时间,那么请征求甲骨文的答复。
如何让SunCC提供源文件和行号?
不幸的是,不知道。
我该如何解决这个问题?
David怀疑[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;
}https://stackoverflow.com/questions/41852552
复制相似问题