[Mesa-dev] [PATCH 05/15] glsl: Add new {fr, ld}exp built-ins IR and prototypes.
Paul Berry
stereotype441 at gmail.com
Fri Aug 23 14:02:50 PDT 2013
On 23 August 2013 13:19, Matt Turner <mattst88 at gmail.com> wrote:
> On Fri, Aug 23, 2013 at 8:55 AM, Paul Berry <stereotype441 at gmail.com>
> wrote:
> > On 22 August 2013 16:08, Matt Turner <mattst88 at gmail.com> wrote:
> >>
> >> ---
> >> src/glsl/builtins/ir/frexp.ir | 25
> >> +++++++++++++++++++++++++
> >> src/glsl/builtins/ir/ldexp.ir | 25
> >> +++++++++++++++++++++++++
> >> src/glsl/builtins/profiles/ARB_gpu_shader5.glsl | 10 ++++++++++
> >> 3 files changed, 60 insertions(+)
> >> create mode 100644 src/glsl/builtins/ir/frexp.ir
> >> create mode 100644 src/glsl/builtins/ir/ldexp.ir
> >>
> >> diff --git a/src/glsl/builtins/ir/frexp.ir b/src/glsl/builtins/ir/
> frexp.ir
> >> new file mode 100644
> >> index 0000000..a514994
> >> --- /dev/null
> >> +++ b/src/glsl/builtins/ir/frexp.ir
> >> @@ -0,0 +1,25 @@
> >> +((function frexp
> >> + (signature float
> >> + (parameters
> >> + (declare (in) float x)
> >> + (declare (out) int exp))
> >> + ((return (expression float frexp (var_ref x) (var_ref exp)))))
> >
> >
> > Having an ir_expression that writes to one of its parameters is going to
> > break assumptions in a lot of our optimization passes.
>
> I'm concerned that that may be a problem we have to solve anyway.
>
> While our hardware doesn't support an frexp instruction (like e.g.,
> AMD does) and we could probably do what you suggest, we do have
> instructions that correspond directly to the uaddCarry() and
> usubBorrow() built-ins in this same extension. They return a value and
> also have an out parameter.
>
> genUType uaddCarry(genUType x, genUType y, out genUType carry);
> genUType usubBorrow(genUType x, genUType y, out genUType borrow);
>
> We could probably avoid the problem you describe by lowering them, but
> it's feeling increasingly distasteful.
>
> Your code would make a good piglit test. I'll do some experiments.
>
Hmm, interesting.
The way LLVM solves this problem, as I understand it, is through so-called
"intrinsic functions" (http://llvm.org/docs/LangRef.html#intrinsic-functions).
I wonder if we should start doing that in Mesa.
Briefly, here is what it would look like, using uaddCarry as an example:
1. First we do an inefficient implementation of uaddCarry in terms of
existing GLSL functions, much like you did for frexp in your frexp_to_arith
lowering pass, except that we do it in
src/glsl/builtins/glsl/uaddCarry.glsl, so it's a little easier to review
:). Optimization passes already deal with function "out" parameters
properly, and function inlining automatically splices in the proper code
during linking.
2. For back-ends that don't have an efficient native way to do uaddCarry,
we're done. The uaddCarry function works as is.
3. For back-ends that do have an efficient way to do uaddCarry, we add a
mechanism to allow the back-end to tell the linker: "don't inline the
definition of this built-in. Just leave it as an ir_call because I have my
own special implementation of it"*.
4. In the back-end visitor code, the ir_call visitor looks at the name of
the function being called. If it's "uaddCarry", then the back-end visitor
just emits the efficient back-end code. Any other ir_calls should have
been eliminated by the function inlining.
*We'll need to be careful to make sure that the right thing happens if the
user overrides uaddCarry with their own user-defined function, of course :)
Now that I've actually thought through it, I'm really excited about this
idea. It seems way more straightforward than what we are currently doing
(e.g. in lower_packing_builtins.cpp), and it works nicely with the other
back-ends because if a back-end doesn't advertise an intrinsic definition
of a given function, it automtically gets the version declared in
src/glsl/builtins without having to do any extra work.
What do you think?
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.freedesktop.org/archives/mesa-dev/attachments/20130823/f05ee30a/attachment.html>
More information about the mesa-dev
mailing list