189285e4d47a65e52547180dca46ecfd81b2996e9Jason Ekstrand#! /usr/bin/python2
29076c4e289de0debf1fb2a7237bdeb9c11002347Connor Abbott
39076c4e289de0debf1fb2a7237bdeb9c11002347Connor Abbottdef type_has_size(type_):
49076c4e289de0debf1fb2a7237bdeb9c11002347Connor Abbott    return type_[-1:].isdigit()
59076c4e289de0debf1fb2a7237bdeb9c11002347Connor Abbott
69076c4e289de0debf1fb2a7237bdeb9c11002347Connor Abbottdef type_sizes(type_):
79076c4e289de0debf1fb2a7237bdeb9c11002347Connor Abbott    if type_.endswith("8"):
89076c4e289de0debf1fb2a7237bdeb9c11002347Connor Abbott        return [8]
99076c4e289de0debf1fb2a7237bdeb9c11002347Connor Abbott    elif type_.endswith("16"):
109076c4e289de0debf1fb2a7237bdeb9c11002347Connor Abbott        return [16]
119076c4e289de0debf1fb2a7237bdeb9c11002347Connor Abbott    elif type_.endswith("32"):
129076c4e289de0debf1fb2a7237bdeb9c11002347Connor Abbott        return [32]
139076c4e289de0debf1fb2a7237bdeb9c11002347Connor Abbott    elif type_.endswith("64"):
149076c4e289de0debf1fb2a7237bdeb9c11002347Connor Abbott        return [64]
159076c4e289de0debf1fb2a7237bdeb9c11002347Connor Abbott    else:
169076c4e289de0debf1fb2a7237bdeb9c11002347Connor Abbott        return [32, 64]
179076c4e289de0debf1fb2a7237bdeb9c11002347Connor Abbott
189076c4e289de0debf1fb2a7237bdeb9c11002347Connor Abbottdef type_add_size(type_, size):
199076c4e289de0debf1fb2a7237bdeb9c11002347Connor Abbott    if type_has_size(type_):
209076c4e289de0debf1fb2a7237bdeb9c11002347Connor Abbott        return type_
219076c4e289de0debf1fb2a7237bdeb9c11002347Connor Abbott    return type_ + str(size)
229076c4e289de0debf1fb2a7237bdeb9c11002347Connor Abbott
239076c4e289de0debf1fb2a7237bdeb9c11002347Connor Abbottdef get_const_field(type_):
249076c4e289de0debf1fb2a7237bdeb9c11002347Connor Abbott    if type_ == "int32":
25084b24f5582567ebf5aa94b7f40ae3bdcb71316bIago Toral Quiroga        return "i32"
269076c4e289de0debf1fb2a7237bdeb9c11002347Connor Abbott    if type_ == "uint32":
27084b24f5582567ebf5aa94b7f40ae3bdcb71316bIago Toral Quiroga        return "u32"
289076c4e289de0debf1fb2a7237bdeb9c11002347Connor Abbott    if type_ == "int64":
29084b24f5582567ebf5aa94b7f40ae3bdcb71316bIago Toral Quiroga        return "i64"
309076c4e289de0debf1fb2a7237bdeb9c11002347Connor Abbott    if type_ == "uint64":
31084b24f5582567ebf5aa94b7f40ae3bdcb71316bIago Toral Quiroga        return "u64"
329076c4e289de0debf1fb2a7237bdeb9c11002347Connor Abbott    if type_ == "bool32":
33084b24f5582567ebf5aa94b7f40ae3bdcb71316bIago Toral Quiroga        return "u32"
349076c4e289de0debf1fb2a7237bdeb9c11002347Connor Abbott    if type_ == "float32":
35084b24f5582567ebf5aa94b7f40ae3bdcb71316bIago Toral Quiroga        return "f32"
369076c4e289de0debf1fb2a7237bdeb9c11002347Connor Abbott    if type_ == "float64":
37084b24f5582567ebf5aa94b7f40ae3bdcb71316bIago Toral Quiroga        return "f64"
389076c4e289de0debf1fb2a7237bdeb9c11002347Connor Abbott    raise Exception(str(type_))
399076c4e289de0debf1fb2a7237bdeb9c11002347Connor Abbott    assert(0)
409076c4e289de0debf1fb2a7237bdeb9c11002347Connor Abbott
4189285e4d47a65e52547180dca46ecfd81b2996e9Jason Ekstrandtemplate = """\
4289285e4d47a65e52547180dca46ecfd81b2996e9Jason Ekstrand/*
4389285e4d47a65e52547180dca46ecfd81b2996e9Jason Ekstrand * Copyright (C) 2014 Intel Corporation
4489285e4d47a65e52547180dca46ecfd81b2996e9Jason Ekstrand *
4589285e4d47a65e52547180dca46ecfd81b2996e9Jason Ekstrand * Permission is hereby granted, free of charge, to any person obtaining a
4689285e4d47a65e52547180dca46ecfd81b2996e9Jason Ekstrand * copy of this software and associated documentation files (the "Software"),
4789285e4d47a65e52547180dca46ecfd81b2996e9Jason Ekstrand * to deal in the Software without restriction, including without limitation
4889285e4d47a65e52547180dca46ecfd81b2996e9Jason Ekstrand * the rights to use, copy, modify, merge, publish, distribute, sublicense,
4989285e4d47a65e52547180dca46ecfd81b2996e9Jason Ekstrand * and/or sell copies of the Software, and to permit persons to whom the
5089285e4d47a65e52547180dca46ecfd81b2996e9Jason Ekstrand * Software is furnished to do so, subject to the following conditions:
5189285e4d47a65e52547180dca46ecfd81b2996e9Jason Ekstrand *
5289285e4d47a65e52547180dca46ecfd81b2996e9Jason Ekstrand * The above copyright notice and this permission notice (including the next
5389285e4d47a65e52547180dca46ecfd81b2996e9Jason Ekstrand * paragraph) shall be included in all copies or substantial portions of the
5489285e4d47a65e52547180dca46ecfd81b2996e9Jason Ekstrand * Software.
5589285e4d47a65e52547180dca46ecfd81b2996e9Jason Ekstrand *
5689285e4d47a65e52547180dca46ecfd81b2996e9Jason Ekstrand * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
5789285e4d47a65e52547180dca46ecfd81b2996e9Jason Ekstrand * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
5889285e4d47a65e52547180dca46ecfd81b2996e9Jason Ekstrand * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
5989285e4d47a65e52547180dca46ecfd81b2996e9Jason Ekstrand * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
6089285e4d47a65e52547180dca46ecfd81b2996e9Jason Ekstrand * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
6189285e4d47a65e52547180dca46ecfd81b2996e9Jason Ekstrand * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
6289285e4d47a65e52547180dca46ecfd81b2996e9Jason Ekstrand * IN THE SOFTWARE.
6389285e4d47a65e52547180dca46ecfd81b2996e9Jason Ekstrand *
6489285e4d47a65e52547180dca46ecfd81b2996e9Jason Ekstrand * Authors:
6589285e4d47a65e52547180dca46ecfd81b2996e9Jason Ekstrand *    Jason Ekstrand (jason@jlekstrand.net)
6689285e4d47a65e52547180dca46ecfd81b2996e9Jason Ekstrand */
6789285e4d47a65e52547180dca46ecfd81b2996e9Jason Ekstrand
6889285e4d47a65e52547180dca46ecfd81b2996e9Jason Ekstrand#include <math.h>
6989285e4d47a65e52547180dca46ecfd81b2996e9Jason Ekstrand#include "main/core.h"
70dd0d3a2c0fb388745519c8a3be800720541eccfeMatt Turner#include "util/rounding.h" /* for _mesa_roundeven */
71183db3a64557d5d231ef58ab5666286f323ff333Rob Clark#include "util/half_float.h"
7289285e4d47a65e52547180dca46ecfd81b2996e9Jason Ekstrand#include "nir_constant_expressions.h"
7389285e4d47a65e52547180dca46ecfd81b2996e9Jason Ekstrand
7489285e4d47a65e52547180dca46ecfd81b2996e9Jason Ekstrand/**
7589285e4d47a65e52547180dca46ecfd81b2996e9Jason Ekstrand * Evaluate one component of packSnorm4x8.
7689285e4d47a65e52547180dca46ecfd81b2996e9Jason Ekstrand */
7789285e4d47a65e52547180dca46ecfd81b2996e9Jason Ekstrandstatic uint8_t
7889285e4d47a65e52547180dca46ecfd81b2996e9Jason Ekstrandpack_snorm_1x8(float x)
7989285e4d47a65e52547180dca46ecfd81b2996e9Jason Ekstrand{
8089285e4d47a65e52547180dca46ecfd81b2996e9Jason Ekstrand    /* From section 8.4 of the GLSL 4.30 spec:
8189285e4d47a65e52547180dca46ecfd81b2996e9Jason Ekstrand     *
8289285e4d47a65e52547180dca46ecfd81b2996e9Jason Ekstrand     *    packSnorm4x8
8389285e4d47a65e52547180dca46ecfd81b2996e9Jason Ekstrand     *    ------------
8489285e4d47a65e52547180dca46ecfd81b2996e9Jason Ekstrand     *    The conversion for component c of v to fixed point is done as
8589285e4d47a65e52547180dca46ecfd81b2996e9Jason Ekstrand     *    follows:
8689285e4d47a65e52547180dca46ecfd81b2996e9Jason Ekstrand     *
8789285e4d47a65e52547180dca46ecfd81b2996e9Jason Ekstrand     *      packSnorm4x8: round(clamp(c, -1, +1) * 127.0)
8889285e4d47a65e52547180dca46ecfd81b2996e9Jason Ekstrand     *
8989285e4d47a65e52547180dca46ecfd81b2996e9Jason Ekstrand     * We must first cast the float to an int, because casting a negative
9089285e4d47a65e52547180dca46ecfd81b2996e9Jason Ekstrand     * float to a uint is undefined.
9189285e4d47a65e52547180dca46ecfd81b2996e9Jason Ekstrand     */
92dd0d3a2c0fb388745519c8a3be800720541eccfeMatt Turner   return (uint8_t) (int)
93dd0d3a2c0fb388745519c8a3be800720541eccfeMatt Turner          _mesa_roundevenf(CLAMP(x, -1.0f, +1.0f) * 127.0f);
9489285e4d47a65e52547180dca46ecfd81b2996e9Jason Ekstrand}
9589285e4d47a65e52547180dca46ecfd81b2996e9Jason Ekstrand
9689285e4d47a65e52547180dca46ecfd81b2996e9Jason Ekstrand/**
9789285e4d47a65e52547180dca46ecfd81b2996e9Jason Ekstrand * Evaluate one component of packSnorm2x16.
9889285e4d47a65e52547180dca46ecfd81b2996e9Jason Ekstrand */
9989285e4d47a65e52547180dca46ecfd81b2996e9Jason Ekstrandstatic uint16_t
10089285e4d47a65e52547180dca46ecfd81b2996e9Jason Ekstrandpack_snorm_1x16(float x)
10189285e4d47a65e52547180dca46ecfd81b2996e9Jason Ekstrand{
10289285e4d47a65e52547180dca46ecfd81b2996e9Jason Ekstrand    /* From section 8.4 of the GLSL ES 3.00 spec:
10389285e4d47a65e52547180dca46ecfd81b2996e9Jason Ekstrand     *
10489285e4d47a65e52547180dca46ecfd81b2996e9Jason Ekstrand     *    packSnorm2x16
10589285e4d47a65e52547180dca46ecfd81b2996e9Jason Ekstrand     *    -------------
10689285e4d47a65e52547180dca46ecfd81b2996e9Jason Ekstrand     *    The conversion for component c of v to fixed point is done as
10789285e4d47a65e52547180dca46ecfd81b2996e9Jason Ekstrand     *    follows:
10889285e4d47a65e52547180dca46ecfd81b2996e9Jason Ekstrand     *
10989285e4d47a65e52547180dca46ecfd81b2996e9Jason Ekstrand     *      packSnorm2x16: round(clamp(c, -1, +1) * 32767.0)
11089285e4d47a65e52547180dca46ecfd81b2996e9Jason Ekstrand     *
11189285e4d47a65e52547180dca46ecfd81b2996e9Jason Ekstrand     * We must first cast the float to an int, because casting a negative
11289285e4d47a65e52547180dca46ecfd81b2996e9Jason Ekstrand     * float to a uint is undefined.
11389285e4d47a65e52547180dca46ecfd81b2996e9Jason Ekstrand     */
114dd0d3a2c0fb388745519c8a3be800720541eccfeMatt Turner   return (uint16_t) (int)
115dd0d3a2c0fb388745519c8a3be800720541eccfeMatt Turner          _mesa_roundevenf(CLAMP(x, -1.0f, +1.0f) * 32767.0f);
11689285e4d47a65e52547180dca46ecfd81b2996e9Jason Ekstrand}
11789285e4d47a65e52547180dca46ecfd81b2996e9Jason Ekstrand
11889285e4d47a65e52547180dca46ecfd81b2996e9Jason Ekstrand/**
11989285e4d47a65e52547180dca46ecfd81b2996e9Jason Ekstrand * Evaluate one component of unpackSnorm4x8.
12089285e4d47a65e52547180dca46ecfd81b2996e9Jason Ekstrand */
12189285e4d47a65e52547180dca46ecfd81b2996e9Jason Ekstrandstatic float
12289285e4d47a65e52547180dca46ecfd81b2996e9Jason Ekstrandunpack_snorm_1x8(uint8_t u)
12389285e4d47a65e52547180dca46ecfd81b2996e9Jason Ekstrand{
12489285e4d47a65e52547180dca46ecfd81b2996e9Jason Ekstrand    /* From section 8.4 of the GLSL 4.30 spec:
12589285e4d47a65e52547180dca46ecfd81b2996e9Jason Ekstrand     *
12689285e4d47a65e52547180dca46ecfd81b2996e9Jason Ekstrand     *    unpackSnorm4x8
12789285e4d47a65e52547180dca46ecfd81b2996e9Jason Ekstrand     *    --------------
12889285e4d47a65e52547180dca46ecfd81b2996e9Jason Ekstrand     *    The conversion for unpacked fixed-point value f to floating point is
12989285e4d47a65e52547180dca46ecfd81b2996e9Jason Ekstrand     *    done as follows:
13089285e4d47a65e52547180dca46ecfd81b2996e9Jason Ekstrand     *
13189285e4d47a65e52547180dca46ecfd81b2996e9Jason Ekstrand     *       unpackSnorm4x8: clamp(f / 127.0, -1, +1)
13289285e4d47a65e52547180dca46ecfd81b2996e9Jason Ekstrand     */
13389285e4d47a65e52547180dca46ecfd81b2996e9Jason Ekstrand   return CLAMP((int8_t) u / 127.0f, -1.0f, +1.0f);
13489285e4d47a65e52547180dca46ecfd81b2996e9Jason Ekstrand}
13589285e4d47a65e52547180dca46ecfd81b2996e9Jason Ekstrand
13689285e4d47a65e52547180dca46ecfd81b2996e9Jason Ekstrand/**
13789285e4d47a65e52547180dca46ecfd81b2996e9Jason Ekstrand * Evaluate one component of unpackSnorm2x16.
13889285e4d47a65e52547180dca46ecfd81b2996e9Jason Ekstrand */
13989285e4d47a65e52547180dca46ecfd81b2996e9Jason Ekstrandstatic float
14089285e4d47a65e52547180dca46ecfd81b2996e9Jason Ekstrandunpack_snorm_1x16(uint16_t u)
14189285e4d47a65e52547180dca46ecfd81b2996e9Jason Ekstrand{
14289285e4d47a65e52547180dca46ecfd81b2996e9Jason Ekstrand    /* From section 8.4 of the GLSL ES 3.00 spec:
14389285e4d47a65e52547180dca46ecfd81b2996e9Jason Ekstrand     *
14489285e4d47a65e52547180dca46ecfd81b2996e9Jason Ekstrand     *    unpackSnorm2x16
14589285e4d47a65e52547180dca46ecfd81b2996e9Jason Ekstrand     *    ---------------
14689285e4d47a65e52547180dca46ecfd81b2996e9Jason Ekstrand     *    The conversion for unpacked fixed-point value f to floating point is
14789285e4d47a65e52547180dca46ecfd81b2996e9Jason Ekstrand     *    done as follows:
14889285e4d47a65e52547180dca46ecfd81b2996e9Jason Ekstrand     *
14989285e4d47a65e52547180dca46ecfd81b2996e9Jason Ekstrand     *       unpackSnorm2x16: clamp(f / 32767.0, -1, +1)
15089285e4d47a65e52547180dca46ecfd81b2996e9Jason Ekstrand     */
15189285e4d47a65e52547180dca46ecfd81b2996e9Jason Ekstrand   return CLAMP((int16_t) u / 32767.0f, -1.0f, +1.0f);
15289285e4d47a65e52547180dca46ecfd81b2996e9Jason Ekstrand}
15389285e4d47a65e52547180dca46ecfd81b2996e9Jason Ekstrand
15489285e4d47a65e52547180dca46ecfd81b2996e9Jason Ekstrand/**
15589285e4d47a65e52547180dca46ecfd81b2996e9Jason Ekstrand * Evaluate one component packUnorm4x8.
15689285e4d47a65e52547180dca46ecfd81b2996e9Jason Ekstrand */
15789285e4d47a65e52547180dca46ecfd81b2996e9Jason Ekstrandstatic uint8_t
15889285e4d47a65e52547180dca46ecfd81b2996e9Jason Ekstrandpack_unorm_1x8(float x)
15989285e4d47a65e52547180dca46ecfd81b2996e9Jason Ekstrand{
16089285e4d47a65e52547180dca46ecfd81b2996e9Jason Ekstrand    /* From section 8.4 of the GLSL 4.30 spec:
16189285e4d47a65e52547180dca46ecfd81b2996e9Jason Ekstrand     *
16289285e4d47a65e52547180dca46ecfd81b2996e9Jason Ekstrand     *    packUnorm4x8
16389285e4d47a65e52547180dca46ecfd81b2996e9Jason Ekstrand     *    ------------
16489285e4d47a65e52547180dca46ecfd81b2996e9Jason Ekstrand     *    The conversion for component c of v to fixed point is done as
16589285e4d47a65e52547180dca46ecfd81b2996e9Jason Ekstrand     *    follows:
16689285e4d47a65e52547180dca46ecfd81b2996e9Jason Ekstrand     *
16789285e4d47a65e52547180dca46ecfd81b2996e9Jason Ekstrand     *       packUnorm4x8: round(clamp(c, 0, +1) * 255.0)
16889285e4d47a65e52547180dca46ecfd81b2996e9Jason Ekstrand     */
169dd0d3a2c0fb388745519c8a3be800720541eccfeMatt Turner   return (uint8_t) (int)
170dd0d3a2c0fb388745519c8a3be800720541eccfeMatt Turner          _mesa_roundevenf(CLAMP(x, 0.0f, 1.0f) * 255.0f);
17189285e4d47a65e52547180dca46ecfd81b2996e9Jason Ekstrand}
17289285e4d47a65e52547180dca46ecfd81b2996e9Jason Ekstrand
17389285e4d47a65e52547180dca46ecfd81b2996e9Jason Ekstrand/**
17489285e4d47a65e52547180dca46ecfd81b2996e9Jason Ekstrand * Evaluate one component packUnorm2x16.
17589285e4d47a65e52547180dca46ecfd81b2996e9Jason Ekstrand */
17689285e4d47a65e52547180dca46ecfd81b2996e9Jason Ekstrandstatic uint16_t
17789285e4d47a65e52547180dca46ecfd81b2996e9Jason Ekstrandpack_unorm_1x16(float x)
17889285e4d47a65e52547180dca46ecfd81b2996e9Jason Ekstrand{
17989285e4d47a65e52547180dca46ecfd81b2996e9Jason Ekstrand    /* From section 8.4 of the GLSL ES 3.00 spec:
18089285e4d47a65e52547180dca46ecfd81b2996e9Jason Ekstrand     *
18189285e4d47a65e52547180dca46ecfd81b2996e9Jason Ekstrand     *    packUnorm2x16
18289285e4d47a65e52547180dca46ecfd81b2996e9Jason Ekstrand     *    -------------
18389285e4d47a65e52547180dca46ecfd81b2996e9Jason Ekstrand     *    The conversion for component c of v to fixed point is done as
18489285e4d47a65e52547180dca46ecfd81b2996e9Jason Ekstrand     *    follows:
18589285e4d47a65e52547180dca46ecfd81b2996e9Jason Ekstrand     *
18689285e4d47a65e52547180dca46ecfd81b2996e9Jason Ekstrand     *       packUnorm2x16: round(clamp(c, 0, +1) * 65535.0)
18789285e4d47a65e52547180dca46ecfd81b2996e9Jason Ekstrand     */
188dd0d3a2c0fb388745519c8a3be800720541eccfeMatt Turner   return (uint16_t) (int)
189dd0d3a2c0fb388745519c8a3be800720541eccfeMatt Turner          _mesa_roundevenf(CLAMP(x, 0.0f, 1.0f) * 65535.0f);
19089285e4d47a65e52547180dca46ecfd81b2996e9Jason Ekstrand}
19189285e4d47a65e52547180dca46ecfd81b2996e9Jason Ekstrand
19289285e4d47a65e52547180dca46ecfd81b2996e9Jason Ekstrand/**
19389285e4d47a65e52547180dca46ecfd81b2996e9Jason Ekstrand * Evaluate one component of unpackUnorm4x8.
19489285e4d47a65e52547180dca46ecfd81b2996e9Jason Ekstrand */
19589285e4d47a65e52547180dca46ecfd81b2996e9Jason Ekstrandstatic float
19689285e4d47a65e52547180dca46ecfd81b2996e9Jason Ekstrandunpack_unorm_1x8(uint8_t u)
19789285e4d47a65e52547180dca46ecfd81b2996e9Jason Ekstrand{
19889285e4d47a65e52547180dca46ecfd81b2996e9Jason Ekstrand    /* From section 8.4 of the GLSL 4.30 spec:
19989285e4d47a65e52547180dca46ecfd81b2996e9Jason Ekstrand     *
20089285e4d47a65e52547180dca46ecfd81b2996e9Jason Ekstrand     *    unpackUnorm4x8
20189285e4d47a65e52547180dca46ecfd81b2996e9Jason Ekstrand     *    --------------
20289285e4d47a65e52547180dca46ecfd81b2996e9Jason Ekstrand     *    The conversion for unpacked fixed-point value f to floating point is
20389285e4d47a65e52547180dca46ecfd81b2996e9Jason Ekstrand     *    done as follows:
20489285e4d47a65e52547180dca46ecfd81b2996e9Jason Ekstrand     *
20589285e4d47a65e52547180dca46ecfd81b2996e9Jason Ekstrand     *       unpackUnorm4x8: f / 255.0
20689285e4d47a65e52547180dca46ecfd81b2996e9Jason Ekstrand     */
20789285e4d47a65e52547180dca46ecfd81b2996e9Jason Ekstrand   return (float) u / 255.0f;
20889285e4d47a65e52547180dca46ecfd81b2996e9Jason Ekstrand}
20989285e4d47a65e52547180dca46ecfd81b2996e9Jason Ekstrand
21089285e4d47a65e52547180dca46ecfd81b2996e9Jason Ekstrand/**
21189285e4d47a65e52547180dca46ecfd81b2996e9Jason Ekstrand * Evaluate one component of unpackUnorm2x16.
21289285e4d47a65e52547180dca46ecfd81b2996e9Jason Ekstrand */
21389285e4d47a65e52547180dca46ecfd81b2996e9Jason Ekstrandstatic float
21489285e4d47a65e52547180dca46ecfd81b2996e9Jason Ekstrandunpack_unorm_1x16(uint16_t u)
21589285e4d47a65e52547180dca46ecfd81b2996e9Jason Ekstrand{
21689285e4d47a65e52547180dca46ecfd81b2996e9Jason Ekstrand    /* From section 8.4 of the GLSL ES 3.00 spec:
21789285e4d47a65e52547180dca46ecfd81b2996e9Jason Ekstrand     *
21889285e4d47a65e52547180dca46ecfd81b2996e9Jason Ekstrand     *    unpackUnorm2x16
21989285e4d47a65e52547180dca46ecfd81b2996e9Jason Ekstrand     *    ---------------
22089285e4d47a65e52547180dca46ecfd81b2996e9Jason Ekstrand     *    The conversion for unpacked fixed-point value f to floating point is
22189285e4d47a65e52547180dca46ecfd81b2996e9Jason Ekstrand     *    done as follows:
22289285e4d47a65e52547180dca46ecfd81b2996e9Jason Ekstrand     *
22389285e4d47a65e52547180dca46ecfd81b2996e9Jason Ekstrand     *       unpackUnorm2x16: f / 65535.0
22489285e4d47a65e52547180dca46ecfd81b2996e9Jason Ekstrand     */
22589285e4d47a65e52547180dca46ecfd81b2996e9Jason Ekstrand   return (float) u / 65535.0f;
22689285e4d47a65e52547180dca46ecfd81b2996e9Jason Ekstrand}
22789285e4d47a65e52547180dca46ecfd81b2996e9Jason Ekstrand
22889285e4d47a65e52547180dca46ecfd81b2996e9Jason Ekstrand/**
22989285e4d47a65e52547180dca46ecfd81b2996e9Jason Ekstrand * Evaluate one component of packHalf2x16.
23089285e4d47a65e52547180dca46ecfd81b2996e9Jason Ekstrand */
23189285e4d47a65e52547180dca46ecfd81b2996e9Jason Ekstrandstatic uint16_t
23289285e4d47a65e52547180dca46ecfd81b2996e9Jason Ekstrandpack_half_1x16(float x)
23389285e4d47a65e52547180dca46ecfd81b2996e9Jason Ekstrand{
23489285e4d47a65e52547180dca46ecfd81b2996e9Jason Ekstrand   return _mesa_float_to_half(x);
23589285e4d47a65e52547180dca46ecfd81b2996e9Jason Ekstrand}
23689285e4d47a65e52547180dca46ecfd81b2996e9Jason Ekstrand
23789285e4d47a65e52547180dca46ecfd81b2996e9Jason Ekstrand/**
23889285e4d47a65e52547180dca46ecfd81b2996e9Jason Ekstrand * Evaluate one component of unpackHalf2x16.
23989285e4d47a65e52547180dca46ecfd81b2996e9Jason Ekstrand */
24089285e4d47a65e52547180dca46ecfd81b2996e9Jason Ekstrandstatic float
24189285e4d47a65e52547180dca46ecfd81b2996e9Jason Ekstrandunpack_half_1x16(uint16_t u)
24289285e4d47a65e52547180dca46ecfd81b2996e9Jason Ekstrand{
24389285e4d47a65e52547180dca46ecfd81b2996e9Jason Ekstrand   return _mesa_half_to_float(u);
24489285e4d47a65e52547180dca46ecfd81b2996e9Jason Ekstrand}
24589285e4d47a65e52547180dca46ecfd81b2996e9Jason Ekstrand
24689285e4d47a65e52547180dca46ecfd81b2996e9Jason Ekstrand/* Some typed vector structures to make things like src0.y work */
2479076c4e289de0debf1fb2a7237bdeb9c11002347Connor Abbotttypedef float float32_t;
2489076c4e289de0debf1fb2a7237bdeb9c11002347Connor Abbotttypedef double float64_t;
2499076c4e289de0debf1fb2a7237bdeb9c11002347Connor Abbotttypedef bool bool32_t;
2509076c4e289de0debf1fb2a7237bdeb9c11002347Connor Abbott% for type in ["float", "int", "uint"]:
2519076c4e289de0debf1fb2a7237bdeb9c11002347Connor Abbott% for width in [32, 64]:
2529076c4e289de0debf1fb2a7237bdeb9c11002347Connor Abbottstruct ${type}${width}_vec {
2539076c4e289de0debf1fb2a7237bdeb9c11002347Connor Abbott   ${type}${width}_t x;
2549076c4e289de0debf1fb2a7237bdeb9c11002347Connor Abbott   ${type}${width}_t y;
2559076c4e289de0debf1fb2a7237bdeb9c11002347Connor Abbott   ${type}${width}_t z;
2569076c4e289de0debf1fb2a7237bdeb9c11002347Connor Abbott   ${type}${width}_t w;
25789285e4d47a65e52547180dca46ecfd81b2996e9Jason Ekstrand};
25889285e4d47a65e52547180dca46ecfd81b2996e9Jason Ekstrand% endfor
2599076c4e289de0debf1fb2a7237bdeb9c11002347Connor Abbott% endfor
2609076c4e289de0debf1fb2a7237bdeb9c11002347Connor Abbott
2619076c4e289de0debf1fb2a7237bdeb9c11002347Connor Abbottstruct bool32_vec {
2629076c4e289de0debf1fb2a7237bdeb9c11002347Connor Abbott    bool x;
2639076c4e289de0debf1fb2a7237bdeb9c11002347Connor Abbott    bool y;
2649076c4e289de0debf1fb2a7237bdeb9c11002347Connor Abbott    bool z;
2659076c4e289de0debf1fb2a7237bdeb9c11002347Connor Abbott    bool w;
2669076c4e289de0debf1fb2a7237bdeb9c11002347Connor Abbott};
26789285e4d47a65e52547180dca46ecfd81b2996e9Jason Ekstrand
26889285e4d47a65e52547180dca46ecfd81b2996e9Jason Ekstrand% for name, op in sorted(opcodes.iteritems()):
26989285e4d47a65e52547180dca46ecfd81b2996e9Jason Ekstrandstatic nir_const_value
2703c7066c1ed1b9f004813995d9a097a083a8bf4d0Ian Romanickevaluate_${name}(MAYBE_UNUSED unsigned num_components, unsigned bit_size,
2713c7066c1ed1b9f004813995d9a097a083a8bf4d0Ian Romanick                 MAYBE_UNUSED nir_const_value *_src)
27289285e4d47a65e52547180dca46ecfd81b2996e9Jason Ekstrand{
27315e553daf0cd5fe70994b6ac5377ff11002357a3Jason Ekstrand   nir_const_value _dst_val = { {0, } };
27489285e4d47a65e52547180dca46ecfd81b2996e9Jason Ekstrand
2759076c4e289de0debf1fb2a7237bdeb9c11002347Connor Abbott   switch (bit_size) {
2769076c4e289de0debf1fb2a7237bdeb9c11002347Connor Abbott   % for bit_size in [32, 64]:
2779076c4e289de0debf1fb2a7237bdeb9c11002347Connor Abbott   case ${bit_size}: {
2789076c4e289de0debf1fb2a7237bdeb9c11002347Connor Abbott      <%
2799076c4e289de0debf1fb2a7237bdeb9c11002347Connor Abbott      output_type = type_add_size(op.output_type, bit_size)
2809076c4e289de0debf1fb2a7237bdeb9c11002347Connor Abbott      input_types = [type_add_size(type_, bit_size) for type_ in op.input_types]
2819076c4e289de0debf1fb2a7237bdeb9c11002347Connor Abbott      %>
2829076c4e289de0debf1fb2a7237bdeb9c11002347Connor Abbott
2839076c4e289de0debf1fb2a7237bdeb9c11002347Connor Abbott      ## For each non-per-component input, create a variable srcN that
2849076c4e289de0debf1fb2a7237bdeb9c11002347Connor Abbott      ## contains x, y, z, and w elements which are filled in with the
2859076c4e289de0debf1fb2a7237bdeb9c11002347Connor Abbott      ## appropriately-typed values.
2869076c4e289de0debf1fb2a7237bdeb9c11002347Connor Abbott      % for j in range(op.num_inputs):
2879076c4e289de0debf1fb2a7237bdeb9c11002347Connor Abbott         % if op.input_sizes[j] == 0:
2889076c4e289de0debf1fb2a7237bdeb9c11002347Connor Abbott            <% continue %>
2899076c4e289de0debf1fb2a7237bdeb9c11002347Connor Abbott         % elif "src" + str(j) not in op.const_expr:
2909076c4e289de0debf1fb2a7237bdeb9c11002347Connor Abbott            ## Avoid unused variable warnings
2919076c4e289de0debf1fb2a7237bdeb9c11002347Connor Abbott            <% continue %>
2929076c4e289de0debf1fb2a7237bdeb9c11002347Connor Abbott         %endif
29389285e4d47a65e52547180dca46ecfd81b2996e9Jason Ekstrand
294ee1f35eb69999933498d97b6fa7dbeb5ab06af74Ian Romanick         const struct ${input_types[j]}_vec src${j} = {
2959076c4e289de0debf1fb2a7237bdeb9c11002347Connor Abbott         % for k in range(op.input_sizes[j]):
2969076c4e289de0debf1fb2a7237bdeb9c11002347Connor Abbott            % if input_types[j] == "bool32":
297084b24f5582567ebf5aa94b7f40ae3bdcb71316bIago Toral Quiroga               _src[${j}].u32[${k}] != 0,
29889285e4d47a65e52547180dca46ecfd81b2996e9Jason Ekstrand            % else:
2999076c4e289de0debf1fb2a7237bdeb9c11002347Connor Abbott               _src[${j}].${get_const_field(input_types[j])}[${k}],
30089285e4d47a65e52547180dca46ecfd81b2996e9Jason Ekstrand            % endif
30189285e4d47a65e52547180dca46ecfd81b2996e9Jason Ekstrand         % endfor
3024300693a078ee29e2be3c05dc0c9383b571786d0Ian Romanick         % for k in range(op.input_sizes[j], 4):
3034300693a078ee29e2be3c05dc0c9383b571786d0Ian Romanick            0,
3044300693a078ee29e2be3c05dc0c9383b571786d0Ian Romanick         % endfor
3059076c4e289de0debf1fb2a7237bdeb9c11002347Connor Abbott         };
3069076c4e289de0debf1fb2a7237bdeb9c11002347Connor Abbott      % endfor
3079076c4e289de0debf1fb2a7237bdeb9c11002347Connor Abbott
3089076c4e289de0debf1fb2a7237bdeb9c11002347Connor Abbott      % if op.output_size == 0:
3099076c4e289de0debf1fb2a7237bdeb9c11002347Connor Abbott         ## For per-component instructions, we need to iterate over the
3109076c4e289de0debf1fb2a7237bdeb9c11002347Connor Abbott         ## components and apply the constant expression one component
3119076c4e289de0debf1fb2a7237bdeb9c11002347Connor Abbott         ## at a time.
3129076c4e289de0debf1fb2a7237bdeb9c11002347Connor Abbott         for (unsigned _i = 0; _i < num_components; _i++) {
3139076c4e289de0debf1fb2a7237bdeb9c11002347Connor Abbott            ## For each per-component input, create a variable srcN that
3149076c4e289de0debf1fb2a7237bdeb9c11002347Connor Abbott            ## contains the value of the current (_i'th) component.
3159076c4e289de0debf1fb2a7237bdeb9c11002347Connor Abbott            % for j in range(op.num_inputs):
3169076c4e289de0debf1fb2a7237bdeb9c11002347Connor Abbott               % if op.input_sizes[j] != 0:
3179076c4e289de0debf1fb2a7237bdeb9c11002347Connor Abbott                  <% continue %>
3189076c4e289de0debf1fb2a7237bdeb9c11002347Connor Abbott               % elif "src" + str(j) not in op.const_expr:
3199076c4e289de0debf1fb2a7237bdeb9c11002347Connor Abbott                  ## Avoid unused variable warnings
3209076c4e289de0debf1fb2a7237bdeb9c11002347Connor Abbott                  <% continue %>
3219076c4e289de0debf1fb2a7237bdeb9c11002347Connor Abbott               % elif input_types[j] == "bool32":
322ee1f35eb69999933498d97b6fa7dbeb5ab06af74Ian Romanick                  const bool src${j} = _src[${j}].u32[_i] != 0;
3239076c4e289de0debf1fb2a7237bdeb9c11002347Connor Abbott               % else:
324ee1f35eb69999933498d97b6fa7dbeb5ab06af74Ian Romanick                  const ${input_types[j]}_t src${j} =
3259076c4e289de0debf1fb2a7237bdeb9c11002347Connor Abbott                     _src[${j}].${get_const_field(input_types[j])}[_i];
3269076c4e289de0debf1fb2a7237bdeb9c11002347Connor Abbott               % endif
3279076c4e289de0debf1fb2a7237bdeb9c11002347Connor Abbott            % endfor
3289076c4e289de0debf1fb2a7237bdeb9c11002347Connor Abbott
3299076c4e289de0debf1fb2a7237bdeb9c11002347Connor Abbott            ## Create an appropriately-typed variable dst and assign the
3309076c4e289de0debf1fb2a7237bdeb9c11002347Connor Abbott            ## result of the const_expr to it.  If const_expr already contains
3319076c4e289de0debf1fb2a7237bdeb9c11002347Connor Abbott            ## writes to dst, just include const_expr directly.
3329076c4e289de0debf1fb2a7237bdeb9c11002347Connor Abbott            % if "dst" in op.const_expr:
3339076c4e289de0debf1fb2a7237bdeb9c11002347Connor Abbott               ${output_type}_t dst;
334ee1f35eb69999933498d97b6fa7dbeb5ab06af74Ian Romanick
3359076c4e289de0debf1fb2a7237bdeb9c11002347Connor Abbott               ${op.const_expr}
3369076c4e289de0debf1fb2a7237bdeb9c11002347Connor Abbott            % else:
3379076c4e289de0debf1fb2a7237bdeb9c11002347Connor Abbott               ${output_type}_t dst = ${op.const_expr};
3389076c4e289de0debf1fb2a7237bdeb9c11002347Connor Abbott            % endif
3399076c4e289de0debf1fb2a7237bdeb9c11002347Connor Abbott
3409076c4e289de0debf1fb2a7237bdeb9c11002347Connor Abbott            ## Store the current component of the actual destination to the
3419076c4e289de0debf1fb2a7237bdeb9c11002347Connor Abbott            ## value of dst.
3429076c4e289de0debf1fb2a7237bdeb9c11002347Connor Abbott            % if output_type == "bool32":
3439076c4e289de0debf1fb2a7237bdeb9c11002347Connor Abbott               ## Sanitize the C value to a proper NIR bool
344084b24f5582567ebf5aa94b7f40ae3bdcb71316bIago Toral Quiroga               _dst_val.u32[_i] = dst ? NIR_TRUE : NIR_FALSE;
3459076c4e289de0debf1fb2a7237bdeb9c11002347Connor Abbott            % else:
3469076c4e289de0debf1fb2a7237bdeb9c11002347Connor Abbott               _dst_val.${get_const_field(output_type)}[_i] = dst;
3479076c4e289de0debf1fb2a7237bdeb9c11002347Connor Abbott            % endif
3489076c4e289de0debf1fb2a7237bdeb9c11002347Connor Abbott         }
3499076c4e289de0debf1fb2a7237bdeb9c11002347Connor Abbott      % else:
3509076c4e289de0debf1fb2a7237bdeb9c11002347Connor Abbott         ## In the non-per-component case, create a struct dst with
3519076c4e289de0debf1fb2a7237bdeb9c11002347Connor Abbott         ## appropriately-typed elements x, y, z, and w and assign the result
3529076c4e289de0debf1fb2a7237bdeb9c11002347Connor Abbott         ## of the const_expr to all components of dst, or include the
3539076c4e289de0debf1fb2a7237bdeb9c11002347Connor Abbott         ## const_expr directly if it writes to dst already.
3549076c4e289de0debf1fb2a7237bdeb9c11002347Connor Abbott         struct ${output_type}_vec dst;
35589285e4d47a65e52547180dca46ecfd81b2996e9Jason Ekstrand
35689285e4d47a65e52547180dca46ecfd81b2996e9Jason Ekstrand         % if "dst" in op.const_expr:
35789285e4d47a65e52547180dca46ecfd81b2996e9Jason Ekstrand            ${op.const_expr}
35889285e4d47a65e52547180dca46ecfd81b2996e9Jason Ekstrand         % else:
3599076c4e289de0debf1fb2a7237bdeb9c11002347Connor Abbott            ## Splat the value to all components.  This way expressions which
3609076c4e289de0debf1fb2a7237bdeb9c11002347Connor Abbott            ## write the same value to all components don't need to explicitly
3619076c4e289de0debf1fb2a7237bdeb9c11002347Connor Abbott            ## write to dest.  One such example is fnoise which has a
3629076c4e289de0debf1fb2a7237bdeb9c11002347Connor Abbott            ## const_expr of 0.0f.
3639076c4e289de0debf1fb2a7237bdeb9c11002347Connor Abbott            dst.x = dst.y = dst.z = dst.w = ${op.const_expr};
36489285e4d47a65e52547180dca46ecfd81b2996e9Jason Ekstrand         % endif
36589285e4d47a65e52547180dca46ecfd81b2996e9Jason Ekstrand
3669076c4e289de0debf1fb2a7237bdeb9c11002347Connor Abbott         ## For each component in the destination, copy the value of dst to
3679076c4e289de0debf1fb2a7237bdeb9c11002347Connor Abbott         ## the actual destination.
3689076c4e289de0debf1fb2a7237bdeb9c11002347Connor Abbott         % for k in range(op.output_size):
3699076c4e289de0debf1fb2a7237bdeb9c11002347Connor Abbott            % if output_type == "bool32":
3709076c4e289de0debf1fb2a7237bdeb9c11002347Connor Abbott               ## Sanitize the C value to a proper NIR bool
371084b24f5582567ebf5aa94b7f40ae3bdcb71316bIago Toral Quiroga               _dst_val.u32[${k}] = dst.${"xyzw"[k]} ? NIR_TRUE : NIR_FALSE;
3729076c4e289de0debf1fb2a7237bdeb9c11002347Connor Abbott            % else:
3739076c4e289de0debf1fb2a7237bdeb9c11002347Connor Abbott               _dst_val.${get_const_field(output_type)}[${k}] = dst.${"xyzw"[k]};
3749076c4e289de0debf1fb2a7237bdeb9c11002347Connor Abbott            % endif
3759076c4e289de0debf1fb2a7237bdeb9c11002347Connor Abbott         % endfor
37689285e4d47a65e52547180dca46ecfd81b2996e9Jason Ekstrand      % endif
37789285e4d47a65e52547180dca46ecfd81b2996e9Jason Ekstrand
3789076c4e289de0debf1fb2a7237bdeb9c11002347Connor Abbott      break;
3799076c4e289de0debf1fb2a7237bdeb9c11002347Connor Abbott   }
3809076c4e289de0debf1fb2a7237bdeb9c11002347Connor Abbott   % endfor
3819076c4e289de0debf1fb2a7237bdeb9c11002347Connor Abbott
3829076c4e289de0debf1fb2a7237bdeb9c11002347Connor Abbott   default:
3839076c4e289de0debf1fb2a7237bdeb9c11002347Connor Abbott      unreachable("unknown bit width");
3849076c4e289de0debf1fb2a7237bdeb9c11002347Connor Abbott   }
38589285e4d47a65e52547180dca46ecfd81b2996e9Jason Ekstrand
38689285e4d47a65e52547180dca46ecfd81b2996e9Jason Ekstrand   return _dst_val;
38789285e4d47a65e52547180dca46ecfd81b2996e9Jason Ekstrand}
38889285e4d47a65e52547180dca46ecfd81b2996e9Jason Ekstrand% endfor
38989285e4d47a65e52547180dca46ecfd81b2996e9Jason Ekstrand
39089285e4d47a65e52547180dca46ecfd81b2996e9Jason Ekstrandnir_const_value
39189285e4d47a65e52547180dca46ecfd81b2996e9Jason Ekstrandnir_eval_const_opcode(nir_op op, unsigned num_components,
3929076c4e289de0debf1fb2a7237bdeb9c11002347Connor Abbott                      unsigned bit_width, nir_const_value *src)
39389285e4d47a65e52547180dca46ecfd81b2996e9Jason Ekstrand{
39489285e4d47a65e52547180dca46ecfd81b2996e9Jason Ekstrand   switch (op) {
39589285e4d47a65e52547180dca46ecfd81b2996e9Jason Ekstrand% for name in sorted(opcodes.iterkeys()):
396ee1f35eb69999933498d97b6fa7dbeb5ab06af74Ian Romanick   case nir_op_${name}:
3979076c4e289de0debf1fb2a7237bdeb9c11002347Connor Abbott      return evaluate_${name}(num_components, bit_width, src);
39889285e4d47a65e52547180dca46ecfd81b2996e9Jason Ekstrand% endfor
39989285e4d47a65e52547180dca46ecfd81b2996e9Jason Ekstrand   default:
40089285e4d47a65e52547180dca46ecfd81b2996e9Jason Ekstrand      unreachable("shouldn't get here");
40189285e4d47a65e52547180dca46ecfd81b2996e9Jason Ekstrand   }
40289285e4d47a65e52547180dca46ecfd81b2996e9Jason Ekstrand}"""
40389285e4d47a65e52547180dca46ecfd81b2996e9Jason Ekstrand
40489285e4d47a65e52547180dca46ecfd81b2996e9Jason Ekstrandfrom nir_opcodes import opcodes
40589285e4d47a65e52547180dca46ecfd81b2996e9Jason Ekstrandfrom mako.template import Template
40689285e4d47a65e52547180dca46ecfd81b2996e9Jason Ekstrand
4079076c4e289de0debf1fb2a7237bdeb9c11002347Connor Abbottprint Template(template).render(opcodes=opcodes, type_sizes=type_sizes,
4089076c4e289de0debf1fb2a7237bdeb9c11002347Connor Abbott                                type_has_size=type_has_size,
4099076c4e289de0debf1fb2a7237bdeb9c11002347Connor Abbott                                type_add_size=type_add_size,
4109076c4e289de0debf1fb2a7237bdeb9c11002347Connor Abbott                                get_const_field=get_const_field)
411