Я пишу ассемблерное длинное дополнение во встроенной сборке GAS,
template <std::size_t NumBits>
void inline KA_add(vli<NumBits> & x, vli<NumBits> const& y);
Если бы я специализировался, я мог бы:
template <>
void inline KA_add<128>(vli<128> & x, vli<128> const& y){
asm("addq %2, %0; adcq %3, %1;" :"+r"(x[0]),"+r"(x[1]):"g"(y[0]),"g"(y[1]):"cc");
}
Хорошо, это работает, теперь, если я попытаюсь обобщить, чтобы разрешить встроенный шаблон, и пусть мой компилятор работает для любой длины...
template <std::size_t NumBits>
void inline KA_add(vli<NumBits> & x, vli<NumBits> const& y){
asm("addq %1, %0;" :"+r"(x[0]):"g"(y[0]):"cc");
for(int i(1); i < vli<NumBits>::numwords;++i)
asm("adcq %1, %0;" :"+r"(x[i]):"g"(y[i]):"cc");
};
Что ж, это не работает. У меня нет гарантии, что бит переноса (CB) распространяется. Это не сохраняется между первой строкой asm и второй. Это может быть логично, потому что цикл увеличивает i и, таким образом, «удаляет» CB I, должно существовать ограничение GAS для сохранения CB по двум вызовам ASM. К сожалению, я не нахожу такой информации.
Есть идеи ?
Спасибо, Мерси!
PS Я переписываю свою функцию, чтобы убрать идеологию C++
template <std::size_t NumBits>
inline void KA_add_test(boost::uint64_t* x, boost::uint64_t const* y){
asm ("addq %1, %0;" :"+r"(x[0]):"g"(y[0]):"cc");
for(int i(1); i < vli<NumBits>::numwords;++i)
asm ("adcq %1, %0;" :"+r"(x[i]):"g"(y[i]):"cc");
};
Ассемблер дает (режим отладки GCC),
ПРИЛОЖЕНИЕ
addq %rdx, %rax;
NO_APP
movq -24(%rbp), %rdx
movq %rax, (%rdx)
.LBB94: .loc 9 55 0
movl $1, -4(%rbp)
jmp .L323
.L324:
.loc 9 56 0
movl -4(%rbp), %eax
cltq
salq $3, %rax
movq %rax, %rdx
addq -24(%rbp), %rdx <----------------- Break the carry bit
movl -4(%rbp), %eax
cltq
salq $3, %rax
addq -32(%rbp), %rax
movq (%rax), %rcx
movq (%rdx), %rax
ПРИЛОЖЕНИЕ
adcq %rcx, %rax;
NO_APP
Как мы можем прочитать есть дополнительный addq, он уничтожает распространение CB
KA_add
, потому что, вероятно, что-то между вашими ассемблерными строками изменяет бит переноса или что-то в этом роде. - person Tony The Lion   schedule 30.11.2012addq
? - person Tony The Lion   schedule 03.12.2012