diff options
Diffstat (limited to 'src/intel/common/gen_decoder.c')
-rw-r--r-- | src/intel/common/gen_decoder.c | 10 |
1 files changed, 7 insertions, 3 deletions
diff --git a/src/intel/common/gen_decoder.c b/src/intel/common/gen_decoder.c index c14c23aad1a..39da3cadbf8 100644 --- a/src/intel/common/gen_decoder.c +++ b/src/intel/common/gen_decoder.c @@ -944,10 +944,14 @@ iter_decode_field(struct gen_field_iterator *iter) snprintf(iter->value, sizeof(iter->value), "%f", (float) v.qw / (1 << iter->field->type.f)); break; - case GEN_TYPE_SFIXED: - /* FIXME: Sign extend extracted field. */ - snprintf(iter->value, sizeof(iter->value), "%s", "foo"); + case GEN_TYPE_SFIXED: { + /* Sign extend before converting */ + int bits = iter->field->type.i + iter->field->type.f + 1; + int64_t v_sign_extend = ((int64_t)(v.qw << (64 - bits))) >> (64 - bits); + snprintf(iter->value, sizeof(iter->value), "%f", + (float) v_sign_extend / (1 << iter->field->type.f)); break; + } case GEN_TYPE_MBO: break; case GEN_TYPE_ENUM: { |