{
// No fallback, maybe we can do it fast
#if !NO_FAST_UNICODE_LOOP
-#if BIGENDIAN // If endianess is backwards then each pair of bytes would be backwards.
- if ( bigEndian &&
-#else
- if ( !bigEndian &&
-#endif // BIGENDIAN
+ // If endianess is backwards then each pair of bytes would be backwards.
+ if ( (bigEndian ^ BitConverter.IsLittleEndian) &&
#if WIN64 // 64 bit CPU needs to be long aligned for this to work.
charLeftOver == 0 && (unchecked((long)chars) & 7) == 0)
{
// No fallback, maybe we can do it fast
#if !NO_FAST_UNICODE_LOOP
-#if BIGENDIAN // If endianess is backwards then each pair of bytes would be backwards.
- if ( bigEndian &&
-#else
- if ( !bigEndian &&
-#endif // BIGENDIAN
+ // If endianess is backwards then each pair of bytes would be backwards.
+ if ( (bigEndian ^ BitConverter.IsLittleEndian) &&
#if WIN64 // 64 bit CPU needs to be long aligned for this to work, 32 bit CPU needs to be 32 bit aligned
(unchecked((long)chars) & 7) == 0 && (unchecked((long)bytes) & 7) == 0 &&
#else
// Also somehow this optimizes the above loop? It seems to cause something above
// to get enregistered, but I haven't figured out how to make that happen without this loop.
else if ((charLeftOver == 0) &&
-#if BIGENDIAN
- bigEndian &&
-#else
- !bigEndian &&
-#endif // BIGENDIAN
+ (bigEndian ^ BitConverter.IsLittleEndian) &&
#if WIN64
(unchecked((long)chars) & 7) != (unchecked((long)bytes) & 7) && // Only do this if chars & bytes are out of line, otherwise faster loop'll be faster next time
// If we're aligned then maybe we can do it fast
// This'll hurt if we're unaligned because we'll always test but never be aligned
#if !NO_FAST_UNICODE_LOOP
-#if BIGENDIAN
- if (bigEndian &&
-#else // BIGENDIAN
- if (!bigEndian &&
-#endif // BIGENDIAN
+ if ((bigEndian ^ BitConverter.IsLittleEndian) &&
#if WIN64 // win64 has to be long aligned
(unchecked((long)bytes) & 7) == 0 &&
#else
// If we're aligned then maybe we can do it fast
// This'll hurt if we're unaligned because we'll always test but never be aligned
#if !NO_FAST_UNICODE_LOOP
-#if BIGENDIAN
- if (bigEndian &&
-#else // BIGENDIAN
- if (!bigEndian &&
-#endif // BIGENDIAN
+ if ((bigEndian ^ BitConverter.IsLittleEndian) &&
#if WIN64 // win64 has to be long aligned
(unchecked((long)chars) & 7) == 0 && (unchecked((long)bytes) & 7) == 0 &&
#else
break;
LongCodeWithMask:
-#if BIGENDIAN
+if (!BitConverter.IsLittleEndian) {
// be careful about the sign extension
ch = (int)(((uint)ch) >> 16);
-#else // BIGENDIAN
+} else {
ch = (char)ch;
-#endif // BIGENDIAN
+}
pSrc++;
if (ch <= 0x7F) {
}
// Unfortunately, this is endianess sensitive
-#if BIGENDIAN
+if (!BitConverter.IsLittleEndian) {
*pTarget = (byte)(ch>>16);
*(pTarget+1) = (byte)ch;
pSrc += 4;
*(pTarget+2) = (byte)(chc>>16);
*(pTarget+3) = (byte)chc;
pTarget += 4;
-#else // BIGENDIAN
+} else {
*pTarget = (byte)ch;
*(pTarget+1) = (byte)(ch>>16);
pSrc += 4;
*(pTarget+2) = (byte)chc;
*(pTarget+3) = (byte)(chc>>16);
pTarget += 4;
-#endif // BIGENDIAN
+}
}
continue;
LongCodeWithMask:
-#if BIGENDIAN
+if (!BitConverter.IsLittleEndian) {
// be careful about the sign extension
ch = (int)(((uint)ch) >> 16);
-#else // BIGENDIAN
+} else {
ch = (char)ch;
-#endif // BIGENDIAN
+}
pSrc++;
if (ch > 0x7F) {
}
break;
-#if BIGENDIAN
LongCodeWithMask32:
// be careful about the sign extension
+if (!BitConverter.IsLittleEndian) {
ch = (int)(((uint)ch) >> 16);
+} else {
+ ch &= 0xFF;
+}
LongCodeWithMask16:
+if (!BitConverter.IsLittleEndian) {
ch = (int)(((uint)ch) >> 8);
-#else // BIGENDIAN
- LongCodeWithMask32:
- LongCodeWithMask16:
+} else {
ch &= 0xFF;
-#endif // BIGENDIAN
+}
pSrc++;
if (ch <= 0x7F) {
continue;
}
// Unfortunately, this is endianess sensitive
-#if BIGENDIAN
+if (!BitConverter.IsLittleEndian) {
*pTarget = (char)((ch >> 8) & 0x7F);
pSrc += 2;
*(pTarget+1) = (char)(ch & 0x7F);
pTarget += 2;
-#else // BIGENDIAN
+} else {
*pTarget = (char)(ch & 0x7F);
pSrc += 2;
*(pTarget+1) = (char)((ch >> 8) & 0x7F);
pTarget += 2;
-#endif // BIGENDIAN
+}
}
// Run 8 characters at a time!
}
// Unfortunately, this is endianess sensitive
-#if BIGENDIAN
+if (!BitConverter.IsLittleEndian) {
*pTarget = (char)((ch >> 24) & 0x7F);
*(pTarget+1) = (char)((ch >> 16) & 0x7F);
*(pTarget+2) = (char)((ch >> 8) & 0x7F);
*(pTarget+6) = (char)((chb >> 8) & 0x7F);
*(pTarget+7) = (char)(chb & 0x7F);
pTarget += 8;
-#else // BIGENDIAN
+} else {
*pTarget = (char)(ch & 0x7F);
*(pTarget+1) = (char)((ch >> 8) & 0x7F);
*(pTarget+2) = (char)((ch >> 16) & 0x7F);
*(pTarget+6) = (char)((chb >> 16) & 0x7F);
*(pTarget+7) = (char)((chb >> 24) & 0x7F);
pTarget += 8;
-#endif // BIGENDIAN
+}
}
break;
-#if BIGENDIAN
LongCodeWithMask32:
+if (!BitConverter.IsLittleEndian) {
// be careful about the sign extension
ch = (int)(((uint)ch) >> 16);
+} else {
+ ch &= 0xFF;
+}
LongCodeWithMask16:
+if (!BitConverter.IsLittleEndian) {
ch = (int)(((uint)ch) >> 8);
-#else // BIGENDIAN
- LongCodeWithMask32:
- LongCodeWithMask16:
+} else {
ch &= 0xFF;
-#endif // BIGENDIAN
+}
pSrc++;
if (ch <= 0x7F) {
*pTarget = (char)ch;