<div dir="ltr"><div><div>Kind of depends on what you actually get back. <br><br>For example, if I take the RDTSC instruction on x86, it returns a 64-bit value, but it's in two registers, EAX and EDX as 32-bit values. The natural thing in that case is to let the builtin form a 64-bit value [either in EAX and EDX in the 32-bit compiler, as that happens to be the way 64-bit values are returned, or as a single 64-bit value by shifting/oring the two register values into one 64-bit return value]. <br><br></div>However, if we have, say, an instruction that returns two distinct values (div that also gives the remainder, as a simple example), you will either have to return a (small) struct, or pass in a pointer to be filled in by the function [the latter is not ideal from an optimisation perspective, as the optimiser has a harder time knowing if the output is aliased with something else.<br><br>--<br></div>Mats<br></div><div class="gmail_extra"><br><div class="gmail_quote">On 9 September 2015 at 10:53, Martin J. O'Riordan via llvm-dev <span dir="ltr"><<a href="mailto:llvm-dev@lists.llvm.org" target="_blank">llvm-dev@lists.llvm.org</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div link="#0563C1" vlink="#954F72" lang="EN-IE"><div><p class="MsoNormal"><span style="font-size:12.0pt;font-family:"Book Antiqua",serif">I have written many builtins for our SHAVE processor which bind directly to our instructions, and making instructions that are not easily selectable by the compiler available to the programmer.<u></u><u></u></span></p><p class="MsoNormal"><span style="font-size:12.0pt;font-family:"Book Antiqua",serif"><u></u> <u></u></span></p><p class="MsoNormal"><span style="font-size:12.0pt;font-family:"Book Antiqua",serif">The majority of these are straight-forward enough, taking a small number pf input operands and returning a single result; for example ‘</span><span style="font-size:12.0pt;font-family:"Courier New"">int __builtin_shave_mul(int, int)</span><span style="font-size:12.0pt;font-family:"Book Antiqua",serif">’ might map onto a simple multiple instruction that takes two input integer operands in registers, and returns a single integer result in another register.<u></u><u></u></span></p><p class="MsoNormal"><span style="font-size:12.0pt;font-family:"Book Antiqua",serif"><u></u> <u></u></span></p><p class="MsoNormal"><span style="font-size:12.0pt;font-family:"Book Antiqua",serif">However, I have a small number instructions that have two output operands, each in a separate register.  I would like to provide access to these instructions using the builtins approach.  This is easy enough to express in LLVM IR, but I have not been able to figure out how this can be presented in a C or C++ binding.<u></u><u></u></span></p><p class="MsoNormal"><span style="font-size:12.0pt;font-family:"Book Antiqua",serif"><u></u> <u></u></span></p><p class="MsoNormal"><span style="font-size:12.0pt;font-family:"Book Antiqua",serif">Is there a pattern for doing this kind of thing that I haven’t discovered, or is it simply something that cannot be expressed using the C binding to the builtins?<u></u><u></u></span></p><p class="MsoNormal"><span style="font-size:12.0pt;font-family:"Book Antiqua",serif"><u></u> <u></u></span></p><p class="MsoNormal"><span style="font-size:12.0pt;font-family:"Book Antiqua",serif">Thanks,<u></u><u></u></span></p><p class="MsoNormal"><span style="font-size:12.0pt;font-family:"Book Antiqua",serif"><u></u> <u></u></span></p><p class="MsoNormal"><span style="font-size:12.0pt;font-family:"Book Antiqua",serif">            MartinO (Movidius Ltd.)<u></u><u></u></span></p><p class="MsoNormal"><span style="font-size:12.0pt;font-family:"Book Antiqua",serif"><u></u> <u></u></span></p></div></div><br>_______________________________________________<br>
LLVM Developers mailing list<br>
<a href="mailto:llvm-dev@lists.llvm.org">llvm-dev@lists.llvm.org</a><br>
<a href="http://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-dev" rel="noreferrer" target="_blank">http://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-dev</a><br>
<br></blockquote></div><br></div>