Developer Studio 12.5와 함께 제공되는 SunCC 컴파일러를 사용하여 Solaris 11.3에 Botan을 구축하고 있습니다. 나는 도서관이나 솔라리스에 익숙하지 않고 문제를 추적하는 데 약간의 노력이 필요합니다.GASM 인라이닝의 인수 'N'에 대한 잘못된 참조
컴파일은 비교적 양호한 파일 divide.cpp
으로 죽어 가고 있습니다. 다음 테스트 케이스로 축소했습니다. 오라클의 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을 찾았습니다. 그러나 UBE는 버그가 있으며 더 많은 것을 배우기 위해 지원 계약을 맺습니다.
오류 메시지가 무엇을 나타내는 않습니다
나는 세 가지 질문이 있습니까?
어떻게 SunCC에서 소스 파일과 줄 번호를 제공합니까?
어떻게하면 문제를 해결할 수 있습니까? I는
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
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)); –