ฉันกำลังเขียนแอสเซมบลียาวเพิ่มเติมในแอสเซมบลีแบบอินไลน์ของ 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 สองครั้ง ขออภัย ฉันไม่พบข้อมูลดังกล่าว
มีความคิดอะไรบ้าง?
ขอบคุณเมอร์ซี่!
ป.ล. ฉันเขียนฟังก์ชันของฉันใหม่เพื่อลบอุดมการณ์ 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 ให้ (โหมด GCC Debug)
แอป
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
ดังที่เราอ่านได้ว่ามีส่วนเสริมเพิ่มเติม ซึ่งจะทำลายการแพร่กระจายของ CB
KA_add
ของคุณให้เราดู เพราะอาจมีบางอย่างที่อยู่ระหว่างบรรทัด asm ของคุณที่กำลังเปลี่ยนแครี่บิตหรืออะไรบางอย่าง - person Tony The Lion   schedule 30.11.2012addq
ของคุณ? - person Tony The Lion   schedule 03.12.2012