Re: [Mesa-dev] [PATCH 21/33] intel: decoder: extract field value computation
On 31/10/17 17:29, Scott D Phillips wrote: Lionel Landwerlin writes: Signed-off-by: Lionel Landwerlin --- src/intel/common/gen_decoder.c | 59 ++ 1 file changed, 37 insertions(+), 22 deletions(-) diff --git a/src/intel/common/gen_decoder.c b/src/intel/common/gen_decoder.c index a63c09cd37e..b0bd161fef3 100644 --- a/src/intel/common/gen_decoder.c +++ b/src/intel/common/gen_decoder.c @@ -818,6 +818,32 @@ iter_advance_field(struct gen_field_iterator *iter) return true; } +static uint64_t +iter_decode_field_raw(struct gen_field *field, + const uint32_t *p, + const uint32_t *end) +{ + uint64_t qw = 0; + + if ((field->end - field->start) > 32) { + if ((p + 1) < end) + qw = ((uint64_t) p[1]) << 32; + qw |= p[0]; + } else + qw = p[0]; + + 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; + + return qw; +} + static void iter_decode_field(struct gen_field_iterator *iter) { @@ -833,35 +859,28 @@ iter_decode_field(struct gen_field_iterator *iter) memset(&v, 0, sizeof(v)); - if ((iter->field->end - iter->field->start) > 32) { - if (&iter->p[iter->dword + 1] < iter->end) - v.qw = ((uint64_t) iter->p[iter->dword+1] << 32); - v.qw |= iter->p[iter->dword]; - } else - v.qw = iter->p[iter->dword]; + v.qw = iter_decode_field_raw(iter->field, +&iter->p[iter->dword], iter->end); const char *enum_name = NULL; switch (iter->field->type.kind) { case GEN_TYPE_UNKNOWN: case GEN_TYPE_INT: { - uint64_t value = field_value(v.qw, iter->field->start, iter->field->end); - snprintf(iter->value, sizeof(iter->value), "%"PRId64, value); - enum_name = gen_get_enum_name(&iter->field->inline_enum, value); + snprintf(iter->value, sizeof(iter->value), "%"PRId64, v.qw); + enum_name = gen_get_enum_name(&iter->field->inline_enum, v.qw); break; } case GEN_TYPE_UINT: { - uint64_t value = field_value(v.qw, iter->field->start, iter->field->end); - snprintf(iter->value, sizeof(iter->value), "%"PRIu64, value); - enum_name = gen_get_enum_name(&iter->field->inline_enum, value); + snprintf(iter->value, sizeof(iter->value), "%"PRIu64, v.qw); + enum_name = gen_get_enum_name(&iter->field->inline_enum, v.qw); break; } case GEN_TYPE_BOOL: { const char *true_string = iter->print_colors ? "\e[0;35mtrue\e[0m" : "true"; snprintf(iter->value, sizeof(iter->value), "%s", - field_value(v.qw, iter->field->start, iter->field->end) ? - true_string : "false"); + v.qw ? true_string : "false"); break; } case GEN_TYPE_FLOAT: @@ -869,8 +888,7 @@ iter_decode_field(struct gen_field_iterator *iter) break; case GEN_TYPE_ADDRESS: case GEN_TYPE_OFFSET: - snprintf(iter->value, sizeof(iter->value), "0x%08"PRIx64, - field_address(v.qw, iter->field->start, iter->field->end)); I think field_address() is unused after this change, so you can remove the function. Thanks, dropped. + snprintf(iter->value, sizeof(iter->value), "0x%08"PRIx64, v.qw); break; case GEN_TYPE_STRUCT: snprintf(iter->value, sizeof(iter->value), "", @@ -881,8 +899,7 @@ iter_decode_field(struct gen_field_iterator *iter) break; case GEN_TYPE_UFIXED: snprintf(iter->value, sizeof(iter->value), "%f", - (float) field_value(v.qw, iter->field->start, - iter->field->end) / (1 << iter->field->type.f)); + (float) v.qw / (1 << iter->field->type.f)); break; case GEN_TYPE_SFIXED: /* FIXME: Sign extend extracted field. */ @@ -891,10 +908,8 @@ iter_decode_field(struct gen_field_iterator *iter) case GEN_TYPE_MBO: break; case GEN_TYPE_ENUM: { - uint64_t value = field_value(v.qw, iter->field->start, iter->field->end); - snprintf(iter->value, sizeof(iter->value), - "%"PRId64, value); - enum_name = gen_get_enum_name(iter->field->type.gen_enum, value); + snprintf(iter->value, sizeof(iter->value), "%"PRId64, v.qw); + enum_name = gen_get_enum_name(iter->field->type.gen_enum, v.qw); break; } } -- 2.15.0.rc2 ___ mesa-dev mailing list mesa-dev@lists.freedesktop.org https://lists.freedesktop.org/mailman/listinfo/mesa-dev ___ mesa-dev mailing list mesa-dev@lists.freedesktop.org https://lists.freedesktop.org/mailman/listinfo/mesa-dev
Re: [Mesa-dev] [PATCH 21/33] intel: decoder: extract field value computation
Lionel Landwerlin writes: > Signed-off-by: Lionel Landwerlin > --- > src/intel/common/gen_decoder.c | 59 > ++ > 1 file changed, 37 insertions(+), 22 deletions(-) > > diff --git a/src/intel/common/gen_decoder.c b/src/intel/common/gen_decoder.c > index a63c09cd37e..b0bd161fef3 100644 > --- a/src/intel/common/gen_decoder.c > +++ b/src/intel/common/gen_decoder.c > @@ -818,6 +818,32 @@ iter_advance_field(struct gen_field_iterator *iter) > return true; > } > > +static uint64_t > +iter_decode_field_raw(struct gen_field *field, > + const uint32_t *p, > + const uint32_t *end) > +{ > + uint64_t qw = 0; > + > + if ((field->end - field->start) > 32) { > + if ((p + 1) < end) > + qw = ((uint64_t) p[1]) << 32; > + qw |= p[0]; > + } else > + qw = p[0]; > + > + 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; > + > + return qw; > +} > + > static void > iter_decode_field(struct gen_field_iterator *iter) > { > @@ -833,35 +859,28 @@ iter_decode_field(struct gen_field_iterator *iter) > > memset(&v, 0, sizeof(v)); > > - if ((iter->field->end - iter->field->start) > 32) { > - if (&iter->p[iter->dword + 1] < iter->end) > - v.qw = ((uint64_t) iter->p[iter->dword+1] << 32); > - v.qw |= iter->p[iter->dword]; > - } else > - v.qw = iter->p[iter->dword]; > + v.qw = iter_decode_field_raw(iter->field, > +&iter->p[iter->dword], iter->end); > > const char *enum_name = NULL; > > switch (iter->field->type.kind) { > case GEN_TYPE_UNKNOWN: > case GEN_TYPE_INT: { > - uint64_t value = field_value(v.qw, iter->field->start, > iter->field->end); > - snprintf(iter->value, sizeof(iter->value), "%"PRId64, value); > - enum_name = gen_get_enum_name(&iter->field->inline_enum, value); > + snprintf(iter->value, sizeof(iter->value), "%"PRId64, v.qw); > + enum_name = gen_get_enum_name(&iter->field->inline_enum, v.qw); >break; > } > case GEN_TYPE_UINT: { > - uint64_t value = field_value(v.qw, iter->field->start, > iter->field->end); > - snprintf(iter->value, sizeof(iter->value), "%"PRIu64, value); > - enum_name = gen_get_enum_name(&iter->field->inline_enum, value); > + snprintf(iter->value, sizeof(iter->value), "%"PRIu64, v.qw); > + enum_name = gen_get_enum_name(&iter->field->inline_enum, v.qw); >break; > } > case GEN_TYPE_BOOL: { >const char *true_string = > iter->print_colors ? "\e[0;35mtrue\e[0m" : "true"; >snprintf(iter->value, sizeof(iter->value), "%s", > - field_value(v.qw, iter->field->start, iter->field->end) ? > - true_string : "false"); > + v.qw ? true_string : "false"); >break; > } > case GEN_TYPE_FLOAT: > @@ -869,8 +888,7 @@ iter_decode_field(struct gen_field_iterator *iter) >break; > case GEN_TYPE_ADDRESS: > case GEN_TYPE_OFFSET: > - snprintf(iter->value, sizeof(iter->value), "0x%08"PRIx64, > - field_address(v.qw, iter->field->start, iter->field->end)); I think field_address() is unused after this change, so you can remove the function. > + snprintf(iter->value, sizeof(iter->value), "0x%08"PRIx64, v.qw); >break; > case GEN_TYPE_STRUCT: >snprintf(iter->value, sizeof(iter->value), "", > @@ -881,8 +899,7 @@ iter_decode_field(struct gen_field_iterator *iter) >break; > case GEN_TYPE_UFIXED: >snprintf(iter->value, sizeof(iter->value), "%f", > - (float) field_value(v.qw, iter->field->start, > - iter->field->end) / (1 << > iter->field->type.f)); > + (float) v.qw / (1 << iter->field->type.f)); >break; > case GEN_TYPE_SFIXED: >/* FIXME: Sign extend extracted field. */ > @@ -891,10 +908,8 @@ iter_decode_field(struct gen_field_iterator *iter) > case GEN_TYPE_MBO: > break; > case GEN_TYPE_ENUM: { > - uint64_t value = field_value(v.qw, iter->field->start, > iter->field->end); > - snprintf(iter->value, sizeof(iter->value), > - "%"PRId64, value); > - enum_name = gen_get_enum_name(iter->field->type.gen_enum, value); > + snprintf(iter->value, sizeof(iter->value), "%"PRId64, v.qw); > + enum_name = gen_get_enum_name(iter->field->type.gen_enum, v.qw); >break; > } > } > -- > 2.15.0.rc2 > > ___ > mesa-dev mailing list > mesa-dev@lists.freedesktop.org > https://lists.freedesktop.org/mailman/listinfo/mesa-dev _
[Mesa-dev] [PATCH 21/33] intel: decoder: extract field value computation
Signed-off-by: Lionel Landwerlin --- src/intel/common/gen_decoder.c | 59 ++ 1 file changed, 37 insertions(+), 22 deletions(-) diff --git a/src/intel/common/gen_decoder.c b/src/intel/common/gen_decoder.c index a63c09cd37e..b0bd161fef3 100644 --- a/src/intel/common/gen_decoder.c +++ b/src/intel/common/gen_decoder.c @@ -818,6 +818,32 @@ iter_advance_field(struct gen_field_iterator *iter) return true; } +static uint64_t +iter_decode_field_raw(struct gen_field *field, + const uint32_t *p, + const uint32_t *end) +{ + uint64_t qw = 0; + + if ((field->end - field->start) > 32) { + if ((p + 1) < end) + qw = ((uint64_t) p[1]) << 32; + qw |= p[0]; + } else + qw = p[0]; + + 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; + + return qw; +} + static void iter_decode_field(struct gen_field_iterator *iter) { @@ -833,35 +859,28 @@ iter_decode_field(struct gen_field_iterator *iter) memset(&v, 0, sizeof(v)); - if ((iter->field->end - iter->field->start) > 32) { - if (&iter->p[iter->dword + 1] < iter->end) - v.qw = ((uint64_t) iter->p[iter->dword+1] << 32); - v.qw |= iter->p[iter->dword]; - } else - v.qw = iter->p[iter->dword]; + v.qw = iter_decode_field_raw(iter->field, +&iter->p[iter->dword], iter->end); const char *enum_name = NULL; switch (iter->field->type.kind) { case GEN_TYPE_UNKNOWN: case GEN_TYPE_INT: { - uint64_t value = field_value(v.qw, iter->field->start, iter->field->end); - snprintf(iter->value, sizeof(iter->value), "%"PRId64, value); - enum_name = gen_get_enum_name(&iter->field->inline_enum, value); + snprintf(iter->value, sizeof(iter->value), "%"PRId64, v.qw); + enum_name = gen_get_enum_name(&iter->field->inline_enum, v.qw); break; } case GEN_TYPE_UINT: { - uint64_t value = field_value(v.qw, iter->field->start, iter->field->end); - snprintf(iter->value, sizeof(iter->value), "%"PRIu64, value); - enum_name = gen_get_enum_name(&iter->field->inline_enum, value); + snprintf(iter->value, sizeof(iter->value), "%"PRIu64, v.qw); + enum_name = gen_get_enum_name(&iter->field->inline_enum, v.qw); break; } case GEN_TYPE_BOOL: { const char *true_string = iter->print_colors ? "\e[0;35mtrue\e[0m" : "true"; snprintf(iter->value, sizeof(iter->value), "%s", - field_value(v.qw, iter->field->start, iter->field->end) ? - true_string : "false"); + v.qw ? true_string : "false"); break; } case GEN_TYPE_FLOAT: @@ -869,8 +888,7 @@ iter_decode_field(struct gen_field_iterator *iter) break; case GEN_TYPE_ADDRESS: case GEN_TYPE_OFFSET: - snprintf(iter->value, sizeof(iter->value), "0x%08"PRIx64, - field_address(v.qw, iter->field->start, iter->field->end)); + snprintf(iter->value, sizeof(iter->value), "0x%08"PRIx64, v.qw); break; case GEN_TYPE_STRUCT: snprintf(iter->value, sizeof(iter->value), "", @@ -881,8 +899,7 @@ iter_decode_field(struct gen_field_iterator *iter) break; case GEN_TYPE_UFIXED: snprintf(iter->value, sizeof(iter->value), "%f", - (float) field_value(v.qw, iter->field->start, - iter->field->end) / (1 << iter->field->type.f)); + (float) v.qw / (1 << iter->field->type.f)); break; case GEN_TYPE_SFIXED: /* FIXME: Sign extend extracted field. */ @@ -891,10 +908,8 @@ iter_decode_field(struct gen_field_iterator *iter) case GEN_TYPE_MBO: break; case GEN_TYPE_ENUM: { - uint64_t value = field_value(v.qw, iter->field->start, iter->field->end); - snprintf(iter->value, sizeof(iter->value), - "%"PRId64, value); - enum_name = gen_get_enum_name(iter->field->type.gen_enum, value); + snprintf(iter->value, sizeof(iter->value), "%"PRId64, v.qw); + enum_name = gen_get_enum_name(iter->field->type.gen_enum, v.qw); break; } } -- 2.15.0.rc2 ___ mesa-dev mailing list mesa-dev@lists.freedesktop.org https://lists.freedesktop.org/mailman/listinfo/mesa-dev