<div dir="ltr"><br><div class="gmail_extra"><br><div class="gmail_quote">On Mon, Apr 30, 2018 at 7:18 AM, Iago Toral Quiroga <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">From: Jose Maria Casanova Crespo <<a href="mailto:jmcasanova@igalia.com">jmcasanova@igalia.com</a>><br>
<br>
>From Intel Skylake PRM, vol 07, "Immediate" section (page 768):<br>
<br>
"For a word, unsigned word, or half-float immediate data,<br>
software must replicate the same 16-bit immediate value to both<br>
the lower word and the high word of the 32-bit immediate field<br>
in a GEN instruction."<br>
<br>
This patch implements float16 negate and fix the int16/uint16<br>
negate that wasn't taking into account the replication in lower<br>
and higher words.<br></blockquote><div><br></div><div>Since this fixes a bug, do we want to split it in two and send the bug-fix to stable?<br></div><div> </div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
v2: Integer cases are different to Float cases. (Jason Ekstrand)<br>
    Included reference to PRM (Jose Maria Casanova)<br>
---<br>
 src/intel/compiler/brw_shader.<wbr>cpp | 11 +++++++----<br>
 1 file changed, 7 insertions(+), 4 deletions(-)<br>
<br>
diff --git a/src/intel/compiler/brw_<wbr>shader.cpp b/src/intel/compiler/brw_<wbr>shader.cpp<br>
index 9cdf9fcb23..76dd1173fa 100644<br>
--- a/src/intel/compiler/brw_<wbr>shader.cpp<br>
+++ b/src/intel/compiler/brw_<wbr>shader.cpp<br>
@@ -580,8 +580,13 @@ brw_negate_immediate(enum brw_reg_type type, struct brw_reg *reg)<br>
       reg->d = -reg->d;<br>
       return true;<br>
    case BRW_REGISTER_TYPE_W:<br>
-   case BRW_REGISTER_TYPE_UW:<br>
-      reg->d = -(int16_t)reg->ud;<br>
+   case BRW_REGISTER_TYPE_UW: {<br>
+      uint16_t value = -(int16_t)reg->ud;<br>
+      reg->ud = value | value << 16;<br></blockquote><div><br></div><div>You're shifting an explicitly 16-bit value by 16.  I think you want to cast to uint32_t.<br></div><div> </div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
+      return true;<br>
+   }<br>
+   case BRW_REGISTER_TYPE_HF:<br>
+      reg->ud ^= 0x80008000;<br>
       return true;<br>
    case BRW_REGISTER_TYPE_F:<br>
       reg->f = -reg->f;<br>
@@ -602,8 +607,6 @@ brw_negate_immediate(enum brw_reg_type type, struct brw_reg *reg)<br>
    case BRW_REGISTER_TYPE_UV:<br>
    case BRW_REGISTER_TYPE_V:<br>
       assert(!"unimplemented: negate UV/V immediate");<br>
-   case BRW_REGISTER_TYPE_HF:<br>
-      assert(!"unimplemented: negate HF immediate");<br>
    case BRW_REGISTER_TYPE_NF:<br>
       unreachable("no NF immediates");<br>
    }<br>
<span class="HOEnZb"><font color="#888888">-- <br>
2.14.1<br>
<br>
</font></span></blockquote></div><br></div></div>