<html><head></head><body style="word-wrap: break-word; -webkit-nbsp-mode: space; -webkit-line-break: after-white-space; ">After chatting on IRC, Peter wants a very specific interrupt (int4 on x86).  I suggested he add a new llvm.x86.int(i32) intrinsic, and use the existing branch on llvm.sadd.with.overflow intrinsic.  The x86 backend can then turn jo+int4 into into when reasonable.<div><br></div><div>-Chris<br><div><br><div><div>On Aug 9, 2010, at 5:45 PM, Chris Lattner wrote:</div><br class="Apple-interchange-newline"><blockquote type="cite"><div style="word-wrap: break-word; -webkit-nbsp-mode: space; -webkit-line-break: after-white-space; "><br><div><div>On Aug 9, 2010, at 10:44 AM, Peter S. Housel wrote:</div><br class="Apple-interchange-newline"><blockquote type="cite">
<div>
<!-- Converted from text/rtf format --><p dir="LTR"><span lang="en-us"></span><span lang="en-us"><font size="2" face="Arial">Several instruction set architectures include</font></span><span lang="en-us"></span><span lang="en-us"> <font size="2" face="Arial">arithmetic</font></span><span lang="en-us"></span><span lang="en-us"><font size="2" face="Arial"> operations that can trap on overflow, or support this feature with a separate trap-on-overflow-flag instruction (such as the x86 INTO instruction).</font></span><span lang="en-us"></span><span lang="en-us"></span></p><div><span lang="en-us"></span><span lang="en-us"></span><br class="webkit-block-placeholder"></div><p dir="LTR"><span lang="en-us"><font size="2" face="Arial">I am adding a back-end to the Open Dylan compiler to generate LLVM IR. The original back-end, which generates x86 machine code, makes use of</font></span><span lang="en-us"></span><span lang="en-us"> <font size="2" face="Arial">the INTO instruction, and the runtime turns the</font></span><span lang="en-us"></span><span lang="en-us"> <font size="2" face="Arial">resulting</font></span><span lang="en-us"></span><span lang="en-us"><font size="2" face="Arial"></font></span><span lang="en-us"></span><span lang="en-us"> <font size="2" face="Arial">INT 4 into a language-level exception</font></span><span lang="en-us"></span><span lang="en-us"><font size="2" face="Arial">. In order to support this</font><font size="2" face="Arial"></font></span><span lang="en-us"></span><span lang="en-us"> <font size="2" face="Arial">not</font></span><span lang="en-us"></span><span lang="en-us"><font size="2" face="Arial">-</font></span><span lang="en-us"></span><span lang="en-us"><font size="2" face="Arial">uncommon requirement using LLVM</font></span><span lang="en-us"></span><span lang="en-us"><font size="2" face="Arial">, I see three</font></span><span lang="en-us"></span><span lang="en-us"> <font size="2" face="Arial">alternatives:</font></span></p><p dir="LTR"><span lang="en-us"><font size="2" face="Arial">1.</font> <font size="2" face="Arial">Add</font></span><span lang="en-us"></span><span lang="en-us"> <font size="2" face="Arial">llvm.sadd.with.overflow.</font></span><span lang="en-us"></span><span lang="en-us"><font size="2" face="Arial">trap.</font></span><span lang="en-us"></span><span lang="en-us"><font size="2" face="Arial">*</font></span><span lang="en-us"></span><span lang="en-us"><font size="2" face="Arial">,</font></span><span lang="en-us"></span><span lang="en-us"> <font size="2" face="Arial">…</font></span><span lang="en-us"></span><span lang="en-us"><font size="2" face="Arial"></font> <font size="2" face="Arial">intrinsics</font><font size="2" face="Arial"> corresponding</font><font size="2" face="Arial"> to the current</font></span><span lang="en-us"></span><span lang="en-us"> <font size="2" face="Arial">llvm.sadd.with.overflow.*</font></span><span lang="en-us"></span><span lang="en-us"><font size="2" face="Arial">,</font></span><span lang="en-us"></span><span lang="en-us"> <font size="2" face="Arial">…</font></span><span lang="en-us"></span><span lang="en-us"><font size="2" face="Arial"> intrinsics to LLVM and the current code generators.</font></span></p><p dir="LTR"><span lang="en-us"><font size="2" face="Arial">2. Add a single llvm.trap.overflow intrinsic</font><font size="2" face="Arial"> to LLVM and</font></span><span lang="en-us"></span><span lang="en-us"> <font size="2" face="Arial">the</font></span><span lang="en-us"></span><span lang="en-us"><font size="2" face="Arial"></font></span><span lang="en-us"></span><span lang="en-us"> <font size="2" face="Arial">current code generators, and ensure that the code generators can</font></span><span lang="en-us"></span><span lang="en-us"> <font size="2" face="Arial">generate the proper arithmetic-with-overflow-trap or trap-on-overflow-flag instruction when it is execu</font><font size="2" face="Arial">ted conditionally based on the output of one of</font></span><span lang="en-us"></span><span lang="en-us"> <font size="2" face="Arial">the</font></span><span lang="en-us"></span><span lang="en-us"><font size="2" face="Arial"></font></span><span lang="en-us"></span><span lang="en-us"> <font size="2" face="Arial">llvm.sadd.with.overflow.*</font></span><span lang="en-us"></span><span lang="en-us"><font size="2" face="Arial"> etc.</font></span><span lang="en-us"></span><span lang="en-us"> <font size="2" face="Arial">intrinsics</font></span><span lang="en-us"></span><span lang="en-us"><font size="2" face="Arial">.</font></span></p><p dir="LTR"><span lang="en-us"><font size="2" face="Arial">3. Don</font></span><span lang="en-us"></span><span lang="en-us"><font size="2" face="Arial">’</font></span><span lang="en-us"></span><span lang="en-us"><font size="2" face="Arial">t try to solve this problem</font></span><span lang="en-us"></span><span lang="en-us"> <font size="2" face="Arial">for LLVM</font></span><span lang="en-us"></span><span lang="en-us"> <font size="2" face="Arial">in general bu</font><font size="2" face="Arial">t use inline assembly</font></span><span lang="en-us"></span><span lang="en-us"> <font size="2" face="Arial">for these few operations</font> <font size="2" face="Arial">in my back-end.</font></span><span lang="en-us"></span><span lang="en-us"></span></p><p dir="LTR"><span lang="en-us"><font size="2" face="Arial">Which</font> <font size="2" face="Arial">alternative</font><font size="2" face="Arial"> should I pursue?</font></span><span lang="en-us"></span><span lang="en-us"><font size="2" face="Arial"> The third is obviously the easiest for me</font></span><span lang="en-us"></span><span lang="en-us"><font size="2" face="Arial">, but other LLVM users would benefit</font> <font size="2" face="Arial">from the other two.</font></span><span lang="en-us"></span><span lang="en-us"></span></p><div><span lang="en-us"></span><br class="webkit-block-placeholder"></div></div></blockquote></div><div><font class="Apple-style-span" face="Arial"><span class="Apple-style-span" style="font-size: small;">I don't understand... why can't you use a branch on a </span></font><span class="Apple-style-span" style="font-family: Arial; font-size: small; ">llvm.sadd.with.overflow that goes to an llvm.trap?  This is what clang does with -ftrapv.</span></div><div><span class="Apple-style-span" style="font-family: Arial; font-size: small; "><br></span></div><div><span class="Apple-style-span" style="font-family: Arial; font-size: small; ">-Chris</span></div></div></blockquote></div><br></div></div></body></html>