GCC intrinsic vs inline assembly: что лучше?

Если я хочу подвергнуть программисту конкретную инструкцию для одной машины, есть два способа сделать это:

  1. определите новый встроенный / встроенный
  2. Expose то же самое, что и встроенная сборка asm() [как его единственная инструкция арифметического типа, Я считаю, что нет необходимости в asm volatile()]

Я прочитал, что builtins позволяют компилятору заботиться о проверке типа, выделении регистра и "других оптимизациях"и т. д. Но компилятору нужно будет сделать это даже в случае asm (), верно ? Так в чем же заключается преимущество производительности использования intrinsic over asm () для одной инструкции ?

Как изменяется уравнение, если задействовано несколько машинных инструкций ?

аргумент "переносимости" в пользу intrinsic понятен, но мне любопытно понять преимущество производительности, если таковое имеется, одного над другим.

1 ответов


Я думаю, это зависит от того, что вы делаете. Изменение GCC и требование измененного GCC для создания вашей программы, если / пока ваш патч GCC не сделает это выше по течению, намного больше головной боли, чем просто использование встроенного asm.

Если инструкция, которую вы хотите использовать, имеет абстрактное значение, не связанное с определенной архитектурой набора инструкций, добавив встроенный / встроенный, чтобы один и тот же код, используя его, мог автоматически работать на всех целях (с отступлением к более сложному реализация с несколькими инструкциями по целям, у которых нет инструкции), вероятно, является" правильным " выбором, но может быть не практичным.

Если инструкция является чем-то очень специфичным для ISA, неясным, не критичным для производительности и т. д. (Я думаю о загрузке специального аппаратного регистра, регистра режима процессора,получении информации о модели и т. д. но я уверен, что вы можете подумать о других примерах), то просто использование встроенного asm почти наверняка является правильным решением.

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