Написать x86 asm-функции переносимо (win / linux / osx), без build-зависят от yasm / nasm?

par2 имеет небольшую и довольно чистую кодовую базу C ++, которая, как мне кажется, прекрасно работает на GNU / Linux, OS X и Windows (с MSVC ++).

Я хотел бы включить версию x86-64 asm одной функции, которая занимает почти все процессорное время. (список рассылки с более подробной информацией, мойреализация / тест здесь.)

Intrinsics было бы очевидным решением, но gcc не генерирует достаточно хороший код для получения одного байта за раз из 64-битного регистра для использования в качестве индекса в LUT. Я мог бы также потратить время на планирование инструкций, чтобы каждая строка кэша UOP содержала кратное 4 UOP, поскольку пропускная способность UOP является узким местом, даже если буфер ввода / вывода имеет приличный размер.

Я бы предпочел не вводить зависимость сборки от yasm, так как многие люди установили gcc, но не yasm.

Есть ли способ написать функцию в asm в отдельном файле, который могут собрать gcc / clang и MSVC? Цели:

нет дополнительного программного обеспечения в качестве build-dep. (без YASM).только одна версия каждой функции asm. (нет поддержки версий MASM & AT & T одного и того же кода.)

Системы сборки Par2cmdline - это autoconf / automake для Unix, MSVC.sln для Windows.

Я знаю, что GNU сборки имеет.intel_syntax noprefix директива, но это только изменяет форматы команд, а не другие директивы ассемблера. например.align 16 противalign 16, Мой код довольно простой и небольшой, поэтому было бы неплохо обойти разные директивы с помощью C-препроцессора#defineс, если это может работать.

Я предполагаю, что определение ЦП и установка указателя функции на основе результата не должны быть проблемой в C ++, даже если мне придется использовать некоторые#ifdef условная компиляция для этого.

Если нет решения, на которое я надеюсь, я, вероятно, представлю сборку-зависимость от yasm и получу./configure --no-asm возможность отключить ускорение asm для людей, работающих на x86 без yasm.

Мой предпочтительный план обработки различных соглашений о вызовах в Windows и Linux ABI заключался в использовании__attribute__((sysv_abi)) на моих C прототипах для моих функций asm. Тогда мне нужно только написать пролог функции для SysV ABI. Есть ли у MSVC что-нибудь подобное, что бы помещать аргументы в регистры в соответствии с SysV ABI для определенных функций? (Кстати, это щекотноошибка компиляторатак что будьте осторожны с этой идеей, если вы хотите, чтобы ваш код работал с текущим gcc.)

Ответы на вопрос(1)

Ваш ответ на вопрос