<div dir="ltr"><div class="gmail_extra"><div class="gmail_quote">On Thu, Oct 26, 2017 at 11:53 PM, Iago Toral <span dir="ltr"><<a href="mailto:itoral@igalia.com" target="_blank">itoral@igalia.com</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">On Wed, 2017-10-25 at 16:25 -0700, Jason Ekstrand wrote:<br>
> ---<br>
>  src/intel/compiler/brw_fs_<wbr>nir.cpp | 33 +++++++++++++++++++++------<br>
<div><div class="h5">> ------<br>
>  1 file changed, 21 insertions(+), 12 deletions(-)<br>
><br>
> diff --git a/src/intel/compiler/brw_fs_<wbr>nir.cpp<br>
> b/src/intel/compiler/brw_fs_<wbr>nir.cpp<br>
> index e008e2e..a441f57 100644<br>
> --- a/src/intel/compiler/brw_fs_<wbr>nir.cpp<br>
> +++ b/src/intel/compiler/brw_fs_<wbr>nir.cpp<br>
> @@ -1441,11 +1441,19 @@ fs_visitor::get_nir_src(const nir_src &src)<br>
>                     src.reg.<wbr>base_offset * src.reg.reg-<br>
> >num_components);<br>
>     }<br>
>  <br>
> -   /* to avoid floating-point denorm flushing problems, set the type<br>
> by<br>
> -    * default to D - instructions that need floating point semantics<br>
> will set<br>
> -    * this to F if they need to<br>
> -    */<br>
> -   return retype(reg, BRW_REGISTER_TYPE_D);<br>
> +   if (nir_src_bit_size(src) == 64 && devinfo->gen == 7) {<br>
> +      /* The only 64-bit type available on gen7 is DF, so use that.<br>
> */<br>
> +      reg.type = BRW_REGISTER_TYPE_DF;<br>
> +   } else {<br>
> +      /* To avoid floating-point denorm flushing problems, set the<br>
> type by<br>
> +       * default to an integer type - instructions that need<br>
> floating point<br>
> +       * semantics will set this to F if they need to<br>
> +       */<br>
> +      reg.type = brw_reg_type_from_bit_size(<wbr>nir_src_bit_size(src),<br>
> +                             <wbr>               BRW_REGISTER_<wbr>TYPE_D);<br>
> +   }<br>
> +<br>
> +   return reg;<br>
>  }<br>
>  <br>
>  /**<br>
> @@ -1455,6 +1463,10 @@ fs_reg<br>
>  fs_visitor::get_nir_src_imm(<wbr>const nir_src &src)<br>
>  {<br>
>     nir_const_value *val = nir_src_as_const_value(src);<br>
> +   /* This function shouldn't be called on anything which can even<br>
> +    * possibly be 64 bits as it can't do what it claims.<br>
> +    */<br>
<br>
</div></div>What would be wrong with something like this?<br>
<br>
if (nir_src_bit_size(src) == 32)<br>
<span class="">   return val ? fs_reg(brw_imm_d(val->i32[0])) : get_nir_src(src);<br>
</span>else<br>
   return val ? fs_reg(brw_imm_df(val->f64[0])<wbr>) : get_nir_src(src);<br><div class="HOEnZb"><div class="h5"></div></div></blockquote><div><br></div><div>Because double immediates only really work on BDW+ and I didn't want someone to call this function and get tripped up by that.<br></div><div> </div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div class="HOEnZb"><div class="h5">
> +   assert(nir_src_bit_size(<wbr>src) == 32);<br>
>     return val ? fs_reg(brw_imm_d(val->i32[0])) : get_nir_src(src);<br>
>  }<br>
>  <br>
> @@ -2648,8 +2660,7 @@ fs_visitor::nir_emit_tcs_<wbr>intrinsic(const<br>
> fs_builder &bld,<br>
>                  */<br>
>                 unsigned channel = iter * 2 + i;<br>
>                 fs_reg dest = shuffle_64bit_data_for_32bit_<wbr>write(bld,<br>
> -                  retype(<wbr>offset(value, bld, 2 * channel),<br>
> BRW_REGISTER_TYPE_DF),<br>
> -                  1);<br>
> +                  offset(<wbr>value, bld, channel), 1);<br>
>  <br>
>                 srcs[header_<wbr>regs + (i + first_component) * 2] = dest;<br>
>                 srcs[header_<wbr>regs + (i + first_component) * 2 + 1] =<br>
> @@ -3505,8 +3516,7 @@ fs_visitor::nir_emit_cs_<wbr>intrinsic(const<br>
> fs_builder &bld,<br>
>        if (nir_src_bit_size(instr->src[<wbr>0]) == 64) {<br>
>           type_size = 8;<br>
>           val_reg = shuffle_64bit_data_for_32bit_<wbr>write(bld,<br>
> -            retype(val_reg, BRW_REGISTER_TYPE_DF),<br>
> -            instr->num_<wbr>components);<br>
> +            val_reg, instr->num_components);<br>
>        }<br>
>  <br>
>        unsigned type_slots = type_size / 4;<br>
> @@ -4005,8 +4015,7 @@ fs_visitor::nir_emit_<wbr>intrinsic(const fs_builder<br>
> &bld, nir_intrinsic_instr *instr<br>
>        if (nir_src_bit_size(instr->src[<wbr>0]) == 64) {<br>
>           type_size = 8;<br>
>           val_reg = shuffle_64bit_data_for_32bit_<wbr>write(bld,<br>
> -            retype(val_reg, BRW_REGISTER_TYPE_DF),<br>
> -            instr->num_<wbr>components);<br>
> +            val_reg, instr->num_components);<br>
>        }<br>
>  <br>
>        unsigned type_slots = type_size / 4;<br>
> @@ -4063,7 +4072,7 @@ fs_visitor::nir_emit_<wbr>intrinsic(const fs_builder<br>
> &bld, nir_intrinsic_instr *instr<br>
>        unsigned first_component = nir_intrinsic_component(instr)<wbr>;<br>
>        if (nir_src_bit_size(instr->src[<wbr>0]) == 64) {<br>
>           fs_reg tmp = shuffle_64bit_data_for_32bit_<wbr>write(bld,<br>
> -            retype(src, BRW_REGISTER_TYPE_DF), num_components);<br>
> +            src, num_components);<br>
>           src = tmp;<br>
>           num_components *= 2;<br>
>        }<br>
</div></div></blockquote></div><br></div></div>