intel/aubinator: Add a get_offset helper
authorJason Ekstrand <jason.ekstrand@intel.com>
Fri, 18 Nov 2016 19:30:50 +0000 (11:30 -0800)
committerJason Ekstrand <jason.ekstrand@intel.com>
Tue, 29 Nov 2016 00:45:09 +0000 (16:45 -0800)
The helper automatically handles masking for us so we don't have to worry
about whether or not something is in the bottom bits.

Reviewed-by: Kristian H. Kristensen <hoegsberg@google.com>
src/intel/tools/aubinator.c

index f5e51676a34eb85126a13b0eaf99255355eaefd7..fbd8721d1c01780c7bc9a8951370633700102239 100644 (file)
@@ -232,12 +232,6 @@ handle_3dstate_index_buffer(struct gen_spec *spec, uint32_t *p)
       printf("\n");
 }
 
-static inline uint64_t
-get_qword(uint32_t *p)
-{
-   return ((uint64_t) p[1] << 32) | p[0];
-}
-
 static inline uint64_t
 get_address(struct gen_spec *spec, uint32_t *p)
 {
@@ -259,6 +253,21 @@ get_address(struct gen_spec *spec, uint32_t *p)
    return addr;
 }
 
+static inline uint64_t
+get_offset(uint32_t *p, uint32_t start, uint32_t end)
+{
+   assert(start <= end);
+   assert(end < 64);
+
+   uint64_t mask = (~0ull >> (64 - (end - start + 1))) << start;
+
+   uint64_t offset = p[0];
+   if (end >= 32)
+      offset |= (uint64_t) p[1] << 32;
+
+   return offset & mask;
+}
+
 static void
 handle_state_base_address(struct gen_spec *spec, uint32_t *p)
 {
@@ -418,10 +427,10 @@ handle_3dstate_vs(struct gen_spec *spec, uint32_t *p)
    int vs_enable;
 
    if (gen_spec_get_gen(spec) >= gen_make_gen(8, 0)) {
-      start = get_qword(&p[1]);
+      start = get_offset(&p[1], 6, 63);
       vs_enable = p[7] & 1;
    } else {
-      start = p[1];
+      start = get_offset(&p[1], 6, 31);
       vs_enable = p[5] & 1;
    }
 
@@ -442,9 +451,9 @@ handle_3dstate_hs(struct gen_spec *spec, uint32_t *p)
    int hs_enable;
 
    if (gen_spec_get_gen(spec) >= gen_make_gen(8, 0)) {
-      start = get_qword(&p[3]);
+      start = get_offset(&p[3], 6, 63);
    } else {
-      start = p[3];
+      start = get_offset(&p[3], 6, 31);
    }
 
    hs_enable = p[2] & 0x80000000;