<div dir="ltr"><br><div class="gmail_extra"><br><br><div class="gmail_quote">On Tue, Jul 15, 2014 at 11:19 AM, Tom Stellard <span dir="ltr"><<a href="mailto:thomas.stellard@amd.com" target="_blank">thomas.stellard@amd.com</a>></span> wrote:<br>

<blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left-width:1px;border-left-color:rgb(204,204,204);border-left-style:solid;padding-left:1ex">---<br>
 src/gallium/auxiliary/util/u_math.h      | 22 ++++++++++++++++++++++<br>
 src/gallium/drivers/radeonsi/si_shader.c |  8 +-------<br>
 2 files changed, 23 insertions(+), 7 deletions(-)<br>
<br>
diff --git a/src/gallium/auxiliary/util/u_math.h b/src/gallium/auxiliary/util/u_math.h<br>
index b9ed197..cd3cf04 100644<br>
--- a/src/gallium/auxiliary/util/u_math.h<br>
+++ b/src/gallium/auxiliary/util/u_math.h<br>
@@ -812,6 +812,28 @@ util_bswap16(uint16_t n)<br>
           (n << 8);<br>
 }<br>
<br>
+static INLINE void*<br>
+util_memcpy_cpu_to_le(void *dest, void *src, size_t n)<br>
+{<br>
+#ifdef PIPE_ARCH_BIG_ENDIAN<br>
+       size_t i, e;<br>
+       for (i = 0, e = n % 8; i < e; i++) {<br>
+               char *d = (char*)dest;<br>
+               char *s = (char*)src;<br>
+               d[i] = s[e - i - 1];<br>
+       }<br>
+       dest += i;<br>
+       n -= i;<br>
+       for (i = 0, e = n / 8; i < e; i++) {<br>
+               uint64_t *d = (uint64_t*)dest;<br>
+               uint64_t *s = (uint64_t*)src;<br>
+               d[i] = util_bswap64(s[e - i - 1]);<br>
+       }<br></blockquote><div><br></div><div>Doesn't this reverse all of the byte (as if it were a list) without preserving word boundaries? e.g.</div><div><br></div><div>|a, b, c, d | e, f, g, h | i, j, k, l | m, n, o, p | -></div>
<div>|p, o, n, m | l, j, k, i | h, g, f, e | d, c, b, a |<br>
</div><div><br></div><div>The old code did something like this, didn't it?:</div><div>|a, b, c, d | e, f, g, h | i, j, k, l | m, n, o, p | -></div><div>|d, c, b, a | h, g, f, e | l, k, j, i | p, o, n, m |<br></div>
<div> </div><div>I don't know which is correct, but it does seem like a behavior change. Or am I misreading the code?</div><div><br></div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left-width:1px;border-left-color:rgb(204,204,204);border-left-style:solid;padding-left:1ex">


+       return dest;<br>
+#else<br>
+       return memcpy(dest, src, n);<br>
+#endif<br>
+}<br>
<br>
 /**<br>
  * Clamp X to [MIN, MAX].<br>
diff --git a/src/gallium/drivers/radeonsi/si_shader.c b/src/gallium/drivers/radeonsi/si_shader.c<br>
index f0650f4..6f0504b 100644<br>
--- a/src/gallium/drivers/radeonsi/si_shader.c<br>
+++ b/src/gallium/drivers/radeonsi/si_shader.c<br>
@@ -2559,13 +2559,7 @@ int si_compile_llvm(struct si_context *sctx, struct si_pipe_shader *shader,<br>
        }<br>
<br>
        ptr = (uint32_t*)sctx->b.ws->buffer_map(shader->bo->cs_buf, sctx->b.rings.gfx.cs, PIPE_TRANSFER_WRITE);<br>
-       if (SI_BIG_ENDIAN) {<br>
-               for (i = 0; i < binary.code_size / 4; ++i) {<br>
-                       ptr[i] = util_cpu_to_le32((*(uint32_t*)(binary.code + i*4)));<br>
-               }<br>
-       } else {<br>
-               memcpy(ptr, binary.code, binary.code_size);<br>
-       }<br>
+       util_memcpy_cpu_to_le(ptr, binary.code, binary.code_size);<br>
        sctx->b.ws->buffer_unmap(shader->bo->cs_buf);<br>
<br>
        free(binary.code);<br>
<span><font color="#888888">--<br>
1.8.1.5<br>
<br>
_______________________________________________<br>
mesa-dev mailing list<br>
<a href="mailto:mesa-dev@lists.freedesktop.org" target="_blank">mesa-dev@lists.freedesktop.org</a><br>
<a href="http://lists.freedesktop.org/mailman/listinfo/mesa-dev" target="_blank">http://lists.freedesktop.org/mailman/listinfo/mesa-dev</a><br>
</font></span></blockquote></div><br></div></div>