2017-01-25 9 views
1

Я строю Botan на Solaris 11.3 с компилятором SunCC, который поставляется с Developer Studio 12.5. Я не слишком хорошо знаком с библиотекой или Solaris, и это требует от меня некоторых усилий для отслеживания проблем.Недопустимая ссылка на аргумент 'N' в GASM Inlining

Компиляция умирает на относительно доброкачественном файле под названием 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 глючит и покупает контракт на поддержку, чтобы узнать больше.

У меня есть три вопроса:

  • Что означает сообщение об ошибке означает?

  • Как я могу получить SunCC для предоставления исходного файла и номера строки?

  • Как я могу обойти проблему?


Если изменить параметр 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 
+0

Если бы это было gcc, я предлагаю построить с использованием '-S'. Он [выглядит как] (https://docs.oracle.com/cd/E19205-01/819-5265/6n7c29df6/index.html#6n7c29dmc) Suncc может поддержать это тоже? Увидеть, что именно создается, действительно поможет здесь. Я также задаюсь вопросом об использовании 'mull' и' addl'. Этот последний 'l' должен указывать 4 байта int, но вы проходите (что я предполагаю, это 2 байта) слова? И эта ссылка в блоге, которую вы указали, говорит о том, что Sun C++ не справляется с «немедленными» операндами. 'g' может означать' i'. Не видите, как это «аргумент 1». –

+0

Меньший случай помогает. Можете ли вы сделать его еще меньше? Как насчет использования '' '' для строки asm? Я предполагаю, что окажется, что вам нужно хотя бы 'mull% [b]'. –

+0

Поскольку проблема возникает во время компиляции, на самом деле не должно быть необходимости для работы блоков или получения того же результата. После того, как вы уменьшили необходимый asm до минимума, который все еще вызывает ошибку, вы можете начать отклонять аргументы. Я ожидаю: 'asm (" mull% [b] ": [b]" = rm "(b):" 0 "(b));'. –

ответ

1

Что делает сообщение об ошибке показывают?

К сожалению, не знаю.

Если кто-то покупает контракт на поддержку и имеет время, пожалуйста, запросите 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; 
} 

 Смежные вопросы

  • Нет связанных вопросов^_^