我有一個asm循環,保證不會超過128次迭代,我希望通過PC相對跳轉來展開。這個想法是以相反的順序展開每個迭代,然後跳轉到需要的循環中。代碼看起來像這樣:gcc內嵌程序集中的PC相對跳轉
#define __mul(i) \
"movq -"#i"(%3,%5,8),%%rax;" \
"mulq "#i"(%4,%6,8);" \
"addq %%rax,%0;" \
"adcq %%rdx,%1;" \
"adcq $0,%2;"
asm("jmp (128-count)*size_of_one_iteration" // I need to figure this jump out
__mul(127)
__mul(126)
__mul(125)
...
__mul(1)
__mul(0)
: "+r"(lo),"+r"(hi),"+r"(overflow)
: "r"(a.data),"r"(b.data),"r"(i-k),"r"(k)
: "%rax","%rdx");
是這樣的可能與gcc內聯彙編?
我現在使用的是Duff設備的變體,但是我發佈了這個,因爲我想切換到只有asm的方式 – Chris 2011-02-07 19:59:35