之前 Shady 的有關 TOC 之文章中有說 TOC 較堆疊快,
但實際是直接使用堆疊會較快。
Shady 之所以會說 TOC 會較快的原因為:
IBM 的 PowerPC 組合語言相關文章中有提到 TOC 通常是在 Cache 中。
但經 Shady 以更改 setzero 組語函式實際測試後又再想想,
64KB 的 TOC 根本不可能一開始就在 Cache 中,
就算它有在 Cache 中,
那也是 L2 Cache 而不是 DCache。
害 Shady 以為就算直接馬上開個堆疊,
也不會比直接載入在 DCache 中的 TOC 還快,
但經 Shady 證明後並非如此。
所以馬上開個堆疊,
這堆疊會在 Dcache 中,
而 TOC 還是從記憶體載入到 L2 Cache、DCache 中,
故 TOC 只有在第一次載入後,
於第二次載入時才會對整體效能有所幫助。
雖說 TOC 沒比馬上開啟堆疊快,
但會比資料在記憶體或者是更新出 Cache 中的堆疊快就是了。
在 IBM 的一些有關組語的文章中,
其組語的例子中都會有類似以下的 " TOC 宣告 " (
紅字):
_start:
.quad ._start,
.TOC.@tocbase, 0
如果你不使用 TOC 請省略這 " TOC 宣告 ",
因為就算沒使用 " TOC 內容 " 或 " 設置 TOC 內容 ",
只要有 " TOC 宣告 " 就會造成函式被呼叫時,
函式和其 TOC 會同時被載入到 Cache 中。
目前最快的
setzero.s。
其 tick 值於 4KB 對齊 128 Byte 下的測試結果為:13 ~ 16 ticks。(注1)
當中無使用 TOC 也沒有 " TOC 宣告 ",
亦無 Altivec ABI 的指令,
但若做了 " TOC 宣告 " 則會使 tick 值增加到 25 ticks 以上 (注2),
所以不要隨便做 " TOC 宣告 "。
注1:呼叫函式前有使用 dcbt 預先載入函式,
若無使用 dcbt 則成績為 17 ~ 25 ticks。
注2:呼叫函式前有使用 dcbt 預先載入函式。