From 23c844b2aa84a65e573dcc023d19b8f5294a8baf Mon Sep 17 00:00:00 2001 From: jhorv <38920027+jhorv@users.noreply.github.com> Date: Sat, 11 Mar 2023 15:05:48 -0500 Subject: Misc performance tweaks (#4509) * use Array.Empty() where instead of allocating new zero-length arrays * structure for loops in a way that the JIT will elide array/Span bounds checking * avoiding function calls in for loop condition tests * avoid LINQ in a hot path * conform with code style * fix mistake in GetNextWaitingObject() * fix GetNextWaitingObject() possibility of returning null if all list items have TimePoint == long.MaxValue * make GetNextWaitingObject() behave FIFO behavior for multiple items with the same TimePoint --- ARMeilleure/CodeGen/Arm64/CodeGenContext.cs | 2 +- ARMeilleure/CodeGen/RegisterAllocators/LinearScanAllocator.cs | 9 ++------- ARMeilleure/Decoders/DecoderHelper.cs | 4 ++-- ARMeilleure/Decoders/OpCodeTable.cs | 6 +++--- 4 files changed, 8 insertions(+), 13 deletions(-) (limited to 'ARMeilleure') diff --git a/ARMeilleure/CodeGen/Arm64/CodeGenContext.cs b/ARMeilleure/CodeGen/Arm64/CodeGenContext.cs index 1ddde0c1..cebfbde1 100644 --- a/ARMeilleure/CodeGen/Arm64/CodeGenContext.cs +++ b/ARMeilleure/CodeGen/Arm64/CodeGenContext.cs @@ -265,7 +265,7 @@ namespace ARMeilleure.CodeGen.Arm64 } else { - relocInfo = new RelocInfo(new RelocEntry[0]); + relocInfo = new RelocInfo(Array.Empty()); } return (code, relocInfo); diff --git a/ARMeilleure/CodeGen/RegisterAllocators/LinearScanAllocator.cs b/ARMeilleure/CodeGen/RegisterAllocators/LinearScanAllocator.cs index 6ea62c28..d80157af 100644 --- a/ARMeilleure/CodeGen/RegisterAllocators/LinearScanAllocator.cs +++ b/ARMeilleure/CodeGen/RegisterAllocators/LinearScanAllocator.cs @@ -433,16 +433,11 @@ namespace ARMeilleure.CodeGen.RegisterAllocators private static int GetHighestValueIndex(Span span) { - int highest = span[0]; - - if (highest == int.MaxValue) - { - return 0; - } + int highest = int.MinValue; int selected = 0; - for (int index = 1; index < span.Length; index++) + for (int index = 0; index < span.Length; index++) { int current = span[index]; diff --git a/ARMeilleure/Decoders/DecoderHelper.cs b/ARMeilleure/Decoders/DecoderHelper.cs index 38f98c39..5227e6a1 100644 --- a/ARMeilleure/Decoders/DecoderHelper.cs +++ b/ARMeilleure/Decoders/DecoderHelper.cs @@ -17,7 +17,7 @@ namespace ARMeilleure.Decoders { uint[] tbl = new uint[256]; - for (int idx = 0; idx < 256; idx++) + for (int idx = 0; idx < tbl.Length; idx++) { tbl[idx] = ExpandImm8ToFP32((uint)idx); } @@ -29,7 +29,7 @@ namespace ARMeilleure.Decoders { ulong[] tbl = new ulong[256]; - for (int idx = 0; idx < 256; idx++) + for (int idx = 0; idx < tbl.Length; idx++) { tbl[idx] = ExpandImm8ToFP64((ulong)idx); } diff --git a/ARMeilleure/Decoders/OpCodeTable.cs b/ARMeilleure/Decoders/OpCodeTable.cs index 54abb141..8464ce55 100644 --- a/ARMeilleure/Decoders/OpCodeTable.cs +++ b/ARMeilleure/Decoders/OpCodeTable.cs @@ -1301,7 +1301,7 @@ namespace ARMeilleure.Decoders { List[] temp = new List[FastLookupSize]; - for (int index = 0; index < FastLookupSize; index++) + for (int index = 0; index < temp.Length; index++) { temp[index] = new List(); } @@ -1311,7 +1311,7 @@ namespace ARMeilleure.Decoders int mask = ToFastLookupIndex(inst.Mask); int value = ToFastLookupIndex(inst.Value); - for (int index = 0; index < FastLookupSize; index++) + for (int index = 0; index < temp.Length; index++) { if ((index & mask) == value) { @@ -1320,7 +1320,7 @@ namespace ARMeilleure.Decoders } } - for (int index = 0; index < FastLookupSize; index++) + for (int index = 0; index < temp.Length; index++) { table[index] = temp[index].ToArray(); } -- cgit v1.2.3