From 4eb7a27ac4532a49b9d383d2b0d80bc0ec317b4c Mon Sep 17 00:00:00 2001 From: Yong He Date: Wed, 19 Mar 2025 11:44:04 -0700 Subject: Fix reinterpret and bitcast and generic arg parsing. (#6627) * Fix reinterpret and bitcast. * Fix warning. * Fix. * Fix. --------- Co-authored-by: Ellie Hermaszewska --- source/slang/slang-ir-extract-value-from-type.cpp | 13 ++++++++----- 1 file changed, 8 insertions(+), 5 deletions(-) (limited to 'source/slang/slang-ir-extract-value-from-type.cpp') 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, -- cgit v1.2.3