私はDeveloper Studioの12.5に付属しているSunCCコンパイラでのSolaris 11.3にBotanを構築しています。私はライブラリやSolarisにあまり慣れていないので、問題を突き止めるのに多少の努力が必要です。無効な参照GASMインラインで「N」
コンパイルはdivide.cpp
と呼ばれる比較的良性のファイルに死にかけています。私はそれを次のテストケースに減らしました。 OracleのGCC-style asm inlining support in Sun Studio 12 compilersによれば、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 chokes on inline assemblerをOracleのボード上に見つけました。しかし、答えは、UBEはバギーで、詳細を知るためのサポート契約を購入しています。
エラーメッセージは何を示しん:
私は3つの質問がありますか?
どのように私はSunCCは、ソースファイルと行番号を提供するために得ることができますか?
問題を回避するにはどうすればよいですか?
私はその後、同じエラーが生成され、ちょうど=m
にb
パラメータを変更した場合。私は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
これがgccの場合は、 '-S'を使用してビルドすることをお勧めします。 Sunccもこれをサポートしていますか?(https://docs.oracle.com/cd/E19205-01/819-5265/6n7c29df6/index.html#6n7c29dmc)何が生成されているかを正確に見ることは、本当にここで助けになるでしょう。私は 'mull'と' addl'を使うことについても不思議です。最後の 'l'は4byteのintを示すはずですが、あなたは(私が2バイトであると仮定した)単語を渡していますか?そして、あなたが提供したそのブログリンクは、SunのC++が「即時」オペランドをうまく扱えないと言っています。 'g'は' i'を意味します。しかし、それが「引数1」であるかどうかは分かりません。 –
小文字の小文字は役に立ちます。あなたはそれをさらに小さくすることはできますか? asm文字列に '' ''を使うのはどうですか?私の推測では、あなたは少なくとも 'mull%[b]'が必要であることが判明するでしょう。 –
コンパイル時に問題が発生するため、実際にはブロックが動作したり、同じ結果が生成される必要はありません。必要なasmを最低限に絞り込んだら、引き続きエラーを生成すると、引数の削除を開始できます。私は次のように期待しています: 'asm(" mull%[b] ":[b]" rm "(b):" 0 "(b)); –