Не полный ответ, извините, но раздел комментариев слишком короток для этого ...
Можете ли вы опубликовать образец строки asm("..." :::)
, которая демонстрирует проблему?
Использованиерегистров XMM не является проблемой, сообщение об ошибке указывает, что GCC хотел создать код, например:
movdqa (%rax),%xmm0
т.е. память загружается / хранится с помощью указателей, хранящихся в общих регистрах, и вы указали больше областей памяти, чемдоступные регистры общего назначения (вероятно, 12 в режиме отладки, потому что RBP
, RSP
используются для frame / stackpointer и, вероятно, RBX
для глобальной таблицы смещений и RAX
зарезервированы для возвратов) без реализации повторного регистраиспользовать потенциал.
Вы можете получить что-то, выполнив что-то вроде:
void *all_mem_args_tbl[16] = { memarg1, memarg2, ... };
void *trashme;
asm ("movq (%0), %1\n\t"
"movdqa (%1), %xmm0\n\t"
"movq 8(%0), %1\n\t"
"movdqa (%1), %xmm1\n\t"
...
: "r"all_mem_args_tbl : "r"(trashme) : ...);
т.е. поместите все ячейки памяти в таблицу, которую вы передадите в качестве операнда, и затем управляйтефактическое использование регистра общего назначения самостоятельно.Это может быть два обращения к указателю через таблицу косвенного обращения, но трудно ли понять это, не зная вашего полного кода ассемблера.