<!DOCTYPE html>
<html>
<head>
<meta http-equiv="Content-Type" content="text/xhtml; charset=utf-8">
</head>
<body>
<div style="font-family:sans-serif"><div style="white-space:normal">
<p dir="auto">On 24 Jul 2019, at 1:46, Philip Reames wrote:</p>

</div>
<div style="white-space:normal"><blockquote style="border-left:2px solid #777; color:#777; margin:0 0 5px; padding-left:5px"><p dir="auto">We've also got some cases where returning a value in a flag might be useful.  Our typical use case is we have a "rare, but not *that* rare* slowpath which sometimes needs to run after a call from a runtime function.  Our other compiler(s) - which use hand rolled assembly for all of these bits - return the "take-rare" bit in ZF, and branch on that after the call.  For our LLVM based system, we just materialize the value into $rax and branch on that.  That naive scheme has been surprisingly not bad performance wise.<br>
<br>
* The "not *that* rare" part is needed to avoid having exceptional unwinding be the right answer.<br>
<br>
If we were to support something like this, you'd really want to be able to define individual flags in the callee's calling convention clobber/preserve lists.  It's really common to have a helper routine which sets say ZF, but leaves others unchanged.  Or to have a function which sets ZF, clobbers OF, and preserves all others.  But if we were going to do that, we'd quickly realize that the x86 backend doesn't track individual flags at all, and thus conclude it probably wasn't worth it begin with.  :)</p>
</blockquote></div>
<div style="white-space:normal">

<p dir="auto">I'm intrigued what functions would usefully <em>preserve</em> flags.  That's quite difficult on x86, since it means you have to spill flags if you do any basic arithmetic at all (unless you do it all with <code style="background-color:#F7F7F7; border-radius:3px; margin:0; padding:0 0.4em" bgcolor="#F7F7F7">lea</code>).  Maybe on a target like PPC with really fleshed-out support for flags and conditionality?</p>

<p dir="auto">John.</p>
</div>
</div>
</body>
</html>