<html><head></head><body style="word-wrap: break-word; -webkit-nbsp-mode: space; -webkit-line-break: after-white-space; ">An alternative to a virtual function is changing the hash table code:<div><br></div><div><div>#define HASH_FACT 79943</div><div>#define HASHT(ta,x) ((unsigned long)((HASH_FACT*(unsigned long)x)%ta->tablesize))</div><div><br></div><div>and make HASH_FACT a variable.  Set HASH_FACT  to 1 if you want an array (and thus the index (x) is less than the table size tablesize).  The index x is one based so the hash function should modified:</div><div><br></div><div>#define HASHT(ta,x) ((unsigned long)((HASH_FACT*(unsigned long)(x-1))%ta->tablesize))</div><div><br></div><div>Mark</div><div><br><div><div><div>On Sep 19, 2011, at 4:20 PM, Jed Brown wrote:</div><br class="Apple-interchange-newline"><blockquote type="cite"><div class="gmail_quote">On Mon, Sep 19, 2011 at 22:13, Aron Ahmadia <span dir="ltr"><<a href="mailto:aron.ahmadia@kaust.edu.sa">aron.ahmadia@kaust.edu.sa</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex;">
<div>BG/P has in-order superscalar execution, you *will* stall on that cache miss because the compiler will not do you any favors in terms of separating the load of the data from its use.</div><div></div></blockquote></div>
<br><div>An indirect call without SMT has a hard stall if the vtable is not in cache too because nothing can be done until that address is loaded. Of course if you call through the same objects a bunch of times, the vtable will be hot, so no issues.</div>
</blockquote></div><br></div></div></div></body></html>