From 0000916e7552b8d6fed91ffa8c77920913272e9d Mon Sep 17 00:00:00 2001 From: baldurk Date: Tue, 9 Jun 2020 12:16:16 +0100 Subject: [PATCH] Expose svbr rotated encoding as static member of LLVM bit reader --- .../driver/shaders/dxil/dxil_bytecode.cpp | 6 +----- .../driver/shaders/dxil/llvm_bitreader.h | 15 +++----------- .../driver/shaders/dxil/llvm_decoder.cpp | 20 +++++++++---------- 3 files changed, 14 insertions(+), 27 deletions(-) diff --git a/renderdoc/driver/shaders/dxil/dxil_bytecode.cpp b/renderdoc/driver/shaders/dxil/dxil_bytecode.cpp index 655bd9e54..f97691245 100644 --- a/renderdoc/driver/shaders/dxil/dxil_bytecode.cpp +++ b/renderdoc/driver/shaders/dxil/dxil_bytecode.cpp @@ -243,11 +243,7 @@ void ParseConstant(const LLVMBC::BlockOrRecord &constant, const Type *&curType, { Value v; v.type = curType; - v.val.u64v[0] = constant.ops[0]; - if(v.val.u64v[0] & 0x1) - v.val.s64v[0] = -int64_t(v.val.u64v[0] >> 1); - else - v.val.u64v[0] >>= 1; + v.val.s64v[0] = LLVMBC::BitReader::svbr(constant.ops[0]); addValue(v); } else if(IS_KNOWN(constant.id, ConstantsRecord::FLOAT)) diff --git a/renderdoc/driver/shaders/dxil/llvm_bitreader.h b/renderdoc/driver/shaders/dxil/llvm_bitreader.h index 1735bf9fa..b46589178 100644 --- a/renderdoc/driver/shaders/dxil/llvm_bitreader.h +++ b/renderdoc/driver/shaders/dxil/llvm_bitreader.h @@ -116,22 +116,13 @@ public: return T(ret); } - template - T svbr(size_t groupBitSize) + static int64_t svbr(uint64_t var) { - // the value will fit in a uint64_t because the any negative values with the high bit set, which - // would overflow when shifted, no longer have the high bit set after being negated. - uint64_t var = vbr(groupBitSize); - // if the low bit is set, it's negative if(var & 0x1) - { - return T(-int64_t(var >> 1)); - } + return -int64_t(var >> 1); else - { - return T(var >> 1); - } + return int64_t(var >> 1); } template diff --git a/renderdoc/driver/shaders/dxil/llvm_decoder.cpp b/renderdoc/driver/shaders/dxil/llvm_decoder.cpp index 9fdb56e7c..ac6579d6a 100644 --- a/renderdoc/driver/shaders/dxil/llvm_decoder.cpp +++ b/renderdoc/driver/shaders/dxil/llvm_decoder.cpp @@ -759,34 +759,34 @@ TEST_CASE("Check LLVM bitreader", "[llvm]") int64_t val; - val = b.svbr(4); + val = LLVMBC::BitReader::svbr(b.vbr(4)); CHECK(val == 2); - val = b.svbr(4); + val = LLVMBC::BitReader::svbr(b.vbr(4)); CHECK(val == 0); - val = b.svbr(4); + val = LLVMBC::BitReader::svbr(b.vbr(4)); CHECK(val == -2); - val = b.svbr(4); + val = LLVMBC::BitReader::svbr(b.vbr(4)); CHECK(val == 0); - val = b.svbr(4); + val = LLVMBC::BitReader::svbr(b.vbr(4)); CHECK(val == 98765); - val = b.svbr(4); + val = LLVMBC::BitReader::svbr(b.vbr(4)); CHECK(val == -98765); - val = b.svbr(4); + val = LLVMBC::BitReader::svbr(b.vbr(4)); CHECK(val == INT64_MAX); - val = b.svbr(4); + val = LLVMBC::BitReader::svbr(b.vbr(4)); CHECK(val == -INT64_MAX); - val = b.svbr(4); + val = LLVMBC::BitReader::svbr(b.vbr(4)); CHECK(val == 3); - val = b.svbr(4); + val = LLVMBC::BitReader::svbr(b.vbr(4)); CHECK(val == 0); // should be exactly at the end of the stream