[Mesa-dev] [PATCH 3/4] intel/decoder: Stop rounding down to the nearest dword

Jason Ekstrand jason at jlekstrand.net
Wed Dec 13 01:38:45 UTC 2017


---
 src/intel/common/gen_decoder.c | 23 ++++++++++++-----------
 1 file changed, 12 insertions(+), 11 deletions(-)

diff --git a/src/intel/common/gen_decoder.c b/src/intel/common/gen_decoder.c
index de4c506..59c76ea 100644
--- a/src/intel/common/gen_decoder.c
+++ b/src/intel/common/gen_decoder.c
@@ -847,27 +847,29 @@ iter_advance_field(struct gen_field_iterator *iter)
 }
 
 static uint64_t
-iter_decode_field_raw(struct gen_field *field,
-                      const uint32_t *p,
-                      const uint32_t *end)
+iter_decode_field_raw(struct gen_field_iterator *iter)
 {
    uint64_t qw = 0;
 
-   if ((field->end - field->start) > 32) {
-      if ((p + 1) < end)
+   int field_start = iter->bit;
+   int field_end = iter->bit + (iter->field->end - iter->field->start);
+
+   const uint32_t *p = iter->p + (iter->bit / 32);
+   if ((field_end - field_start) > 32) {
+      if ((p + 1) < iter->p_end)
          qw = ((uint64_t) p[1]) << 32;
       qw |= p[0];
    } else
       qw = p[0];
 
-   qw = field_value(qw, field->start, field->end);
+   qw = field_value(qw, field_start, field_end);
 
    /* Address & offset types have to be aligned to dwords, their start bit is
     * a reminder of the alignment requirement.
     */
-   if (field->type.kind == GEN_TYPE_ADDRESS ||
-       field->type.kind == GEN_TYPE_OFFSET)
-      qw <<= field->start % 32;
+   if (iter->field->type.kind == GEN_TYPE_ADDRESS ||
+       iter->field->type.kind == GEN_TYPE_OFFSET)
+      qw <<= field_start % 32;
 
    return qw;
 }
@@ -887,8 +889,7 @@ iter_decode_field(struct gen_field_iterator *iter)
 
    memset(&v, 0, sizeof(v));
 
-   v.qw = iter_decode_field_raw(iter->field,
-                                &iter->p[iter->bit / 32], iter->p_end);
+   v.qw = iter_decode_field_raw(iter);
 
    const char *enum_name = NULL;
 
-- 
2.5.0.400.gff86faf



More information about the mesa-dev mailing list