Skip to content

Commit 48dbc4f

Browse files
jonchamjkotas
andauthored
Use architecture independent code paths in Array (#108449)
* Avoid architecture specific code path in Array. Check IntPtr.Size which should evaluate to constant/no-op by either the trimmer or the compiler. * Use goto to reuse existing code paths Co-authored-by: Jan Kotas <[email protected]>
1 parent 3bcaadb commit 48dbc4f

File tree

1 file changed

+31
-48
lines changed
  • src/libraries/System.Private.CoreLib/src/System

1 file changed

+31
-48
lines changed

src/libraries/System.Private.CoreLib/src/System/Array.cs

Lines changed: 31 additions & 48 deletions
Original file line numberDiff line numberDiff line change
@@ -916,29 +916,25 @@ public static int BinarySearch(Array array, int index, int length, object? value
916916
result = GenericBinarySearch<ushort>(array, adjustedIndex, length, value);
917917
break;
918918
case CorElementType.ELEMENT_TYPE_I4:
919-
#if TARGET_32BIT
920-
case CorElementType.ELEMENT_TYPE_I:
921-
#endif
922919
result = GenericBinarySearch<int>(array, adjustedIndex, length, value);
923920
break;
924921
case CorElementType.ELEMENT_TYPE_U4:
925-
#if TARGET_32BIT
926-
case CorElementType.ELEMENT_TYPE_U:
927-
#endif
928922
result = GenericBinarySearch<uint>(array, adjustedIndex, length, value);
929923
break;
930924
case CorElementType.ELEMENT_TYPE_I8:
931-
#if TARGET_64BIT
932-
case CorElementType.ELEMENT_TYPE_I:
933-
#endif
934925
result = GenericBinarySearch<long>(array, adjustedIndex, length, value);
935926
break;
936927
case CorElementType.ELEMENT_TYPE_U8:
937-
#if TARGET_64BIT
938-
case CorElementType.ELEMENT_TYPE_U:
939-
#endif
940928
result = GenericBinarySearch<ulong>(array, adjustedIndex, length, value);
941929
break;
930+
case CorElementType.ELEMENT_TYPE_I:
931+
if (IntPtr.Size == 4)
932+
goto case CorElementType.ELEMENT_TYPE_I4;
933+
goto case CorElementType.ELEMENT_TYPE_I8;
934+
case CorElementType.ELEMENT_TYPE_U:
935+
if (IntPtr.Size == 4)
936+
goto case CorElementType.ELEMENT_TYPE_U4;
937+
goto case CorElementType.ELEMENT_TYPE_U8;
942938
case CorElementType.ELEMENT_TYPE_R4:
943939
result = GenericBinarySearch<float>(array, adjustedIndex, length, value);
944940
break;
@@ -1424,20 +1420,17 @@ public static int IndexOf(Array array, object? value, int startIndex, int count)
14241420
break;
14251421
case CorElementType.ELEMENT_TYPE_I4:
14261422
case CorElementType.ELEMENT_TYPE_U4:
1427-
#if TARGET_32BIT
1428-
case CorElementType.ELEMENT_TYPE_I:
1429-
case CorElementType.ELEMENT_TYPE_U:
1430-
#endif
14311423
result = GenericIndexOf<int>(array, value, adjustedIndex, count);
14321424
break;
14331425
case CorElementType.ELEMENT_TYPE_I8:
14341426
case CorElementType.ELEMENT_TYPE_U8:
1435-
#if TARGET_64BIT
1436-
case CorElementType.ELEMENT_TYPE_I:
1437-
case CorElementType.ELEMENT_TYPE_U:
1438-
#endif
14391427
result = GenericIndexOf<long>(array, value, adjustedIndex, count);
14401428
break;
1429+
case CorElementType.ELEMENT_TYPE_I:
1430+
case CorElementType.ELEMENT_TYPE_U:
1431+
if (IntPtr.Size == 4)
1432+
goto case CorElementType.ELEMENT_TYPE_I4;
1433+
goto case CorElementType.ELEMENT_TYPE_I8;
14411434
case CorElementType.ELEMENT_TYPE_R4:
14421435
result = GenericIndexOf<float>(array, value, adjustedIndex, count);
14431436
break;
@@ -1654,20 +1647,17 @@ public static int LastIndexOf(Array array, object? value, int startIndex, int co
16541647
break;
16551648
case CorElementType.ELEMENT_TYPE_I4:
16561649
case CorElementType.ELEMENT_TYPE_U4:
1657-
#if TARGET_32BIT
1658-
case CorElementType.ELEMENT_TYPE_I:
1659-
case CorElementType.ELEMENT_TYPE_U:
1660-
#endif
16611650
result = GenericLastIndexOf<int>(array, value, adjustedIndex, count);
16621651
break;
16631652
case CorElementType.ELEMENT_TYPE_I8:
16641653
case CorElementType.ELEMENT_TYPE_U8:
1665-
#if TARGET_64BIT
1666-
case CorElementType.ELEMENT_TYPE_I:
1667-
case CorElementType.ELEMENT_TYPE_U:
1668-
#endif
16691654
result = GenericLastIndexOf<long>(array, value, adjustedIndex, count);
16701655
break;
1656+
case CorElementType.ELEMENT_TYPE_I:
1657+
case CorElementType.ELEMENT_TYPE_U:
1658+
if (IntPtr.Size == 4)
1659+
goto case CorElementType.ELEMENT_TYPE_I4;
1660+
goto case CorElementType.ELEMENT_TYPE_I8;
16711661
case CorElementType.ELEMENT_TYPE_R4:
16721662
result = GenericLastIndexOf<float>(array, value, adjustedIndex, count);
16731663
break;
@@ -1863,22 +1853,19 @@ public static void Reverse(Array array, int index, int length)
18631853
return;
18641854
case CorElementType.ELEMENT_TYPE_I4:
18651855
case CorElementType.ELEMENT_TYPE_U4:
1866-
#if TARGET_32BIT
1867-
case CorElementType.ELEMENT_TYPE_I:
1868-
case CorElementType.ELEMENT_TYPE_U:
1869-
#endif
18701856
case CorElementType.ELEMENT_TYPE_R4:
18711857
UnsafeArrayAsSpan<int>(array, adjustedIndex, length).Reverse();
18721858
return;
18731859
case CorElementType.ELEMENT_TYPE_I8:
18741860
case CorElementType.ELEMENT_TYPE_U8:
1875-
#if TARGET_64BIT
1876-
case CorElementType.ELEMENT_TYPE_I:
1877-
case CorElementType.ELEMENT_TYPE_U:
1878-
#endif
18791861
case CorElementType.ELEMENT_TYPE_R8:
18801862
UnsafeArrayAsSpan<long>(array, adjustedIndex, length).Reverse();
18811863
return;
1864+
case CorElementType.ELEMENT_TYPE_I:
1865+
case CorElementType.ELEMENT_TYPE_U:
1866+
if (IntPtr.Size == 4)
1867+
goto case CorElementType.ELEMENT_TYPE_I4;
1868+
goto case CorElementType.ELEMENT_TYPE_I8;
18821869
case CorElementType.ELEMENT_TYPE_OBJECT:
18831870
case CorElementType.ELEMENT_TYPE_ARRAY:
18841871
case CorElementType.ELEMENT_TYPE_SZARRAY:
@@ -2069,29 +2056,25 @@ public static void Sort(Array keys, Array? items, int index, int length, ICompar
20692056
GenericSort<ushort>(keys, items, adjustedIndex, length);
20702057
return;
20712058
case CorElementType.ELEMENT_TYPE_I4:
2072-
#if TARGET_32BIT
2073-
case CorElementType.ELEMENT_TYPE_I:
2074-
#endif
20752059
GenericSort<int>(keys, items, adjustedIndex, length);
20762060
return;
20772061
case CorElementType.ELEMENT_TYPE_U4:
2078-
#if TARGET_32BIT
2079-
case CorElementType.ELEMENT_TYPE_U:
2080-
#endif
20812062
GenericSort<uint>(keys, items, adjustedIndex, length);
20822063
return;
20832064
case CorElementType.ELEMENT_TYPE_I8:
2084-
#if TARGET_64BIT
2085-
case CorElementType.ELEMENT_TYPE_I:
2086-
#endif
20872065
GenericSort<long>(keys, items, adjustedIndex, length);
20882066
return;
20892067
case CorElementType.ELEMENT_TYPE_U8:
2090-
#if TARGET_64BIT
2091-
case CorElementType.ELEMENT_TYPE_U:
2092-
#endif
20932068
GenericSort<ulong>(keys, items, adjustedIndex, length);
20942069
return;
2070+
case CorElementType.ELEMENT_TYPE_I:
2071+
if (IntPtr.Size == 4)
2072+
goto case CorElementType.ELEMENT_TYPE_I4;
2073+
goto case CorElementType.ELEMENT_TYPE_I8;
2074+
case CorElementType.ELEMENT_TYPE_U:
2075+
if (IntPtr.Size == 4)
2076+
goto case CorElementType.ELEMENT_TYPE_U4;
2077+
goto case CorElementType.ELEMENT_TYPE_U8;
20952078
case CorElementType.ELEMENT_TYPE_R4:
20962079
GenericSort<float>(keys, items, adjustedIndex, length);
20972080
return;

0 commit comments

Comments
 (0)