@@ -110,16 +110,19 @@ inline unsigned getEnumTagSinglePayloadImpl(
110
110
unsigned caseIndexFromExtraTagBits =
111
111
payloadSize >= 4 ? 0 : (extraTagBits - 1U ) << (payloadSize * 8U );
112
112
113
+ #if defined(__BIG_ENDIAN__)
114
+ // On BE high order bytes contain the index
115
+ unsigned long caseIndexFromValue = 0 ;
116
+ unsigned numPayloadTagBytes = std::min (size_t (8 ), payloadSize);
117
+ if (numPayloadTagBytes)
118
+ memcpy (reinterpret_cast <uint8_t *>(&caseIndexFromValue) + 8 -
119
+ numPayloadTagBytes,
120
+ valueAddr, numPayloadTagBytes);
121
+ #else
113
122
// In practice we should need no more than four bytes from the payload
114
123
// area.
115
124
unsigned caseIndexFromValue = 0 ;
116
125
unsigned numPayloadTagBytes = std::min (size_t (4 ), payloadSize);
117
- #if defined(__BIG_ENDIAN__)
118
- if (numPayloadTagBytes)
119
- small_memcpy (reinterpret_cast <uint8_t *>(&caseIndexFromValue) + 4 -
120
- numPayloadTagBytes,
121
- valueAddr, numPayloadTagBytes, true );
122
- #else
123
126
if (numPayloadTagBytes)
124
127
small_memcpy (&caseIndexFromValue, valueAddr,
125
128
numPayloadTagBytes, true );
@@ -192,6 +195,8 @@ inline void storeEnumTagSinglePayloadImpl(
192
195
reinterpret_cast <uint8_t *>(&payloadIndex) + 4 -
193
196
numPayloadTagBytes,
194
197
numPayloadTagBytes, true );
198
+ if (payloadSize > 4 )
199
+ memset (valueAddr + 4 , 0 , payloadSize - 4 );
195
200
if (numExtraTagBytes)
196
201
small_memcpy (extraTagBitAddr,
197
202
reinterpret_cast <uint8_t *>(&extraTagIndex) + 4 -
0 commit comments