par2 имеет небольшую и довольно чистую С++-кодовую базу, которая, как я думаю, прекрасно подходит для GNU/Linux, OS X и Windows ( с MSVС++).
Я хотел бы включить версию x86-64 asm одной функции, которая занимает почти все время процессора. (рассылки с более подробными сообщениями. реализация /benchmark здесь.)
Intrinsics будет очевидным решением, но gcc не создает достаточно хороший код для получения одного байта за раз из 64-битного регистра для использования в качестве индекса в LUT. Я также мог бы потратить время, чтобы запланировать инструкции, поэтому каждая строка кэша uop содержит несколько 4-х тонов, поскольку пропускная способность uop является узким местом, даже если буфер ввода/вывода является приличным размером.
Я бы предпочел не вводить зависимость от ясности, поскольку многие люди установили gcc, но не yasm.
Есть ли способ написать функцию в asm в отдельном файле, который может собирать gcc/clang и MSVC? Цели:
- нет дополнительного программного обеспечения в качестве сборки. (без YASM).
- только одна версия каждой функции asm. (без поддержки версий MASM и AT & T того же кода.)
Системы сборки Par2cmdline - это autoconf/automake для Unix, MSVC .sln
для Windows.
Я знаю, что сборник GNU имеет директиву .intel_syntax noprefix
, но это только изменяет форматы команд, а не другие директивы ассемблера. например .align 16
против align 16
. Мой код довольно прост и мал, поэтому было бы нормально работать с различными директивами с C-препроцессором #define
s, если это может работать.
Я предполагаю, что выполнение обнаружения ЦП и установка указателя функции на основе результата не должны быть проблемой на С++, даже если я должен использовать для этого условную компиляцию #ifdef
.
Если нет решения для того, на что я надеюсь, я, вероятно, добавлю зависящую от построения зависимость от yasm и имею параметр ./configure --no-asm
, чтобы отключить ускорение asm для людей, строящих на x86 без присутствия язвы.
Мой предпочтительный план обработки различных соглашений о вызовах в Windows и Linux ABI состоял в использовании __attribute__((sysv_abi))
для моих прототипов C для моих функций asm. Тогда мне нужно написать пролог функции для SysV ABI. Есть ли у MSVC что-то вроде этого, что поставит args в regs в соответствии с SysV ABI для определенных функций? (BTW, это щекотало ошибка компилятора, поэтому будьте осторожны с этой идеей, если вы хотите, чтобы ваш код работал с текущим gcc.)