Saya sedang menulis tambahan panjang perakitan di perakitan inline GAS,
template <std::size_t NumBits>
void inline KA_add(vli<NumBits> & x, vli<NumBits> const& y);
Jika saya berspesialisasi, saya dapat melakukan:
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");
}
Bagus itu berfungsi, sekarang jika saya mencoba menggeneralisasi untuk mengizinkan sebaris templat, dan membiarkan kompiler saya bekerja untuk jangka waktu berapa pun ...
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");
};
Ya, itu tidak berhasil. Saya tidak punya jaminan bahwa carry bit (CB) disebarkan. Ini tidak menghemat antara garis asm pertama dan yang kedua. Ini mungkin logis karena loop menambah i dan "menghapus" hal CB I, harus ada batasan GAS untuk melestarikan CB selama dua panggilan ASM. Sayangnya saya tidak menemukan informasi seperti itu.
Ada ide ?
Terima kasih, Merci!
PS Saya menulis ulang fungsi saya untuk menghilangkan ideologi 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");
};
Asm memberi (mode Debug GCC),
APLIKASI
addq %rdx, %rax;
TIDAK_APLIKASI
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
APLIKASI
adcq %rcx, %rax;
TIDAK_APLIKASI
Seperti yang bisa kita baca, ada tambahan tambahan yang merusak propagasi CB
KA_add
Anda, karena kemungkinan ada sesuatu di antara baris asm Anda yang mengubah bit carry atau semacamnya. - person Tony The Lion   schedule 30.11.2012addq
Anda? - person Tony The Lion   schedule 03.12.2012