ошибка встроенной сборки: не удается найти регистр в классе 'GENERAL_REGS' при перезагрузке 'asm' - PullRequest
0 голосов
/ 31 мая 2011

У меня есть встроенный блок сборки в стиле AT & T , который работает с XMM регистрами, и нет никаких проблем в Release конфигурации моего XCode *Проект 1008 *, однако я наткнулся на эту странную ошибку (которая предположительно является ошибкой GCC ) в конфигурации Отладка ... Можно ли как-то это исправить?В ассемблере нет ничего особенного, но я использую много ограничений памяти ( 12 ограничений ), может ли это вызвать эту проблему?

Ответы [ 2 ]

0 голосов
/ 01 июня 2011

Не полный ответ, извините, но раздел комментариев слишком короток для этого ...

Можете ли вы опубликовать образец строки 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) : ...);

т.е. поместите все ячейки памяти в таблицу, которую вы передадите в качестве операнда, и затем управляйтефактическое использование регистра общего назначения самостоятельно.Это может быть два обращения к указателю через таблицу косвенного обращения, но трудно ли понять это, не зная вашего полного кода ассемблера.

0 голосов
/ 31 мая 2011

В конфигурации отладки по умолчанию используется -O0. Поскольку этот флаг отключает оптимизацию, компилятор, вероятно, не сможет выделить регистры с учетом ограничений, указанных в встроенном коде сборки, что приведет к нехватке регистров.

Одним из решений является определение другого уровня оптимизации, например, -Os, который используется по умолчанию в конфигурации выпуска.

...