Следующий код заполняет результат с помощью встроенной сборки:
uint64_t Foo::f() {
uint64_t result;
asm volatile
("vldmia %1, {q0-q1} \n" // q0-1 = *this
⋮
"vstmia %0, {d0} \n" // result = d0
:: "r"(&result), "r"(this)
: "q0", "q1");
return result;
}
Переменная result
безоговорочно установлена в ассемблерном коде, но анализатор Xcode, похоже, игнорирует это (анализ потока переходит прямо от объявления к оператору возврата) и жалуется:
…/BitBoard.cpp:26:9: Undefined or garbage value returned to caller
Есть ли способ успокоить анализатор, не тратя циклы на инициализацию result
?
EDIT: я попробовал указать ограничение вывода:
: "=r"(&result) : "r"(this), "r"(&result)
Но компилятор хрипит с "Invalid lvalue in asm output". Удаление &
компилирует, но возвращает случайные результаты. Изменение vstmia %0, {d0}
на vmov %0, d0
также завершается ошибкой с сообщением «Недопустимый операнд для инструкции».
Я подозреваю, что мне нужно пометить result
как вывод, как было предложено, и заполнить его по-другому в коде сборки, но я не могу найти никакой информации о том, как это сделать.