Написать 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.)