summaryrefslogtreecommitdiff
path: root/source/slang/slang-ir-extract-value-from-type.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'source/slang/slang-ir-extract-value-from-type.cpp')
-rw-r--r--source/slang/slang-ir-extract-value-from-type.cpp13
1 files changed, 8 insertions, 5 deletions
diff --git a/source/slang/slang-ir-extract-value-from-type.cpp b/source/slang/slang-ir-extract-value-from-type.cpp
index 919274863..acb17068f 100644
--- a/source/slang/slang-ir-extract-value-from-type.cpp
+++ b/source/slang/slang-ir-extract-value-from-type.cpp
@@ -231,6 +231,7 @@ IRInst* extractMultiByteValueAtOffset(
{
// The request value is fully contained in the found leaf element.
// We can proceed to extract the requested bits from the element.
+ resultValue = builder.emitBitCast(uintType, leaf.leafValue);
uint32_t shift = leaf.offsetInValue * 8;
if (shift > 0)
resultValue =
@@ -242,7 +243,7 @@ IRInst* extractMultiByteValueAtOffset(
bitMask = 0xFF;
break;
case 2:
- bitMask = 0xFFFFF;
+ bitMask = 0xFFFF;
break;
case 3:
bitMask = 0xFFFFFF;
@@ -264,23 +265,25 @@ IRInst* extractMultiByteValueAtOffset(
{
// The requested value crosses the boundaries of different fields.
// We need to extract first and second half separately, and combine them together.
+ auto firstHalfSize = leaf.valueSize - leaf.offsetInValue;
auto firstHalf = extractMultiByteValueAtOffset(
builder,
targetProgram,
dataType,
layout,
src,
- size / 2,
+ firstHalfSize,
offset);
+ auto restSize = size - firstHalfSize;
auto secondHalf = extractMultiByteValueAtOffset(
builder,
targetProgram,
dataType,
layout,
src,
- size / 2,
- offset + size / 2);
- uint32_t shift = (size / 2) * 8;
+ restSize,
+ offset + firstHalfSize);
+ uint32_t shift = firstHalfSize * 8;
resultValue = builder.emitAdd(
builder.getUIntType(),
firstHalf,