2017-01-25 5 views
1

私は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は、ソースファイルと行番号を提供するために得ることができますか?

  • 問題を回避するにはどうすればよいですか?


私はその後、同じエラーが生成され、ちょうど=mbパラメータを変更した場合。私は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 
+0

これが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」であるかどうかは分かりません。 –

+0

小文字の小文字は役に立ちます。あなたはそれをさらに小さくすることはできますか? asm文字列に '' ''を使うのはどうですか?私の推測では、あなたは少なくとも 'mull%[b]'が必要であることが判明するでしょう。 –

+0

コンパイル時に問題が発生するため、実際にはブロックが動作したり、同じ結果が生成される必要はありません。必要なasmを最低限に絞り込んだら、引き続きエラーを生成すると、引数の削除を開始できます。私は次のように期待しています: 'asm(" mull%[b] ":[b]" rm "(b):" 0 "(b)); –

答えて

1

を示す?

残念ながら、全く分かりません。

誰かがサポート契約を結んで時間がある場合は、オラクルに回答を求めてください。

SunCCにソースファイルと行番号を提供させるにはどうすればよいですか?

残念ながら、全く分かりません。私はこの問題を回避するにはどうすればよい

David Wohlferdは、出力オペランド[b]"=rm"(b)を疑いました。1つのASMブロックを2つのブロックに分割する必要があるようです。それはひどいハックですが、私たちはそれを行う別の方法を考え出していません。

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; 
} 
関連する問題