<html><body style="word-wrap: break-word; -webkit-nbsp-mode: space; -webkit-line-break: after-white-space; "><br><div><div>On Jul 16, 2009, at 12:53 AM, Aaron Gray wrote:</div><br class="Apple-interchange-newline"><blockquote type="cite"><div>Chris,</div> <div> </div> <div>The basic idea of using templates inconjunction with inlining is for efficiency. </div> <div> </div> <div>6,500 virtual calls outputting bytes out of 10000 calls, and the rest 1,750 being words to output 10,000 of code does not entice me to use virtual calls.<br></div></blockquote><div><br></div><div>I understand that you say that, but I can't bring myself to care at this point.  Have you thought about how many cycles are already used to produce the instructions that lead to the emission of those 10K bytes?  The total percentage of time spent doing these virtual calls will be tiny compared to the total time to generate the code.</div><div><br></div><div>If you switch to using virtual functions, get the code working, and we *measure* a performance problem, then we can fix it.  There are much better ways to do this than templating the whole code emitter.</div><br><blockquote type="cite"><div>Whats Daniels approach, does he have any online documentation or code, do you have an email address so I may talk to him.</div> </blockquote><div><br></div><div>Take a look at how asmprinters work in include/llvm/Target/TargetRegistry.h .  If you have specific questions, llvmdev is a great place to ask them.</div><div><br></div><div>-Chris</div><div><br></div><br><blockquote type="cite"><div> </div> <div>Aaron</div> <div> </div> <div class="gmail_quote">2009/7/16 Chris Lattner <span dir="ltr"><<a href="mailto:clattner@apple.com">clattner@apple.com</a>></span><br> <blockquote class="gmail_quote" style="PADDING-LEFT: 1ex; MARGIN: 0px 0px 0px 0.8ex; BORDER-LEFT: #ccc 1px solid"> <div class="im">On Jul 15, 2009, at 9:01 AM, Aaron Gray wrote:<br> <blockquote class="gmail_quote" style="PADDING-LEFT: 1ex; MARGIN: 0px 0px 0px 0.8ex; BORDER-LEFT: #ccc 1px solid">Chris,<br><br>If you/we do not like this code, then the alternatives are :-<br>1) Leave as is, which I would not suggest.<br> 2) Revert to using MachineCodeEmitter like mechanics with virtual extend() method to allow rebuffering with ObjectCodeEmitter providing the memory management.<br>3) Don't really know of any other alternatives :)<br><br> 2 maybe the best compromise option. Its easy to code, removes templating from the CodeEmitters, and is virtually transparent to our other DOE work. The only thing it does not write via a BinaryObject object, so we loose that functionality.<br> </blockquote><br></div>Hi Aaron,<br><br>I'm sorry for not getting back to you sooner.  I work fairly LIFO and the craziness that has happened since your emails have distracted me.<br><br>One problem with this patch is that (for example) X86TargetMachine.cpp refers to the "createX86ObjectCodeEmitterPass" symbol, which forces the code emitter to object code emitter to be linked into the X86 target module.  There is still no way to create a JIT without two copies of the code emitter template.  I believe that aligning this work with Daniels work to make the targets more modular would be straight forward.  Are you willing to do this?<br> <br>This patch keeps around the templates, which I really don't like.  However, this is better than what is in mainline, so it seems like a reasonable step to me if you really really want to do this.  However, I still don't understand why you're unwilling to make the CodeEmitter be a virtual base class instead of a template!<br> <font color="#888888"><br>-Chris<br></font></blockquote></div><br></blockquote></div><br></body></html>