v3d: Dump fields in CLIF output in increasing offset order.
authorEric Anholt <eric@anholt.net>
Tue, 26 Jun 2018 19:57:16 +0000 (12:57 -0700)
committerEric Anholt <eric@anholt.net>
Sat, 28 Jul 2018 00:56:55 +0000 (17:56 -0700)
Previously, we emitted in XML order, which I happen to type in the
decreasing offset order of the specifications.  However, the CLIF parser
wants increasing offsets.

src/broadcom/cle/v3d_decoder.c

index 725561cef858510b3ae946391923c4f4f378e613..ed39ec48fc5d56e341b640c33991081961a1bc85 100644 (file)
@@ -511,6 +511,13 @@ skip:
         ctx->parse_depth++;
 }
 
+static int
+field_offset_compare(const void *a, const void *b)
+{
+        return ((*(const struct v3d_field **)a)->start -
+                (*(const struct v3d_field **)b)->start);
+}
+
 static void
 end_element(void *data, const char *name)
 {
@@ -549,6 +556,13 @@ end_element(void *data, const char *name)
                 else if (strcmp(name, "register") == 0)
                         spec->registers[spec->nregisters++] = group;
 
+                /* Sort the fields in increasing offset order.  The XML might
+                 * be specified in any order, but we'll want to iterate from
+                 * the bottom.
+                 */
+                qsort(group->fields, group->nfields, sizeof(*group->fields),
+                      field_offset_compare);
+
                 assert(spec->ncommands < ARRAY_SIZE(spec->commands));
                 assert(spec->nstructs < ARRAY_SIZE(spec->structs));
                 assert(spec->nregisters < ARRAY_SIZE(spec->registers));