Я новичок в X86, и я застрял в обновлении двойного массива, используя значения другого двойного массива. Следующий код - это моя функция, и я хочу использовать встроенную сборку для замены фрагмента кода внутри цикла. Я приложил сообщение об ошибке ниже. Может ли кто-нибудь помочь мне указать на мои ошибки? Я запутался в сообщениях об ошибках и не знаю, как их пересмотреть.Как обновить все элементы в двойном массиве в X86?
static inline void update(double * x,double * y,double * z,double * vx,
double * vy,double * vz,uint32_t size){
for (uint32_t i=0;i<size;++i){
x[i] = x[i] + vx[i];
y[i] = y[i] + vy[i];
z[i] = z[i] + vz[i];
}
}
uint32_t counter = 0;
__asm__ __volatile__ (
"loop: \n\t"
"faddq (%4), (%1)\n\t"
"faddq (%5), (%2)\n\t"
"faddq (%6), (%3)\n\t"
"addq $8, %1\n\t"
"addq $8, %2\n\t"
"addq $8, %3\n\t"
"addq $8, %4\n\t"
"addq $8, %5\n\t"
"addq $8, %6\n\t"
"incq %0\n\t"
"cmp %0, %7\n\t"
"jne loopb"
: "+r"(counter)
: "r" (x),"r" (y),"r"(z),"r"(vx),"r"(vy),"r"(vz),"r"(size)
: "memory", "cc");
Сообщения об ошибках:
update_locations_ass.c:150:15: error: invalid instruction mnemonic 'faddq'
"loop: \n\t"
^
<inline asm>:2:2: note: instantiated into assembly here
faddq (%rdi), (%rcx)
^~~~~
update_locations_ass.c:151:25: error: invalid instruction mnemonic 'faddq'
"faddq (%4), (%1)\n\t"
^
<inline asm>:3:2: note: instantiated into assembly here
faddq (%r8), (%rdx)
^~~~~
update_locations_ass.c:152:28: error: invalid instruction mnemonic 'faddq'
"faddq (%5), (%2)\n\t"
^
<inline asm>:4:2: note: instantiated into assembly here
faddq (%r9), (%rsi)
^~~~~
update_locations_ass.c:159:23: error: invalid operand for instruction
"addq $8, %6\n\t"
^
<inline asm>:11:7: note: instantiated into assembly here
incq %eax
Компилятор версия: сконфигурированного с: prefix =/Применения/Xcode.app/Содержание/Developer/USR --with-Gxx-включают-DIR = /usr/include/c++/4.2.1 компании Apple LLVM версии 6.1.0 (лязг-602.0.53) (на основе LLVM 3.6.0svn) Цель: x86_64-яблочно-darwin14.0.0 Автор модели:
POSIX
Какой компилятор вы используете? Пожалуйста, не публикуйте скриншоты сообщений об ошибках. Скопируйте и вставьте их в свой вопрос. И почему вы пишете это в сборке? Компилятор может генерировать лучший код. –
Он не распознает инструкцию 'faddq'. Вероятно, ваш компилятор не поддерживает FPU. –
Компилятор clang-602.0.53 – PLNewbie