From d0939a97b74ff7455ff389a3ef76d90fa53aabe1 Mon Sep 17 00:00:00 2001 From: Phil Date: Wed, 17 Jan 2024 08:30:50 -0800 Subject: [PATCH 01/17] - Added Interrupt Queue --- Source/Docs/introduction.rst | 3 +- Source/Mosa.Compiler.x64/Intrinsic/IRQs.cs | 2 +- Source/Mosa.Compiler.x86/Intrinsic/IRQs.cs | 5 +- Source/Mosa.DeviceSystem/HAL.cs | 2 +- Source/Mosa.Kernel.BareMetal.x86/IDT.cs | 3 +- .../Mosa.Kernel.BareMetal/InterruptManager.cs | 6 ++ .../Mosa.Kernel.BareMetal/InterruptQueue.cs | 79 +++++++++++++++++++ Source/Mosa.Kernel.BareMetal/Startup.cs | 4 +- Source/Mosa.Runtime/Interrupt.cs | 11 --- 9 files changed, 95 insertions(+), 20 deletions(-) create mode 100644 Source/Mosa.Kernel.BareMetal/InterruptQueue.cs delete mode 100644 Source/Mosa.Runtime/Interrupt.cs diff --git a/Source/Docs/introduction.rst b/Source/Docs/introduction.rst index 8cece3187a..38b7311b90 100644 --- a/Source/Docs/introduction.rst +++ b/Source/Docs/introduction.rst @@ -22,7 +22,8 @@ The target platforms are: - 32-bit x86 (stable) - 64-bit x86 (x64) (in development) -- A32 ARMv8 (in early development) +- 32-bit ARMv8+ (in early development) +- 64-bit ARMv8+ (in early development) The MOSA compiler supports most object and non-object oriented code, including: diff --git a/Source/Mosa.Compiler.x64/Intrinsic/IRQs.cs b/Source/Mosa.Compiler.x64/Intrinsic/IRQs.cs index af466c1e23..6224e85670 100644 --- a/Source/Mosa.Compiler.x64/Intrinsic/IRQs.cs +++ b/Source/Mosa.Compiler.x64/Intrinsic/IRQs.cs @@ -9,7 +9,7 @@ namespace Mosa.Compiler.x64.Intrinsic; /// internal static partial class IntrinsicMethods { - private static readonly string DefaultInterruptMethodName = "Mosa.Kernel.X64.IDT::ProcessInterrupt"; + private static readonly string DefaultInterruptMethodName = "Mosa.Kernel.BareMetal.X64.IDT::ProcessInterrupt"; private static void InsertIRQ(int irq, Context context, Transform transform) { diff --git a/Source/Mosa.Compiler.x86/Intrinsic/IRQs.cs b/Source/Mosa.Compiler.x86/Intrinsic/IRQs.cs index 4d36666d9e..5b4588d322 100644 --- a/Source/Mosa.Compiler.x86/Intrinsic/IRQs.cs +++ b/Source/Mosa.Compiler.x86/Intrinsic/IRQs.cs @@ -9,8 +9,7 @@ namespace Mosa.Compiler.x86.Intrinsic; /// internal static partial class IntrinsicMethods { - //private static readonly string DefaultInterruptMethodName = "Mosa.Kernel.x86.IDT::ProcessInterrupt"; - private static readonly string DefaultInterruptMethodName = "Mosa.Runtime.Interrupt::Process"; + private static readonly string DefaultInterruptMethodName = "Mosa.Kernel.BareMetal.x86.IDT::ProcessInterrupt"; private static readonly string[] seperator = new string[] { "::" }; @@ -23,7 +22,7 @@ private static void InsertIRQ(int irq, Context context, Transform transform) interruptMethodName = DefaultInterruptMethodName; } - var ar = interruptMethodName.Split(seperator, System.StringSplitOptions.None); + var ar = interruptMethodName.Split(seperator, StringSplitOptions.None); if (ar.Length != 2) return; diff --git a/Source/Mosa.DeviceSystem/HAL.cs b/Source/Mosa.DeviceSystem/HAL.cs index 747c1b16fa..d7ef9cf45c 100644 --- a/Source/Mosa.DeviceSystem/HAL.cs +++ b/Source/Mosa.DeviceSystem/HAL.cs @@ -107,7 +107,7 @@ public static void Assert(bool condition, string message) } /// - /// Pause + /// Yield /// public static void Yield() => hardwareAbstraction.Yield(); diff --git a/Source/Mosa.Kernel.BareMetal.x86/IDT.cs b/Source/Mosa.Kernel.BareMetal.x86/IDT.cs index 33f364aadb..ba93ed8d41 100644 --- a/Source/Mosa.Kernel.BareMetal.x86/IDT.cs +++ b/Source/Mosa.Kernel.BareMetal.x86/IDT.cs @@ -6,7 +6,6 @@ using Mosa.Kernel.BareMetal.BootMemory; using Mosa.Kernel.BareMetal.Intel; using Mosa.Runtime; -using Mosa.Runtime.Plug; using Mosa.Runtime.x86; namespace Mosa.Kernel.BareMetal.x86; @@ -2170,7 +2169,6 @@ private static void IRQ255() /// Interrupts the handler. /// /// The stack state pointer. - [Plug("Mosa.Runtime.Interrupt::Process")] private static unsafe void ProcessInterrupt(Pointer stackStatePointer) { var stack = new IDTStackEntry(stackStatePointer); @@ -2270,6 +2268,7 @@ private static unsafe void ProcessInterrupt(Pointer stackStatePointer) default: Interrupt?.Invoke(stack.Interrupt, stack.ErrorCode); + BareMetal.InterruptManager.ProcessInterrupt(stack.Interrupt, stack.ErrorCode); break; } diff --git a/Source/Mosa.Kernel.BareMetal/InterruptManager.cs b/Source/Mosa.Kernel.BareMetal/InterruptManager.cs index 9ffb4f1c50..8de49651ea 100644 --- a/Source/Mosa.Kernel.BareMetal/InterruptManager.cs +++ b/Source/Mosa.Kernel.BareMetal/InterruptManager.cs @@ -10,6 +10,7 @@ public static void Setup() { Debug.WriteLine("InterreuptManager:Setup()"); + InterruptQueue.Setup(); Platform.Interrupt.Setup(); Debug.WriteLine("InterreuptManager:Setup() [Exit]"); @@ -19,4 +20,9 @@ public static void SetHandler(InterruptHandler handler) { Platform.Interrupt.SetHandler(handler); } + + public static void ProcessInterrupt(uint interrupt, uint errorCode) + { + InterruptQueue.Enqueue(interrupt); + } } diff --git a/Source/Mosa.Kernel.BareMetal/InterruptQueue.cs b/Source/Mosa.Kernel.BareMetal/InterruptQueue.cs new file mode 100644 index 0000000000..1922a0d79b --- /dev/null +++ b/Source/Mosa.Kernel.BareMetal/InterruptQueue.cs @@ -0,0 +1,79 @@ +// Copyright (c) MOSA Project. Licensed under the New BSD License. + +namespace Mosa.Kernel.BareMetal; + +public static class InterruptQueue +{ + private const int MaxIRQs = 8196; + + private static int[] slots; + private static int first; + private static int last; + private static int length; + + public static void Setup() + { + Debug.WriteLine("InterruptQueue:Setup()"); + + slots = new int[8196]; + first = -1; + last = -1; + length = 0; + + for (var i = 0; i < MaxIRQs; i++) + { + slots[i] = -1; + } + + Debug.WriteLine("InterruptQueue:Setup() [Exit]"); + } + + public static int GetLength() => length; + + public static void Enqueue(uint irq) + { + if (last == -1) + { + first = (int)irq; + last = (int)irq; + length = 1; + } + else + { + if (last == irq) + return; + + if (slots[irq] != -1) + return; + + slots[last] = (int)irq; + + last = (int)irq; + + length++; + } + } + + public static int Dequeue() + { + if (first == -1) + { + return -1; + } + else + { + var ret = first; + + first = slots[first]; + + if (first == -1) + { + last = -1; + } + + length--; + + return ret; + } + } +} diff --git a/Source/Mosa.Kernel.BareMetal/Startup.cs b/Source/Mosa.Kernel.BareMetal/Startup.cs index 05bda15065..02eff802a9 100644 --- a/Source/Mosa.Kernel.BareMetal/Startup.cs +++ b/Source/Mosa.Kernel.BareMetal/Startup.cs @@ -252,7 +252,9 @@ private static Pointer AllocateMemory(uint size) private static void ProcessInterrupt(uint interrupt, uint errorCode) { - if (interrupt is >= 0x20 and < 0x30) + if (interrupt is >= 0x20 and < 0x30) // FIXME: X86 specific + { HAL.ProcessInterrupt((byte)(interrupt - 0x20)); + } } } diff --git a/Source/Mosa.Runtime/Interrupt.cs b/Source/Mosa.Runtime/Interrupt.cs deleted file mode 100644 index e507dbaa40..0000000000 --- a/Source/Mosa.Runtime/Interrupt.cs +++ /dev/null @@ -1,11 +0,0 @@ -// Copyright (c) MOSA Project. Licensed under the New BSD License. - -namespace Mosa.Runtime; - -internal static class Interrupt -{ - private static void Process(Pointer stackStatePointer) - { - // Will be plugged - } -} From 986d720500fcb8e458bcce6c50c227297d814b2f Mon Sep 17 00:00:00 2001 From: Phil Date: Wed, 17 Jan 2024 22:04:54 -0800 Subject: [PATCH 02/17] - Version to 2.6 --- .github/workflows/builds.yml | 2 +- Source/Mosa.Compiler.Framework/CompilerVersion.cs | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/builds.yml b/.github/workflows/builds.yml index a3090e8386..40fc849aa0 100644 --- a/.github/workflows/builds.yml +++ b/.github/workflows/builds.yml @@ -12,7 +12,7 @@ permissions: contents: write env: - BUILD_VERSION: 2.5.1.${{ github.run_number }} + BUILD_VERSION: 2.6.0.${{ github.run_number }} jobs: diff --git a/Source/Mosa.Compiler.Framework/CompilerVersion.cs b/Source/Mosa.Compiler.Framework/CompilerVersion.cs index ba4cb6e645..c6491dd607 100644 --- a/Source/Mosa.Compiler.Framework/CompilerVersion.cs +++ b/Source/Mosa.Compiler.Framework/CompilerVersion.cs @@ -18,7 +18,7 @@ public static Version GetVersion() if (version.Build == 0) { // Revision and build number are reversed by design - version = new Version(2, 5, 1, 1); + version = new Version(2, 6, 0, 0); } return version; From 5a02f44f2a0b95922c39277ab147943e3337eec3 Mon Sep 17 00:00:00 2001 From: Phil Date: Sun, 25 Feb 2024 14:10:56 -0800 Subject: [PATCH 03/17] - WIP: SystemCall --- Source/Mosa.Compiler.ARM32/Intrinsic/Mcr.cs | 2 +- Source/Mosa.Compiler.ARM32/Intrinsic/Mrc.cs | 2 +- Source/Mosa.Compiler.ARM32/Intrinsic/Nop.cs | 2 +- Source/Mosa.Compiler.ARM64/Intrinsic/Nop.cs | 2 +- .../Intrinsics/CreateInstanceSimple.cs | 2 +- .../Intrinsics/GetAssemblyListTable.cs | 2 +- .../Intrinsics/GetBootOptions.cs | 2 +- .../Intrinsics/GetDelegateMethodAddress.cs | 2 +- .../Intrinsics/GetDelegateTargetAddress.cs | 2 +- .../Intrinsics/GetExceptionRegister.cs | 2 +- .../GetMethodExceptionLookupTable.cs | 2 +- .../Intrinsics/GetMethodLookupTable.cs | 2 +- .../Intrinsics/GetObjectAddress.cs | 2 +- .../Intrinsics/GetObjectFromAddress.cs | 2 +- .../Intrinsics/GetStackFrame.cs | 2 +- .../Intrinsics/GetStackPointer.cs | 2 +- .../Intrinsics/GetStringType.cs | 2 +- .../Intrinsics/Load16.cs | 2 +- .../Intrinsics/Load32.cs | 2 +- .../Intrinsics/Load64.cs | 2 +- .../Intrinsics/Load8.cs | 2 +- .../Intrinsics/LoadPointer.cs | 2 +- .../Intrinsics/LoadR4.cs | 2 +- .../Intrinsics/LoadR8.cs | 2 +- .../Intrinsics/Store16.cs | 2 +- .../Intrinsics/Store32.cs | 2 +- .../Intrinsics/Store64.cs | 2 +- .../Intrinsics/Store8.cs | 2 +- .../Intrinsics/StorePointer.cs | 2 +- .../Intrinsics/StoreR4.cs | 2 +- .../Intrinsics/StoreR8.cs | 2 +- .../Intrinsics/SuppressStackFrame.cs | 2 +- .../Stubs/ByReference.cs | 2 +- .../Stubs/RuntimeHelpers.cs | 2 +- .../Mosa.Compiler.Framework/Stubs/Unsafe.cs | 2 +- .../Intrinsic/AllocateStackSpace.cs | 2 +- Source/Mosa.Compiler.x64/Intrinsic/Blsr32.cs | 2 +- Source/Mosa.Compiler.x64/Intrinsic/Blsr64.cs | 2 +- .../Mosa.Compiler.x64/Intrinsic/BochsDebug.cs | 2 +- Source/Mosa.Compiler.x64/Intrinsic/Call.cs | 2 +- Source/Mosa.Compiler.x64/Intrinsic/Cli.cs | 2 +- .../Intrinsic/CmpXChgLoad64.cs | 2 +- .../Mosa.Compiler.x64/Intrinsic/CpuIdRAX.cs | 2 +- .../Mosa.Compiler.x64/Intrinsic/CpuIdRBX.cs | 2 +- .../Mosa.Compiler.x64/Intrinsic/CpuIdRCX.cs | 2 +- .../Mosa.Compiler.x64/Intrinsic/CpuIdRDX.cs | 2 +- Source/Mosa.Compiler.x64/Intrinsic/Div.cs | 2 +- .../Mosa.Compiler.x64/Intrinsic/FrameCall.cs | 2 +- .../Intrinsic/FrameCallRetR8.cs | 2 +- .../Intrinsic/FrameCallRetU8.cs | 2 +- .../Mosa.Compiler.x64/Intrinsic/FrameJump.cs | 2 +- Source/Mosa.Compiler.x64/Intrinsic/Get16.cs | 2 +- Source/Mosa.Compiler.x64/Intrinsic/Get32.cs | 2 +- Source/Mosa.Compiler.x64/Intrinsic/Get64.cs | 2 +- Source/Mosa.Compiler.x64/Intrinsic/Get8.cs | 2 +- Source/Mosa.Compiler.x64/Intrinsic/GetCR0.cs | 2 +- Source/Mosa.Compiler.x64/Intrinsic/GetCR2.cs | 2 +- Source/Mosa.Compiler.x64/Intrinsic/GetCR3.cs | 2 +- Source/Mosa.Compiler.x64/Intrinsic/GetCR4.cs | 2 +- Source/Mosa.Compiler.x64/Intrinsic/GetCS.cs | 2 +- Source/Mosa.Compiler.x64/Intrinsic/GetFS.cs | 2 +- .../Intrinsic/GetIDTJumpLocation.cs | 2 +- .../Intrinsic/GetIRQHandler.cs | 16 --------- Source/Mosa.Compiler.x64/Intrinsic/Hlt.cs | 2 +- Source/Mosa.Compiler.x64/Intrinsic/IRQs.cs | 2 +- Source/Mosa.Compiler.x64/Intrinsic/In16.cs | 2 +- Source/Mosa.Compiler.x64/Intrinsic/In32.cs | 2 +- Source/Mosa.Compiler.x64/Intrinsic/In8.cs | 2 +- Source/Mosa.Compiler.x64/Intrinsic/Int.cs | 2 +- .../Intrinsic/InterruptReturn.cs | 2 +- Source/Mosa.Compiler.x64/Intrinsic/Invlpg.cs | 2 +- Source/Mosa.Compiler.x64/Intrinsic/Jmp.cs | 2 +- Source/Mosa.Compiler.x64/Intrinsic/Lgdt.cs | 2 +- Source/Mosa.Compiler.x64/Intrinsic/Lidt.cs | 2 +- .../Mosa.Compiler.x64/Intrinsic/Memclr256.cs | 2 +- .../Mosa.Compiler.x64/Intrinsic/Memcpy256.cs | 2 +- Source/Mosa.Compiler.x64/Intrinsic/Nop.cs | 2 +- Source/Mosa.Compiler.x64/Intrinsic/Out16.cs | 2 +- Source/Mosa.Compiler.x64/Intrinsic/Out32.cs | 2 +- Source/Mosa.Compiler.x64/Intrinsic/Out8.cs | 2 +- Source/Mosa.Compiler.x64/Intrinsic/Pause.cs | 2 +- Source/Mosa.Compiler.x64/Intrinsic/RdMSR.cs | 2 +- .../Mosa.Compiler.x64/Intrinsic/Remainder.cs | 2 +- .../Intrinsic/Roundsd2Negative.cs | 2 +- .../Intrinsic/Roundsd2Positive.cs | 2 +- .../Intrinsic/Roundss2Negative.cs | 2 +- .../Intrinsic/Roundss2Positive.cs | 2 +- Source/Mosa.Compiler.x64/Intrinsic/Set16.cs | 2 +- Source/Mosa.Compiler.x64/Intrinsic/Set32.cs | 2 +- Source/Mosa.Compiler.x64/Intrinsic/Set8.cs | 2 +- Source/Mosa.Compiler.x64/Intrinsic/SetCR0.cs | 2 +- Source/Mosa.Compiler.x64/Intrinsic/SetCR2.cs | 2 +- Source/Mosa.Compiler.x64/Intrinsic/SetCR3.cs | 2 +- Source/Mosa.Compiler.x64/Intrinsic/SetCR4.cs | 2 +- Source/Mosa.Compiler.x64/Intrinsic/SetFS.cs | 2 +- .../Intrinsic/SetSegments.cs | 2 +- Source/Mosa.Compiler.x64/Intrinsic/Sqrtsd.cs | 2 +- Source/Mosa.Compiler.x64/Intrinsic/Sqrtss.cs | 2 +- Source/Mosa.Compiler.x64/Intrinsic/Sti.cs | 2 +- Source/Mosa.Compiler.x64/Intrinsic/WrMSR.cs | 2 +- .../Mosa.Compiler.x64/Intrinsic/XAddLoad32.cs | 2 +- .../Mosa.Compiler.x64/Intrinsic/XAddLoad64.cs | 2 +- .../Mosa.Compiler.x64/Intrinsic/XChgLoad32.cs | 2 +- .../Mosa.Compiler.x64/Intrinsic/XChgLoad64.cs | 2 +- .../Intrinsic/AllocateStackSpace.cs | 8 ++--- Source/Mosa.Compiler.x86/Intrinsic/Blsr32.cs | 2 +- .../Mosa.Compiler.x86/Intrinsic/BochsDebug.cs | 2 +- Source/Mosa.Compiler.x86/Intrinsic/Cli.cs | 2 +- .../Intrinsic/CmpXChgLoad32.cs | 2 +- .../Mosa.Compiler.x86/Intrinsic/CpuIdEax.cs | 2 +- .../Mosa.Compiler.x86/Intrinsic/CpuIdEbx.cs | 2 +- .../Mosa.Compiler.x86/Intrinsic/CpuIdEcx.cs | 2 +- .../Mosa.Compiler.x86/Intrinsic/CpuIdEdx.cs | 2 +- Source/Mosa.Compiler.x86/Intrinsic/Div.cs | 2 +- Source/Mosa.Compiler.x86/Intrinsic/FarJump.cs | 2 +- .../Mosa.Compiler.x86/Intrinsic/FrameCall.cs | 2 +- .../Intrinsic/FrameCallRetR8.cs | 2 +- .../Intrinsic/FrameCallRetU4.cs | 2 +- .../Intrinsic/FrameCallRetU8.cs | 2 +- .../Mosa.Compiler.x86/Intrinsic/FrameJump.cs | 2 +- Source/Mosa.Compiler.x86/Intrinsic/Get16.cs | 2 +- Source/Mosa.Compiler.x86/Intrinsic/Get32.cs | 2 +- Source/Mosa.Compiler.x86/Intrinsic/Get8.cs | 2 +- Source/Mosa.Compiler.x86/Intrinsic/GetCR0.cs | 2 +- Source/Mosa.Compiler.x86/Intrinsic/GetCR2.cs | 2 +- Source/Mosa.Compiler.x86/Intrinsic/GetCR3.cs | 2 +- Source/Mosa.Compiler.x86/Intrinsic/GetCR4.cs | 2 +- Source/Mosa.Compiler.x86/Intrinsic/GetCS.cs | 2 +- Source/Mosa.Compiler.x86/Intrinsic/GetEAX.cs | 21 +++++++++++ Source/Mosa.Compiler.x86/Intrinsic/GetFS.cs | 2 +- .../Intrinsic/GetIDTJumpLocation.cs | 2 +- .../Intrinsic/GetIRQHandler.cs | 16 --------- Source/Mosa.Compiler.x86/Intrinsic/Hlt.cs | 2 +- Source/Mosa.Compiler.x86/Intrinsic/IRQs.cs | 2 +- Source/Mosa.Compiler.x86/Intrinsic/In16.cs | 2 +- Source/Mosa.Compiler.x86/Intrinsic/In32.cs | 2 +- Source/Mosa.Compiler.x86/Intrinsic/In8.cs | 2 +- Source/Mosa.Compiler.x86/Intrinsic/Int.cs | 2 +- .../Intrinsic/InterruptReturn.cs | 6 ++-- Source/Mosa.Compiler.x86/Intrinsic/Invlpg.cs | 2 +- Source/Mosa.Compiler.x86/Intrinsic/Lgdt.cs | 2 +- Source/Mosa.Compiler.x86/Intrinsic/Lidt.cs | 2 +- Source/Mosa.Compiler.x86/Intrinsic/Lzcnt32.cs | 2 +- .../Mosa.Compiler.x86/Intrinsic/Memclr256.cs | 5 ++- .../Mosa.Compiler.x86/Intrinsic/Memcpy256.cs | 9 +++-- Source/Mosa.Compiler.x86/Intrinsic/Nop.cs | 2 +- Source/Mosa.Compiler.x86/Intrinsic/Out16.cs | 2 +- Source/Mosa.Compiler.x86/Intrinsic/Out32.cs | 2 +- Source/Mosa.Compiler.x86/Intrinsic/Out8.cs | 2 +- Source/Mosa.Compiler.x86/Intrinsic/Pause.cs | 2 +- .../Mosa.Compiler.x86/Intrinsic/Popcnt32.cs | 2 +- Source/Mosa.Compiler.x86/Intrinsic/RdMSR.cs | 2 +- .../Mosa.Compiler.x86/Intrinsic/Remainder.cs | 2 +- .../Intrinsic/Roundsd2Negative.cs | 2 +- .../Intrinsic/Roundsd2Positive.cs | 2 +- .../Intrinsic/Roundss2Negative.cs | 2 +- .../Intrinsic/Roundss2Positive.cs | 2 +- Source/Mosa.Compiler.x86/Intrinsic/Set16.cs | 2 +- Source/Mosa.Compiler.x86/Intrinsic/Set32.cs | 2 +- Source/Mosa.Compiler.x86/Intrinsic/Set8.cs | 2 +- Source/Mosa.Compiler.x86/Intrinsic/SetCR0.cs | 2 +- Source/Mosa.Compiler.x86/Intrinsic/SetCR2.cs | 2 +- Source/Mosa.Compiler.x86/Intrinsic/SetCR3.cs | 2 +- Source/Mosa.Compiler.x86/Intrinsic/SetCR4.cs | 2 +- Source/Mosa.Compiler.x86/Intrinsic/SetEAX.cs | 17 +++++++++ Source/Mosa.Compiler.x86/Intrinsic/SetFS.cs | 2 +- .../Intrinsic/SetSegments.cs | 2 +- Source/Mosa.Compiler.x86/Intrinsic/Sqrtsd.cs | 2 +- Source/Mosa.Compiler.x86/Intrinsic/Sqrtss.cs | 2 +- Source/Mosa.Compiler.x86/Intrinsic/Sti.cs | 2 +- Source/Mosa.Compiler.x86/Intrinsic/Tzcnt32.cs | 2 +- Source/Mosa.Compiler.x86/Intrinsic/WrMSR.cs | 2 +- .../Mosa.Compiler.x86/Intrinsic/XAddLoad32.cs | 2 +- .../Mosa.Compiler.x86/Intrinsic/XChgLoad32.cs | 2 +- .../Mosa.DeviceDriver/ISA/ACPI/ACPIDriver.cs | 3 +- Source/Mosa.DeviceDriver/ISA/PCIController.cs | 6 +--- .../PCI/VMware/VMwareSVGA2.cs | 5 +-- Source/Mosa.DeviceSystem/BaseDeviceDriver.cs | 5 +-- Source/Mosa.DeviceSystem/PCI/PCIDevice.cs | 6 +--- .../PartitionDeviceDriver.cs | 6 +--- Source/Mosa.Kernel.BareMetal.x86/IDT.cs | 4 +++ .../Mosa.Kernel.BareMetal.x86/PlatformPlug.cs | 6 ++++ Source/Mosa.Kernel.BareMetal.x86/Scheduler.cs | 15 ++++++++ Source/Mosa.Kernel.BareMetal/Platform.cs | 5 +++ Source/Mosa.Kernel.BareMetal/Scheduler.cs | 35 +++++++++++++++++++ Source/Mosa.Kernel.BareMetal/System.cs | 22 ++++++++++++ Source/Mosa.Korlib/System.Threading/Thread.cs | 2 +- Source/Mosa.Runtime.x86/Native.cs | 6 ++++ 188 files changed, 318 insertions(+), 238 deletions(-) delete mode 100644 Source/Mosa.Compiler.x64/Intrinsic/GetIRQHandler.cs create mode 100644 Source/Mosa.Compiler.x86/Intrinsic/GetEAX.cs delete mode 100644 Source/Mosa.Compiler.x86/Intrinsic/GetIRQHandler.cs create mode 100644 Source/Mosa.Compiler.x86/Intrinsic/SetEAX.cs create mode 100644 Source/Mosa.Kernel.BareMetal/System.cs diff --git a/Source/Mosa.Compiler.ARM32/Intrinsic/Mcr.cs b/Source/Mosa.Compiler.ARM32/Intrinsic/Mcr.cs index a1476b529f..af295af60d 100644 --- a/Source/Mosa.Compiler.ARM32/Intrinsic/Mcr.cs +++ b/Source/Mosa.Compiler.ARM32/Intrinsic/Mcr.cs @@ -5,7 +5,7 @@ namespace Mosa.Compiler.ARM32.Intrinsic; /// -/// IntrinsicMethods +/// Intrinsic Methods /// internal static partial class IntrinsicMethods { diff --git a/Source/Mosa.Compiler.ARM32/Intrinsic/Mrc.cs b/Source/Mosa.Compiler.ARM32/Intrinsic/Mrc.cs index 507bbf7952..0e48b09457 100644 --- a/Source/Mosa.Compiler.ARM32/Intrinsic/Mrc.cs +++ b/Source/Mosa.Compiler.ARM32/Intrinsic/Mrc.cs @@ -5,7 +5,7 @@ namespace Mosa.Compiler.ARM32.Intrinsic; /// -/// IntrinsicMethods +/// Intrinsic Methods /// internal static partial class IntrinsicMethods { diff --git a/Source/Mosa.Compiler.ARM32/Intrinsic/Nop.cs b/Source/Mosa.Compiler.ARM32/Intrinsic/Nop.cs index 0454ed1b20..601438fdae 100644 --- a/Source/Mosa.Compiler.ARM32/Intrinsic/Nop.cs +++ b/Source/Mosa.Compiler.ARM32/Intrinsic/Nop.cs @@ -5,7 +5,7 @@ namespace Mosa.Compiler.ARM32.Intrinsic; /// -/// IntrinsicMethods +/// Intrinsic Methods /// internal static partial class IntrinsicMethods { diff --git a/Source/Mosa.Compiler.ARM64/Intrinsic/Nop.cs b/Source/Mosa.Compiler.ARM64/Intrinsic/Nop.cs index 46c28db962..f29608b57d 100644 --- a/Source/Mosa.Compiler.ARM64/Intrinsic/Nop.cs +++ b/Source/Mosa.Compiler.ARM64/Intrinsic/Nop.cs @@ -5,7 +5,7 @@ namespace Mosa.Compiler.ARM64.Intrinsic; /// -/// IntrinsicMethods +/// Intrinsic Methods /// internal static partial class IntrinsicMethods { diff --git a/Source/Mosa.Compiler.Framework/Intrinsics/CreateInstanceSimple.cs b/Source/Mosa.Compiler.Framework/Intrinsics/CreateInstanceSimple.cs index e3e0421ee2..c36b2d5448 100644 --- a/Source/Mosa.Compiler.Framework/Intrinsics/CreateInstanceSimple.cs +++ b/Source/Mosa.Compiler.Framework/Intrinsics/CreateInstanceSimple.cs @@ -3,7 +3,7 @@ namespace Mosa.Compiler.Framework.Intrinsics; /// -/// IntrinsicMethods +/// Intrinsic Methods /// internal static partial class IntrinsicMethods { diff --git a/Source/Mosa.Compiler.Framework/Intrinsics/GetAssemblyListTable.cs b/Source/Mosa.Compiler.Framework/Intrinsics/GetAssemblyListTable.cs index c81026fcd1..e0a55d6cd7 100644 --- a/Source/Mosa.Compiler.Framework/Intrinsics/GetAssemblyListTable.cs +++ b/Source/Mosa.Compiler.Framework/Intrinsics/GetAssemblyListTable.cs @@ -3,7 +3,7 @@ namespace Mosa.Compiler.Framework.Intrinsics; /// -/// IntrinsicMethods +/// Intrinsic Methods /// internal static partial class IntrinsicMethods { diff --git a/Source/Mosa.Compiler.Framework/Intrinsics/GetBootOptions.cs b/Source/Mosa.Compiler.Framework/Intrinsics/GetBootOptions.cs index 82fde436d3..c782dad765 100644 --- a/Source/Mosa.Compiler.Framework/Intrinsics/GetBootOptions.cs +++ b/Source/Mosa.Compiler.Framework/Intrinsics/GetBootOptions.cs @@ -3,7 +3,7 @@ namespace Mosa.Compiler.Framework.Intrinsics; /// -/// IntrinsicMethods +/// Intrinsic Methods /// internal static partial class IntrinsicMethods { diff --git a/Source/Mosa.Compiler.Framework/Intrinsics/GetDelegateMethodAddress.cs b/Source/Mosa.Compiler.Framework/Intrinsics/GetDelegateMethodAddress.cs index e24322f5e4..3b24c5c09d 100644 --- a/Source/Mosa.Compiler.Framework/Intrinsics/GetDelegateMethodAddress.cs +++ b/Source/Mosa.Compiler.Framework/Intrinsics/GetDelegateMethodAddress.cs @@ -3,7 +3,7 @@ namespace Mosa.Compiler.Framework.Intrinsics; /// -/// IntrinsicMethods +/// Intrinsic Methods /// internal static partial class IntrinsicMethods { diff --git a/Source/Mosa.Compiler.Framework/Intrinsics/GetDelegateTargetAddress.cs b/Source/Mosa.Compiler.Framework/Intrinsics/GetDelegateTargetAddress.cs index a8570adc75..6b4958d5f5 100644 --- a/Source/Mosa.Compiler.Framework/Intrinsics/GetDelegateTargetAddress.cs +++ b/Source/Mosa.Compiler.Framework/Intrinsics/GetDelegateTargetAddress.cs @@ -3,7 +3,7 @@ namespace Mosa.Compiler.Framework.Intrinsics; /// -/// IntrinsicMethods +/// Intrinsic Methods /// internal static partial class IntrinsicMethods { diff --git a/Source/Mosa.Compiler.Framework/Intrinsics/GetExceptionRegister.cs b/Source/Mosa.Compiler.Framework/Intrinsics/GetExceptionRegister.cs index 1e67e01d73..2d8adb388d 100644 --- a/Source/Mosa.Compiler.Framework/Intrinsics/GetExceptionRegister.cs +++ b/Source/Mosa.Compiler.Framework/Intrinsics/GetExceptionRegister.cs @@ -3,7 +3,7 @@ namespace Mosa.Compiler.Framework.Intrinsics; /// -/// IntrinsicMethods +/// Intrinsic Methods /// internal static partial class IntrinsicMethods { diff --git a/Source/Mosa.Compiler.Framework/Intrinsics/GetMethodExceptionLookupTable.cs b/Source/Mosa.Compiler.Framework/Intrinsics/GetMethodExceptionLookupTable.cs index 4c1dc71a6e..60433f3163 100644 --- a/Source/Mosa.Compiler.Framework/Intrinsics/GetMethodExceptionLookupTable.cs +++ b/Source/Mosa.Compiler.Framework/Intrinsics/GetMethodExceptionLookupTable.cs @@ -3,7 +3,7 @@ namespace Mosa.Compiler.Framework.Intrinsics; /// -/// IntrinsicMethods +/// Intrinsic Methods /// internal static partial class IntrinsicMethods { diff --git a/Source/Mosa.Compiler.Framework/Intrinsics/GetMethodLookupTable.cs b/Source/Mosa.Compiler.Framework/Intrinsics/GetMethodLookupTable.cs index 4550a414ed..6215eab18b 100644 --- a/Source/Mosa.Compiler.Framework/Intrinsics/GetMethodLookupTable.cs +++ b/Source/Mosa.Compiler.Framework/Intrinsics/GetMethodLookupTable.cs @@ -3,7 +3,7 @@ namespace Mosa.Compiler.Framework.Intrinsics; /// -/// IntrinsicMethods +/// Intrinsic Methods /// internal static partial class IntrinsicMethods { diff --git a/Source/Mosa.Compiler.Framework/Intrinsics/GetObjectAddress.cs b/Source/Mosa.Compiler.Framework/Intrinsics/GetObjectAddress.cs index 712e5baf14..ffeb5e9e08 100644 --- a/Source/Mosa.Compiler.Framework/Intrinsics/GetObjectAddress.cs +++ b/Source/Mosa.Compiler.Framework/Intrinsics/GetObjectAddress.cs @@ -3,7 +3,7 @@ namespace Mosa.Compiler.Framework.Intrinsics; /// -/// IntrinsicMethods +/// Intrinsic Methods /// internal static partial class IntrinsicMethods { diff --git a/Source/Mosa.Compiler.Framework/Intrinsics/GetObjectFromAddress.cs b/Source/Mosa.Compiler.Framework/Intrinsics/GetObjectFromAddress.cs index 14c40f2f78..eb93afa1e0 100644 --- a/Source/Mosa.Compiler.Framework/Intrinsics/GetObjectFromAddress.cs +++ b/Source/Mosa.Compiler.Framework/Intrinsics/GetObjectFromAddress.cs @@ -3,7 +3,7 @@ namespace Mosa.Compiler.Framework.Intrinsics; /// -/// IntrinsicMethods +/// Intrinsic Methods /// internal static partial class IntrinsicMethods { diff --git a/Source/Mosa.Compiler.Framework/Intrinsics/GetStackFrame.cs b/Source/Mosa.Compiler.Framework/Intrinsics/GetStackFrame.cs index 3efc69a90b..9c82357302 100644 --- a/Source/Mosa.Compiler.Framework/Intrinsics/GetStackFrame.cs +++ b/Source/Mosa.Compiler.Framework/Intrinsics/GetStackFrame.cs @@ -3,7 +3,7 @@ namespace Mosa.Compiler.Framework.Intrinsics; /// -/// IntrinsicMethods +/// Intrinsic Methods /// internal static partial class IntrinsicMethods { diff --git a/Source/Mosa.Compiler.Framework/Intrinsics/GetStackPointer.cs b/Source/Mosa.Compiler.Framework/Intrinsics/GetStackPointer.cs index 5ae1591010..654b551bc8 100644 --- a/Source/Mosa.Compiler.Framework/Intrinsics/GetStackPointer.cs +++ b/Source/Mosa.Compiler.Framework/Intrinsics/GetStackPointer.cs @@ -3,7 +3,7 @@ namespace Mosa.Compiler.Framework.Intrinsics; /// -/// IntrinsicMethods +/// Intrinsic Methods /// internal static partial class IntrinsicMethods { diff --git a/Source/Mosa.Compiler.Framework/Intrinsics/GetStringType.cs b/Source/Mosa.Compiler.Framework/Intrinsics/GetStringType.cs index f17f79b0eb..2fcfa35edc 100644 --- a/Source/Mosa.Compiler.Framework/Intrinsics/GetStringType.cs +++ b/Source/Mosa.Compiler.Framework/Intrinsics/GetStringType.cs @@ -3,7 +3,7 @@ namespace Mosa.Compiler.Framework.Intrinsics; /// -/// IntrinsicMethods +/// Intrinsic Methods /// internal static partial class IntrinsicMethods { diff --git a/Source/Mosa.Compiler.Framework/Intrinsics/Load16.cs b/Source/Mosa.Compiler.Framework/Intrinsics/Load16.cs index 8682bfd2c0..8653b66798 100644 --- a/Source/Mosa.Compiler.Framework/Intrinsics/Load16.cs +++ b/Source/Mosa.Compiler.Framework/Intrinsics/Load16.cs @@ -3,7 +3,7 @@ namespace Mosa.Compiler.Framework.Intrinsics; /// -/// IntrinsicMethods +/// Intrinsic Methods /// internal static partial class IntrinsicMethods { diff --git a/Source/Mosa.Compiler.Framework/Intrinsics/Load32.cs b/Source/Mosa.Compiler.Framework/Intrinsics/Load32.cs index 66542090db..deb9eec9ac 100644 --- a/Source/Mosa.Compiler.Framework/Intrinsics/Load32.cs +++ b/Source/Mosa.Compiler.Framework/Intrinsics/Load32.cs @@ -3,7 +3,7 @@ namespace Mosa.Compiler.Framework.Intrinsics; /// -/// IntrinsicMethods +/// Intrinsic Methods /// internal static partial class IntrinsicMethods { diff --git a/Source/Mosa.Compiler.Framework/Intrinsics/Load64.cs b/Source/Mosa.Compiler.Framework/Intrinsics/Load64.cs index e32304f219..92fa540a88 100644 --- a/Source/Mosa.Compiler.Framework/Intrinsics/Load64.cs +++ b/Source/Mosa.Compiler.Framework/Intrinsics/Load64.cs @@ -3,7 +3,7 @@ namespace Mosa.Compiler.Framework.Intrinsics; /// -/// IntrinsicMethods +/// Intrinsic Methods /// internal static partial class IntrinsicMethods { diff --git a/Source/Mosa.Compiler.Framework/Intrinsics/Load8.cs b/Source/Mosa.Compiler.Framework/Intrinsics/Load8.cs index ada639b443..c19917e551 100644 --- a/Source/Mosa.Compiler.Framework/Intrinsics/Load8.cs +++ b/Source/Mosa.Compiler.Framework/Intrinsics/Load8.cs @@ -3,7 +3,7 @@ namespace Mosa.Compiler.Framework.Intrinsics; /// -/// IntrinsicMethods +/// Intrinsic Methods /// internal static partial class IntrinsicMethods { diff --git a/Source/Mosa.Compiler.Framework/Intrinsics/LoadPointer.cs b/Source/Mosa.Compiler.Framework/Intrinsics/LoadPointer.cs index 59384bcf11..19c1d24b07 100644 --- a/Source/Mosa.Compiler.Framework/Intrinsics/LoadPointer.cs +++ b/Source/Mosa.Compiler.Framework/Intrinsics/LoadPointer.cs @@ -3,7 +3,7 @@ namespace Mosa.Compiler.Framework.Intrinsics; /// -/// IntrinsicMethods +/// Intrinsic Methods /// internal static partial class IntrinsicMethods { diff --git a/Source/Mosa.Compiler.Framework/Intrinsics/LoadR4.cs b/Source/Mosa.Compiler.Framework/Intrinsics/LoadR4.cs index 8eb19e84e0..4b0d83d57e 100644 --- a/Source/Mosa.Compiler.Framework/Intrinsics/LoadR4.cs +++ b/Source/Mosa.Compiler.Framework/Intrinsics/LoadR4.cs @@ -3,7 +3,7 @@ namespace Mosa.Compiler.Framework.Intrinsics; /// -/// IntrinsicMethods +/// Intrinsic Methods /// internal static partial class IntrinsicMethods { diff --git a/Source/Mosa.Compiler.Framework/Intrinsics/LoadR8.cs b/Source/Mosa.Compiler.Framework/Intrinsics/LoadR8.cs index 3ff4688229..cd67aa9db6 100644 --- a/Source/Mosa.Compiler.Framework/Intrinsics/LoadR8.cs +++ b/Source/Mosa.Compiler.Framework/Intrinsics/LoadR8.cs @@ -3,7 +3,7 @@ namespace Mosa.Compiler.Framework.Intrinsics; /// -/// IntrinsicMethods +/// Intrinsic Methods /// internal static partial class IntrinsicMethods { diff --git a/Source/Mosa.Compiler.Framework/Intrinsics/Store16.cs b/Source/Mosa.Compiler.Framework/Intrinsics/Store16.cs index ca9bf3607c..4d7120bc7e 100644 --- a/Source/Mosa.Compiler.Framework/Intrinsics/Store16.cs +++ b/Source/Mosa.Compiler.Framework/Intrinsics/Store16.cs @@ -3,7 +3,7 @@ namespace Mosa.Compiler.Framework.Intrinsics; /// -/// IntrinsicMethods +/// Intrinsic Methods /// internal static partial class IntrinsicMethods { diff --git a/Source/Mosa.Compiler.Framework/Intrinsics/Store32.cs b/Source/Mosa.Compiler.Framework/Intrinsics/Store32.cs index 8a35383d54..0576d41b65 100644 --- a/Source/Mosa.Compiler.Framework/Intrinsics/Store32.cs +++ b/Source/Mosa.Compiler.Framework/Intrinsics/Store32.cs @@ -3,7 +3,7 @@ namespace Mosa.Compiler.Framework.Intrinsics; /// -/// IntrinsicMethods +/// Intrinsic Methods /// internal static partial class IntrinsicMethods { diff --git a/Source/Mosa.Compiler.Framework/Intrinsics/Store64.cs b/Source/Mosa.Compiler.Framework/Intrinsics/Store64.cs index 04be675ead..91fd03efc0 100644 --- a/Source/Mosa.Compiler.Framework/Intrinsics/Store64.cs +++ b/Source/Mosa.Compiler.Framework/Intrinsics/Store64.cs @@ -3,7 +3,7 @@ namespace Mosa.Compiler.Framework.Intrinsics; /// -/// IntrinsicMethods +/// Intrinsic Methods /// internal static partial class IntrinsicMethods { diff --git a/Source/Mosa.Compiler.Framework/Intrinsics/Store8.cs b/Source/Mosa.Compiler.Framework/Intrinsics/Store8.cs index 27e3b9c70f..a77baff254 100644 --- a/Source/Mosa.Compiler.Framework/Intrinsics/Store8.cs +++ b/Source/Mosa.Compiler.Framework/Intrinsics/Store8.cs @@ -3,7 +3,7 @@ namespace Mosa.Compiler.Framework.Intrinsics; /// -/// IntrinsicMethods +/// Intrinsic Methods /// internal static partial class IntrinsicMethods { diff --git a/Source/Mosa.Compiler.Framework/Intrinsics/StorePointer.cs b/Source/Mosa.Compiler.Framework/Intrinsics/StorePointer.cs index 39e42b1b72..2562814736 100644 --- a/Source/Mosa.Compiler.Framework/Intrinsics/StorePointer.cs +++ b/Source/Mosa.Compiler.Framework/Intrinsics/StorePointer.cs @@ -3,7 +3,7 @@ namespace Mosa.Compiler.Framework.Intrinsics; /// -/// IntrinsicMethods +/// Intrinsic Methods /// internal static partial class IntrinsicMethods { diff --git a/Source/Mosa.Compiler.Framework/Intrinsics/StoreR4.cs b/Source/Mosa.Compiler.Framework/Intrinsics/StoreR4.cs index e38e989a2e..258703251d 100644 --- a/Source/Mosa.Compiler.Framework/Intrinsics/StoreR4.cs +++ b/Source/Mosa.Compiler.Framework/Intrinsics/StoreR4.cs @@ -3,7 +3,7 @@ namespace Mosa.Compiler.Framework.Intrinsics; /// -/// IntrinsicMethods +/// Intrinsic Methods /// internal static partial class IntrinsicMethods { diff --git a/Source/Mosa.Compiler.Framework/Intrinsics/StoreR8.cs b/Source/Mosa.Compiler.Framework/Intrinsics/StoreR8.cs index 52955df887..c9a5c9c22b 100644 --- a/Source/Mosa.Compiler.Framework/Intrinsics/StoreR8.cs +++ b/Source/Mosa.Compiler.Framework/Intrinsics/StoreR8.cs @@ -3,7 +3,7 @@ namespace Mosa.Compiler.Framework.Intrinsics; /// -/// IntrinsicMethods +/// Intrinsic Methods /// internal static partial class IntrinsicMethods { diff --git a/Source/Mosa.Compiler.Framework/Intrinsics/SuppressStackFrame.cs b/Source/Mosa.Compiler.Framework/Intrinsics/SuppressStackFrame.cs index 3bffa208d4..e91eedbccd 100644 --- a/Source/Mosa.Compiler.Framework/Intrinsics/SuppressStackFrame.cs +++ b/Source/Mosa.Compiler.Framework/Intrinsics/SuppressStackFrame.cs @@ -5,7 +5,7 @@ namespace Mosa.Compiler.x86.Intrinsic; /// -/// IntrinsicMethods +/// Intrinsic Methods /// internal static partial class IntrinsicMethods { diff --git a/Source/Mosa.Compiler.Framework/Stubs/ByReference.cs b/Source/Mosa.Compiler.Framework/Stubs/ByReference.cs index 9a2b60f986..bf236dddfd 100644 --- a/Source/Mosa.Compiler.Framework/Stubs/ByReference.cs +++ b/Source/Mosa.Compiler.Framework/Stubs/ByReference.cs @@ -5,7 +5,7 @@ namespace Mosa.Compiler.Framework.Intrinsics; /// -/// IntrinsicMethods +/// Intrinsic Methods /// internal static partial class StubMethods { diff --git a/Source/Mosa.Compiler.Framework/Stubs/RuntimeHelpers.cs b/Source/Mosa.Compiler.Framework/Stubs/RuntimeHelpers.cs index bfdaee250b..a5d6aee031 100644 --- a/Source/Mosa.Compiler.Framework/Stubs/RuntimeHelpers.cs +++ b/Source/Mosa.Compiler.Framework/Stubs/RuntimeHelpers.cs @@ -3,7 +3,7 @@ namespace Mosa.Compiler.Framework.Intrinsics; /// -/// IntrinsicMethods +/// Intrinsic Methods /// internal static partial class StubMethods { diff --git a/Source/Mosa.Compiler.Framework/Stubs/Unsafe.cs b/Source/Mosa.Compiler.Framework/Stubs/Unsafe.cs index fe70bb968b..8975338a7b 100644 --- a/Source/Mosa.Compiler.Framework/Stubs/Unsafe.cs +++ b/Source/Mosa.Compiler.Framework/Stubs/Unsafe.cs @@ -5,7 +5,7 @@ namespace Mosa.Compiler.Framework.Intrinsics; /// -/// IntrinsicMethods +/// Intrinsic Methods /// internal static partial class StubMethods { diff --git a/Source/Mosa.Compiler.x64/Intrinsic/AllocateStackSpace.cs b/Source/Mosa.Compiler.x64/Intrinsic/AllocateStackSpace.cs index 989d9fb47f..ec37f52737 100644 --- a/Source/Mosa.Compiler.x64/Intrinsic/AllocateStackSpace.cs +++ b/Source/Mosa.Compiler.x64/Intrinsic/AllocateStackSpace.cs @@ -5,7 +5,7 @@ namespace Mosa.Compiler.x64.Intrinsic; /// -/// IntrinsicMethods +/// Intrinsic Methods /// internal static partial class IntrinsicMethods { diff --git a/Source/Mosa.Compiler.x64/Intrinsic/Blsr32.cs b/Source/Mosa.Compiler.x64/Intrinsic/Blsr32.cs index 2655f553ef..3ed6bde561 100644 --- a/Source/Mosa.Compiler.x64/Intrinsic/Blsr32.cs +++ b/Source/Mosa.Compiler.x64/Intrinsic/Blsr32.cs @@ -5,7 +5,7 @@ namespace Mosa.Compiler.x64.Intrinsic; /// -/// IntrinsicMethods +/// Intrinsic Methods /// internal static partial class IntrinsicMethods { diff --git a/Source/Mosa.Compiler.x64/Intrinsic/Blsr64.cs b/Source/Mosa.Compiler.x64/Intrinsic/Blsr64.cs index 69206c0fdc..5934abbf71 100644 --- a/Source/Mosa.Compiler.x64/Intrinsic/Blsr64.cs +++ b/Source/Mosa.Compiler.x64/Intrinsic/Blsr64.cs @@ -5,7 +5,7 @@ namespace Mosa.Compiler.x64.Intrinsic; /// -/// IntrinsicMethods +/// Intrinsic Methods /// internal static partial class IntrinsicMethods { diff --git a/Source/Mosa.Compiler.x64/Intrinsic/BochsDebug.cs b/Source/Mosa.Compiler.x64/Intrinsic/BochsDebug.cs index 0e3b9226f3..fc90e4248f 100644 --- a/Source/Mosa.Compiler.x64/Intrinsic/BochsDebug.cs +++ b/Source/Mosa.Compiler.x64/Intrinsic/BochsDebug.cs @@ -5,7 +5,7 @@ namespace Mosa.Compiler.x64.Intrinsic; /// -/// IntrinsicMethods +/// Intrinsic Methods /// internal static partial class IntrinsicMethods { diff --git a/Source/Mosa.Compiler.x64/Intrinsic/Call.cs b/Source/Mosa.Compiler.x64/Intrinsic/Call.cs index 5887d47970..4e9b3584b5 100644 --- a/Source/Mosa.Compiler.x64/Intrinsic/Call.cs +++ b/Source/Mosa.Compiler.x64/Intrinsic/Call.cs @@ -5,7 +5,7 @@ namespace Mosa.Compiler.x64.Intrinsic; /// -/// IntrinsicMethods +/// Intrinsic Methods /// internal static partial class IntrinsicMethods { diff --git a/Source/Mosa.Compiler.x64/Intrinsic/Cli.cs b/Source/Mosa.Compiler.x64/Intrinsic/Cli.cs index 06065d1270..407adbd7eb 100644 --- a/Source/Mosa.Compiler.x64/Intrinsic/Cli.cs +++ b/Source/Mosa.Compiler.x64/Intrinsic/Cli.cs @@ -5,7 +5,7 @@ namespace Mosa.Compiler.x64.Intrinsic; /// -/// IntrinsicMethods +/// Intrinsic Methods /// internal static partial class IntrinsicMethods { diff --git a/Source/Mosa.Compiler.x64/Intrinsic/CmpXChgLoad64.cs b/Source/Mosa.Compiler.x64/Intrinsic/CmpXChgLoad64.cs index ff3566fc9d..287cd540da 100644 --- a/Source/Mosa.Compiler.x64/Intrinsic/CmpXChgLoad64.cs +++ b/Source/Mosa.Compiler.x64/Intrinsic/CmpXChgLoad64.cs @@ -5,7 +5,7 @@ namespace Mosa.Compiler.x64.Intrinsic; /// -/// IntrinsicMethods +/// Intrinsic Methods /// internal static partial class IntrinsicMethods { diff --git a/Source/Mosa.Compiler.x64/Intrinsic/CpuIdRAX.cs b/Source/Mosa.Compiler.x64/Intrinsic/CpuIdRAX.cs index 86354cef57..c75ffe0291 100644 --- a/Source/Mosa.Compiler.x64/Intrinsic/CpuIdRAX.cs +++ b/Source/Mosa.Compiler.x64/Intrinsic/CpuIdRAX.cs @@ -5,7 +5,7 @@ namespace Mosa.Compiler.x64.Intrinsic; /// -/// IntrinsicMethods +/// Intrinsic Methods /// internal static partial class IntrinsicMethods { diff --git a/Source/Mosa.Compiler.x64/Intrinsic/CpuIdRBX.cs b/Source/Mosa.Compiler.x64/Intrinsic/CpuIdRBX.cs index da05e73f51..78e6ba133c 100644 --- a/Source/Mosa.Compiler.x64/Intrinsic/CpuIdRBX.cs +++ b/Source/Mosa.Compiler.x64/Intrinsic/CpuIdRBX.cs @@ -5,7 +5,7 @@ namespace Mosa.Compiler.x64.Intrinsic; /// -/// IntrinsicMethods +/// Intrinsic Methods /// internal static partial class IntrinsicMethods { diff --git a/Source/Mosa.Compiler.x64/Intrinsic/CpuIdRCX.cs b/Source/Mosa.Compiler.x64/Intrinsic/CpuIdRCX.cs index a9f39c4527..7d77e1bcc4 100644 --- a/Source/Mosa.Compiler.x64/Intrinsic/CpuIdRCX.cs +++ b/Source/Mosa.Compiler.x64/Intrinsic/CpuIdRCX.cs @@ -5,7 +5,7 @@ namespace Mosa.Compiler.x64.Intrinsic; /// -/// IntrinsicMethods +/// Intrinsic Methods /// internal static partial class IntrinsicMethods { diff --git a/Source/Mosa.Compiler.x64/Intrinsic/CpuIdRDX.cs b/Source/Mosa.Compiler.x64/Intrinsic/CpuIdRDX.cs index e6b7487f4b..ab8e83df25 100644 --- a/Source/Mosa.Compiler.x64/Intrinsic/CpuIdRDX.cs +++ b/Source/Mosa.Compiler.x64/Intrinsic/CpuIdRDX.cs @@ -5,7 +5,7 @@ namespace Mosa.Compiler.x64.Intrinsic; /// -/// IntrinsicMethods +/// Intrinsic Methods /// internal static partial class IntrinsicMethods { diff --git a/Source/Mosa.Compiler.x64/Intrinsic/Div.cs b/Source/Mosa.Compiler.x64/Intrinsic/Div.cs index cdb9293700..c8131cce57 100644 --- a/Source/Mosa.Compiler.x64/Intrinsic/Div.cs +++ b/Source/Mosa.Compiler.x64/Intrinsic/Div.cs @@ -5,7 +5,7 @@ namespace Mosa.Compiler.x64.Intrinsic; /// -/// IntrinsicMethods +/// Intrinsic Methods /// internal static partial class IntrinsicMethods { diff --git a/Source/Mosa.Compiler.x64/Intrinsic/FrameCall.cs b/Source/Mosa.Compiler.x64/Intrinsic/FrameCall.cs index acf6176284..1fad663379 100644 --- a/Source/Mosa.Compiler.x64/Intrinsic/FrameCall.cs +++ b/Source/Mosa.Compiler.x64/Intrinsic/FrameCall.cs @@ -5,7 +5,7 @@ namespace Mosa.Compiler.x64.Intrinsic; /// -/// IntrinsicMethods +/// Intrinsic Methods /// internal static partial class IntrinsicMethods { diff --git a/Source/Mosa.Compiler.x64/Intrinsic/FrameCallRetR8.cs b/Source/Mosa.Compiler.x64/Intrinsic/FrameCallRetR8.cs index eafb916dc6..9ded69f9ea 100644 --- a/Source/Mosa.Compiler.x64/Intrinsic/FrameCallRetR8.cs +++ b/Source/Mosa.Compiler.x64/Intrinsic/FrameCallRetR8.cs @@ -5,7 +5,7 @@ namespace Mosa.Compiler.x64.Intrinsic; /// -/// IntrinsicMethods +/// Intrinsic Methods /// internal static partial class IntrinsicMethods { diff --git a/Source/Mosa.Compiler.x64/Intrinsic/FrameCallRetU8.cs b/Source/Mosa.Compiler.x64/Intrinsic/FrameCallRetU8.cs index f4d9f999f0..9b3cffd01d 100644 --- a/Source/Mosa.Compiler.x64/Intrinsic/FrameCallRetU8.cs +++ b/Source/Mosa.Compiler.x64/Intrinsic/FrameCallRetU8.cs @@ -5,7 +5,7 @@ namespace Mosa.Compiler.x64.Intrinsic; /// -/// IntrinsicMethods +/// Intrinsic Methods /// internal static partial class IntrinsicMethods { diff --git a/Source/Mosa.Compiler.x64/Intrinsic/FrameJump.cs b/Source/Mosa.Compiler.x64/Intrinsic/FrameJump.cs index 67c25ec59a..851ea53f2d 100644 --- a/Source/Mosa.Compiler.x64/Intrinsic/FrameJump.cs +++ b/Source/Mosa.Compiler.x64/Intrinsic/FrameJump.cs @@ -5,7 +5,7 @@ namespace Mosa.Compiler.x64.Intrinsic; /// -/// IntrinsicMethods +/// Intrinsic Methods /// internal static partial class IntrinsicMethods { diff --git a/Source/Mosa.Compiler.x64/Intrinsic/Get16.cs b/Source/Mosa.Compiler.x64/Intrinsic/Get16.cs index f760a90812..e70b4803ab 100644 --- a/Source/Mosa.Compiler.x64/Intrinsic/Get16.cs +++ b/Source/Mosa.Compiler.x64/Intrinsic/Get16.cs @@ -5,7 +5,7 @@ namespace Mosa.Compiler.x64.Intrinsic; /// -/// IntrinsicMethods +/// Intrinsic Methods /// internal static partial class IntrinsicMethods { diff --git a/Source/Mosa.Compiler.x64/Intrinsic/Get32.cs b/Source/Mosa.Compiler.x64/Intrinsic/Get32.cs index b9f25c2c5e..8865142513 100644 --- a/Source/Mosa.Compiler.x64/Intrinsic/Get32.cs +++ b/Source/Mosa.Compiler.x64/Intrinsic/Get32.cs @@ -5,7 +5,7 @@ namespace Mosa.Compiler.x64.Intrinsic; /// -/// IntrinsicMethods +/// Intrinsic Methods /// internal static partial class IntrinsicMethods { diff --git a/Source/Mosa.Compiler.x64/Intrinsic/Get64.cs b/Source/Mosa.Compiler.x64/Intrinsic/Get64.cs index 1e21192334..1bfd7c36e0 100644 --- a/Source/Mosa.Compiler.x64/Intrinsic/Get64.cs +++ b/Source/Mosa.Compiler.x64/Intrinsic/Get64.cs @@ -5,7 +5,7 @@ namespace Mosa.Compiler.x64.Intrinsic; /// -/// IntrinsicMethods +/// Intrinsic Methods /// internal static partial class IntrinsicMethods { diff --git a/Source/Mosa.Compiler.x64/Intrinsic/Get8.cs b/Source/Mosa.Compiler.x64/Intrinsic/Get8.cs index d69beb6547..8df999f35f 100644 --- a/Source/Mosa.Compiler.x64/Intrinsic/Get8.cs +++ b/Source/Mosa.Compiler.x64/Intrinsic/Get8.cs @@ -5,7 +5,7 @@ namespace Mosa.Compiler.x64.Intrinsic; /// -/// IntrinsicMethods +/// Intrinsic Methods /// internal static partial class IntrinsicMethods { diff --git a/Source/Mosa.Compiler.x64/Intrinsic/GetCR0.cs b/Source/Mosa.Compiler.x64/Intrinsic/GetCR0.cs index 00a53317f7..898a478f67 100644 --- a/Source/Mosa.Compiler.x64/Intrinsic/GetCR0.cs +++ b/Source/Mosa.Compiler.x64/Intrinsic/GetCR0.cs @@ -5,7 +5,7 @@ namespace Mosa.Compiler.x64.Intrinsic; /// -/// IntrinsicMethods +/// Intrinsic Methods /// internal static partial class IntrinsicMethods { diff --git a/Source/Mosa.Compiler.x64/Intrinsic/GetCR2.cs b/Source/Mosa.Compiler.x64/Intrinsic/GetCR2.cs index 3026e4a169..21c5e81e82 100644 --- a/Source/Mosa.Compiler.x64/Intrinsic/GetCR2.cs +++ b/Source/Mosa.Compiler.x64/Intrinsic/GetCR2.cs @@ -5,7 +5,7 @@ namespace Mosa.Compiler.x64.Intrinsic; /// -/// IntrinsicMethods +/// Intrinsic Methods /// internal static partial class IntrinsicMethods { diff --git a/Source/Mosa.Compiler.x64/Intrinsic/GetCR3.cs b/Source/Mosa.Compiler.x64/Intrinsic/GetCR3.cs index 22a2686ff7..55fb621c4e 100644 --- a/Source/Mosa.Compiler.x64/Intrinsic/GetCR3.cs +++ b/Source/Mosa.Compiler.x64/Intrinsic/GetCR3.cs @@ -5,7 +5,7 @@ namespace Mosa.Compiler.x64.Intrinsic; /// -/// IntrinsicMethods +/// Intrinsic Methods /// internal static partial class IntrinsicMethods { diff --git a/Source/Mosa.Compiler.x64/Intrinsic/GetCR4.cs b/Source/Mosa.Compiler.x64/Intrinsic/GetCR4.cs index 8b8f8efafb..e445fbb7a6 100644 --- a/Source/Mosa.Compiler.x64/Intrinsic/GetCR4.cs +++ b/Source/Mosa.Compiler.x64/Intrinsic/GetCR4.cs @@ -5,7 +5,7 @@ namespace Mosa.Compiler.x64.Intrinsic; /// -/// IntrinsicMethods +/// Intrinsic Methods /// internal static partial class IntrinsicMethods { diff --git a/Source/Mosa.Compiler.x64/Intrinsic/GetCS.cs b/Source/Mosa.Compiler.x64/Intrinsic/GetCS.cs index 55a3781305..695c836d6f 100644 --- a/Source/Mosa.Compiler.x64/Intrinsic/GetCS.cs +++ b/Source/Mosa.Compiler.x64/Intrinsic/GetCS.cs @@ -5,7 +5,7 @@ namespace Mosa.Compiler.x64.Intrinsic; /// -/// IntrinsicMethods +/// Intrinsic Methods /// internal static partial class IntrinsicMethods { diff --git a/Source/Mosa.Compiler.x64/Intrinsic/GetFS.cs b/Source/Mosa.Compiler.x64/Intrinsic/GetFS.cs index efc79c3130..7485a395e5 100644 --- a/Source/Mosa.Compiler.x64/Intrinsic/GetFS.cs +++ b/Source/Mosa.Compiler.x64/Intrinsic/GetFS.cs @@ -5,7 +5,7 @@ namespace Mosa.Compiler.x64.Intrinsic; /// -/// IntrinsicMethods +/// Intrinsic Methods /// internal static partial class IntrinsicMethods { diff --git a/Source/Mosa.Compiler.x64/Intrinsic/GetIDTJumpLocation.cs b/Source/Mosa.Compiler.x64/Intrinsic/GetIDTJumpLocation.cs index 57a19c828d..fc485b6e61 100644 --- a/Source/Mosa.Compiler.x64/Intrinsic/GetIDTJumpLocation.cs +++ b/Source/Mosa.Compiler.x64/Intrinsic/GetIDTJumpLocation.cs @@ -7,7 +7,7 @@ namespace Mosa.Compiler.x64.Intrinsic; /// -/// IntrinsicMethods +/// Intrinsic Methods /// internal static partial class IntrinsicMethods { diff --git a/Source/Mosa.Compiler.x64/Intrinsic/GetIRQHandler.cs b/Source/Mosa.Compiler.x64/Intrinsic/GetIRQHandler.cs deleted file mode 100644 index 37e73df41c..0000000000 --- a/Source/Mosa.Compiler.x64/Intrinsic/GetIRQHandler.cs +++ /dev/null @@ -1,16 +0,0 @@ -// Copyright (c) MOSA Project. Licensed under the New BSD License. - -using Mosa.Compiler.Framework; - -namespace Mosa.Compiler.x64.Intrinsic; - -/// -/// IntrinsicMethods -/// -internal static partial class IntrinsicMethods -{ - [IntrinsicMethod("Mosa.Compiler.x64.Intrinsic::GetIRQHandler")] - private static void GetIRQHandler(Context context, Transform transform) - { - } -} diff --git a/Source/Mosa.Compiler.x64/Intrinsic/Hlt.cs b/Source/Mosa.Compiler.x64/Intrinsic/Hlt.cs index b78c787d88..aaa472194f 100644 --- a/Source/Mosa.Compiler.x64/Intrinsic/Hlt.cs +++ b/Source/Mosa.Compiler.x64/Intrinsic/Hlt.cs @@ -5,7 +5,7 @@ namespace Mosa.Compiler.x64.Intrinsic; /// -/// IntrinsicMethods +/// Intrinsic Methods /// internal static partial class IntrinsicMethods { diff --git a/Source/Mosa.Compiler.x64/Intrinsic/IRQs.cs b/Source/Mosa.Compiler.x64/Intrinsic/IRQs.cs index 6224e85670..9b74ce668f 100644 --- a/Source/Mosa.Compiler.x64/Intrinsic/IRQs.cs +++ b/Source/Mosa.Compiler.x64/Intrinsic/IRQs.cs @@ -5,7 +5,7 @@ namespace Mosa.Compiler.x64.Intrinsic; /// -/// IntrinsicMethods +/// Intrinsic Methods /// internal static partial class IntrinsicMethods { diff --git a/Source/Mosa.Compiler.x64/Intrinsic/In16.cs b/Source/Mosa.Compiler.x64/Intrinsic/In16.cs index 9ac98232a1..d3d88fe76a 100644 --- a/Source/Mosa.Compiler.x64/Intrinsic/In16.cs +++ b/Source/Mosa.Compiler.x64/Intrinsic/In16.cs @@ -5,7 +5,7 @@ namespace Mosa.Compiler.x64.Intrinsic; /// -/// IntrinsicMethods +/// Intrinsic Methods /// internal static partial class IntrinsicMethods { diff --git a/Source/Mosa.Compiler.x64/Intrinsic/In32.cs b/Source/Mosa.Compiler.x64/Intrinsic/In32.cs index 32681a0237..eec160881a 100644 --- a/Source/Mosa.Compiler.x64/Intrinsic/In32.cs +++ b/Source/Mosa.Compiler.x64/Intrinsic/In32.cs @@ -5,7 +5,7 @@ namespace Mosa.Compiler.x64.Intrinsic; /// -/// IntrinsicMethods +/// Intrinsic Methods /// internal static partial class IntrinsicMethods { diff --git a/Source/Mosa.Compiler.x64/Intrinsic/In8.cs b/Source/Mosa.Compiler.x64/Intrinsic/In8.cs index b6d5a202d7..73fcd2b3ba 100644 --- a/Source/Mosa.Compiler.x64/Intrinsic/In8.cs +++ b/Source/Mosa.Compiler.x64/Intrinsic/In8.cs @@ -5,7 +5,7 @@ namespace Mosa.Compiler.x64.Intrinsic; /// -/// IntrinsicMethods +/// Intrinsic Methods /// internal static partial class IntrinsicMethods { diff --git a/Source/Mosa.Compiler.x64/Intrinsic/Int.cs b/Source/Mosa.Compiler.x64/Intrinsic/Int.cs index c0694a694a..5f05cb7388 100644 --- a/Source/Mosa.Compiler.x64/Intrinsic/Int.cs +++ b/Source/Mosa.Compiler.x64/Intrinsic/Int.cs @@ -5,7 +5,7 @@ namespace Mosa.Compiler.x64.Intrinsic; /// -/// IntrinsicMethods +/// Intrinsic Methods /// internal static partial class IntrinsicMethods { diff --git a/Source/Mosa.Compiler.x64/Intrinsic/InterruptReturn.cs b/Source/Mosa.Compiler.x64/Intrinsic/InterruptReturn.cs index 36ce35201e..7e04bd88a3 100644 --- a/Source/Mosa.Compiler.x64/Intrinsic/InterruptReturn.cs +++ b/Source/Mosa.Compiler.x64/Intrinsic/InterruptReturn.cs @@ -5,7 +5,7 @@ namespace Mosa.Compiler.x64.Intrinsic; /// -/// IntrinsicMethods +/// Intrinsic Methods /// internal static partial class IntrinsicMethods { diff --git a/Source/Mosa.Compiler.x64/Intrinsic/Invlpg.cs b/Source/Mosa.Compiler.x64/Intrinsic/Invlpg.cs index 6546599635..4e40abdd9d 100644 --- a/Source/Mosa.Compiler.x64/Intrinsic/Invlpg.cs +++ b/Source/Mosa.Compiler.x64/Intrinsic/Invlpg.cs @@ -5,7 +5,7 @@ namespace Mosa.Compiler.x64.Intrinsic; /// -/// IntrinsicMethods +/// Intrinsic Methods /// internal static partial class IntrinsicMethods { diff --git a/Source/Mosa.Compiler.x64/Intrinsic/Jmp.cs b/Source/Mosa.Compiler.x64/Intrinsic/Jmp.cs index 106d0458c4..d3adb6d851 100644 --- a/Source/Mosa.Compiler.x64/Intrinsic/Jmp.cs +++ b/Source/Mosa.Compiler.x64/Intrinsic/Jmp.cs @@ -5,7 +5,7 @@ namespace Mosa.Compiler.x64.Intrinsic; /// -/// IntrinsicMethods +/// Intrinsic Methods /// internal static partial class IntrinsicMethods { diff --git a/Source/Mosa.Compiler.x64/Intrinsic/Lgdt.cs b/Source/Mosa.Compiler.x64/Intrinsic/Lgdt.cs index 5f45c62a5b..5ffa731c03 100644 --- a/Source/Mosa.Compiler.x64/Intrinsic/Lgdt.cs +++ b/Source/Mosa.Compiler.x64/Intrinsic/Lgdt.cs @@ -5,7 +5,7 @@ namespace Mosa.Compiler.x64.Intrinsic; /// -/// IntrinsicMethods +/// Intrinsic Methods /// internal static partial class IntrinsicMethods { diff --git a/Source/Mosa.Compiler.x64/Intrinsic/Lidt.cs b/Source/Mosa.Compiler.x64/Intrinsic/Lidt.cs index c3a7f04651..c0590c8968 100644 --- a/Source/Mosa.Compiler.x64/Intrinsic/Lidt.cs +++ b/Source/Mosa.Compiler.x64/Intrinsic/Lidt.cs @@ -5,7 +5,7 @@ namespace Mosa.Compiler.x64.Intrinsic; /// -/// IntrinsicMethods +/// Intrinsic Methods /// internal static partial class IntrinsicMethods { diff --git a/Source/Mosa.Compiler.x64/Intrinsic/Memclr256.cs b/Source/Mosa.Compiler.x64/Intrinsic/Memclr256.cs index 8fd481e650..8b60248f14 100644 --- a/Source/Mosa.Compiler.x64/Intrinsic/Memclr256.cs +++ b/Source/Mosa.Compiler.x64/Intrinsic/Memclr256.cs @@ -5,7 +5,7 @@ namespace Mosa.Compiler.x64.Intrinsic; /// -/// IntrinsicMethods +/// Intrinsic Methods /// internal static partial class IntrinsicMethods { diff --git a/Source/Mosa.Compiler.x64/Intrinsic/Memcpy256.cs b/Source/Mosa.Compiler.x64/Intrinsic/Memcpy256.cs index d398c16f51..4159a7f1a7 100644 --- a/Source/Mosa.Compiler.x64/Intrinsic/Memcpy256.cs +++ b/Source/Mosa.Compiler.x64/Intrinsic/Memcpy256.cs @@ -5,7 +5,7 @@ namespace Mosa.Compiler.x64.Intrinsic; /// -/// IntrinsicMethods +/// Intrinsic Methods /// internal static partial class IntrinsicMethods { diff --git a/Source/Mosa.Compiler.x64/Intrinsic/Nop.cs b/Source/Mosa.Compiler.x64/Intrinsic/Nop.cs index eaa23dc7dc..9a18750e6c 100644 --- a/Source/Mosa.Compiler.x64/Intrinsic/Nop.cs +++ b/Source/Mosa.Compiler.x64/Intrinsic/Nop.cs @@ -5,7 +5,7 @@ namespace Mosa.Compiler.x64.Intrinsic; /// -/// IntrinsicMethods +/// Intrinsic Methods /// internal static partial class IntrinsicMethods { diff --git a/Source/Mosa.Compiler.x64/Intrinsic/Out16.cs b/Source/Mosa.Compiler.x64/Intrinsic/Out16.cs index ee6de40722..3e59e4a6b1 100644 --- a/Source/Mosa.Compiler.x64/Intrinsic/Out16.cs +++ b/Source/Mosa.Compiler.x64/Intrinsic/Out16.cs @@ -5,7 +5,7 @@ namespace Mosa.Compiler.x64.Intrinsic; /// -/// IntrinsicMethods +/// Intrinsic Methods /// internal static partial class IntrinsicMethods { diff --git a/Source/Mosa.Compiler.x64/Intrinsic/Out32.cs b/Source/Mosa.Compiler.x64/Intrinsic/Out32.cs index 9445f3fadc..4a59dd9621 100644 --- a/Source/Mosa.Compiler.x64/Intrinsic/Out32.cs +++ b/Source/Mosa.Compiler.x64/Intrinsic/Out32.cs @@ -5,7 +5,7 @@ namespace Mosa.Compiler.x64.Intrinsic; /// -/// IntrinsicMethods +/// Intrinsic Methods /// internal static partial class IntrinsicMethods { diff --git a/Source/Mosa.Compiler.x64/Intrinsic/Out8.cs b/Source/Mosa.Compiler.x64/Intrinsic/Out8.cs index a5328ede74..cf234501da 100644 --- a/Source/Mosa.Compiler.x64/Intrinsic/Out8.cs +++ b/Source/Mosa.Compiler.x64/Intrinsic/Out8.cs @@ -5,7 +5,7 @@ namespace Mosa.Compiler.x64.Intrinsic; /// -/// IntrinsicMethods +/// Intrinsic Methods /// internal static partial class IntrinsicMethods { diff --git a/Source/Mosa.Compiler.x64/Intrinsic/Pause.cs b/Source/Mosa.Compiler.x64/Intrinsic/Pause.cs index af051b348a..a8155df3e9 100644 --- a/Source/Mosa.Compiler.x64/Intrinsic/Pause.cs +++ b/Source/Mosa.Compiler.x64/Intrinsic/Pause.cs @@ -5,7 +5,7 @@ namespace Mosa.Compiler.x64.Intrinsic; /// -/// IntrinsicMethods +/// Intrinsic Methods /// internal static partial class IntrinsicMethods { diff --git a/Source/Mosa.Compiler.x64/Intrinsic/RdMSR.cs b/Source/Mosa.Compiler.x64/Intrinsic/RdMSR.cs index 787e255dff..95585567ce 100644 --- a/Source/Mosa.Compiler.x64/Intrinsic/RdMSR.cs +++ b/Source/Mosa.Compiler.x64/Intrinsic/RdMSR.cs @@ -5,7 +5,7 @@ namespace Mosa.Compiler.x64.Intrinsic; /// -/// IntrinsicMethods +/// Intrinsic Methods /// internal static partial class IntrinsicMethods { diff --git a/Source/Mosa.Compiler.x64/Intrinsic/Remainder.cs b/Source/Mosa.Compiler.x64/Intrinsic/Remainder.cs index f61649f0c1..5fdbd0b4ed 100644 --- a/Source/Mosa.Compiler.x64/Intrinsic/Remainder.cs +++ b/Source/Mosa.Compiler.x64/Intrinsic/Remainder.cs @@ -5,7 +5,7 @@ namespace Mosa.Compiler.x64.Intrinsic; /// -/// IntrinsicMethods +/// Intrinsic Methods /// internal static partial class IntrinsicMethods { diff --git a/Source/Mosa.Compiler.x64/Intrinsic/Roundsd2Negative.cs b/Source/Mosa.Compiler.x64/Intrinsic/Roundsd2Negative.cs index b2103081e5..3b467c4bd7 100644 --- a/Source/Mosa.Compiler.x64/Intrinsic/Roundsd2Negative.cs +++ b/Source/Mosa.Compiler.x64/Intrinsic/Roundsd2Negative.cs @@ -5,7 +5,7 @@ namespace Mosa.Compiler.x64.Intrinsic; /// -/// IntrinsicMethods +/// Intrinsic Methods /// internal static partial class IntrinsicMethods { diff --git a/Source/Mosa.Compiler.x64/Intrinsic/Roundsd2Positive.cs b/Source/Mosa.Compiler.x64/Intrinsic/Roundsd2Positive.cs index a7074c79ba..229e6398c2 100644 --- a/Source/Mosa.Compiler.x64/Intrinsic/Roundsd2Positive.cs +++ b/Source/Mosa.Compiler.x64/Intrinsic/Roundsd2Positive.cs @@ -5,7 +5,7 @@ namespace Mosa.Compiler.x64.Intrinsic; /// -/// IntrinsicMethods +/// Intrinsic Methods /// internal static partial class IntrinsicMethods { diff --git a/Source/Mosa.Compiler.x64/Intrinsic/Roundss2Negative.cs b/Source/Mosa.Compiler.x64/Intrinsic/Roundss2Negative.cs index d14fda845b..b1adc8e74a 100644 --- a/Source/Mosa.Compiler.x64/Intrinsic/Roundss2Negative.cs +++ b/Source/Mosa.Compiler.x64/Intrinsic/Roundss2Negative.cs @@ -5,7 +5,7 @@ namespace Mosa.Compiler.x64.Intrinsic; /// -/// IntrinsicMethods +/// Intrinsic Methods /// internal static partial class IntrinsicMethods { diff --git a/Source/Mosa.Compiler.x64/Intrinsic/Roundss2Positive.cs b/Source/Mosa.Compiler.x64/Intrinsic/Roundss2Positive.cs index 88ead30d44..fd4328412c 100644 --- a/Source/Mosa.Compiler.x64/Intrinsic/Roundss2Positive.cs +++ b/Source/Mosa.Compiler.x64/Intrinsic/Roundss2Positive.cs @@ -5,7 +5,7 @@ namespace Mosa.Compiler.x64.Intrinsic; /// -/// IntrinsicMethods +/// Intrinsic Methods /// internal static partial class IntrinsicMethods { diff --git a/Source/Mosa.Compiler.x64/Intrinsic/Set16.cs b/Source/Mosa.Compiler.x64/Intrinsic/Set16.cs index b68bb435b4..347cb0d2f9 100644 --- a/Source/Mosa.Compiler.x64/Intrinsic/Set16.cs +++ b/Source/Mosa.Compiler.x64/Intrinsic/Set16.cs @@ -5,7 +5,7 @@ namespace Mosa.Compiler.x64.Intrinsic; /// -/// IntrinsicMethods +/// Intrinsic Methods /// internal static partial class IntrinsicMethods { diff --git a/Source/Mosa.Compiler.x64/Intrinsic/Set32.cs b/Source/Mosa.Compiler.x64/Intrinsic/Set32.cs index 055bcb82a1..a1c3bb6ecf 100644 --- a/Source/Mosa.Compiler.x64/Intrinsic/Set32.cs +++ b/Source/Mosa.Compiler.x64/Intrinsic/Set32.cs @@ -5,7 +5,7 @@ namespace Mosa.Compiler.x64.Intrinsic; /// -/// IntrinsicMethods +/// Intrinsic Methods /// internal static partial class IntrinsicMethods { diff --git a/Source/Mosa.Compiler.x64/Intrinsic/Set8.cs b/Source/Mosa.Compiler.x64/Intrinsic/Set8.cs index 9afadcde0d..d4367fc37e 100644 --- a/Source/Mosa.Compiler.x64/Intrinsic/Set8.cs +++ b/Source/Mosa.Compiler.x64/Intrinsic/Set8.cs @@ -5,7 +5,7 @@ namespace Mosa.Compiler.x64.Intrinsic; /// -/// IntrinsicMethods +/// Intrinsic Methods /// internal static partial class IntrinsicMethods { diff --git a/Source/Mosa.Compiler.x64/Intrinsic/SetCR0.cs b/Source/Mosa.Compiler.x64/Intrinsic/SetCR0.cs index ebd0eae410..c25d7ac411 100644 --- a/Source/Mosa.Compiler.x64/Intrinsic/SetCR0.cs +++ b/Source/Mosa.Compiler.x64/Intrinsic/SetCR0.cs @@ -5,7 +5,7 @@ namespace Mosa.Compiler.x64.Intrinsic; /// -/// IntrinsicMethods +/// Intrinsic Methods /// internal static partial class IntrinsicMethods { diff --git a/Source/Mosa.Compiler.x64/Intrinsic/SetCR2.cs b/Source/Mosa.Compiler.x64/Intrinsic/SetCR2.cs index aaf2725fcb..e74220057a 100644 --- a/Source/Mosa.Compiler.x64/Intrinsic/SetCR2.cs +++ b/Source/Mosa.Compiler.x64/Intrinsic/SetCR2.cs @@ -5,7 +5,7 @@ namespace Mosa.Compiler.x64.Intrinsic; /// -/// IntrinsicMethods +/// Intrinsic Methods /// internal static partial class IntrinsicMethods { diff --git a/Source/Mosa.Compiler.x64/Intrinsic/SetCR3.cs b/Source/Mosa.Compiler.x64/Intrinsic/SetCR3.cs index 40c7ac09dd..210a946cc7 100644 --- a/Source/Mosa.Compiler.x64/Intrinsic/SetCR3.cs +++ b/Source/Mosa.Compiler.x64/Intrinsic/SetCR3.cs @@ -5,7 +5,7 @@ namespace Mosa.Compiler.x64.Intrinsic; /// -/// IntrinsicMethods +/// Intrinsic Methods /// internal static partial class IntrinsicMethods { diff --git a/Source/Mosa.Compiler.x64/Intrinsic/SetCR4.cs b/Source/Mosa.Compiler.x64/Intrinsic/SetCR4.cs index 8266ae3c89..103d12f88b 100644 --- a/Source/Mosa.Compiler.x64/Intrinsic/SetCR4.cs +++ b/Source/Mosa.Compiler.x64/Intrinsic/SetCR4.cs @@ -5,7 +5,7 @@ namespace Mosa.Compiler.x64.Intrinsic; /// -/// IntrinsicMethods +/// Intrinsic Methods /// internal static partial class IntrinsicMethods { diff --git a/Source/Mosa.Compiler.x64/Intrinsic/SetFS.cs b/Source/Mosa.Compiler.x64/Intrinsic/SetFS.cs index 382af3e9ed..b625b0bf13 100644 --- a/Source/Mosa.Compiler.x64/Intrinsic/SetFS.cs +++ b/Source/Mosa.Compiler.x64/Intrinsic/SetFS.cs @@ -5,7 +5,7 @@ namespace Mosa.Compiler.x64.Intrinsic; /// -/// IntrinsicMethods +/// Intrinsic Methods /// internal static partial class IntrinsicMethods { diff --git a/Source/Mosa.Compiler.x64/Intrinsic/SetSegments.cs b/Source/Mosa.Compiler.x64/Intrinsic/SetSegments.cs index b51de8c012..d4c0815de7 100644 --- a/Source/Mosa.Compiler.x64/Intrinsic/SetSegments.cs +++ b/Source/Mosa.Compiler.x64/Intrinsic/SetSegments.cs @@ -5,7 +5,7 @@ namespace Mosa.Compiler.x64.Intrinsic; /// -/// IntrinsicMethods +/// Intrinsic Methods /// internal static partial class IntrinsicMethods { diff --git a/Source/Mosa.Compiler.x64/Intrinsic/Sqrtsd.cs b/Source/Mosa.Compiler.x64/Intrinsic/Sqrtsd.cs index f66b43be4e..85f76c5726 100644 --- a/Source/Mosa.Compiler.x64/Intrinsic/Sqrtsd.cs +++ b/Source/Mosa.Compiler.x64/Intrinsic/Sqrtsd.cs @@ -5,7 +5,7 @@ namespace Mosa.Compiler.x64.Intrinsic; /// -/// IntrinsicMethods +/// Intrinsic Methods /// internal static partial class IntrinsicMethods { diff --git a/Source/Mosa.Compiler.x64/Intrinsic/Sqrtss.cs b/Source/Mosa.Compiler.x64/Intrinsic/Sqrtss.cs index 27931fb942..cf70372a8e 100644 --- a/Source/Mosa.Compiler.x64/Intrinsic/Sqrtss.cs +++ b/Source/Mosa.Compiler.x64/Intrinsic/Sqrtss.cs @@ -5,7 +5,7 @@ namespace Mosa.Compiler.x64.Intrinsic; /// -/// IntrinsicMethods +/// Intrinsic Methods /// internal static partial class IntrinsicMethods { diff --git a/Source/Mosa.Compiler.x64/Intrinsic/Sti.cs b/Source/Mosa.Compiler.x64/Intrinsic/Sti.cs index 9e25327744..38d0db6b6f 100644 --- a/Source/Mosa.Compiler.x64/Intrinsic/Sti.cs +++ b/Source/Mosa.Compiler.x64/Intrinsic/Sti.cs @@ -5,7 +5,7 @@ namespace Mosa.Compiler.x64.Intrinsic; /// -/// IntrinsicMethods +/// Intrinsic Methods /// internal static partial class IntrinsicMethods { diff --git a/Source/Mosa.Compiler.x64/Intrinsic/WrMSR.cs b/Source/Mosa.Compiler.x64/Intrinsic/WrMSR.cs index e10497408e..62e12beae7 100644 --- a/Source/Mosa.Compiler.x64/Intrinsic/WrMSR.cs +++ b/Source/Mosa.Compiler.x64/Intrinsic/WrMSR.cs @@ -5,7 +5,7 @@ namespace Mosa.Compiler.x64.Intrinsic; /// -/// IntrinsicMethods +/// Intrinsic Methods /// internal static partial class IntrinsicMethods { diff --git a/Source/Mosa.Compiler.x64/Intrinsic/XAddLoad32.cs b/Source/Mosa.Compiler.x64/Intrinsic/XAddLoad32.cs index f48fe25e0e..3ab250753f 100644 --- a/Source/Mosa.Compiler.x64/Intrinsic/XAddLoad32.cs +++ b/Source/Mosa.Compiler.x64/Intrinsic/XAddLoad32.cs @@ -5,7 +5,7 @@ namespace Mosa.Compiler.x64.Intrinsic; /// -/// IntrinsicMethods +/// Intrinsic Methods /// internal static partial class IntrinsicMethods { diff --git a/Source/Mosa.Compiler.x64/Intrinsic/XAddLoad64.cs b/Source/Mosa.Compiler.x64/Intrinsic/XAddLoad64.cs index 89fa3102bb..5cbddce3d2 100644 --- a/Source/Mosa.Compiler.x64/Intrinsic/XAddLoad64.cs +++ b/Source/Mosa.Compiler.x64/Intrinsic/XAddLoad64.cs @@ -5,7 +5,7 @@ namespace Mosa.Compiler.x64.Intrinsic; /// -/// IntrinsicMethods +/// Intrinsic Methods /// internal static partial class IntrinsicMethods { diff --git a/Source/Mosa.Compiler.x64/Intrinsic/XChgLoad32.cs b/Source/Mosa.Compiler.x64/Intrinsic/XChgLoad32.cs index f6031b84b7..aae7955c44 100644 --- a/Source/Mosa.Compiler.x64/Intrinsic/XChgLoad32.cs +++ b/Source/Mosa.Compiler.x64/Intrinsic/XChgLoad32.cs @@ -5,7 +5,7 @@ namespace Mosa.Compiler.x64.Intrinsic; /// -/// IntrinsicMethods +/// Intrinsic Methods /// internal static partial class IntrinsicMethods { diff --git a/Source/Mosa.Compiler.x64/Intrinsic/XChgLoad64.cs b/Source/Mosa.Compiler.x64/Intrinsic/XChgLoad64.cs index 8e5c6e80d1..2d5b700e93 100644 --- a/Source/Mosa.Compiler.x64/Intrinsic/XChgLoad64.cs +++ b/Source/Mosa.Compiler.x64/Intrinsic/XChgLoad64.cs @@ -5,7 +5,7 @@ namespace Mosa.Compiler.x64.Intrinsic; /// -/// IntrinsicMethods +/// Intrinsic Methods /// internal static partial class IntrinsicMethods { diff --git a/Source/Mosa.Compiler.x86/Intrinsic/AllocateStackSpace.cs b/Source/Mosa.Compiler.x86/Intrinsic/AllocateStackSpace.cs index ba2447f2cd..af2bf35513 100644 --- a/Source/Mosa.Compiler.x86/Intrinsic/AllocateStackSpace.cs +++ b/Source/Mosa.Compiler.x86/Intrinsic/AllocateStackSpace.cs @@ -5,17 +5,17 @@ namespace Mosa.Compiler.x86.Intrinsic; /// -/// IntrinsicMethods +/// Intrinsic Methods /// internal static partial class IntrinsicMethods { [IntrinsicMethod("Mosa.Compiler.x86.Intrinsic::AllocateStackSpace")] private static void AllocateStackSpace(Context context, Transform transform) { - Operand result = context.Result; - Operand size = context.Operand1; + var result = context.Result; + var size = context.Operand1; - Operand esp = transform.PhysicalRegisters.Allocate32(CPURegister.ESP); + var esp = transform.PhysicalRegisters.Allocate32(CPURegister.ESP); context.SetInstruction(X86.Sub32, esp, esp, size); context.AppendInstruction(X86.Mov32, result, esp); diff --git a/Source/Mosa.Compiler.x86/Intrinsic/Blsr32.cs b/Source/Mosa.Compiler.x86/Intrinsic/Blsr32.cs index 82a627d38a..5bb8536f38 100644 --- a/Source/Mosa.Compiler.x86/Intrinsic/Blsr32.cs +++ b/Source/Mosa.Compiler.x86/Intrinsic/Blsr32.cs @@ -5,7 +5,7 @@ namespace Mosa.Compiler.x86.Intrinsic; /// -/// IntrinsicMethods +/// Intrinsic Methods /// internal static partial class IntrinsicMethods { diff --git a/Source/Mosa.Compiler.x86/Intrinsic/BochsDebug.cs b/Source/Mosa.Compiler.x86/Intrinsic/BochsDebug.cs index ed0640fc63..91c99e7b93 100644 --- a/Source/Mosa.Compiler.x86/Intrinsic/BochsDebug.cs +++ b/Source/Mosa.Compiler.x86/Intrinsic/BochsDebug.cs @@ -5,7 +5,7 @@ namespace Mosa.Compiler.x86.Intrinsic; /// -/// IntrinsicMethods +/// Intrinsic Methods /// internal static partial class IntrinsicMethods { diff --git a/Source/Mosa.Compiler.x86/Intrinsic/Cli.cs b/Source/Mosa.Compiler.x86/Intrinsic/Cli.cs index a779320fb9..acb06d418d 100644 --- a/Source/Mosa.Compiler.x86/Intrinsic/Cli.cs +++ b/Source/Mosa.Compiler.x86/Intrinsic/Cli.cs @@ -5,7 +5,7 @@ namespace Mosa.Compiler.x86.Intrinsic; /// -/// IntrinsicMethods +/// Intrinsic Methods /// internal static partial class IntrinsicMethods { diff --git a/Source/Mosa.Compiler.x86/Intrinsic/CmpXChgLoad32.cs b/Source/Mosa.Compiler.x86/Intrinsic/CmpXChgLoad32.cs index 3847293f87..09b4dff814 100644 --- a/Source/Mosa.Compiler.x86/Intrinsic/CmpXChgLoad32.cs +++ b/Source/Mosa.Compiler.x86/Intrinsic/CmpXChgLoad32.cs @@ -5,7 +5,7 @@ namespace Mosa.Compiler.x86.Intrinsic; /// -/// IntrinsicMethods +/// Intrinsic Methods /// internal static partial class IntrinsicMethods { diff --git a/Source/Mosa.Compiler.x86/Intrinsic/CpuIdEax.cs b/Source/Mosa.Compiler.x86/Intrinsic/CpuIdEax.cs index 6c9f670b57..c8e3179fc0 100644 --- a/Source/Mosa.Compiler.x86/Intrinsic/CpuIdEax.cs +++ b/Source/Mosa.Compiler.x86/Intrinsic/CpuIdEax.cs @@ -5,7 +5,7 @@ namespace Mosa.Compiler.x86.Intrinsic; /// -/// IntrinsicMethods +/// Intrinsic Methods /// internal static partial class IntrinsicMethods { diff --git a/Source/Mosa.Compiler.x86/Intrinsic/CpuIdEbx.cs b/Source/Mosa.Compiler.x86/Intrinsic/CpuIdEbx.cs index 6ecf46ee2c..4254cee549 100644 --- a/Source/Mosa.Compiler.x86/Intrinsic/CpuIdEbx.cs +++ b/Source/Mosa.Compiler.x86/Intrinsic/CpuIdEbx.cs @@ -5,7 +5,7 @@ namespace Mosa.Compiler.x86.Intrinsic; /// -/// IntrinsicMethods +/// Intrinsic Methods /// internal static partial class IntrinsicMethods { diff --git a/Source/Mosa.Compiler.x86/Intrinsic/CpuIdEcx.cs b/Source/Mosa.Compiler.x86/Intrinsic/CpuIdEcx.cs index c95596e5ad..3a60133930 100644 --- a/Source/Mosa.Compiler.x86/Intrinsic/CpuIdEcx.cs +++ b/Source/Mosa.Compiler.x86/Intrinsic/CpuIdEcx.cs @@ -5,7 +5,7 @@ namespace Mosa.Compiler.x86.Intrinsic; /// -/// IntrinsicMethods +/// Intrinsic Methods /// internal static partial class IntrinsicMethods { diff --git a/Source/Mosa.Compiler.x86/Intrinsic/CpuIdEdx.cs b/Source/Mosa.Compiler.x86/Intrinsic/CpuIdEdx.cs index af7636846d..1fcd09bedb 100644 --- a/Source/Mosa.Compiler.x86/Intrinsic/CpuIdEdx.cs +++ b/Source/Mosa.Compiler.x86/Intrinsic/CpuIdEdx.cs @@ -5,7 +5,7 @@ namespace Mosa.Compiler.x86.Intrinsic; /// -/// IntrinsicMethods +/// Intrinsic Methods /// internal static partial class IntrinsicMethods { diff --git a/Source/Mosa.Compiler.x86/Intrinsic/Div.cs b/Source/Mosa.Compiler.x86/Intrinsic/Div.cs index 9fd525ce88..03850768b7 100644 --- a/Source/Mosa.Compiler.x86/Intrinsic/Div.cs +++ b/Source/Mosa.Compiler.x86/Intrinsic/Div.cs @@ -5,7 +5,7 @@ namespace Mosa.Compiler.x86.Intrinsic; /// -/// IntrinsicMethods +/// Intrinsic Methods /// internal static partial class IntrinsicMethods { diff --git a/Source/Mosa.Compiler.x86/Intrinsic/FarJump.cs b/Source/Mosa.Compiler.x86/Intrinsic/FarJump.cs index 290ee1a239..f3b0438a48 100644 --- a/Source/Mosa.Compiler.x86/Intrinsic/FarJump.cs +++ b/Source/Mosa.Compiler.x86/Intrinsic/FarJump.cs @@ -5,7 +5,7 @@ namespace Mosa.Compiler.x86.Intrinsic; /// -/// IntrinsicMethods +/// Intrinsic Methods /// internal static partial class IntrinsicMethods { diff --git a/Source/Mosa.Compiler.x86/Intrinsic/FrameCall.cs b/Source/Mosa.Compiler.x86/Intrinsic/FrameCall.cs index 2b1a65fa34..c33f061fc0 100644 --- a/Source/Mosa.Compiler.x86/Intrinsic/FrameCall.cs +++ b/Source/Mosa.Compiler.x86/Intrinsic/FrameCall.cs @@ -5,7 +5,7 @@ namespace Mosa.Compiler.x86.Intrinsic; /// -/// IntrinsicMethods +/// Intrinsic Methods /// internal static partial class IntrinsicMethods { diff --git a/Source/Mosa.Compiler.x86/Intrinsic/FrameCallRetR8.cs b/Source/Mosa.Compiler.x86/Intrinsic/FrameCallRetR8.cs index 22d266470b..180b5e2268 100644 --- a/Source/Mosa.Compiler.x86/Intrinsic/FrameCallRetR8.cs +++ b/Source/Mosa.Compiler.x86/Intrinsic/FrameCallRetR8.cs @@ -5,7 +5,7 @@ namespace Mosa.Compiler.x86.Intrinsic; /// -/// IntrinsicMethods +/// Intrinsic Methods /// internal static partial class IntrinsicMethods { diff --git a/Source/Mosa.Compiler.x86/Intrinsic/FrameCallRetU4.cs b/Source/Mosa.Compiler.x86/Intrinsic/FrameCallRetU4.cs index 8380f5ca9e..f01cfeaf6d 100644 --- a/Source/Mosa.Compiler.x86/Intrinsic/FrameCallRetU4.cs +++ b/Source/Mosa.Compiler.x86/Intrinsic/FrameCallRetU4.cs @@ -5,7 +5,7 @@ namespace Mosa.Compiler.x86.Intrinsic; /// -/// IntrinsicMethods +/// Intrinsic Methods /// internal static partial class IntrinsicMethods { diff --git a/Source/Mosa.Compiler.x86/Intrinsic/FrameCallRetU8.cs b/Source/Mosa.Compiler.x86/Intrinsic/FrameCallRetU8.cs index 229df30bbc..0d45ea7b2b 100644 --- a/Source/Mosa.Compiler.x86/Intrinsic/FrameCallRetU8.cs +++ b/Source/Mosa.Compiler.x86/Intrinsic/FrameCallRetU8.cs @@ -5,7 +5,7 @@ namespace Mosa.Compiler.x86.Intrinsic; /// -/// IntrinsicMethods +/// Intrinsic Methods /// internal static partial class IntrinsicMethods { diff --git a/Source/Mosa.Compiler.x86/Intrinsic/FrameJump.cs b/Source/Mosa.Compiler.x86/Intrinsic/FrameJump.cs index 1592e57a13..0c29d1c657 100644 --- a/Source/Mosa.Compiler.x86/Intrinsic/FrameJump.cs +++ b/Source/Mosa.Compiler.x86/Intrinsic/FrameJump.cs @@ -5,7 +5,7 @@ namespace Mosa.Compiler.x86.Intrinsic; /// -/// IntrinsicMethods +/// Intrinsic Methods /// internal static partial class IntrinsicMethods { diff --git a/Source/Mosa.Compiler.x86/Intrinsic/Get16.cs b/Source/Mosa.Compiler.x86/Intrinsic/Get16.cs index 8b665bcce7..e78322d1e5 100644 --- a/Source/Mosa.Compiler.x86/Intrinsic/Get16.cs +++ b/Source/Mosa.Compiler.x86/Intrinsic/Get16.cs @@ -5,7 +5,7 @@ namespace Mosa.Compiler.x86.Intrinsic; /// -/// IntrinsicMethods +/// Intrinsic Methods /// internal static partial class IntrinsicMethods { diff --git a/Source/Mosa.Compiler.x86/Intrinsic/Get32.cs b/Source/Mosa.Compiler.x86/Intrinsic/Get32.cs index 76dd80209d..fd648185b2 100644 --- a/Source/Mosa.Compiler.x86/Intrinsic/Get32.cs +++ b/Source/Mosa.Compiler.x86/Intrinsic/Get32.cs @@ -5,7 +5,7 @@ namespace Mosa.Compiler.x86.Intrinsic; /// -/// IntrinsicMethods +/// Intrinsic Methods /// internal static partial class IntrinsicMethods { diff --git a/Source/Mosa.Compiler.x86/Intrinsic/Get8.cs b/Source/Mosa.Compiler.x86/Intrinsic/Get8.cs index cb9a2d3779..d182d55a5c 100644 --- a/Source/Mosa.Compiler.x86/Intrinsic/Get8.cs +++ b/Source/Mosa.Compiler.x86/Intrinsic/Get8.cs @@ -5,7 +5,7 @@ namespace Mosa.Compiler.x86.Intrinsic; /// -/// IntrinsicMethods +/// Intrinsic Methods /// internal static partial class IntrinsicMethods { diff --git a/Source/Mosa.Compiler.x86/Intrinsic/GetCR0.cs b/Source/Mosa.Compiler.x86/Intrinsic/GetCR0.cs index 8f409abb4d..8fd84ac28c 100644 --- a/Source/Mosa.Compiler.x86/Intrinsic/GetCR0.cs +++ b/Source/Mosa.Compiler.x86/Intrinsic/GetCR0.cs @@ -5,7 +5,7 @@ namespace Mosa.Compiler.x86.Intrinsic; /// -/// IntrinsicMethods +/// Intrinsic Methods /// internal static partial class IntrinsicMethods { diff --git a/Source/Mosa.Compiler.x86/Intrinsic/GetCR2.cs b/Source/Mosa.Compiler.x86/Intrinsic/GetCR2.cs index 3c7635deb5..5b3214b21e 100644 --- a/Source/Mosa.Compiler.x86/Intrinsic/GetCR2.cs +++ b/Source/Mosa.Compiler.x86/Intrinsic/GetCR2.cs @@ -5,7 +5,7 @@ namespace Mosa.Compiler.x86.Intrinsic; /// -/// IntrinsicMethods +/// Intrinsic Methods /// internal static partial class IntrinsicMethods { diff --git a/Source/Mosa.Compiler.x86/Intrinsic/GetCR3.cs b/Source/Mosa.Compiler.x86/Intrinsic/GetCR3.cs index 8228d38358..757db5b776 100644 --- a/Source/Mosa.Compiler.x86/Intrinsic/GetCR3.cs +++ b/Source/Mosa.Compiler.x86/Intrinsic/GetCR3.cs @@ -5,7 +5,7 @@ namespace Mosa.Compiler.x86.Intrinsic; /// -/// IntrinsicMethods +/// Intrinsic Methods /// internal static partial class IntrinsicMethods { diff --git a/Source/Mosa.Compiler.x86/Intrinsic/GetCR4.cs b/Source/Mosa.Compiler.x86/Intrinsic/GetCR4.cs index d92b47a688..00bbf8fb7b 100644 --- a/Source/Mosa.Compiler.x86/Intrinsic/GetCR4.cs +++ b/Source/Mosa.Compiler.x86/Intrinsic/GetCR4.cs @@ -5,7 +5,7 @@ namespace Mosa.Compiler.x86.Intrinsic; /// -/// IntrinsicMethods +/// Intrinsic Methods /// internal static partial class IntrinsicMethods { diff --git a/Source/Mosa.Compiler.x86/Intrinsic/GetCS.cs b/Source/Mosa.Compiler.x86/Intrinsic/GetCS.cs index 868d324842..cfb63de2cf 100644 --- a/Source/Mosa.Compiler.x86/Intrinsic/GetCS.cs +++ b/Source/Mosa.Compiler.x86/Intrinsic/GetCS.cs @@ -5,7 +5,7 @@ namespace Mosa.Compiler.x86.Intrinsic; /// -/// IntrinsicMethods +/// Intrinsic Methods /// internal static partial class IntrinsicMethods { diff --git a/Source/Mosa.Compiler.x86/Intrinsic/GetEAX.cs b/Source/Mosa.Compiler.x86/Intrinsic/GetEAX.cs new file mode 100644 index 0000000000..771bd23912 --- /dev/null +++ b/Source/Mosa.Compiler.x86/Intrinsic/GetEAX.cs @@ -0,0 +1,21 @@ +// Copyright (c) MOSA Project. Licensed under the New BSD License. + +using Mosa.Compiler.Framework; + +namespace Mosa.Compiler.x86.Intrinsic; + +/// +/// Intrinsic Methods +/// +internal static partial class IntrinsicMethods +{ + [IntrinsicMethod("Mosa.Compiler.x86.Intrinsic::GetEAX")] + private static void GetEAX(Context context, Transform transform) + { + var result = context.Result; + var eax = transform.PhysicalRegisters.Allocate32(CPURegister.EAX); + + context.SetInstruction(IR.Gen, eax); + context.AppendInstruction(X86.Mov32, result, eax); + } +} diff --git a/Source/Mosa.Compiler.x86/Intrinsic/GetFS.cs b/Source/Mosa.Compiler.x86/Intrinsic/GetFS.cs index b32bb9813a..a67347632e 100644 --- a/Source/Mosa.Compiler.x86/Intrinsic/GetFS.cs +++ b/Source/Mosa.Compiler.x86/Intrinsic/GetFS.cs @@ -5,7 +5,7 @@ namespace Mosa.Compiler.x86.Intrinsic; /// -/// IntrinsicMethods +/// Intrinsic Methods /// internal static partial class IntrinsicMethods { diff --git a/Source/Mosa.Compiler.x86/Intrinsic/GetIDTJumpLocation.cs b/Source/Mosa.Compiler.x86/Intrinsic/GetIDTJumpLocation.cs index 15fde02b9c..c910638c60 100644 --- a/Source/Mosa.Compiler.x86/Intrinsic/GetIDTJumpLocation.cs +++ b/Source/Mosa.Compiler.x86/Intrinsic/GetIDTJumpLocation.cs @@ -7,7 +7,7 @@ namespace Mosa.Compiler.x86.Intrinsic; /// -/// IntrinsicMethods +/// Intrinsic Methods /// internal static partial class IntrinsicMethods { diff --git a/Source/Mosa.Compiler.x86/Intrinsic/GetIRQHandler.cs b/Source/Mosa.Compiler.x86/Intrinsic/GetIRQHandler.cs deleted file mode 100644 index 6404202605..0000000000 --- a/Source/Mosa.Compiler.x86/Intrinsic/GetIRQHandler.cs +++ /dev/null @@ -1,16 +0,0 @@ -// Copyright (c) MOSA Project. Licensed under the New BSD License. - -using Mosa.Compiler.Framework; - -namespace Mosa.Compiler.x86.Intrinsic; - -/// -/// IntrinsicMethods -/// -internal static partial class IntrinsicMethods -{ - [IntrinsicMethod("Mosa.Compiler.x86.Intrinsic::GetIRQHandler")] - private static void GetIRQHandler(Context context, Transform transform) - { - } -} diff --git a/Source/Mosa.Compiler.x86/Intrinsic/Hlt.cs b/Source/Mosa.Compiler.x86/Intrinsic/Hlt.cs index 9bc857be03..aa54085f81 100644 --- a/Source/Mosa.Compiler.x86/Intrinsic/Hlt.cs +++ b/Source/Mosa.Compiler.x86/Intrinsic/Hlt.cs @@ -5,7 +5,7 @@ namespace Mosa.Compiler.x86.Intrinsic; /// -/// IntrinsicMethods +/// Intrinsic Methods /// internal static partial class IntrinsicMethods { diff --git a/Source/Mosa.Compiler.x86/Intrinsic/IRQs.cs b/Source/Mosa.Compiler.x86/Intrinsic/IRQs.cs index 5b4588d322..873745cf97 100644 --- a/Source/Mosa.Compiler.x86/Intrinsic/IRQs.cs +++ b/Source/Mosa.Compiler.x86/Intrinsic/IRQs.cs @@ -5,7 +5,7 @@ namespace Mosa.Compiler.x86.Intrinsic; /// -/// IntrinsicMethods +/// Intrinsic Methods /// internal static partial class IntrinsicMethods { diff --git a/Source/Mosa.Compiler.x86/Intrinsic/In16.cs b/Source/Mosa.Compiler.x86/Intrinsic/In16.cs index e50aa9b65d..90b1b8feac 100644 --- a/Source/Mosa.Compiler.x86/Intrinsic/In16.cs +++ b/Source/Mosa.Compiler.x86/Intrinsic/In16.cs @@ -5,7 +5,7 @@ namespace Mosa.Compiler.x86.Intrinsic; /// -/// IntrinsicMethods +/// Intrinsic Methods /// internal static partial class IntrinsicMethods { diff --git a/Source/Mosa.Compiler.x86/Intrinsic/In32.cs b/Source/Mosa.Compiler.x86/Intrinsic/In32.cs index 3accfa5a60..ada645a370 100644 --- a/Source/Mosa.Compiler.x86/Intrinsic/In32.cs +++ b/Source/Mosa.Compiler.x86/Intrinsic/In32.cs @@ -5,7 +5,7 @@ namespace Mosa.Compiler.x86.Intrinsic; /// -/// IntrinsicMethods +/// Intrinsic Methods /// internal static partial class IntrinsicMethods { diff --git a/Source/Mosa.Compiler.x86/Intrinsic/In8.cs b/Source/Mosa.Compiler.x86/Intrinsic/In8.cs index 7d303a275e..0b9f794ce2 100644 --- a/Source/Mosa.Compiler.x86/Intrinsic/In8.cs +++ b/Source/Mosa.Compiler.x86/Intrinsic/In8.cs @@ -5,7 +5,7 @@ namespace Mosa.Compiler.x86.Intrinsic; /// -/// IntrinsicMethods +/// Intrinsic Methods /// internal static partial class IntrinsicMethods { diff --git a/Source/Mosa.Compiler.x86/Intrinsic/Int.cs b/Source/Mosa.Compiler.x86/Intrinsic/Int.cs index 48bd07a11a..3a2ecf9fd3 100644 --- a/Source/Mosa.Compiler.x86/Intrinsic/Int.cs +++ b/Source/Mosa.Compiler.x86/Intrinsic/Int.cs @@ -5,7 +5,7 @@ namespace Mosa.Compiler.x86.Intrinsic; /// -/// IntrinsicMethods +/// Intrinsic Methods /// internal static partial class IntrinsicMethods { diff --git a/Source/Mosa.Compiler.x86/Intrinsic/InterruptReturn.cs b/Source/Mosa.Compiler.x86/Intrinsic/InterruptReturn.cs index df1f7caa01..a59397b912 100644 --- a/Source/Mosa.Compiler.x86/Intrinsic/InterruptReturn.cs +++ b/Source/Mosa.Compiler.x86/Intrinsic/InterruptReturn.cs @@ -5,16 +5,16 @@ namespace Mosa.Compiler.x86.Intrinsic; /// -/// IntrinsicMethods +/// Intrinsic Methods /// internal static partial class IntrinsicMethods { [IntrinsicMethod("Mosa.Compiler.x86.Intrinsic::InterruptReturn")] private static void InterruptReturn(Context context, Transform transform) { - Operand v0 = context.Operand1; + var v0 = context.Operand1; - Operand esp = transform.PhysicalRegisters.Allocate32(CPURegister.ESP); + var esp = transform.PhysicalRegisters.Allocate32(CPURegister.ESP); context.SetInstruction(X86.Mov32, esp, v0); context.AppendInstruction(X86.Popad); diff --git a/Source/Mosa.Compiler.x86/Intrinsic/Invlpg.cs b/Source/Mosa.Compiler.x86/Intrinsic/Invlpg.cs index 052d6ba537..4f14f95ceb 100644 --- a/Source/Mosa.Compiler.x86/Intrinsic/Invlpg.cs +++ b/Source/Mosa.Compiler.x86/Intrinsic/Invlpg.cs @@ -5,7 +5,7 @@ namespace Mosa.Compiler.x86.Intrinsic; /// -/// IntrinsicMethods +/// Intrinsic Methods /// internal static partial class IntrinsicMethods { diff --git a/Source/Mosa.Compiler.x86/Intrinsic/Lgdt.cs b/Source/Mosa.Compiler.x86/Intrinsic/Lgdt.cs index 6e8f1d7fe1..aa3e02b7ef 100644 --- a/Source/Mosa.Compiler.x86/Intrinsic/Lgdt.cs +++ b/Source/Mosa.Compiler.x86/Intrinsic/Lgdt.cs @@ -5,7 +5,7 @@ namespace Mosa.Compiler.x86.Intrinsic; /// -/// IntrinsicMethods +/// Intrinsic Methods /// internal static partial class IntrinsicMethods { diff --git a/Source/Mosa.Compiler.x86/Intrinsic/Lidt.cs b/Source/Mosa.Compiler.x86/Intrinsic/Lidt.cs index db86c526d2..46a565884b 100644 --- a/Source/Mosa.Compiler.x86/Intrinsic/Lidt.cs +++ b/Source/Mosa.Compiler.x86/Intrinsic/Lidt.cs @@ -5,7 +5,7 @@ namespace Mosa.Compiler.x86.Intrinsic; /// -/// IntrinsicMethods +/// Intrinsic Methods /// internal static partial class IntrinsicMethods { diff --git a/Source/Mosa.Compiler.x86/Intrinsic/Lzcnt32.cs b/Source/Mosa.Compiler.x86/Intrinsic/Lzcnt32.cs index 1d7f42c315..9936ff6a9f 100644 --- a/Source/Mosa.Compiler.x86/Intrinsic/Lzcnt32.cs +++ b/Source/Mosa.Compiler.x86/Intrinsic/Lzcnt32.cs @@ -5,7 +5,7 @@ namespace Mosa.Compiler.x86.Intrinsic; /// -/// IntrinsicMethods +/// Intrinsic Methods /// internal static partial class IntrinsicMethods { diff --git a/Source/Mosa.Compiler.x86/Intrinsic/Memclr256.cs b/Source/Mosa.Compiler.x86/Intrinsic/Memclr256.cs index f9c22fe298..bcb5f6a627 100644 --- a/Source/Mosa.Compiler.x86/Intrinsic/Memclr256.cs +++ b/Source/Mosa.Compiler.x86/Intrinsic/Memclr256.cs @@ -5,7 +5,7 @@ namespace Mosa.Compiler.x86.Intrinsic; /// -/// IntrinsicMethods +/// Intrinsic Methods /// internal static partial class IntrinsicMethods { @@ -15,10 +15,9 @@ private static void Memclr256(Context context, Transform transform) var dest = context.Operand1; var v0 = transform.PhysicalRegisters.AllocateR8(CPURegister.XMM0); - var offset16 = Operand.Constant32_16; context.SetInstruction(X86.PXor, v0, v0, v0); context.AppendInstruction(X86.MovupsStore, dest, Operand.Constant32_0, v0); - context.AppendInstruction(X86.MovupsStore, dest, offset16, v0); + context.AppendInstruction(X86.MovupsStore, dest, Operand.Constant32_16, v0); } } diff --git a/Source/Mosa.Compiler.x86/Intrinsic/Memcpy256.cs b/Source/Mosa.Compiler.x86/Intrinsic/Memcpy256.cs index fe02b002dc..2cd069a6ea 100644 --- a/Source/Mosa.Compiler.x86/Intrinsic/Memcpy256.cs +++ b/Source/Mosa.Compiler.x86/Intrinsic/Memcpy256.cs @@ -5,7 +5,7 @@ namespace Mosa.Compiler.x86.Intrinsic; /// -/// IntrinsicMethods +/// Intrinsic Methods /// internal static partial class IntrinsicMethods { @@ -17,11 +17,10 @@ private static void Memcpy256(Context context, Transform transform) var v0 = transform.VirtualRegisters.Allocate32(); var v1 = transform.VirtualRegisters.Allocate32(); - var offset16 = Operand.Constant32_16; - context.SetInstruction(X86.MovupsLoad, v0, dest, Operand.Constant32_0); - context.AppendInstruction(X86.MovupsLoad, v1, dest, offset16); + context.SetInstruction(X86.MovupsLoad, v0, src, Operand.Constant32_0); + context.AppendInstruction(X86.MovupsLoad, v1, src, Operand.Constant32_16); context.AppendInstruction(X86.MovupsStore, null, dest, Operand.Constant32_0, v0); - context.AppendInstruction(X86.MovupsStore, null, dest, offset16, v1); + context.AppendInstruction(X86.MovupsStore, null, dest, Operand.Constant32_16, v1); } } diff --git a/Source/Mosa.Compiler.x86/Intrinsic/Nop.cs b/Source/Mosa.Compiler.x86/Intrinsic/Nop.cs index d8d30bb1ab..8af83d33c6 100644 --- a/Source/Mosa.Compiler.x86/Intrinsic/Nop.cs +++ b/Source/Mosa.Compiler.x86/Intrinsic/Nop.cs @@ -5,7 +5,7 @@ namespace Mosa.Compiler.x86.Intrinsic; /// -/// IntrinsicMethods +/// Intrinsic Methods /// internal static partial class IntrinsicMethods { diff --git a/Source/Mosa.Compiler.x86/Intrinsic/Out16.cs b/Source/Mosa.Compiler.x86/Intrinsic/Out16.cs index 1b93a68a25..5185374b55 100644 --- a/Source/Mosa.Compiler.x86/Intrinsic/Out16.cs +++ b/Source/Mosa.Compiler.x86/Intrinsic/Out16.cs @@ -5,7 +5,7 @@ namespace Mosa.Compiler.x86.Intrinsic; /// -/// IntrinsicMethods +/// Intrinsic Methods /// internal static partial class IntrinsicMethods { diff --git a/Source/Mosa.Compiler.x86/Intrinsic/Out32.cs b/Source/Mosa.Compiler.x86/Intrinsic/Out32.cs index 992110c6cd..a2c13b9776 100644 --- a/Source/Mosa.Compiler.x86/Intrinsic/Out32.cs +++ b/Source/Mosa.Compiler.x86/Intrinsic/Out32.cs @@ -5,7 +5,7 @@ namespace Mosa.Compiler.x86.Intrinsic; /// -/// IntrinsicMethods +/// Intrinsic Methods /// internal static partial class IntrinsicMethods { diff --git a/Source/Mosa.Compiler.x86/Intrinsic/Out8.cs b/Source/Mosa.Compiler.x86/Intrinsic/Out8.cs index a865bca722..0cb645eaac 100644 --- a/Source/Mosa.Compiler.x86/Intrinsic/Out8.cs +++ b/Source/Mosa.Compiler.x86/Intrinsic/Out8.cs @@ -5,7 +5,7 @@ namespace Mosa.Compiler.x86.Intrinsic; /// -/// IntrinsicMethods +/// Intrinsic Methods /// internal static partial class IntrinsicMethods { diff --git a/Source/Mosa.Compiler.x86/Intrinsic/Pause.cs b/Source/Mosa.Compiler.x86/Intrinsic/Pause.cs index 3ee5d8ad18..95c67216ee 100644 --- a/Source/Mosa.Compiler.x86/Intrinsic/Pause.cs +++ b/Source/Mosa.Compiler.x86/Intrinsic/Pause.cs @@ -5,7 +5,7 @@ namespace Mosa.Compiler.x86.Intrinsic; /// -/// IntrinsicMethods +/// Intrinsic Methods /// internal static partial class IntrinsicMethods { diff --git a/Source/Mosa.Compiler.x86/Intrinsic/Popcnt32.cs b/Source/Mosa.Compiler.x86/Intrinsic/Popcnt32.cs index d9e96b402a..960461e60e 100644 --- a/Source/Mosa.Compiler.x86/Intrinsic/Popcnt32.cs +++ b/Source/Mosa.Compiler.x86/Intrinsic/Popcnt32.cs @@ -5,7 +5,7 @@ namespace Mosa.Compiler.x86.Intrinsic; /// -/// IntrinsicMethods +/// Intrinsic Methods /// internal static partial class IntrinsicMethods { diff --git a/Source/Mosa.Compiler.x86/Intrinsic/RdMSR.cs b/Source/Mosa.Compiler.x86/Intrinsic/RdMSR.cs index 95fe4ff29f..f46dc787b2 100644 --- a/Source/Mosa.Compiler.x86/Intrinsic/RdMSR.cs +++ b/Source/Mosa.Compiler.x86/Intrinsic/RdMSR.cs @@ -5,7 +5,7 @@ namespace Mosa.Compiler.x86.Intrinsic; /// -/// IntrinsicMethods +/// Intrinsic Methods /// internal static partial class IntrinsicMethods { diff --git a/Source/Mosa.Compiler.x86/Intrinsic/Remainder.cs b/Source/Mosa.Compiler.x86/Intrinsic/Remainder.cs index 40095be86c..0a1d77a054 100644 --- a/Source/Mosa.Compiler.x86/Intrinsic/Remainder.cs +++ b/Source/Mosa.Compiler.x86/Intrinsic/Remainder.cs @@ -5,7 +5,7 @@ namespace Mosa.Compiler.x86.Intrinsic; /// -/// IntrinsicMethods +/// Intrinsic Methods /// internal static partial class IntrinsicMethods { diff --git a/Source/Mosa.Compiler.x86/Intrinsic/Roundsd2Negative.cs b/Source/Mosa.Compiler.x86/Intrinsic/Roundsd2Negative.cs index dc4fbfeaef..7d10779acc 100644 --- a/Source/Mosa.Compiler.x86/Intrinsic/Roundsd2Negative.cs +++ b/Source/Mosa.Compiler.x86/Intrinsic/Roundsd2Negative.cs @@ -5,7 +5,7 @@ namespace Mosa.Compiler.x86.Intrinsic; /// -/// IntrinsicMethods +/// Intrinsic Methods /// internal static partial class IntrinsicMethods { diff --git a/Source/Mosa.Compiler.x86/Intrinsic/Roundsd2Positive.cs b/Source/Mosa.Compiler.x86/Intrinsic/Roundsd2Positive.cs index 73ad5c5874..5c94b684f0 100644 --- a/Source/Mosa.Compiler.x86/Intrinsic/Roundsd2Positive.cs +++ b/Source/Mosa.Compiler.x86/Intrinsic/Roundsd2Positive.cs @@ -5,7 +5,7 @@ namespace Mosa.Compiler.x86.Intrinsic; /// -/// IntrinsicMethods +/// Intrinsic Methods /// internal static partial class IntrinsicMethods { diff --git a/Source/Mosa.Compiler.x86/Intrinsic/Roundss2Negative.cs b/Source/Mosa.Compiler.x86/Intrinsic/Roundss2Negative.cs index 9ca4ce576d..26b077bffc 100644 --- a/Source/Mosa.Compiler.x86/Intrinsic/Roundss2Negative.cs +++ b/Source/Mosa.Compiler.x86/Intrinsic/Roundss2Negative.cs @@ -5,7 +5,7 @@ namespace Mosa.Compiler.x86.Intrinsic; /// -/// IntrinsicMethods +/// Intrinsic Methods /// internal static partial class IntrinsicMethods { diff --git a/Source/Mosa.Compiler.x86/Intrinsic/Roundss2Positive.cs b/Source/Mosa.Compiler.x86/Intrinsic/Roundss2Positive.cs index e35ea3f967..0e39ca631f 100644 --- a/Source/Mosa.Compiler.x86/Intrinsic/Roundss2Positive.cs +++ b/Source/Mosa.Compiler.x86/Intrinsic/Roundss2Positive.cs @@ -5,7 +5,7 @@ namespace Mosa.Compiler.x86.Intrinsic; /// -/// IntrinsicMethods +/// Intrinsic Methods /// internal static partial class IntrinsicMethods { diff --git a/Source/Mosa.Compiler.x86/Intrinsic/Set16.cs b/Source/Mosa.Compiler.x86/Intrinsic/Set16.cs index 221cdb90d3..d11e4e9ad9 100644 --- a/Source/Mosa.Compiler.x86/Intrinsic/Set16.cs +++ b/Source/Mosa.Compiler.x86/Intrinsic/Set16.cs @@ -5,7 +5,7 @@ namespace Mosa.Compiler.x86.Intrinsic; /// -/// IntrinsicMethods +/// Intrinsic Methods /// internal static partial class IntrinsicMethods { diff --git a/Source/Mosa.Compiler.x86/Intrinsic/Set32.cs b/Source/Mosa.Compiler.x86/Intrinsic/Set32.cs index 4173af0756..5baffcfbeb 100644 --- a/Source/Mosa.Compiler.x86/Intrinsic/Set32.cs +++ b/Source/Mosa.Compiler.x86/Intrinsic/Set32.cs @@ -5,7 +5,7 @@ namespace Mosa.Compiler.x86.Intrinsic; /// -/// IntrinsicMethods +/// Intrinsic Methods /// internal static partial class IntrinsicMethods { diff --git a/Source/Mosa.Compiler.x86/Intrinsic/Set8.cs b/Source/Mosa.Compiler.x86/Intrinsic/Set8.cs index 78f5c8f4c0..bb75943bb4 100644 --- a/Source/Mosa.Compiler.x86/Intrinsic/Set8.cs +++ b/Source/Mosa.Compiler.x86/Intrinsic/Set8.cs @@ -5,7 +5,7 @@ namespace Mosa.Compiler.x86.Intrinsic; /// -/// IntrinsicMethods +/// Intrinsic Methods /// internal static partial class IntrinsicMethods { diff --git a/Source/Mosa.Compiler.x86/Intrinsic/SetCR0.cs b/Source/Mosa.Compiler.x86/Intrinsic/SetCR0.cs index 5dd0d5e4e5..f9a8f7bf4c 100644 --- a/Source/Mosa.Compiler.x86/Intrinsic/SetCR0.cs +++ b/Source/Mosa.Compiler.x86/Intrinsic/SetCR0.cs @@ -5,7 +5,7 @@ namespace Mosa.Compiler.x86.Intrinsic; /// -/// IntrinsicMethods +/// Intrinsic Methods /// internal static partial class IntrinsicMethods { diff --git a/Source/Mosa.Compiler.x86/Intrinsic/SetCR2.cs b/Source/Mosa.Compiler.x86/Intrinsic/SetCR2.cs index 2a4d47f4da..f0ee17a015 100644 --- a/Source/Mosa.Compiler.x86/Intrinsic/SetCR2.cs +++ b/Source/Mosa.Compiler.x86/Intrinsic/SetCR2.cs @@ -5,7 +5,7 @@ namespace Mosa.Compiler.x86.Intrinsic; /// -/// IntrinsicMethods +/// Intrinsic Methods /// internal static partial class IntrinsicMethods { diff --git a/Source/Mosa.Compiler.x86/Intrinsic/SetCR3.cs b/Source/Mosa.Compiler.x86/Intrinsic/SetCR3.cs index ac12e98c04..2c321dbf9a 100644 --- a/Source/Mosa.Compiler.x86/Intrinsic/SetCR3.cs +++ b/Source/Mosa.Compiler.x86/Intrinsic/SetCR3.cs @@ -5,7 +5,7 @@ namespace Mosa.Compiler.x86.Intrinsic; /// -/// IntrinsicMethods +/// Intrinsic Methods /// internal static partial class IntrinsicMethods { diff --git a/Source/Mosa.Compiler.x86/Intrinsic/SetCR4.cs b/Source/Mosa.Compiler.x86/Intrinsic/SetCR4.cs index eb6d00e590..a35d4a8850 100644 --- a/Source/Mosa.Compiler.x86/Intrinsic/SetCR4.cs +++ b/Source/Mosa.Compiler.x86/Intrinsic/SetCR4.cs @@ -5,7 +5,7 @@ namespace Mosa.Compiler.x86.Intrinsic; /// -/// IntrinsicMethods +/// Intrinsic Methods /// internal static partial class IntrinsicMethods { diff --git a/Source/Mosa.Compiler.x86/Intrinsic/SetEAX.cs b/Source/Mosa.Compiler.x86/Intrinsic/SetEAX.cs new file mode 100644 index 0000000000..539247c7ac --- /dev/null +++ b/Source/Mosa.Compiler.x86/Intrinsic/SetEAX.cs @@ -0,0 +1,17 @@ +// Copyright (c) MOSA Project. Licensed under the New BSD License. + +using Mosa.Compiler.Framework; + +namespace Mosa.Compiler.x86.Intrinsic; + +/// +/// Intrinsic Methods +/// +internal static partial class IntrinsicMethods +{ + [IntrinsicMethod("Mosa.Compiler.x86.Intrinsic::SetEAX")] + private static void SetEAX(Context context, Transform transform) + { + context.SetInstruction(X86.Mov32, transform.PhysicalRegisters.Allocate32(CPURegister.EAX), context.Operand1); + } +} diff --git a/Source/Mosa.Compiler.x86/Intrinsic/SetFS.cs b/Source/Mosa.Compiler.x86/Intrinsic/SetFS.cs index 8f3f71170d..dd8ca213c8 100644 --- a/Source/Mosa.Compiler.x86/Intrinsic/SetFS.cs +++ b/Source/Mosa.Compiler.x86/Intrinsic/SetFS.cs @@ -5,7 +5,7 @@ namespace Mosa.Compiler.x86.Intrinsic; /// -/// IntrinsicMethods +/// Intrinsic Methods /// internal static partial class IntrinsicMethods { diff --git a/Source/Mosa.Compiler.x86/Intrinsic/SetSegments.cs b/Source/Mosa.Compiler.x86/Intrinsic/SetSegments.cs index 5ee1622c43..c7a2f56570 100644 --- a/Source/Mosa.Compiler.x86/Intrinsic/SetSegments.cs +++ b/Source/Mosa.Compiler.x86/Intrinsic/SetSegments.cs @@ -5,7 +5,7 @@ namespace Mosa.Compiler.x86.Intrinsic; /// -/// IntrinsicMethods +/// Intrinsic Methods /// internal static partial class IntrinsicMethods { diff --git a/Source/Mosa.Compiler.x86/Intrinsic/Sqrtsd.cs b/Source/Mosa.Compiler.x86/Intrinsic/Sqrtsd.cs index a7011ce69b..153d742f92 100644 --- a/Source/Mosa.Compiler.x86/Intrinsic/Sqrtsd.cs +++ b/Source/Mosa.Compiler.x86/Intrinsic/Sqrtsd.cs @@ -5,7 +5,7 @@ namespace Mosa.Compiler.x86.Intrinsic; /// -/// IntrinsicMethods +/// Intrinsic Methods /// internal static partial class IntrinsicMethods { diff --git a/Source/Mosa.Compiler.x86/Intrinsic/Sqrtss.cs b/Source/Mosa.Compiler.x86/Intrinsic/Sqrtss.cs index 73628b7929..537ffbfe91 100644 --- a/Source/Mosa.Compiler.x86/Intrinsic/Sqrtss.cs +++ b/Source/Mosa.Compiler.x86/Intrinsic/Sqrtss.cs @@ -5,7 +5,7 @@ namespace Mosa.Compiler.x86.Intrinsic; /// -/// IntrinsicMethods +/// Intrinsic Methods /// internal static partial class IntrinsicMethods { diff --git a/Source/Mosa.Compiler.x86/Intrinsic/Sti.cs b/Source/Mosa.Compiler.x86/Intrinsic/Sti.cs index 7954232793..6130376d42 100644 --- a/Source/Mosa.Compiler.x86/Intrinsic/Sti.cs +++ b/Source/Mosa.Compiler.x86/Intrinsic/Sti.cs @@ -5,7 +5,7 @@ namespace Mosa.Compiler.x86.Intrinsic; /// -/// IntrinsicMethods +/// Intrinsic Methods /// internal static partial class IntrinsicMethods { diff --git a/Source/Mosa.Compiler.x86/Intrinsic/Tzcnt32.cs b/Source/Mosa.Compiler.x86/Intrinsic/Tzcnt32.cs index 7ab4bf1e32..8626695e48 100644 --- a/Source/Mosa.Compiler.x86/Intrinsic/Tzcnt32.cs +++ b/Source/Mosa.Compiler.x86/Intrinsic/Tzcnt32.cs @@ -5,7 +5,7 @@ namespace Mosa.Compiler.x86.Intrinsic; /// -/// IntrinsicMethods +/// Intrinsic Methods /// internal static partial class IntrinsicMethods { diff --git a/Source/Mosa.Compiler.x86/Intrinsic/WrMSR.cs b/Source/Mosa.Compiler.x86/Intrinsic/WrMSR.cs index 138150ef31..5a89cb4e97 100644 --- a/Source/Mosa.Compiler.x86/Intrinsic/WrMSR.cs +++ b/Source/Mosa.Compiler.x86/Intrinsic/WrMSR.cs @@ -5,7 +5,7 @@ namespace Mosa.Compiler.x86.Intrinsic; /// -/// IntrinsicMethods +/// Intrinsic Methods /// internal static partial class IntrinsicMethods { diff --git a/Source/Mosa.Compiler.x86/Intrinsic/XAddLoad32.cs b/Source/Mosa.Compiler.x86/Intrinsic/XAddLoad32.cs index 0b3c8cfc65..783385d628 100644 --- a/Source/Mosa.Compiler.x86/Intrinsic/XAddLoad32.cs +++ b/Source/Mosa.Compiler.x86/Intrinsic/XAddLoad32.cs @@ -5,7 +5,7 @@ namespace Mosa.Compiler.x86.Intrinsic; /// -/// IntrinsicMethods +/// Intrinsic Methods /// internal static partial class IntrinsicMethods { diff --git a/Source/Mosa.Compiler.x86/Intrinsic/XChgLoad32.cs b/Source/Mosa.Compiler.x86/Intrinsic/XChgLoad32.cs index 349f856e00..6405780d6c 100644 --- a/Source/Mosa.Compiler.x86/Intrinsic/XChgLoad32.cs +++ b/Source/Mosa.Compiler.x86/Intrinsic/XChgLoad32.cs @@ -5,7 +5,7 @@ namespace Mosa.Compiler.x86.Intrinsic; /// -/// IntrinsicMethods +/// Intrinsic Methods /// internal static partial class IntrinsicMethods { diff --git a/Source/Mosa.DeviceDriver/ISA/ACPI/ACPIDriver.cs b/Source/Mosa.DeviceDriver/ISA/ACPI/ACPIDriver.cs index 341fdedf48..4d1c5db004 100644 --- a/Source/Mosa.DeviceDriver/ISA/ACPI/ACPIDriver.cs +++ b/Source/Mosa.DeviceDriver/ISA/ACPI/ACPIDriver.cs @@ -207,7 +207,8 @@ private Pointer FindBySignature(string signature) // See: https://github.com/msareedjr/MOSA-MikeOS/commit/6867064fedae707280083ba4d9ff12d468a6dce0 var h = new ACPISDTHeader(HAL.GetPhysicalMemory(xsdt ? XSDT.GetPointerToOtherSDT(i) : RSDT.GetPointerToOtherSDT(i), 0xFFF).Address); - if (!h.Pointer.IsNull && h.Signature == value) return h.Pointer; + if (!h.Pointer.IsNull && h.Signature == value) + return h.Pointer; } // No SDT found (by signature) diff --git a/Source/Mosa.DeviceDriver/ISA/PCIController.cs b/Source/Mosa.DeviceDriver/ISA/PCIController.cs index a72c014f43..cb584735ba 100644 --- a/Source/Mosa.DeviceDriver/ISA/PCIController.cs +++ b/Source/Mosa.DeviceDriver/ISA/PCIController.cs @@ -60,11 +60,7 @@ public override void Start() /// Called when an interrupt is received. /// /// - public override bool OnInterrupt() - { - // TODO - return false; - } + public override bool OnInterrupt() => false; /// /// Gets the index. diff --git a/Source/Mosa.DeviceDriver/PCI/VMware/VMwareSVGA2.cs b/Source/Mosa.DeviceDriver/PCI/VMware/VMwareSVGA2.cs index 9865260c28..b2f6cca762 100644 --- a/Source/Mosa.DeviceDriver/PCI/VMware/VMwareSVGA2.cs +++ b/Source/Mosa.DeviceDriver/PCI/VMware/VMwareSVGA2.cs @@ -247,10 +247,7 @@ public override void Start() Device.Status = DeviceStatus.Online; } - public override bool OnInterrupt() - { - return false; - } + public override bool OnInterrupt() => false; public void SetMode(uint width, uint height) { diff --git a/Source/Mosa.DeviceSystem/BaseDeviceDriver.cs b/Source/Mosa.DeviceSystem/BaseDeviceDriver.cs index 14b2ad97a6..5a6eb3b995 100644 --- a/Source/Mosa.DeviceSystem/BaseDeviceDriver.cs +++ b/Source/Mosa.DeviceSystem/BaseDeviceDriver.cs @@ -57,8 +57,5 @@ public virtual void Stop() /// Called when an interrupt is received. /// /// - public virtual bool OnInterrupt() - { - return false; - } + public virtual bool OnInterrupt() => false; } diff --git a/Source/Mosa.DeviceSystem/PCI/PCIDevice.cs b/Source/Mosa.DeviceSystem/PCI/PCIDevice.cs index c1b2b39552..6c4a1cae75 100644 --- a/Source/Mosa.DeviceSystem/PCI/PCIDevice.cs +++ b/Source/Mosa.DeviceSystem/PCI/PCIDevice.cs @@ -288,11 +288,7 @@ public override void Start() /// Called when an interrupt is received. /// /// - public override bool OnInterrupt() - { - // TODO - return true; - } + public override bool OnInterrupt() => true; /// /// Enables the device. diff --git a/Source/Mosa.DeviceSystem/PartitionDeviceDriver.cs b/Source/Mosa.DeviceSystem/PartitionDeviceDriver.cs index ff86fbe5c7..bb48ccde5b 100644 --- a/Source/Mosa.DeviceSystem/PartitionDeviceDriver.cs +++ b/Source/Mosa.DeviceSystem/PartitionDeviceDriver.cs @@ -71,11 +71,7 @@ public override void Start() /// Called when an interrupt is received. /// /// - public override bool OnInterrupt() - { - // TODO - return true; - } + public override bool OnInterrupt() => true; /// /// Reads the block. diff --git a/Source/Mosa.Kernel.BareMetal.x86/IDT.cs b/Source/Mosa.Kernel.BareMetal.x86/IDT.cs index ba93ed8d41..9b74281dad 100644 --- a/Source/Mosa.Kernel.BareMetal.x86/IDT.cs +++ b/Source/Mosa.Kernel.BareMetal.x86/IDT.cs @@ -2262,6 +2262,10 @@ private static unsafe void ProcessInterrupt(Pointer stackStatePointer) BareMetal.Scheduler.ClockInterrupt(stackStatePointer); break; + case Scheduler.IRQ.SystemCall: + BareMetal.Scheduler.SystemCall(new Pointer(stack.EAX)); + break; + case Scheduler.IRQ.ThreadTermination: BareMetal.Scheduler.TerminateCurrentThread(); break; diff --git a/Source/Mosa.Kernel.BareMetal.x86/PlatformPlug.cs b/Source/Mosa.Kernel.BareMetal.x86/PlatformPlug.cs index 0b0c48a606..c403aee3fe 100644 --- a/Source/Mosa.Kernel.BareMetal.x86/PlatformPlug.cs +++ b/Source/Mosa.Kernel.BareMetal.x86/PlatformPlug.cs @@ -144,11 +144,17 @@ public static class SchedulerPlug [Plug("Mosa.Kernel.BareMetal.Platform+Scheduler::SignalTermination")] public static void SignalTermination() => Scheduler.SignalTermination(); + [Plug("Mosa.Kernel.BareMetal.Platform+Scheduler::SignalSystemCall")] + public static object SignalSystemCall(object obj) => Scheduler.SignalSystemCall(obj); + [Plug("Mosa.Kernel.BareMetal.Platform+Scheduler::SwitchToThread")] public static void SwitchToThread(Thread thread) => Scheduler.SwitchToThread(thread); [Plug("Mosa.Kernel.BareMetal.Platform+Scheduler::SetupThreadStack")] public static Pointer SetupThreadStack(Pointer stackTop, Pointer methodAddress, Pointer termAddress) => Scheduler.SetupThreadStack(stackTop, methodAddress, termAddress); + + [Plug("Mosa.Kernel.BareMetal.Platform+Scheduler::SetReturnObject")] + public static void SetReturnObject(Pointer stackTop, Pointer ob) => Scheduler.SetReturnObject(stackTop, ob); } public static class SerialPlug diff --git a/Source/Mosa.Kernel.BareMetal.x86/Scheduler.cs b/Source/Mosa.Kernel.BareMetal.x86/Scheduler.cs index 62de29e2d7..65195575b8 100644 --- a/Source/Mosa.Kernel.BareMetal.x86/Scheduler.cs +++ b/Source/Mosa.Kernel.BareMetal.x86/Scheduler.cs @@ -11,6 +11,7 @@ public static class Scheduler { public static class IRQ { + public const int SystemCall = 253; public const int Clock = 0x20; public const int ThreadTermination = 254; } @@ -32,6 +33,15 @@ public static void SignalTermination() Native.Int(IRQ.ThreadTermination); } + [MethodImpl(MethodImplOptions.NoInlining)] + public static object SignalSystemCall(object obj) + { + Native.SetEAX(Intrinsic.GetObjectAddress(obj).ToUInt32()); + Native.Int(IRQ.SystemCall); + + return Native.GetEAX(); + } + public static Pointer SetupThreadStack(Pointer stackTop, Pointer methodAddress, Pointer termAddress) { Debug.WriteLine("x86.Scheduler:SetupThreadStack()"); @@ -67,4 +77,9 @@ public static void SwitchToThread(Thread thread) Native.InterruptReturn((uint)thread.StackStatePointer.ToInt32()); } + + public static void SetReturnObject(Pointer stackTop, Pointer ob) + { + stackTop.Store32(-32, ob.ToInt32()); // EAX + } } diff --git a/Source/Mosa.Kernel.BareMetal/Platform.cs b/Source/Mosa.Kernel.BareMetal/Platform.cs index 520c27f771..adac9d8fbf 100644 --- a/Source/Mosa.Kernel.BareMetal/Platform.cs +++ b/Source/Mosa.Kernel.BareMetal/Platform.cs @@ -92,10 +92,15 @@ public static void Yield() public static void SignalTermination() { } + public static object SignalSystemCall(object obj) => null; + public static void SwitchToThread(Thread thread) { } public static Pointer SetupThreadStack(Pointer stackTop, Pointer methodAddress, Pointer termAddress) => Pointer.Zero; + + public static void SetReturnObject(Pointer stackTop, Pointer ob) + { } } public static class Serial diff --git a/Source/Mosa.Kernel.BareMetal/Scheduler.cs b/Source/Mosa.Kernel.BareMetal/Scheduler.cs index f7b7f428d1..b499e03c1d 100644 --- a/Source/Mosa.Kernel.BareMetal/Scheduler.cs +++ b/Source/Mosa.Kernel.BareMetal/Scheduler.cs @@ -80,6 +80,28 @@ public static void TerminateCurrentThread() ScheduleNextThread(threadID); } + public static void SystemCall(Pointer request) + { + var threadID = GetCurrentThreadID(); + + // TODO: Put the request somewhere + + SleepThread(threadID); + ScheduleNextThread(threadID); + } + + public static void SetSystemCallReturn(uint threadID, object response) + { + var thread = Threads[threadID]; + + Platform.Scheduler.SetReturnObject(thread.StackTop, Intrinsic.GetObjectAddress(response)); + + if (thread.Status == ThreadStatus.Sleeping) + { + thread.Status = ThreadStatus.Running; + } + } + #endregion Public API #region Internal API @@ -113,6 +135,12 @@ internal static void SignalTermination() Platform.Scheduler.SignalTermination(); } + [MethodImpl(MethodImplOptions.NoInlining)] + internal static object SignalSystemCall(object obj) + { + return Platform.Scheduler.SignalSystemCall(obj); + } + private static uint CreateThread(ThreadStart thread, uint stackSize) { Debug.WriteLine("Scheduler:CreateThread()"); @@ -157,6 +185,13 @@ private static void TerminateThread(uint threadID) } } + private static void SleepThread(uint threadID) + { + var thread = Threads[threadID]; + + thread.Status = ThreadStatus.Sleeping; + } + private static uint GetNextThread(uint currentThreadID) { uint threadID = currentThreadID; diff --git a/Source/Mosa.Kernel.BareMetal/System.cs b/Source/Mosa.Kernel.BareMetal/System.cs new file mode 100644 index 0000000000..569fd0fc18 --- /dev/null +++ b/Source/Mosa.Kernel.BareMetal/System.cs @@ -0,0 +1,22 @@ +// Copyright (c) MOSA Project. Licensed under the New BSD License. + +using Mosa.Runtime; + +namespace Mosa.Kernel.BareMetal; + +public static class System +{ + public static object SystemCall(object obj) + { + // Find object in memory + PinObject(obj); + + // Raise the interrupt + return Scheduler.SignalSystemCall(obj); + } + + public static void PinObject(object obj) + { + // TODO + } +} diff --git a/Source/Mosa.Korlib/System.Threading/Thread.cs b/Source/Mosa.Korlib/System.Threading/Thread.cs index e45ba71043..ba5f7a1d75 100644 --- a/Source/Mosa.Korlib/System.Threading/Thread.cs +++ b/Source/Mosa.Korlib/System.Threading/Thread.cs @@ -2,7 +2,7 @@ namespace System.Threading; -public enum ThreadStatus { Empty = 0, Running, Terminating, Terminated, Waiting }; +public enum ThreadStatus { Empty = 0, Running, Terminating, Terminated, Sleeping }; public delegate void ThreadStart(); diff --git a/Source/Mosa.Runtime.x86/Native.cs b/Source/Mosa.Runtime.x86/Native.cs index cff205800f..297e1f5be0 100644 --- a/Source/Mosa.Runtime.x86/Native.cs +++ b/Source/Mosa.Runtime.x86/Native.cs @@ -160,6 +160,12 @@ public static unsafe class Native [DllImport("Mosa.Compiler.x86.Intrinsic::Set32")] public static extern void Set32(uint address, uint value); + [DllImport("Mosa.Compiler.x86.Intrinsic::SetEAX")] + public static extern void SetEAX(uint value); + + [DllImport("Mosa.Compiler.x86.Intrinsic::GetEAX")] + public static extern uint GetEAX(); + [DllImport("Mosa.Compiler.x86.Intrinsic::GetFS")] public static extern uint GetFS(); From 0bd16221eb8cc494fe01e8c1106dc9a4f46c4e83 Mon Sep 17 00:00:00 2001 From: Phil Date: Sat, 2 Mar 2024 09:19:28 -0800 Subject: [PATCH 04/17] - WIP --- Source/Data/IR-Instructions.json | 8 ++++ Source/Mosa.Compiler.Framework/IR.cs | 1 + .../Instructions/Use.cs | 20 ++++++++++ .../PlatformIntrinsic/IntrinsicMethodCall.cs | 2 +- Source/Mosa.Compiler.x86/Intrinsic/Int.cs | 2 +- Source/Mosa.Compiler.x86/Intrinsic/Int3.cs | 38 +++++++++++++++++++ Source/Mosa.Compiler.x86/Intrinsic/SetEAX.cs | 17 --------- .../Mosa.Kernel.BareMetal.x86/PlatformPlug.cs | 2 +- Source/Mosa.Kernel.BareMetal.x86/Scheduler.cs | 5 +-- .../IPC/IdentifierHelper.cs | 13 +++++++ Source/Mosa.Kernel.BareMetal/IPC/Message.cs | 11 ++++++ .../IPC/ReceiverRegistry.cs | 15 ++++++++ .../Mosa.Kernel.BareMetal/IPC/SystemCall.cs | 29 ++++++++++++++ Source/Mosa.Kernel.BareMetal/Platform.cs | 2 +- Source/Mosa.Kernel.BareMetal/Scheduler.cs | 4 +- Source/Mosa.Kernel.BareMetal/System.cs | 22 ----------- Source/Mosa.Kernel.BareMetal/Thread.cs | 6 +++ Source/Mosa.Runtime.x86/Native.cs | 6 +-- 18 files changed, 152 insertions(+), 51 deletions(-) create mode 100644 Source/Mosa.Compiler.Framework/Instructions/Use.cs create mode 100644 Source/Mosa.Compiler.x86/Intrinsic/Int3.cs delete mode 100644 Source/Mosa.Compiler.x86/Intrinsic/SetEAX.cs create mode 100644 Source/Mosa.Kernel.BareMetal/IPC/IdentifierHelper.cs create mode 100644 Source/Mosa.Kernel.BareMetal/IPC/Message.cs create mode 100644 Source/Mosa.Kernel.BareMetal/IPC/ReceiverRegistry.cs create mode 100644 Source/Mosa.Kernel.BareMetal/IPC/SystemCall.cs delete mode 100644 Source/Mosa.Kernel.BareMetal/System.cs diff --git a/Source/Data/IR-Instructions.json b/Source/Data/IR-Instructions.json index 3ad0767dc2..32fd5e9a45 100644 --- a/Source/Data/IR-Instructions.json +++ b/Source/Data/IR-Instructions.json @@ -461,6 +461,14 @@ "IgnoreDuringCodeGeneration": "true", "VariableOperands": "true" }, + { + "Name": "Use", + "FamilyName": "IR", + "ResultCount": 0, + "OperandCount": 0, + "IgnoreDuringCodeGeneration": "true", + "VariableOperands": "true" + }, { "Name": "IntrinsicMethodCall", "FamilyName": "IR", diff --git a/Source/Mosa.Compiler.Framework/IR.cs b/Source/Mosa.Compiler.Framework/IR.cs index 8e1df91171..03e5b93576 100644 --- a/Source/Mosa.Compiler.Framework/IR.cs +++ b/Source/Mosa.Compiler.Framework/IR.cs @@ -78,6 +78,7 @@ public static class IR public static readonly BaseInstruction FinallyStart = new FinallyStart(); public static readonly BaseInstruction Flow = new Flow(); public static readonly BaseInstruction Gen = new Gen(); + public static readonly BaseInstruction Use = new Use(); public static readonly BaseInstruction IntrinsicMethodCall = new IntrinsicMethodCall(); public static readonly BaseInstruction IsInstanceOfType = new IsInstanceOfType(); public static readonly BaseInstruction IsInstanceOfInterfaceType = new IsInstanceOfInterfaceType(); diff --git a/Source/Mosa.Compiler.Framework/Instructions/Use.cs b/Source/Mosa.Compiler.Framework/Instructions/Use.cs new file mode 100644 index 0000000000..cea234934e --- /dev/null +++ b/Source/Mosa.Compiler.Framework/Instructions/Use.cs @@ -0,0 +1,20 @@ +// Copyright (c) MOSA Project. Licensed under the New BSD License. + +// This code was generated by an automated template. + +namespace Mosa.Compiler.Framework.Instructions; + +/// +/// Use +/// +public sealed class Use : BaseIRInstruction +{ + public Use() + : base(0, 0) + { + } + + public override bool IgnoreDuringCodeGeneration => true; + + public override bool HasVariableOperands => true; +} diff --git a/Source/Mosa.Compiler.Framework/Transforms/PlatformIntrinsic/IntrinsicMethodCall.cs b/Source/Mosa.Compiler.Framework/Transforms/PlatformIntrinsic/IntrinsicMethodCall.cs index 406352b605..158d748bfc 100644 --- a/Source/Mosa.Compiler.Framework/Transforms/PlatformIntrinsic/IntrinsicMethodCall.cs +++ b/Source/Mosa.Compiler.Framework/Transforms/PlatformIntrinsic/IntrinsicMethodCall.cs @@ -3,7 +3,7 @@ namespace Mosa.Compiler.Framework.Transforms.PlatformIntrinsic; /// -/// IntrinsicMethodCall +/// Intrinsic Method Call /// public sealed class IntrinsicMethodCall : BaseTransform { diff --git a/Source/Mosa.Compiler.x86/Intrinsic/Int.cs b/Source/Mosa.Compiler.x86/Intrinsic/Int.cs index 3a2ecf9fd3..793e6f7b65 100644 --- a/Source/Mosa.Compiler.x86/Intrinsic/Int.cs +++ b/Source/Mosa.Compiler.x86/Intrinsic/Int.cs @@ -14,6 +14,6 @@ private static void Int(Context context, Transform transform) { Helper.FoldOperand1ToConstant(context); - context.SetInstruction(X86.Int, context.Result, context.Operand1); + context.SetInstruction(X86.Int, null, context.Operand1); } } diff --git a/Source/Mosa.Compiler.x86/Intrinsic/Int3.cs b/Source/Mosa.Compiler.x86/Intrinsic/Int3.cs new file mode 100644 index 0000000000..5ce29fd572 --- /dev/null +++ b/Source/Mosa.Compiler.x86/Intrinsic/Int3.cs @@ -0,0 +1,38 @@ +// Copyright (c) MOSA Project. Licensed under the New BSD License. + +using Mosa.Compiler.Framework; + +namespace Mosa.Compiler.x86.Intrinsic; + +/// +/// Intrinsic Methods +/// +internal static partial class IntrinsicMethods +{ + [IntrinsicMethod("Mosa.Compiler.x86.Intrinsic::Int3")] + private static void Int3(Context context, Transform transform) + { + var operand2 = context.Operand2; + var operand3 = context.Operand3; + var operand4 = context.Operand4; + + Helper.FoldOperand1ToConstant(context); + + var operand1 = context.Operand1; + + var eax = transform.PhysicalRegisters.Allocate32(CPURegister.EAX); + var ebx = transform.PhysicalRegisters.Allocate32(CPURegister.EBX); + var ecx = transform.PhysicalRegisters.Allocate32(CPURegister.ECX); + + context.SetInstruction(X86.Mov32, eax, operand2); + context.AppendInstruction(X86.Mov32, ebx, operand3); + context.AppendInstruction(X86.Mov32, ecx, operand4); + + context.AppendInstruction(X86.Int, null, operand1); + + context.AppendInstruction(IR.Use, null, eax); + context.AppendInstruction(IR.Use, null, ebx); + context.AppendInstruction(IR.Use, null, ecx); + + } +} diff --git a/Source/Mosa.Compiler.x86/Intrinsic/SetEAX.cs b/Source/Mosa.Compiler.x86/Intrinsic/SetEAX.cs deleted file mode 100644 index 539247c7ac..0000000000 --- a/Source/Mosa.Compiler.x86/Intrinsic/SetEAX.cs +++ /dev/null @@ -1,17 +0,0 @@ -// Copyright (c) MOSA Project. Licensed under the New BSD License. - -using Mosa.Compiler.Framework; - -namespace Mosa.Compiler.x86.Intrinsic; - -/// -/// Intrinsic Methods -/// -internal static partial class IntrinsicMethods -{ - [IntrinsicMethod("Mosa.Compiler.x86.Intrinsic::SetEAX")] - private static void SetEAX(Context context, Transform transform) - { - context.SetInstruction(X86.Mov32, transform.PhysicalRegisters.Allocate32(CPURegister.EAX), context.Operand1); - } -} diff --git a/Source/Mosa.Kernel.BareMetal.x86/PlatformPlug.cs b/Source/Mosa.Kernel.BareMetal.x86/PlatformPlug.cs index c403aee3fe..cc322b8db9 100644 --- a/Source/Mosa.Kernel.BareMetal.x86/PlatformPlug.cs +++ b/Source/Mosa.Kernel.BareMetal.x86/PlatformPlug.cs @@ -145,7 +145,7 @@ public static class SchedulerPlug public static void SignalTermination() => Scheduler.SignalTermination(); [Plug("Mosa.Kernel.BareMetal.Platform+Scheduler::SignalSystemCall")] - public static object SignalSystemCall(object obj) => Scheduler.SignalSystemCall(obj); + public static object SignalSystemCall(object obj, uint receiverID, uint senderID) => Scheduler.SignalSystemCall(obj, receiverID, senderID); [Plug("Mosa.Kernel.BareMetal.Platform+Scheduler::SwitchToThread")] public static void SwitchToThread(Thread thread) => Scheduler.SwitchToThread(thread); diff --git a/Source/Mosa.Kernel.BareMetal.x86/Scheduler.cs b/Source/Mosa.Kernel.BareMetal.x86/Scheduler.cs index 65195575b8..25e8258e4b 100644 --- a/Source/Mosa.Kernel.BareMetal.x86/Scheduler.cs +++ b/Source/Mosa.Kernel.BareMetal.x86/Scheduler.cs @@ -34,10 +34,9 @@ public static void SignalTermination() } [MethodImpl(MethodImplOptions.NoInlining)] - public static object SignalSystemCall(object obj) + public static object SignalSystemCall(object obj, uint senderID, uint receiverID) { - Native.SetEAX(Intrinsic.GetObjectAddress(obj).ToUInt32()); - Native.Int(IRQ.SystemCall); + Native.Int3(IRQ.SystemCall, Intrinsic.GetObjectAddress(obj).ToUInt32(), receiverID, senderID); return Native.GetEAX(); } diff --git a/Source/Mosa.Kernel.BareMetal/IPC/IdentifierHelper.cs b/Source/Mosa.Kernel.BareMetal/IPC/IdentifierHelper.cs new file mode 100644 index 0000000000..5b7caf3c1c --- /dev/null +++ b/Source/Mosa.Kernel.BareMetal/IPC/IdentifierHelper.cs @@ -0,0 +1,13 @@ +// Copyright (c) MOSA Project. Licensed under the New BSD License. + +namespace Mosa.Kernel.BareMetal.IPC; + +internal class IdentifierHelper +{ + private static int Sequence = 0; + + public uint GetUniqueIdentifier() + { + return (uint)System.Threading.Interlocked.Increment(ref Sequence); + } +} diff --git a/Source/Mosa.Kernel.BareMetal/IPC/Message.cs b/Source/Mosa.Kernel.BareMetal/IPC/Message.cs new file mode 100644 index 0000000000..93f54c1bc5 --- /dev/null +++ b/Source/Mosa.Kernel.BareMetal/IPC/Message.cs @@ -0,0 +1,11 @@ +// Copyright (c) MOSA Project. Licensed under the New BSD License. + +namespace Mosa.Kernel.BareMetal.IPC; + +public class Message +{ + public uint ReceiverID; + public uint SenderID; + + public object Data; +} diff --git a/Source/Mosa.Kernel.BareMetal/IPC/ReceiverRegistry.cs b/Source/Mosa.Kernel.BareMetal/IPC/ReceiverRegistry.cs new file mode 100644 index 0000000000..5e6c04bb32 --- /dev/null +++ b/Source/Mosa.Kernel.BareMetal/IPC/ReceiverRegistry.cs @@ -0,0 +1,15 @@ +// Copyright (c) MOSA Project. Licensed under the New BSD License. + +namespace Mosa.Kernel.BareMetal.IPC; + +internal static class ReceiverRegistry +{ + public static uint RegisterThread(Thread thread) + { + var id = IdentifierHelper.GetUniqueIdentifier(); + + thread.ReceivedID = id; + + return id; + } +} diff --git a/Source/Mosa.Kernel.BareMetal/IPC/SystemCall.cs b/Source/Mosa.Kernel.BareMetal/IPC/SystemCall.cs new file mode 100644 index 0000000000..ffc0e0be32 --- /dev/null +++ b/Source/Mosa.Kernel.BareMetal/IPC/SystemCall.cs @@ -0,0 +1,29 @@ +// Copyright (c) MOSA Project. Licensed under the New BSD License. + +namespace Mosa.Kernel.BareMetal.IPC; + +public static class SystemCall +{ + public static object Send(object obj, uint receiverID, uint senderID) + { + // Find object in memory + PinObject(obj); + + // Raise the interrupt + var value = Scheduler.SignalSystemCall(obj, receiverID, senderID); + + UnpinObject(obj); + + return value; + } + + private static void PinObject(object obj) + { + // TODO + } + + private static void UnpinObject(object obj) + { + // TODO + } +} diff --git a/Source/Mosa.Kernel.BareMetal/Platform.cs b/Source/Mosa.Kernel.BareMetal/Platform.cs index adac9d8fbf..07211c5b31 100644 --- a/Source/Mosa.Kernel.BareMetal/Platform.cs +++ b/Source/Mosa.Kernel.BareMetal/Platform.cs @@ -92,7 +92,7 @@ public static void Yield() public static void SignalTermination() { } - public static object SignalSystemCall(object obj) => null; + public static object SignalSystemCall(object obj, uint receiverID, uint senderID) => null; public static void SwitchToThread(Thread thread) { } diff --git a/Source/Mosa.Kernel.BareMetal/Scheduler.cs b/Source/Mosa.Kernel.BareMetal/Scheduler.cs index b499e03c1d..f0fb24e5d4 100644 --- a/Source/Mosa.Kernel.BareMetal/Scheduler.cs +++ b/Source/Mosa.Kernel.BareMetal/Scheduler.cs @@ -136,9 +136,9 @@ internal static void SignalTermination() } [MethodImpl(MethodImplOptions.NoInlining)] - internal static object SignalSystemCall(object obj) + internal static object SignalSystemCall(object obj, uint receiverID, uint senderID) { - return Platform.Scheduler.SignalSystemCall(obj); + return Platform.Scheduler.SignalSystemCall(obj, receiverID, senderID); } private static uint CreateThread(ThreadStart thread, uint stackSize) diff --git a/Source/Mosa.Kernel.BareMetal/System.cs b/Source/Mosa.Kernel.BareMetal/System.cs deleted file mode 100644 index 569fd0fc18..0000000000 --- a/Source/Mosa.Kernel.BareMetal/System.cs +++ /dev/null @@ -1,22 +0,0 @@ -// Copyright (c) MOSA Project. Licensed under the New BSD License. - -using Mosa.Runtime; - -namespace Mosa.Kernel.BareMetal; - -public static class System -{ - public static object SystemCall(object obj) - { - // Find object in memory - PinObject(obj); - - // Raise the interrupt - return Scheduler.SignalSystemCall(obj); - } - - public static void PinObject(object obj) - { - // TODO - } -} diff --git a/Source/Mosa.Kernel.BareMetal/Thread.cs b/Source/Mosa.Kernel.BareMetal/Thread.cs index 99fa727862..ad7f0757c8 100644 --- a/Source/Mosa.Kernel.BareMetal/Thread.cs +++ b/Source/Mosa.Kernel.BareMetal/Thread.cs @@ -1,6 +1,8 @@ // Copyright (c) MOSA Project. Licensed under the New BSD License. +using System.Collections.Generic; using System.Threading; +using Mosa.Kernel.BareMetal.IPC; using Mosa.Runtime; namespace Mosa.Kernel.BareMetal; @@ -12,4 +14,8 @@ public class Thread public Pointer StackBottom; public Pointer StackStatePointer; public uint Ticks; + + public uint ReceivedID; + public Message Message = new Message(); + public Queue Queue = new(); } diff --git a/Source/Mosa.Runtime.x86/Native.cs b/Source/Mosa.Runtime.x86/Native.cs index 297e1f5be0..85f46c313b 100644 --- a/Source/Mosa.Runtime.x86/Native.cs +++ b/Source/Mosa.Runtime.x86/Native.cs @@ -75,6 +75,9 @@ public static unsafe class Native [DllImport("Mosa.Compiler.x86.Intrinsic::Int")] public static extern void Int(byte interrupt); + [DllImport("Mosa.Compiler.x86.Intrinsic::Int3")] + public static extern void Int3(byte interrupt, uint a, uint b, uint c); + [DllImport("Mosa.Compiler.x86.Intrinsic::Sqrtsd")] public static extern double Sqrtsd(double destination); @@ -160,9 +163,6 @@ public static unsafe class Native [DllImport("Mosa.Compiler.x86.Intrinsic::Set32")] public static extern void Set32(uint address, uint value); - [DllImport("Mosa.Compiler.x86.Intrinsic::SetEAX")] - public static extern void SetEAX(uint value); - [DllImport("Mosa.Compiler.x86.Intrinsic::GetEAX")] public static extern uint GetEAX(); From c5ee5e4624793b667a53b733efe75a9a9000f523 Mon Sep 17 00:00:00 2001 From: Phil Date: Sun, 3 Mar 2024 18:05:42 -0800 Subject: [PATCH 05/17] - WIP --- Source/Mosa.Compiler.x86/Intrinsic/Int3.cs | 38 ---- Source/Mosa.Kernel.BareMetal.x86/IDT.cs | 6 +- .../Mosa.Kernel.BareMetal.x86/PlatformPlug.cs | 2 +- Source/Mosa.Kernel.BareMetal.x86/Scheduler.cs | 7 +- .../IPC/IdentifierHelper.cs | 4 +- Source/Mosa.Kernel.BareMetal/IPC/Message.cs | 10 +- .../Mosa.Kernel.BareMetal/IPC/MessageQueue.cs | 39 +++++ .../IPC/QueueRegistry.cs | 25 +++ .../IPC/ReceiverRegistry.cs | 15 -- .../IPC/ServiceIdentification.cs | 31 ++++ .../Mosa.Kernel.BareMetal/IPC/SystemCall.cs | 23 +-- Source/Mosa.Kernel.BareMetal/Platform.cs | 2 +- Source/Mosa.Kernel.BareMetal/Scheduler.cs | 164 ++++++++++-------- Source/Mosa.Kernel.BareMetal/Thread.cs | 13 +- Source/Mosa.Runtime.x86/Native.cs | 3 - 15 files changed, 225 insertions(+), 157 deletions(-) delete mode 100644 Source/Mosa.Compiler.x86/Intrinsic/Int3.cs create mode 100644 Source/Mosa.Kernel.BareMetal/IPC/MessageQueue.cs create mode 100644 Source/Mosa.Kernel.BareMetal/IPC/QueueRegistry.cs delete mode 100644 Source/Mosa.Kernel.BareMetal/IPC/ReceiverRegistry.cs create mode 100644 Source/Mosa.Kernel.BareMetal/IPC/ServiceIdentification.cs diff --git a/Source/Mosa.Compiler.x86/Intrinsic/Int3.cs b/Source/Mosa.Compiler.x86/Intrinsic/Int3.cs deleted file mode 100644 index 5ce29fd572..0000000000 --- a/Source/Mosa.Compiler.x86/Intrinsic/Int3.cs +++ /dev/null @@ -1,38 +0,0 @@ -// Copyright (c) MOSA Project. Licensed under the New BSD License. - -using Mosa.Compiler.Framework; - -namespace Mosa.Compiler.x86.Intrinsic; - -/// -/// Intrinsic Methods -/// -internal static partial class IntrinsicMethods -{ - [IntrinsicMethod("Mosa.Compiler.x86.Intrinsic::Int3")] - private static void Int3(Context context, Transform transform) - { - var operand2 = context.Operand2; - var operand3 = context.Operand3; - var operand4 = context.Operand4; - - Helper.FoldOperand1ToConstant(context); - - var operand1 = context.Operand1; - - var eax = transform.PhysicalRegisters.Allocate32(CPURegister.EAX); - var ebx = transform.PhysicalRegisters.Allocate32(CPURegister.EBX); - var ecx = transform.PhysicalRegisters.Allocate32(CPURegister.ECX); - - context.SetInstruction(X86.Mov32, eax, operand2); - context.AppendInstruction(X86.Mov32, ebx, operand3); - context.AppendInstruction(X86.Mov32, ecx, operand4); - - context.AppendInstruction(X86.Int, null, operand1); - - context.AppendInstruction(IR.Use, null, eax); - context.AppendInstruction(IR.Use, null, ebx); - context.AppendInstruction(IR.Use, null, ecx); - - } -} diff --git a/Source/Mosa.Kernel.BareMetal.x86/IDT.cs b/Source/Mosa.Kernel.BareMetal.x86/IDT.cs index 9b74281dad..1248f55728 100644 --- a/Source/Mosa.Kernel.BareMetal.x86/IDT.cs +++ b/Source/Mosa.Kernel.BareMetal.x86/IDT.cs @@ -2263,13 +2263,17 @@ private static unsafe void ProcessInterrupt(Pointer stackStatePointer) break; case Scheduler.IRQ.SystemCall: - BareMetal.Scheduler.SystemCall(new Pointer(stack.EAX)); + BareMetal.Scheduler.SystemCall(stackStatePointer, new Pointer(stack.EAX)); break; case Scheduler.IRQ.ThreadTermination: BareMetal.Scheduler.TerminateCurrentThread(); break; + case Scheduler.IRQ.ThreadYield: + BareMetal.Scheduler.YieldCurrentThread(stackStatePointer); + break; + default: Interrupt?.Invoke(stack.Interrupt, stack.ErrorCode); BareMetal.InterruptManager.ProcessInterrupt(stack.Interrupt, stack.ErrorCode); diff --git a/Source/Mosa.Kernel.BareMetal.x86/PlatformPlug.cs b/Source/Mosa.Kernel.BareMetal.x86/PlatformPlug.cs index cc322b8db9..288af698ef 100644 --- a/Source/Mosa.Kernel.BareMetal.x86/PlatformPlug.cs +++ b/Source/Mosa.Kernel.BareMetal.x86/PlatformPlug.cs @@ -145,7 +145,7 @@ public static class SchedulerPlug public static void SignalTermination() => Scheduler.SignalTermination(); [Plug("Mosa.Kernel.BareMetal.Platform+Scheduler::SignalSystemCall")] - public static object SignalSystemCall(object obj, uint receiverID, uint senderID) => Scheduler.SignalSystemCall(obj, receiverID, senderID); + public static object SignalSystemCall() => Scheduler.SignalSystemCall(); [Plug("Mosa.Kernel.BareMetal.Platform+Scheduler::SwitchToThread")] public static void SwitchToThread(Thread thread) => Scheduler.SwitchToThread(thread); diff --git a/Source/Mosa.Kernel.BareMetal.x86/Scheduler.cs b/Source/Mosa.Kernel.BareMetal.x86/Scheduler.cs index 25e8258e4b..2586b0d8c0 100644 --- a/Source/Mosa.Kernel.BareMetal.x86/Scheduler.cs +++ b/Source/Mosa.Kernel.BareMetal.x86/Scheduler.cs @@ -11,8 +11,9 @@ public static class Scheduler { public static class IRQ { - public const int SystemCall = 253; + public const int SystemCall = 252; public const int Clock = 0x20; + public const int ThreadYield = 253; public const int ThreadTermination = 254; } @@ -34,9 +35,9 @@ public static void SignalTermination() } [MethodImpl(MethodImplOptions.NoInlining)] - public static object SignalSystemCall(object obj, uint senderID, uint receiverID) + public static object SignalSystemCall() { - Native.Int3(IRQ.SystemCall, Intrinsic.GetObjectAddress(obj).ToUInt32(), receiverID, senderID); + Native.Int(IRQ.SystemCall); return Native.GetEAX(); } diff --git a/Source/Mosa.Kernel.BareMetal/IPC/IdentifierHelper.cs b/Source/Mosa.Kernel.BareMetal/IPC/IdentifierHelper.cs index 5b7caf3c1c..5f64e3d83b 100644 --- a/Source/Mosa.Kernel.BareMetal/IPC/IdentifierHelper.cs +++ b/Source/Mosa.Kernel.BareMetal/IPC/IdentifierHelper.cs @@ -2,11 +2,11 @@ namespace Mosa.Kernel.BareMetal.IPC; -internal class IdentifierHelper +internal static class IdentifierHelper { private static int Sequence = 0; - public uint GetUniqueIdentifier() + public static uint GetUniqueIdentifier() { return (uint)System.Threading.Interlocked.Increment(ref Sequence); } diff --git a/Source/Mosa.Kernel.BareMetal/IPC/Message.cs b/Source/Mosa.Kernel.BareMetal/IPC/Message.cs index 93f54c1bc5..eced4b5763 100644 --- a/Source/Mosa.Kernel.BareMetal/IPC/Message.cs +++ b/Source/Mosa.Kernel.BareMetal/IPC/Message.cs @@ -4,8 +4,12 @@ namespace Mosa.Kernel.BareMetal.IPC; public class Message { - public uint ReceiverID; - public uint SenderID; - public object Data; + public Thread Thread; + + public Message(object requestData, Thread thread = null) + { + Data = requestData; + Thread = thread; + } } diff --git a/Source/Mosa.Kernel.BareMetal/IPC/MessageQueue.cs b/Source/Mosa.Kernel.BareMetal/IPC/MessageQueue.cs new file mode 100644 index 0000000000..8d28a70b1f --- /dev/null +++ b/Source/Mosa.Kernel.BareMetal/IPC/MessageQueue.cs @@ -0,0 +1,39 @@ +// Copyright (c) MOSA Project. Licensed under the New BSD License. + +using System.Collections.Generic; + +namespace Mosa.Kernel.BareMetal.IPC; + +internal class MessageQueue +{ + public string Name { get; private set; } + + public ServiceIdentification ServiceID { get; private set; } + + private readonly Queue Queue = new(); + + public MessageQueue(string name, ServiceIdentification serviceID) + { + Name = name; + ServiceID = serviceID; + } + + public void Add(Message message) + { + lock (this) + { + Queue.Enqueue(message); + } + } + + public Message Pop() + { + lock (this) + { + if (Queue.Count == 0) + return null; + + return Queue.Dequeue(); + } + } +} diff --git a/Source/Mosa.Kernel.BareMetal/IPC/QueueRegistry.cs b/Source/Mosa.Kernel.BareMetal/IPC/QueueRegistry.cs new file mode 100644 index 0000000000..7a6014f5ce --- /dev/null +++ b/Source/Mosa.Kernel.BareMetal/IPC/QueueRegistry.cs @@ -0,0 +1,25 @@ +// Copyright (c) MOSA Project. Licensed under the New BSD License. + +using System.Collections.Generic; + +namespace Mosa.Kernel.BareMetal.IPC; + +internal static class QueueRegistry +{ + public static List Queues = new List(); + + //public static Register(ServiceIdentification serviceID, MessageQueue queue) + //{ + //} + + public static MessageQueue Find(ServiceIdentification serviceID) + { + foreach (var queue in Queues) + { + if (queue.ServiceID.ID == serviceID.ID) + return queue; + } + + return null; + } +} diff --git a/Source/Mosa.Kernel.BareMetal/IPC/ReceiverRegistry.cs b/Source/Mosa.Kernel.BareMetal/IPC/ReceiverRegistry.cs deleted file mode 100644 index 5e6c04bb32..0000000000 --- a/Source/Mosa.Kernel.BareMetal/IPC/ReceiverRegistry.cs +++ /dev/null @@ -1,15 +0,0 @@ -// Copyright (c) MOSA Project. Licensed under the New BSD License. - -namespace Mosa.Kernel.BareMetal.IPC; - -internal static class ReceiverRegistry -{ - public static uint RegisterThread(Thread thread) - { - var id = IdentifierHelper.GetUniqueIdentifier(); - - thread.ReceivedID = id; - - return id; - } -} diff --git a/Source/Mosa.Kernel.BareMetal/IPC/ServiceIdentification.cs b/Source/Mosa.Kernel.BareMetal/IPC/ServiceIdentification.cs new file mode 100644 index 0000000000..5c0bc36a5d --- /dev/null +++ b/Source/Mosa.Kernel.BareMetal/IPC/ServiceIdentification.cs @@ -0,0 +1,31 @@ +// Copyright (c) MOSA Project. Licensed under the New BSD License. + +using System; + +namespace Mosa.Kernel.BareMetal.IPC; + +public readonly struct ServiceIdentification +{ + public readonly uint ID { get; } + + public uint ServiceID { get { return ID & 0xFFFF; } } + + public uint FunctionID { get { return ID >> 16 & 0xFFFF; } } + + public uint VersionID { get { return ID >> 24 & 0xFFFF; } } + + public ServiceIdentification(uint serviceID, uint functionID, uint versionID) + { + ID = (serviceID & 0xFFFF) | ((functionID & 0xFF) << 16) | ((versionID & 0xFF) << 24); + } + + public static bool operator ==(ServiceIdentification a, ServiceIdentification b) + { + return a.ID == b.ID; + } + + public static bool operator !=(ServiceIdentification a, ServiceIdentification b) + { + return a.ID != b.ID; + } +} diff --git a/Source/Mosa.Kernel.BareMetal/IPC/SystemCall.cs b/Source/Mosa.Kernel.BareMetal/IPC/SystemCall.cs index ffc0e0be32..611424fcdc 100644 --- a/Source/Mosa.Kernel.BareMetal/IPC/SystemCall.cs +++ b/Source/Mosa.Kernel.BareMetal/IPC/SystemCall.cs @@ -4,26 +4,19 @@ namespace Mosa.Kernel.BareMetal.IPC; public static class SystemCall { - public static object Send(object obj, uint receiverID, uint senderID) + public static object Send(ServiceIdentification serviceID, object data) { - // Find object in memory - PinObject(obj); + var messageQueue = QueueRegistry.Find(serviceID); - // Raise the interrupt - var value = Scheduler.SignalSystemCall(obj, receiverID, senderID); + if (messageQueue == null) + return null; - UnpinObject(obj); + var message = new Message(data, null); - return value; - } + messageQueue.Add(message); - private static void PinObject(object obj) - { - // TODO - } + var value = Scheduler.SignalSystemCall(); - private static void UnpinObject(object obj) - { - // TODO + return value; } } diff --git a/Source/Mosa.Kernel.BareMetal/Platform.cs b/Source/Mosa.Kernel.BareMetal/Platform.cs index 07211c5b31..2de02bccee 100644 --- a/Source/Mosa.Kernel.BareMetal/Platform.cs +++ b/Source/Mosa.Kernel.BareMetal/Platform.cs @@ -92,7 +92,7 @@ public static void Yield() public static void SignalTermination() { } - public static object SignalSystemCall(object obj, uint receiverID, uint senderID) => null; + public static object SignalSystemCall() => null; public static void SwitchToThread(Thread thread) { } diff --git a/Source/Mosa.Kernel.BareMetal/Scheduler.cs b/Source/Mosa.Kernel.BareMetal/Scheduler.cs index f0fb24e5d4..b972de1916 100644 --- a/Source/Mosa.Kernel.BareMetal/Scheduler.cs +++ b/Source/Mosa.Kernel.BareMetal/Scheduler.cs @@ -1,16 +1,20 @@ // Copyright (c) MOSA Project. Licensed under the New BSD License. +using System; using System.Runtime.CompilerServices; using System.Threading; +using Mosa.Kernel.BareMetal.IPC; using Mosa.Runtime; +// NOTE: The scheduler called from the interrupt handler may not allocate memory! + namespace Mosa.Kernel.BareMetal; public static class Scheduler { #region Private Members - private const int MaxThreads = 256; + private const int MaxThreads = 4096; private static Pointer SignalThreadTerminationMethodAddress; @@ -18,10 +22,12 @@ public static class Scheduler private static bool Enabled; - private static uint CurrentThreadID; + private static Thread CurrentThread; private static int clockTicks; + private static uint NextThreadID; + private static uint DefaultStackSize => Page.Size * 8; #endregion Private Members @@ -38,7 +44,8 @@ public static void Start() { Debug.WriteLine("Scheduler:Start()"); - SetThreadID(0); + SetCurrentThread(null); + NextThreadID = 1; Enabled = true; Platform.Scheduler.Start(); @@ -48,7 +55,7 @@ public static void Start() public static uint CreateThread(ThreadStart thread) { - return CreateThread(thread, DefaultStackSize); + return CreateThread(thread, DefaultStackSize).Index; } public static void ClockInterrupt(Pointer stackSate) @@ -59,10 +66,10 @@ public static void ClockInterrupt(Pointer stackSate) Interlocked.Increment(ref clockTicks); // Save current stack state - var threadID = GetCurrentThreadID(); - SaveThreadState(threadID, stackSate); + var thread = GetCurrentThread(); + SaveThreadState(thread, stackSate); - ScheduleNextThread(threadID); + ScheduleNextThread(thread); } public static void TerminateCurrentThread() @@ -70,36 +77,55 @@ public static void TerminateCurrentThread() if (!Enabled) return; - var threadID = GetCurrentThreadID(); + var thread = GetCurrentThread(); - if (threadID != 0) + if (thread != null) { - TerminateThread(threadID); + TerminateThread(thread); } - ScheduleNextThread(threadID); + ScheduleNextThread(thread); } - public static void SystemCall(Pointer request) + public static void YieldCurrentThread(Pointer stackSate) { - var threadID = GetCurrentThreadID(); + if (!Enabled) + return; - // TODO: Put the request somewhere + var thread = GetCurrentThread(); + SaveThreadState(thread, stackSate); - SleepThread(threadID); - ScheduleNextThread(threadID); + ScheduleNextThread(thread); + } + + public static void SystemCall(Pointer stackSate, Pointer data) + { + if (!Enabled) + return; + + var thread = GetCurrentThread(); + + SaveThreadState(thread, stackSate); + + thread.Status = ThreadStatus.Sleeping; + + ScheduleNextThread(thread); } public static void SetSystemCallReturn(uint threadID, object response) { var thread = Threads[threadID]; - Platform.Scheduler.SetReturnObject(thread.StackTop, Intrinsic.GetObjectAddress(response)); - if (thread.Status == ThreadStatus.Sleeping) { + Platform.Scheduler.SetReturnObject(thread.StackTop, Intrinsic.GetObjectAddress(response)); + thread.Status = ThreadStatus.Running; } + else + { + Debug.WriteLine("WARNING: Thread not sleep"); + } } #endregion Public API @@ -112,12 +138,12 @@ internal static void Setup() Enabled = false; Threads = new Thread[MaxThreads]; - CurrentThreadID = 0; + CurrentThread = null; clockTicks = 0; - for (var i = 0; i < MaxThreads; i++) + for (var i = 0u; i < MaxThreads; i++) { - Threads[i] = new Thread(); + Threads[i] = new Thread(i); } var address = GetAddress(IdleThread); @@ -136,12 +162,12 @@ internal static void SignalTermination() } [MethodImpl(MethodImplOptions.NoInlining)] - internal static object SignalSystemCall(object obj, uint receiverID, uint senderID) + internal static object SignalSystemCall() { - return Platform.Scheduler.SignalSystemCall(obj, receiverID, senderID); + return Platform.Scheduler.SignalSystemCall(); } - private static uint CreateThread(ThreadStart thread, uint stackSize) + private static Thread CreateThread(ThreadStart thread, uint stackSize) { Debug.WriteLine("Scheduler:CreateThread()"); @@ -154,6 +180,15 @@ private static uint CreateThread(ThreadStart thread, uint stackSize) return newthread; } + internal static void QueueRequestMessage(MessageQueue messageQueue, object data) + { + var thread = GetCurrentThread(); + + var message = new Message(data, thread); + + // + } + #endregion Internal API #region Private API @@ -167,17 +202,15 @@ private static void IdleThread() } } - private static void ScheduleNextThread(uint threadID) + private static void ScheduleNextThread(Thread currentThread) { - threadID = GetNextThread(threadID); - SwitchToThread(threadID); + var thread = GetNextThread(currentThread); + SwitchToThread(thread); } - private static void TerminateThread(uint threadID) + private static void TerminateThread(Thread thread) { - var thread = Threads[threadID]; - - if (thread.Status == ThreadStatus.Running) + if (thread.Status == ThreadStatus.Running || thread.Status == ThreadStatus.Sleeping) { thread.Status = ThreadStatus.Terminating; @@ -185,34 +218,29 @@ private static void TerminateThread(uint threadID) } } - private static void SleepThread(uint threadID) + private static Thread GetNextThread(Thread currentThread) { - var thread = Threads[threadID]; + var currentIndex = currentThread.Index; - thread.Status = ThreadStatus.Sleeping; - } + if (currentIndex == 0) + currentIndex = 1; - private static uint GetNextThread(uint currentThreadID) - { - uint threadID = currentThreadID; - - if (currentThreadID == 0) - currentThreadID = 1; + var index = currentIndex; while (true) { - threadID++; + index++; - if (threadID == MaxThreads) - threadID = 1; + if (index == MaxThreads) + index = 1; - var thread = Threads[threadID]; + var thread = Threads[index]; if (thread.Status == ThreadStatus.Running) - return threadID; + return thread; - if (currentThreadID == threadID) - return 0; // idle thread + if (currentIndex == index) + return null; // idle thread } } @@ -226,26 +254,26 @@ private static Pointer GetAddress(ParameterizedThreadStart d) return Intrinsic.GetDelegateTargetAddress(d); } - private static uint CreateThread(Pointer methodAddress, uint stackSize) + private static Thread CreateThread(Pointer methodAddress, uint stackSize) { Debug.WriteLine("Scheduler:CreateThread(Pointer,uint)"); - var threadID = FindEmptyThreadSlot(); + var index = FindEmptyThreadSlot(); - if (threadID == 0) + if (index == 0) { ResetTerminatedThreads(); - threadID = FindEmptyThreadSlot(); + index = FindEmptyThreadSlot(); } - CreateThread(methodAddress, stackSize, threadID); + var thread = CreateThread(methodAddress, stackSize, index); Debug.WriteLine("Scheduler:CreateThread(Pointer,uint) [Exit]"); - return threadID; + return thread; } - private static void CreateThread(Pointer methodAddress, uint pages, uint threadID) + private static Thread CreateThread(Pointer methodAddress, uint pages, uint threadID) { Debug.WriteLine("Scheduler:CreateThread(Pointer, uint, uint)"); @@ -260,38 +288,34 @@ private static void CreateThread(Pointer methodAddress, uint pages, uint threadI thread.StackBottom = stack; thread.StackTop = stackTop; thread.StackStatePointer = bottom; + thread.Ticks = 0; + thread.ID = NextThreadID++; Debug.WriteLine("Scheduler:CreateThread(Pointer, uint, uint) [Exit]"); + + return thread; } - private static void SaveThreadState(uint threadID, Pointer stackSate) + private static void SaveThreadState(Thread thread, Pointer stackSate) { - //Assert.True(threadID < MaxThreads, "SaveThreadState(): invalid thread id > max"); - - var thread = Threads[threadID]; - - //Assert.True(thread != null, "SaveThreadState(): thread id = null"); - thread.StackStatePointer = stackSate; } - private static uint GetCurrentThreadID() + private static Thread GetCurrentThread() { - return CurrentThreadID; + return CurrentThread; } - private static void SetThreadID(uint threadID) + private static void SetCurrentThread(Thread thread) { - CurrentThreadID = threadID; + CurrentThread = thread; } - private static void SwitchToThread(uint threadID) + private static void SwitchToThread(Thread thread) { - var thread = Threads[threadID]; - thread.Ticks++; - SetThreadID(threadID); + SetCurrentThread(thread); Platform.Scheduler.SwitchToThread(thread); } diff --git a/Source/Mosa.Kernel.BareMetal/Thread.cs b/Source/Mosa.Kernel.BareMetal/Thread.cs index ad7f0757c8..4ef05ca4d9 100644 --- a/Source/Mosa.Kernel.BareMetal/Thread.cs +++ b/Source/Mosa.Kernel.BareMetal/Thread.cs @@ -1,21 +1,24 @@ // Copyright (c) MOSA Project. Licensed under the New BSD License. -using System.Collections.Generic; using System.Threading; -using Mosa.Kernel.BareMetal.IPC; using Mosa.Runtime; namespace Mosa.Kernel.BareMetal; public class Thread { + public readonly uint Index; + + public uint ID; + public ThreadStatus Status = ThreadStatus.Empty; public Pointer StackTop; public Pointer StackBottom; public Pointer StackStatePointer; public uint Ticks; - public uint ReceivedID; - public Message Message = new Message(); - public Queue Queue = new(); + public Thread(uint index) + { + Index = index; + } } diff --git a/Source/Mosa.Runtime.x86/Native.cs b/Source/Mosa.Runtime.x86/Native.cs index 85f46c313b..4aa62584cb 100644 --- a/Source/Mosa.Runtime.x86/Native.cs +++ b/Source/Mosa.Runtime.x86/Native.cs @@ -75,9 +75,6 @@ public static unsafe class Native [DllImport("Mosa.Compiler.x86.Intrinsic::Int")] public static extern void Int(byte interrupt); - [DllImport("Mosa.Compiler.x86.Intrinsic::Int3")] - public static extern void Int3(byte interrupt, uint a, uint b, uint c); - [DllImport("Mosa.Compiler.x86.Intrinsic::Sqrtsd")] public static extern double Sqrtsd(double destination); From d64a6ad75d989c873ec7e102955bfe95b37b262b Mon Sep 17 00:00:00 2001 From: Phil Date: Sun, 3 Mar 2024 23:11:26 -0800 Subject: [PATCH 06/17] - WIP --- Source/Mosa.Kernel.BareMetal/IPC/Message.cs | 18 +++++++-- .../IPC/QueueRegistry.cs | 25 ------------ .../IPC/ServiceIdentification.cs | 2 - .../IPC/ServiceQueueRegistry.cs | 32 +++++++++++++++ .../Mosa.Kernel.BareMetal/IPC/SystemCall.cs | 2 +- Source/Mosa.Kernel.BareMetal/Scheduler.cs | 39 +++++++++++-------- Source/Mosa.Kernel.BareMetal/Thread.cs | 3 +- 7 files changed, 71 insertions(+), 50 deletions(-) delete mode 100644 Source/Mosa.Kernel.BareMetal/IPC/QueueRegistry.cs create mode 100644 Source/Mosa.Kernel.BareMetal/IPC/ServiceQueueRegistry.cs diff --git a/Source/Mosa.Kernel.BareMetal/IPC/Message.cs b/Source/Mosa.Kernel.BareMetal/IPC/Message.cs index eced4b5763..e28e603107 100644 --- a/Source/Mosa.Kernel.BareMetal/IPC/Message.cs +++ b/Source/Mosa.Kernel.BareMetal/IPC/Message.cs @@ -2,14 +2,24 @@ namespace Mosa.Kernel.BareMetal.IPC; -public class Message +internal class Message { - public object Data; - public Thread Thread; + public readonly object Data; + public readonly uint Sequence; + public readonly Thread Thread; public Message(object requestData, Thread thread = null) { Data = requestData; - Thread = thread; + + if (thread != null) + { + Thread = thread; + Sequence = ++thread.Sequence; + } + else + { + Sequence = 0; + } } } diff --git a/Source/Mosa.Kernel.BareMetal/IPC/QueueRegistry.cs b/Source/Mosa.Kernel.BareMetal/IPC/QueueRegistry.cs deleted file mode 100644 index 7a6014f5ce..0000000000 --- a/Source/Mosa.Kernel.BareMetal/IPC/QueueRegistry.cs +++ /dev/null @@ -1,25 +0,0 @@ -// Copyright (c) MOSA Project. Licensed under the New BSD License. - -using System.Collections.Generic; - -namespace Mosa.Kernel.BareMetal.IPC; - -internal static class QueueRegistry -{ - public static List Queues = new List(); - - //public static Register(ServiceIdentification serviceID, MessageQueue queue) - //{ - //} - - public static MessageQueue Find(ServiceIdentification serviceID) - { - foreach (var queue in Queues) - { - if (queue.ServiceID.ID == serviceID.ID) - return queue; - } - - return null; - } -} diff --git a/Source/Mosa.Kernel.BareMetal/IPC/ServiceIdentification.cs b/Source/Mosa.Kernel.BareMetal/IPC/ServiceIdentification.cs index 5c0bc36a5d..2c24669b6d 100644 --- a/Source/Mosa.Kernel.BareMetal/IPC/ServiceIdentification.cs +++ b/Source/Mosa.Kernel.BareMetal/IPC/ServiceIdentification.cs @@ -1,7 +1,5 @@ // Copyright (c) MOSA Project. Licensed under the New BSD License. -using System; - namespace Mosa.Kernel.BareMetal.IPC; public readonly struct ServiceIdentification diff --git a/Source/Mosa.Kernel.BareMetal/IPC/ServiceQueueRegistry.cs b/Source/Mosa.Kernel.BareMetal/IPC/ServiceQueueRegistry.cs new file mode 100644 index 0000000000..c86e8ec7dc --- /dev/null +++ b/Source/Mosa.Kernel.BareMetal/IPC/ServiceQueueRegistry.cs @@ -0,0 +1,32 @@ +// Copyright (c) MOSA Project. Licensed under the New BSD License. + +using System.Collections.Generic; + +namespace Mosa.Kernel.BareMetal.IPC; + +internal static class ServiceQueueRegistry +{ + public static List Queues = new List(); + + public static void Register(ServiceIdentification serviceID, MessageQueue queue) + { + lock (Queues) + { + Queues.Add(queue); + } + } + + public static MessageQueue Find(ServiceIdentification serviceID) + { + lock (Queues) + { + foreach (var queue in Queues) + { + if (queue.ServiceID.ID == serviceID.ID) + return queue; + } + + return null; + } + } +} diff --git a/Source/Mosa.Kernel.BareMetal/IPC/SystemCall.cs b/Source/Mosa.Kernel.BareMetal/IPC/SystemCall.cs index 611424fcdc..87adb31b68 100644 --- a/Source/Mosa.Kernel.BareMetal/IPC/SystemCall.cs +++ b/Source/Mosa.Kernel.BareMetal/IPC/SystemCall.cs @@ -6,7 +6,7 @@ public static class SystemCall { public static object Send(ServiceIdentification serviceID, object data) { - var messageQueue = QueueRegistry.Find(serviceID); + var messageQueue = ServiceQueueRegistry.Find(serviceID); if (messageQueue == null) return null; diff --git a/Source/Mosa.Kernel.BareMetal/Scheduler.cs b/Source/Mosa.Kernel.BareMetal/Scheduler.cs index b972de1916..8aaa364100 100644 --- a/Source/Mosa.Kernel.BareMetal/Scheduler.cs +++ b/Source/Mosa.Kernel.BareMetal/Scheduler.cs @@ -93,8 +93,8 @@ public static void YieldCurrentThread(Pointer stackSate) return; var thread = GetCurrentThread(); - SaveThreadState(thread, stackSate); + SaveThreadState(thread, stackSate); ScheduleNextThread(thread); } @@ -107,7 +107,7 @@ public static void SystemCall(Pointer stackSate, Pointer data) SaveThreadState(thread, stackSate); - thread.Status = ThreadStatus.Sleeping; + Sleep(thread); ScheduleNextThread(thread); } @@ -146,10 +146,10 @@ internal static void Setup() Threads[i] = new Thread(i); } - var address = GetAddress(IdleThread); - SignalThreadTerminationMethodAddress = GetAddress(SignalTermination); + var address = GetAddress(IdleThread); + CreateThread(address, 2, 0); Debug.WriteLine("Scheduler:Setup() [Exit]"); @@ -167,19 +167,6 @@ internal static object SignalSystemCall() return Platform.Scheduler.SignalSystemCall(); } - private static Thread CreateThread(ThreadStart thread, uint stackSize) - { - Debug.WriteLine("Scheduler:CreateThread()"); - - var address = GetAddress(thread); - - var newthread = CreateThread(address, stackSize); - - Debug.WriteLine("Scheduler:CreateThread() [Exit]"); - - return newthread; - } - internal static void QueueRequestMessage(MessageQueue messageQueue, object data) { var thread = GetCurrentThread(); @@ -193,6 +180,19 @@ internal static void QueueRequestMessage(MessageQueue messageQueue, object data) #region Private API + private static Thread CreateThread(ThreadStart thread, uint stackSize) + { + Debug.WriteLine("Scheduler:CreateThread()"); + + var address = GetAddress(thread); + + var newthread = CreateThread(address, stackSize); + + Debug.WriteLine("Scheduler:CreateThread() [Exit]"); + + return newthread; + } + [MethodImpl(MethodImplOptions.NoInlining)] private static void IdleThread() { @@ -301,6 +301,11 @@ private static void SaveThreadState(Thread thread, Pointer stackSate) thread.StackStatePointer = stackSate; } + private static void Sleep(Thread thread) + { + thread.Status = ThreadStatus.Sleeping; + } + private static Thread GetCurrentThread() { return CurrentThread; diff --git a/Source/Mosa.Kernel.BareMetal/Thread.cs b/Source/Mosa.Kernel.BareMetal/Thread.cs index 4ef05ca4d9..c94aaf3f4f 100644 --- a/Source/Mosa.Kernel.BareMetal/Thread.cs +++ b/Source/Mosa.Kernel.BareMetal/Thread.cs @@ -15,7 +15,8 @@ public class Thread public Pointer StackTop; public Pointer StackBottom; public Pointer StackStatePointer; - public uint Ticks; + public uint Sequence = 0; + public uint Ticks = 0; public Thread(uint index) { From c5678eca240b22ec7a345299f4c0a7ab92c0c262 Mon Sep 17 00:00:00 2001 From: Phil Date: Sun, 3 Mar 2024 23:37:57 -0800 Subject: [PATCH 07/17] - WIP --- Source/Mosa.Kernel.BareMetal/System.cs | 20 -------------------- 1 file changed, 20 deletions(-) delete mode 100644 Source/Mosa.Kernel.BareMetal/System.cs diff --git a/Source/Mosa.Kernel.BareMetal/System.cs b/Source/Mosa.Kernel.BareMetal/System.cs deleted file mode 100644 index c6d850fdfb..0000000000 --- a/Source/Mosa.Kernel.BareMetal/System.cs +++ /dev/null @@ -1,20 +0,0 @@ -// Copyright (c) MOSA Project. Licensed under the New BSD License. - -namespace Mosa.Kernel.BareMetal; - -public static class System -{ - public static object SystemCall(object obj) - { - // Find object in memory - PinObject(obj); - - // Raise the interrupt - return Scheduler.SignalSystemCall(obj); - } - - public static void PinObject(object obj) - { - // TODO - } -} From 8ce2a2696ed5e9ba0f087f5384b0f1c0ffe3726c Mon Sep 17 00:00:00 2001 From: Phil Date: Fri, 22 Mar 2024 22:39:25 -0700 Subject: [PATCH 08/17] - WIP --- .../Analysis/LoopAwareBlockOrder.cs | 43 ++++----- .../Analysis/LoopDetector.cs | 88 +++++++++++++++++++ .../Common/QuickBlockSet.cs | 62 +++++++++++++ .../Common/QuickBlockSetLookup.cs | 59 ------------- .../{Common => }/Loop.cs | 2 +- .../Stages/LoopInvariantCodeMotionStage.cs | 84 +----------------- .../BitMap/BitMapIndexTable.cs | 2 +- Source/Mosa.Kernel.BareMetal/IPC/Message.cs | 25 ------ .../Mosa.Kernel.BareMetal/IPC/SystemCall.cs | 22 ----- Source/Mosa.Kernel.BareMetal/Messaging/IPC.cs | 61 +++++++++++++ .../{IPC => Messaging}/IdentifierHelper.cs | 2 +- .../Messaging/Message.cs | 17 ++++ .../{IPC => Messaging}/MessageQueue.cs | 4 +- .../ServiceIdentification.cs | 2 +- .../ServiceQueueRegistry.cs | 16 +++- Source/Mosa.Kernel.BareMetal/Scheduler.cs | 10 ++- .../Optimization/LoopUnrollingTests.cs | 15 +++- .../MOSASettings.cs | 5 +- 18 files changed, 297 insertions(+), 222 deletions(-) create mode 100644 Source/Mosa.Compiler.Framework/Analysis/LoopDetector.cs create mode 100644 Source/Mosa.Compiler.Framework/Common/QuickBlockSet.cs delete mode 100644 Source/Mosa.Compiler.Framework/Common/QuickBlockSetLookup.cs rename Source/Mosa.Compiler.Framework/{Common => }/Loop.cs (93%) delete mode 100644 Source/Mosa.Kernel.BareMetal/IPC/Message.cs delete mode 100644 Source/Mosa.Kernel.BareMetal/IPC/SystemCall.cs create mode 100644 Source/Mosa.Kernel.BareMetal/Messaging/IPC.cs rename Source/Mosa.Kernel.BareMetal/{IPC => Messaging}/IdentifierHelper.cs (86%) create mode 100644 Source/Mosa.Kernel.BareMetal/Messaging/Message.cs rename Source/Mosa.Kernel.BareMetal/{IPC => Messaging}/MessageQueue.cs (89%) rename Source/Mosa.Kernel.BareMetal/{IPC => Messaging}/ServiceIdentification.cs (94%) rename Source/Mosa.Kernel.BareMetal/{IPC => Messaging}/ServiceQueueRegistry.cs (70%) diff --git a/Source/Mosa.Compiler.Framework/Analysis/LoopAwareBlockOrder.cs b/Source/Mosa.Compiler.Framework/Analysis/LoopAwareBlockOrder.cs index 4ad4e1a988..e4277d0ded 100644 --- a/Source/Mosa.Compiler.Framework/Analysis/LoopAwareBlockOrder.cs +++ b/Source/Mosa.Compiler.Framework/Analysis/LoopAwareBlockOrder.cs @@ -2,6 +2,7 @@ using System.Collections; using System.Diagnostics; +using Mosa.Compiler.Framework.Common; namespace Mosa.Compiler.Framework.Analysis; @@ -13,10 +14,10 @@ public sealed class LoopAwareBlockOrder : BaseBlockOrder #region Data Members private BasicBlocks basicBlocks; - private BitArray active; - private BitArray visited; - private BitArray loopHeader; - private List loopEnds; + private QuickBlockSet active; + private QuickBlockSet visited; + private QuickBlockSet loopHeader; + private QuickBlockSet loopEnds; private int loopCount; private int[] forwardBranchesCount; private int[] loopBlockIndex; @@ -113,9 +114,9 @@ public override void Analyze(BasicBlocks basicBlocks) this.basicBlocks = basicBlocks; blockCount = basicBlocks.Count; - loopEnds = new List(); + loopEnds = new QuickBlockSet(basicBlocks); loopCount = 0; - loopHeader = new BitArray(blockCount, false); + loopHeader = new QuickBlockSet(basicBlocks); forwardBranchesCount = new int[blockCount]; loopBlockIndex = new int[blockCount]; loopDepth = new int[blockCount]; @@ -153,8 +154,8 @@ private void Start(BasicBlock start) private void StartCountEdges(BasicBlock start) { - active = new BitArray(blockCount, false); - visited = new BitArray(blockCount, false); + active = new QuickBlockSet(basicBlocks); + visited = new QuickBlockSet(basicBlocks); CountEdges(start, null); } @@ -163,12 +164,12 @@ private void CountEdges(BasicBlock current, BasicBlock parent) { var blockId = current.Sequence; - if (active.Get(blockId)) + if (active.Contains(current)) { - Debug.Assert(visited.Get(blockId)); + Debug.Assert(visited.Contains(current)); Debug.Assert(parent != null); - loopHeader.Set(blockId, true); + loopHeader.Add(current); loopEnds.Add(parent); return; @@ -176,21 +177,21 @@ private void CountEdges(BasicBlock current, BasicBlock parent) forwardBranchesCount[blockId]++; - if (visited.Get(blockId)) + if (visited.Contains(current)) return; - visited.Set(blockId, true); - active.Set(blockId, true); + visited.Add(current); + active.Add(current); foreach (var next in current.NextBlocks) { CountEdges(next, current); } - Debug.Assert(active.Get(blockId)); - active.Set(blockId, false); + Debug.Assert(active.Contains(current)); + active.Remove(current); - if (loopHeader.Get(blockId)) + if (loopHeader.Contains(current)) { loopBlockIndex[blockId] = loopCount; loopCount++; @@ -218,7 +219,7 @@ private void MarkLoops() var worklist = new Stack(); - foreach (var loopEnd in loopEnds) + foreach (var loopEnd in loopEnds.GetBlocks()) { var loopStart = loopEnd.NextBlocks[0]; // assuming the first one? var loopStartIndex = loopBlockIndex[loopStart.Sequence]; @@ -248,7 +249,7 @@ private void MarkLoops() private void AssignLoopDepth(BasicBlock start) { - visited = new BitArray(blockCount, false); + visited = new QuickBlockSet(basicBlocks); var worklist = new Stack(); @@ -258,9 +259,9 @@ private void AssignLoopDepth(BasicBlock start) { var current = worklist.Pop(); - if (!visited.Get(current.Sequence)) + if (!visited.Contains(current)) { - visited.Set(current.Sequence, true); + visited.Add(current); var currentLoopDepth = 0; var minLoopIndex = -1; diff --git a/Source/Mosa.Compiler.Framework/Analysis/LoopDetector.cs b/Source/Mosa.Compiler.Framework/Analysis/LoopDetector.cs new file mode 100644 index 0000000000..51e00178d3 --- /dev/null +++ b/Source/Mosa.Compiler.Framework/Analysis/LoopDetector.cs @@ -0,0 +1,88 @@ +// Copyright (c) MOSA Project. Licensed under the New BSD License. + +using System.Collections; + +namespace Mosa.Compiler.Framework.Analysis; + +/// +/// Loop Detector +/// +public sealed class LoopDetector +{ + public static List FindLoops(BasicBlocks basicBlocks) + { + var dominance = new SimpleFastDominance(basicBlocks, basicBlocks.PrologueBlock); + + return FindLoops(basicBlocks, dominance); + } + + public static List FindLoops(BasicBlocks basicBlocks, SimpleFastDominance analysisDominance) + { + var loops = new List(); + var lookup = new Dictionary(); + + foreach (var block in basicBlocks) + { + if (block.PreviousBlocks.Count == 0) + continue; + + foreach (var previous in block.PreviousBlocks) + { + // Is this a back-edge? Yes, if "block" dominates "previous" + if (analysisDominance.IsDominator(block, previous)) + { + if (lookup.TryGetValue(block, out Loop loop)) + { + loop.AddBackEdge(previous); + } + else + { + loop = new Loop(block, previous); + loops.Add(loop); + lookup.Add(block, loop); + } + } + } + } + + foreach (var loop in loops) + { + PopulateLoopNodes(basicBlocks, loop); + } + + return loops; + } + + private static void PopulateLoopNodes(BasicBlocks basicBlocks, Loop loop) + { + var worklist = new Stack(); + var array = new BitArray(basicBlocks.Count); + + foreach (var backedge in loop.Backedges) + { + worklist.Push(backedge); + } + + loop.AddNode(loop.Header); + array.Set(loop.Header.Sequence, true); + + while (worklist.Count != 0) + { + var node = worklist.Pop(); + + if (!array.Get(node.Sequence)) + { + array.Set(node.Sequence, true); + loop.LoopBlocks.Add(node); + + foreach (var previous in node.PreviousBlocks) + { + if (previous == loop.Header) + continue; + + worklist.Push(previous); + } + } + } + } +} diff --git a/Source/Mosa.Compiler.Framework/Common/QuickBlockSet.cs b/Source/Mosa.Compiler.Framework/Common/QuickBlockSet.cs new file mode 100644 index 0000000000..ca3db3914e --- /dev/null +++ b/Source/Mosa.Compiler.Framework/Common/QuickBlockSet.cs @@ -0,0 +1,62 @@ +// Copyright (c) MOSA Project. Licensed under the New BSD License. + +using System.Collections; + +namespace Mosa.Compiler.Framework.Common; + +public sealed class QuickBlockSet +{ + private readonly BasicBlocks BasicBlocks; + private readonly BitArray ArraySet; + + public QuickBlockSet(BasicBlocks basicBlocks) + { + BasicBlocks = basicBlocks; + ArraySet = new BitArray(basicBlocks.Count, false); + } + + public QuickBlockSet(BasicBlocks basicBlocks, List blocks) + { + BasicBlocks = basicBlocks; + ArraySet = new BitArray(basicBlocks.Count, false); + + if (blocks != null) + { + Add(blocks); + } + } + + public void Add(BasicBlock block) + { + ArraySet.Set(block.Sequence, true); + } + + public void Add(List blocks) + { + foreach (var block in blocks) + { + ArraySet.Set(block.Sequence, true); + } + } + + public bool Contains(BasicBlock block) + { + return ArraySet.Get(block.Sequence); + } + + public void Remove(BasicBlock block) + { + ArraySet.Set(block.Sequence, false); + } + + public IEnumerable GetBlocks() + { + for (var i = 0; i < ArraySet.Count; i++) + { + if (ArraySet.Get(i)) + { + yield return BasicBlocks[i]; + } + } + } +} diff --git a/Source/Mosa.Compiler.Framework/Common/QuickBlockSetLookup.cs b/Source/Mosa.Compiler.Framework/Common/QuickBlockSetLookup.cs deleted file mode 100644 index bbcc73bd99..0000000000 --- a/Source/Mosa.Compiler.Framework/Common/QuickBlockSetLookup.cs +++ /dev/null @@ -1,59 +0,0 @@ -// Copyright (c) MOSA Project. Licensed under the New BSD License. - -using System.Collections; - -namespace Mosa.Compiler.Framework.Common; - -public sealed class QuickBlockSetLookup -{ - private readonly BitArray array; - - public QuickBlockSetLookup(BasicBlocks basicBlocks) - { - array = new BitArray(basicBlocks.Count, false); - } - - public QuickBlockSetLookup(BasicBlocks basicBlocks, List blocks) - { - array = new BitArray(basicBlocks.Count, false); - - if (blocks != null) - { - Add(blocks); - } - } - - public void Add(List blocks) - { - foreach (var block in blocks) - { - array.Set(block.Sequence, true); - } - } - - public bool Contains(BasicBlock block) - { - return array.Get(block.Sequence); - } - - public void Add(BasicBlock block) - { - array.Set(block.Sequence, true); - } - - public void Remove(BasicBlock block) - { - array.Set(block.Sequence, false); - } - - public IEnumerable GetBlocks(BasicBlocks basicBlocks) - { - for (var i = 0; i < array.Count; i++) - { - if (array.Get(i)) - { - yield return basicBlocks[i]; - } - } - } -} diff --git a/Source/Mosa.Compiler.Framework/Common/Loop.cs b/Source/Mosa.Compiler.Framework/Loop.cs similarity index 93% rename from Source/Mosa.Compiler.Framework/Common/Loop.cs rename to Source/Mosa.Compiler.Framework/Loop.cs index c1080c6806..1fff89812e 100644 --- a/Source/Mosa.Compiler.Framework/Common/Loop.cs +++ b/Source/Mosa.Compiler.Framework/Loop.cs @@ -2,7 +2,7 @@ using System.Diagnostics; -namespace Mosa.Compiler.Framework.Common; +namespace Mosa.Compiler.Framework; public sealed class Loop { diff --git a/Source/Mosa.Compiler.Framework/Stages/LoopInvariantCodeMotionStage.cs b/Source/Mosa.Compiler.Framework/Stages/LoopInvariantCodeMotionStage.cs index 3ef6843d23..eee3d9d485 100644 --- a/Source/Mosa.Compiler.Framework/Stages/LoopInvariantCodeMotionStage.cs +++ b/Source/Mosa.Compiler.Framework/Stages/LoopInvariantCodeMotionStage.cs @@ -5,7 +5,6 @@ using System.Text; using Mosa.Compiler.Common; using Mosa.Compiler.Framework.Analysis; -using Mosa.Compiler.Framework.Common; namespace Mosa.Compiler.Framework.Stages; @@ -18,9 +17,7 @@ public sealed class LoopInvariantCodeMotionStage : BaseMethodCompilerStage private readonly Counter CodeMotionCount = new("LoopInvariantCodeMotion.CodeMotion"); private readonly Counter Methods = new("LoopInvariantCodeMotion.Methods"); - private SimpleFastDominance AnalysisDominance; - - private HashSet ParamStoreSet = new HashSet(); + private HashSet ParamStoreSet = new(); private TraceLog trace; @@ -50,9 +47,7 @@ protected override void Run() ParamStoreSet = CollectParamStores(); - AnalysisDominance = new SimpleFastDominance(BasicBlocks, BasicBlocks.PrologueBlock); - - var loops = FindLoops(); + var loops = LoopDetector.FindLoops(BasicBlocks); if (loops.Count == 0) return; @@ -62,7 +57,7 @@ protected override void Run() DumpLoops(loops); } - SortLoops(loops); + SortLoopsByBlockCount(loops); FindLoopInvariantInstructions(loops); @@ -78,77 +73,6 @@ protected override void Run() protected override void Finish() { ParamStoreSet = null; - AnalysisDominance = null; - } - - private List FindLoops() - { - var loops = new List(); - var lookup = new Dictionary(); - - foreach (var block in BasicBlocks) - { - if (block.PreviousBlocks.Count == 0) - continue; - - foreach (var previous in block.PreviousBlocks) - { - // Is this a back-edge? Yes, if "block" dominates "previous" - if (AnalysisDominance.IsDominator(block, previous)) - { - if (lookup.TryGetValue(block, out Loop loop)) - { - loop.AddBackEdge(previous); - } - else - { - loop = new Loop(block, previous); - loops.Add(loop); - lookup.Add(block, loop); - } - } - } - } - - foreach (var loop in loops) - { - PopulateLoopNodes(loop); - } - - return loops; - } - - private void PopulateLoopNodes(Loop loop) - { - var worklist = new Stack(); - var array = new BitArray(BasicBlocks.Count); - - foreach (var backedge in loop.Backedges) - { - worklist.Push(backedge); - } - - loop.AddNode(loop.Header); - array.Set(loop.Header.Sequence, true); - - while (worklist.Count != 0) - { - var node = worklist.Pop(); - - if (!array.Get(node.Sequence)) - { - array.Set(node.Sequence, true); - loop.LoopBlocks.Add(node); - - foreach (var previous in node.PreviousBlocks) - { - if (previous == loop.Header) - continue; - - worklist.Push(previous); - } - } - } } public void DumpLoops(List loops) @@ -180,7 +104,7 @@ public void DumpLoops(List loops) } } - private void SortLoops(List loops) + private static void SortLoopsByBlockCount(List loops) { loops.Sort((Loop p1, Loop p2) => p1.LoopBlocks.Count < p2.LoopBlocks.Count ? 0 : 1); } diff --git a/Source/Mosa.Kernel.BareMetal/BitMap/BitMapIndexTable.cs b/Source/Mosa.Kernel.BareMetal/BitMap/BitMapIndexTable.cs index bea9be46dc..0b112bbb83 100644 --- a/Source/Mosa.Kernel.BareMetal/BitMap/BitMapIndexTable.cs +++ b/Source/Mosa.Kernel.BareMetal/BitMap/BitMapIndexTable.cs @@ -4,7 +4,7 @@ namespace Mosa.Kernel.BareMetal; -public struct BitMapIndexTable +public readonly struct BitMapIndexTable { private readonly Pointer Pointer; diff --git a/Source/Mosa.Kernel.BareMetal/IPC/Message.cs b/Source/Mosa.Kernel.BareMetal/IPC/Message.cs deleted file mode 100644 index e28e603107..0000000000 --- a/Source/Mosa.Kernel.BareMetal/IPC/Message.cs +++ /dev/null @@ -1,25 +0,0 @@ -// Copyright (c) MOSA Project. Licensed under the New BSD License. - -namespace Mosa.Kernel.BareMetal.IPC; - -internal class Message -{ - public readonly object Data; - public readonly uint Sequence; - public readonly Thread Thread; - - public Message(object requestData, Thread thread = null) - { - Data = requestData; - - if (thread != null) - { - Thread = thread; - Sequence = ++thread.Sequence; - } - else - { - Sequence = 0; - } - } -} diff --git a/Source/Mosa.Kernel.BareMetal/IPC/SystemCall.cs b/Source/Mosa.Kernel.BareMetal/IPC/SystemCall.cs deleted file mode 100644 index 87adb31b68..0000000000 --- a/Source/Mosa.Kernel.BareMetal/IPC/SystemCall.cs +++ /dev/null @@ -1,22 +0,0 @@ -// Copyright (c) MOSA Project. Licensed under the New BSD License. - -namespace Mosa.Kernel.BareMetal.IPC; - -public static class SystemCall -{ - public static object Send(ServiceIdentification serviceID, object data) - { - var messageQueue = ServiceQueueRegistry.Find(serviceID); - - if (messageQueue == null) - return null; - - var message = new Message(data, null); - - messageQueue.Add(message); - - var value = Scheduler.SignalSystemCall(); - - return value; - } -} diff --git a/Source/Mosa.Kernel.BareMetal/Messaging/IPC.cs b/Source/Mosa.Kernel.BareMetal/Messaging/IPC.cs new file mode 100644 index 0000000000..e63016203b --- /dev/null +++ b/Source/Mosa.Kernel.BareMetal/Messaging/IPC.cs @@ -0,0 +1,61 @@ +// Copyright (c) MOSA Project. Licensed under the New BSD License. + +namespace Mosa.Kernel.BareMetal.Messaging; + +public static class IPC +{ + public static MessageQueue CreateServiceQueue(string serviceName, ServiceIdentification serviceID) + { + var messageQueue = new MessageQueue(serviceName, serviceID); + + ServiceQueueRegistry.Register(serviceID, messageQueue); + + return messageQueue; + } + + public static MessageQueue FindServiceQueue(ServiceIdentification serviceID) + { + return ServiceQueueRegistry.Find(serviceID); + } + + public static MessageQueue FindServiceQueue(string serviceName) + { + return ServiceQueueRegistry.Find(serviceName); + } + + public static object SendData(MessageQueue messageQueue, object data) + { + if (messageQueue == null) + return null; + + Scheduler.SendMessage(messageQueue, data, false); + + var value = Scheduler.SignalSystemCall(); + + return value; + } + + public static object SendDataAsync(MessageQueue messageQueue, object data) + { + if (messageQueue == null) + return null; + + Scheduler.SendMessage(messageQueue, data, true); + + var value = Scheduler.SignalSystemCall(); + + return value; + } + + internal static void SendResponse(Message message, object response) + { + // TODO + } + + internal static Message Listen() + { + // TODO + + return null; + } +} diff --git a/Source/Mosa.Kernel.BareMetal/IPC/IdentifierHelper.cs b/Source/Mosa.Kernel.BareMetal/Messaging/IdentifierHelper.cs similarity index 86% rename from Source/Mosa.Kernel.BareMetal/IPC/IdentifierHelper.cs rename to Source/Mosa.Kernel.BareMetal/Messaging/IdentifierHelper.cs index 5f64e3d83b..83fd3afa19 100644 --- a/Source/Mosa.Kernel.BareMetal/IPC/IdentifierHelper.cs +++ b/Source/Mosa.Kernel.BareMetal/Messaging/IdentifierHelper.cs @@ -1,6 +1,6 @@ // Copyright (c) MOSA Project. Licensed under the New BSD License. -namespace Mosa.Kernel.BareMetal.IPC; +namespace Mosa.Kernel.BareMetal.Messaging; internal static class IdentifierHelper { diff --git a/Source/Mosa.Kernel.BareMetal/Messaging/Message.cs b/Source/Mosa.Kernel.BareMetal/Messaging/Message.cs new file mode 100644 index 0000000000..48df0c4a79 --- /dev/null +++ b/Source/Mosa.Kernel.BareMetal/Messaging/Message.cs @@ -0,0 +1,17 @@ +// Copyright (c) MOSA Project. Licensed under the New BSD License. + +namespace Mosa.Kernel.BareMetal.Messaging; + +public class Message +{ + public readonly object Data; + public readonly Thread Thread; + public readonly uint Sequence; + + public Message(object requestData, Thread thread = null, uint sequence = 0) + { + Data = requestData; + Thread = thread; + Sequence = sequence; + } +} diff --git a/Source/Mosa.Kernel.BareMetal/IPC/MessageQueue.cs b/Source/Mosa.Kernel.BareMetal/Messaging/MessageQueue.cs similarity index 89% rename from Source/Mosa.Kernel.BareMetal/IPC/MessageQueue.cs rename to Source/Mosa.Kernel.BareMetal/Messaging/MessageQueue.cs index 8d28a70b1f..5e7d89634e 100644 --- a/Source/Mosa.Kernel.BareMetal/IPC/MessageQueue.cs +++ b/Source/Mosa.Kernel.BareMetal/Messaging/MessageQueue.cs @@ -2,9 +2,9 @@ using System.Collections.Generic; -namespace Mosa.Kernel.BareMetal.IPC; +namespace Mosa.Kernel.BareMetal.Messaging; -internal class MessageQueue +public class MessageQueue { public string Name { get; private set; } diff --git a/Source/Mosa.Kernel.BareMetal/IPC/ServiceIdentification.cs b/Source/Mosa.Kernel.BareMetal/Messaging/ServiceIdentification.cs similarity index 94% rename from Source/Mosa.Kernel.BareMetal/IPC/ServiceIdentification.cs rename to Source/Mosa.Kernel.BareMetal/Messaging/ServiceIdentification.cs index 2c24669b6d..caf6fe24b6 100644 --- a/Source/Mosa.Kernel.BareMetal/IPC/ServiceIdentification.cs +++ b/Source/Mosa.Kernel.BareMetal/Messaging/ServiceIdentification.cs @@ -1,6 +1,6 @@ // Copyright (c) MOSA Project. Licensed under the New BSD License. -namespace Mosa.Kernel.BareMetal.IPC; +namespace Mosa.Kernel.BareMetal.Messaging; public readonly struct ServiceIdentification { diff --git a/Source/Mosa.Kernel.BareMetal/IPC/ServiceQueueRegistry.cs b/Source/Mosa.Kernel.BareMetal/Messaging/ServiceQueueRegistry.cs similarity index 70% rename from Source/Mosa.Kernel.BareMetal/IPC/ServiceQueueRegistry.cs rename to Source/Mosa.Kernel.BareMetal/Messaging/ServiceQueueRegistry.cs index c86e8ec7dc..a667b49f31 100644 --- a/Source/Mosa.Kernel.BareMetal/IPC/ServiceQueueRegistry.cs +++ b/Source/Mosa.Kernel.BareMetal/Messaging/ServiceQueueRegistry.cs @@ -2,7 +2,7 @@ using System.Collections.Generic; -namespace Mosa.Kernel.BareMetal.IPC; +namespace Mosa.Kernel.BareMetal.Messaging; internal static class ServiceQueueRegistry { @@ -29,4 +29,18 @@ public static MessageQueue Find(ServiceIdentification serviceID) return null; } } + + public static MessageQueue Find(string serviceName) + { + lock (Queues) + { + foreach (var queue in Queues) + { + if (queue.Name == serviceName) + return queue; + } + + return null; + } + } } diff --git a/Source/Mosa.Kernel.BareMetal/Scheduler.cs b/Source/Mosa.Kernel.BareMetal/Scheduler.cs index 8aaa364100..f0778e2016 100644 --- a/Source/Mosa.Kernel.BareMetal/Scheduler.cs +++ b/Source/Mosa.Kernel.BareMetal/Scheduler.cs @@ -3,7 +3,7 @@ using System; using System.Runtime.CompilerServices; using System.Threading; -using Mosa.Kernel.BareMetal.IPC; +using Mosa.Kernel.BareMetal.Messaging; using Mosa.Runtime; // NOTE: The scheduler called from the interrupt handler may not allocate memory! @@ -167,13 +167,15 @@ internal static object SignalSystemCall() return Platform.Scheduler.SignalSystemCall(); } - internal static void QueueRequestMessage(MessageQueue messageQueue, object data) + internal static void SendMessage(MessageQueue messageQueue, object data, bool async) { var thread = GetCurrentThread(); - var message = new Message(data, thread); + var sequence = async ? 0 : ++thread.Sequence; - // + var message = async ? new Message(data, thread, sequence) : new Message(data); + + messageQueue.Add(message); } #endregion Internal API diff --git a/Source/Mosa.UnitTests/Optimization/LoopUnrollingTests.cs b/Source/Mosa.UnitTests/Optimization/LoopUnrollingTests.cs index a9f6987c3b..cbd5628357 100644 --- a/Source/Mosa.UnitTests/Optimization/LoopUnrollingTests.cs +++ b/Source/Mosa.UnitTests/Optimization/LoopUnrollingTests.cs @@ -13,7 +13,20 @@ public static int SimpleUnroll() for (var i = 0; i < 2; i++) { - v = v + 1; + v++; + } + + return v; + } + + [MethodImpl(MethodImplOptions.NoInlining)] + public static int SimpleUnroll2(int a) + { + var v = 0; + + for (var i = 0; i < 2; i++) + { + v += a; } return v; diff --git a/Source/Mosa.Utility.Configuration/MOSASettings.cs b/Source/Mosa.Utility.Configuration/MOSASettings.cs index 1d4e5179b0..750e9910b9 100644 --- a/Source/Mosa.Utility.Configuration/MOSASettings.cs +++ b/Source/Mosa.Utility.Configuration/MOSASettings.cs @@ -66,13 +66,13 @@ public string DebugFile public bool EmitBinary { get => Settings.GetValue(Name.Compiler_Binary, true); - set => Settings.SetValue(Name.Compiler_Binary, true); + set => Settings.SetValue(Name.Compiler_Binary, value); } public bool EmitDwarf { get => Settings.GetValue(Name.Linker_Dwarf, false); - set => Settings.SetValue(Name.Linker_Dwarf, false); + set => Settings.SetValue(Name.Linker_Dwarf, value); } public string MultibootVersion @@ -757,7 +757,6 @@ public void SetDefaultSettings() MethodScanner = false; - EmitBinary = true; SSA = true; BasicOptimizations = true; ValueNumbering = true; From b8bde7f8d673504c455d0b033ed6d585ee5c8a93 Mon Sep 17 00:00:00 2001 From: Phil Date: Fri, 22 Mar 2024 23:26:27 -0700 Subject: [PATCH 09/17] - WIP --- .../Analysis/LoopAwareBlockOrder.cs | 18 +++++++++--------- .../Analysis/LoopDetector.cs | 9 +++++---- .../Analysis/SimpleTraceBlockOrder.cs | 9 +++++---- .../{QuickBlockSet.cs => BlockBitSet.cs} | 16 +++++++++++++--- .../Stages/ValueNumberingStage.cs | 9 +++++---- .../BasicBlocks/RemoveUnreachableBlocks.cs | 11 ++++++----- 6 files changed, 43 insertions(+), 29 deletions(-) rename Source/Mosa.Compiler.Framework/Common/{QuickBlockSet.cs => BlockBitSet.cs} (77%) diff --git a/Source/Mosa.Compiler.Framework/Analysis/LoopAwareBlockOrder.cs b/Source/Mosa.Compiler.Framework/Analysis/LoopAwareBlockOrder.cs index e4277d0ded..dc7206e849 100644 --- a/Source/Mosa.Compiler.Framework/Analysis/LoopAwareBlockOrder.cs +++ b/Source/Mosa.Compiler.Framework/Analysis/LoopAwareBlockOrder.cs @@ -14,10 +14,10 @@ public sealed class LoopAwareBlockOrder : BaseBlockOrder #region Data Members private BasicBlocks basicBlocks; - private QuickBlockSet active; - private QuickBlockSet visited; - private QuickBlockSet loopHeader; - private QuickBlockSet loopEnds; + private BlockBitSet active; + private BlockBitSet visited; + private BlockBitSet loopHeader; + private BlockBitSet loopEnds; private int loopCount; private int[] forwardBranchesCount; private int[] loopBlockIndex; @@ -114,9 +114,9 @@ public override void Analyze(BasicBlocks basicBlocks) this.basicBlocks = basicBlocks; blockCount = basicBlocks.Count; - loopEnds = new QuickBlockSet(basicBlocks); + loopEnds = new BlockBitSet(basicBlocks); loopCount = 0; - loopHeader = new QuickBlockSet(basicBlocks); + loopHeader = new BlockBitSet(basicBlocks); forwardBranchesCount = new int[blockCount]; loopBlockIndex = new int[blockCount]; loopDepth = new int[blockCount]; @@ -154,8 +154,8 @@ private void Start(BasicBlock start) private void StartCountEdges(BasicBlock start) { - active = new QuickBlockSet(basicBlocks); - visited = new QuickBlockSet(basicBlocks); + active = new BlockBitSet(basicBlocks); + visited = new BlockBitSet(basicBlocks); CountEdges(start, null); } @@ -249,7 +249,7 @@ private void MarkLoops() private void AssignLoopDepth(BasicBlock start) { - visited = new QuickBlockSet(basicBlocks); + visited = new BlockBitSet(basicBlocks); var worklist = new Stack(); diff --git a/Source/Mosa.Compiler.Framework/Analysis/LoopDetector.cs b/Source/Mosa.Compiler.Framework/Analysis/LoopDetector.cs index 51e00178d3..d65b5ba18c 100644 --- a/Source/Mosa.Compiler.Framework/Analysis/LoopDetector.cs +++ b/Source/Mosa.Compiler.Framework/Analysis/LoopDetector.cs @@ -1,6 +1,7 @@ // Copyright (c) MOSA Project. Licensed under the New BSD License. using System.Collections; +using Mosa.Compiler.Framework.Common; namespace Mosa.Compiler.Framework.Analysis; @@ -56,7 +57,7 @@ public static List FindLoops(BasicBlocks basicBlocks, SimpleFastDominance private static void PopulateLoopNodes(BasicBlocks basicBlocks, Loop loop) { var worklist = new Stack(); - var array = new BitArray(basicBlocks.Count); + var array = new BlockBitSet(basicBlocks); foreach (var backedge in loop.Backedges) { @@ -64,15 +65,15 @@ private static void PopulateLoopNodes(BasicBlocks basicBlocks, Loop loop) } loop.AddNode(loop.Header); - array.Set(loop.Header.Sequence, true); + array.Add(loop.Header); while (worklist.Count != 0) { var node = worklist.Pop(); - if (!array.Get(node.Sequence)) + if (!array.Contains(node)) { - array.Set(node.Sequence, true); + array.Add(node); loop.LoopBlocks.Add(node); foreach (var previous in node.PreviousBlocks) diff --git a/Source/Mosa.Compiler.Framework/Analysis/SimpleTraceBlockOrder.cs b/Source/Mosa.Compiler.Framework/Analysis/SimpleTraceBlockOrder.cs index eec3aea19e..28ec2fa8bc 100644 --- a/Source/Mosa.Compiler.Framework/Analysis/SimpleTraceBlockOrder.cs +++ b/Source/Mosa.Compiler.Framework/Analysis/SimpleTraceBlockOrder.cs @@ -1,6 +1,7 @@ // Copyright (c) MOSA Project. Licensed under the New BSD License. using System.Collections; +using Mosa.Compiler.Framework.Common; namespace Mosa.Compiler.Framework.Analysis; @@ -22,7 +23,7 @@ public override int GetLoopIndex(BasicBlock block) public override void Analyze(BasicBlocks basicBlocks) { // Create dictionary of referenced blocks - var referenced = new BitArray(basicBlocks.Count); + var referenced = new BlockBitSet(basicBlocks); // Allocate list of ordered Blocks NewBlockOrder = new List(basicBlocks.Count); @@ -38,9 +39,9 @@ public override void Analyze(BasicBlocks basicBlocks) { var block = workList.Pop(); - if (!referenced.Get(block.Sequence)) + if (!referenced.Contains(block)) { - referenced.Set(block.Sequence, true); + referenced.Add(block); NewBlockOrder.Add(block); var nextBlocks = new List(block.NextBlocks); @@ -48,7 +49,7 @@ public override void Analyze(BasicBlocks basicBlocks) foreach (var successor in nextBlocks) { - if (!referenced.Get(successor.Sequence)) + if (!referenced.Contains(successor)) { workList.Push(successor); } diff --git a/Source/Mosa.Compiler.Framework/Common/QuickBlockSet.cs b/Source/Mosa.Compiler.Framework/Common/BlockBitSet.cs similarity index 77% rename from Source/Mosa.Compiler.Framework/Common/QuickBlockSet.cs rename to Source/Mosa.Compiler.Framework/Common/BlockBitSet.cs index ca3db3914e..481d1d8137 100644 --- a/Source/Mosa.Compiler.Framework/Common/QuickBlockSet.cs +++ b/Source/Mosa.Compiler.Framework/Common/BlockBitSet.cs @@ -4,18 +4,18 @@ namespace Mosa.Compiler.Framework.Common; -public sealed class QuickBlockSet +public sealed class BlockBitSet { private readonly BasicBlocks BasicBlocks; private readonly BitArray ArraySet; - public QuickBlockSet(BasicBlocks basicBlocks) + public BlockBitSet(BasicBlocks basicBlocks) { BasicBlocks = basicBlocks; ArraySet = new BitArray(basicBlocks.Count, false); } - public QuickBlockSet(BasicBlocks basicBlocks, List blocks) + public BlockBitSet(BasicBlocks basicBlocks, List blocks) { BasicBlocks = basicBlocks; ArraySet = new BitArray(basicBlocks.Count, false); @@ -49,6 +49,16 @@ public void Remove(BasicBlock block) ArraySet.Set(block.Sequence, false); } + public void Or(BlockBitSet set) + { + ArraySet.Or(set.ArraySet); + } + + public void And(BlockBitSet set) + { + ArraySet.And(set.ArraySet); + } + public IEnumerable GetBlocks() { for (var i = 0; i < ArraySet.Count; i++) diff --git a/Source/Mosa.Compiler.Framework/Stages/ValueNumberingStage.cs b/Source/Mosa.Compiler.Framework/Stages/ValueNumberingStage.cs index 3fe46f062f..ccaeb06fd9 100644 --- a/Source/Mosa.Compiler.Framework/Stages/ValueNumberingStage.cs +++ b/Source/Mosa.Compiler.Framework/Stages/ValueNumberingStage.cs @@ -4,6 +4,7 @@ using System.Diagnostics; using Mosa.Compiler.Common.Exceptions; using Mosa.Compiler.Framework.Analysis; +using Mosa.Compiler.Framework.Common; namespace Mosa.Compiler.Framework.Stages; @@ -16,7 +17,7 @@ public sealed class ValueNumberingStage : BaseMethodCompilerStage private List ReversePostOrder; private Dictionary MapToValueNumber; - private BitArray Processed; + private BlockBitSet Processed; private TraceLog trace; @@ -67,7 +68,7 @@ protected override void Run() MapToValueNumber = new Dictionary(MethodCompiler.VirtualRegisters.Count); Expressions = new Dictionary>(); - Processed = new BitArray(BasicBlocks.Count, false); + Processed = new BlockBitSet(BasicBlocks); AnalysisDominance = new SimpleFastDominance(BasicBlocks, BasicBlocks.PrologueBlock); @@ -203,7 +204,7 @@ private void ValueNumber(BasicBlock block, out List nextblocks, out var successorValidated = false; var successorProcessed = true; - Processed.Set(block.Sequence, true); + Processed.Add(block); for (var node = block.AfterFirst; !node.IsBlockEndInstruction; node = node.Next) { @@ -219,7 +220,7 @@ private void ValueNumber(BasicBlock block, out List nextblocks, out successorValidated = true; foreach (var processed in block.PreviousBlocks) { - if (!Processed.Get(block.Sequence)) + if (!Processed.Contains(block)) { successorProcessed = false; break; diff --git a/Source/Mosa.Compiler.Framework/Transforms/BasicBlocks/RemoveUnreachableBlocks.cs b/Source/Mosa.Compiler.Framework/Transforms/BasicBlocks/RemoveUnreachableBlocks.cs index 944a1624d2..754b010fb3 100644 --- a/Source/Mosa.Compiler.Framework/Transforms/BasicBlocks/RemoveUnreachableBlocks.cs +++ b/Source/Mosa.Compiler.Framework/Transforms/BasicBlocks/RemoveUnreachableBlocks.cs @@ -1,6 +1,7 @@ // Copyright (c) MOSA Project. Licensed under the New BSD License. using System.Collections; +using Mosa.Compiler.Framework.Common; namespace Mosa.Compiler.Framework.Transforms.BasicBlocks; @@ -15,13 +16,13 @@ public override int Process(Transform transform) var emptied = 0; var stack = new Stack(); - var bitmap = new BitArray(basicBlocks.Count, false); + var bitmap = new BlockBitSet(basicBlocks); foreach (var block in basicBlocks) { if (block.IsHeadBlock || block.IsHandlerHeadBlock || block.IsTryHeadBlock) { - bitmap.Set(block.Sequence, true); + bitmap.Add(block); stack.Push(block); } } @@ -36,9 +37,9 @@ public override int Process(Transform transform) { //trace?.Log($"Visited Block: {block}"); - if (!bitmap.Get(next.Sequence)) + if (!bitmap.Contains(next)) { - bitmap.Set(next.Sequence, true); + bitmap.Add(next); stack.Push(next); } } @@ -46,7 +47,7 @@ public override int Process(Transform transform) foreach (var block in basicBlocks) { - if (bitmap.Get(block.Sequence)) + if (bitmap.Contains(block)) continue; if (block.IsHandlerHeadBlock || block.IsTryHeadBlock) From 61f1947bdb1ecfedfc029ed5e866fb75f18c4c5f Mon Sep 17 00:00:00 2001 From: Phil Date: Sat, 23 Mar 2024 08:11:42 -0700 Subject: [PATCH 10/17] - Fix --- Source/Mosa.Utility.Configuration/MOSASettings.cs | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/Source/Mosa.Utility.Configuration/MOSASettings.cs b/Source/Mosa.Utility.Configuration/MOSASettings.cs index 1d4e5179b0..750e9910b9 100644 --- a/Source/Mosa.Utility.Configuration/MOSASettings.cs +++ b/Source/Mosa.Utility.Configuration/MOSASettings.cs @@ -66,13 +66,13 @@ public string DebugFile public bool EmitBinary { get => Settings.GetValue(Name.Compiler_Binary, true); - set => Settings.SetValue(Name.Compiler_Binary, true); + set => Settings.SetValue(Name.Compiler_Binary, value); } public bool EmitDwarf { get => Settings.GetValue(Name.Linker_Dwarf, false); - set => Settings.SetValue(Name.Linker_Dwarf, false); + set => Settings.SetValue(Name.Linker_Dwarf, value); } public string MultibootVersion @@ -757,7 +757,6 @@ public void SetDefaultSettings() MethodScanner = false; - EmitBinary = true; SSA = true; BasicOptimizations = true; ValueNumbering = true; From f92541965510a09205c950b3eddc97d04664c94b Mon Sep 17 00:00:00 2001 From: Phil Date: Sat, 23 Mar 2024 08:36:43 -0700 Subject: [PATCH 11/17] - Utilizing BlockBitSet class --- .../Analysis/LoopAwareBlockOrder.cs | 37 ++++---- .../Analysis/LoopDetector.cs | 89 +++++++++++++++++++ .../Analysis/SimpleTraceBlockOrder.cs | 9 +- .../Common/BlockBitSet.cs | 72 +++++++++++++++ .../Common/QuickBlockSetLookup.cs | 59 ------------ .../{Common => }/Loop.cs | 2 +- .../Stages/LoopInvariantCodeMotionStage.cs | 84 +---------------- .../Stages/ValueNumberingStage.cs | 9 +- .../BasicBlocks/RemoveUnreachableBlocks.cs | 11 +-- .../Optimization/LoopUnrollingTests.cs | 15 +++- 10 files changed, 215 insertions(+), 172 deletions(-) create mode 100644 Source/Mosa.Compiler.Framework/Analysis/LoopDetector.cs create mode 100644 Source/Mosa.Compiler.Framework/Common/BlockBitSet.cs delete mode 100644 Source/Mosa.Compiler.Framework/Common/QuickBlockSetLookup.cs rename Source/Mosa.Compiler.Framework/{Common => }/Loop.cs (93%) diff --git a/Source/Mosa.Compiler.Framework/Analysis/LoopAwareBlockOrder.cs b/Source/Mosa.Compiler.Framework/Analysis/LoopAwareBlockOrder.cs index 4ad4e1a988..09089d7d1c 100644 --- a/Source/Mosa.Compiler.Framework/Analysis/LoopAwareBlockOrder.cs +++ b/Source/Mosa.Compiler.Framework/Analysis/LoopAwareBlockOrder.cs @@ -2,6 +2,7 @@ using System.Collections; using System.Diagnostics; +using Mosa.Compiler.Framework.Common; namespace Mosa.Compiler.Framework.Analysis; @@ -13,9 +14,9 @@ public sealed class LoopAwareBlockOrder : BaseBlockOrder #region Data Members private BasicBlocks basicBlocks; - private BitArray active; - private BitArray visited; - private BitArray loopHeader; + private BlockBitSet active; + private BlockBitSet visited; + private BlockBitSet loopHeader; private List loopEnds; private int loopCount; private int[] forwardBranchesCount; @@ -115,7 +116,7 @@ public override void Analyze(BasicBlocks basicBlocks) blockCount = basicBlocks.Count; loopEnds = new List(); loopCount = 0; - loopHeader = new BitArray(blockCount, false); + loopHeader = new BlockBitSet(basicBlocks); forwardBranchesCount = new int[blockCount]; loopBlockIndex = new int[blockCount]; loopDepth = new int[blockCount]; @@ -153,8 +154,8 @@ private void Start(BasicBlock start) private void StartCountEdges(BasicBlock start) { - active = new BitArray(blockCount, false); - visited = new BitArray(blockCount, false); + active = new BlockBitSet(basicBlocks); + visited = new BlockBitSet(basicBlocks); CountEdges(start, null); } @@ -163,12 +164,12 @@ private void CountEdges(BasicBlock current, BasicBlock parent) { var blockId = current.Sequence; - if (active.Get(blockId)) + if (active.Contains(current)) { - Debug.Assert(visited.Get(blockId)); + Debug.Assert(visited.Contains(current)); Debug.Assert(parent != null); - loopHeader.Set(blockId, true); + loopHeader.Add(current); loopEnds.Add(parent); return; @@ -176,21 +177,21 @@ private void CountEdges(BasicBlock current, BasicBlock parent) forwardBranchesCount[blockId]++; - if (visited.Get(blockId)) + if (visited.Contains(current)) return; - visited.Set(blockId, true); - active.Set(blockId, true); + visited.Add(current); + active.Add(current); foreach (var next in current.NextBlocks) { CountEdges(next, current); } - Debug.Assert(active.Get(blockId)); - active.Set(blockId, false); + Debug.Assert(active.Contains(current)); + active.Remove(current); - if (loopHeader.Get(blockId)) + if (loopHeader.Contains(current)) { loopBlockIndex[blockId] = loopCount; loopCount++; @@ -248,7 +249,7 @@ private void MarkLoops() private void AssignLoopDepth(BasicBlock start) { - visited = new BitArray(blockCount, false); + visited = new BlockBitSet(basicBlocks); var worklist = new Stack(); @@ -258,9 +259,9 @@ private void AssignLoopDepth(BasicBlock start) { var current = worklist.Pop(); - if (!visited.Get(current.Sequence)) + if (!visited.Contains(current)) { - visited.Set(current.Sequence, true); + visited.Add(current); var currentLoopDepth = 0; var minLoopIndex = -1; diff --git a/Source/Mosa.Compiler.Framework/Analysis/LoopDetector.cs b/Source/Mosa.Compiler.Framework/Analysis/LoopDetector.cs new file mode 100644 index 0000000000..d65b5ba18c --- /dev/null +++ b/Source/Mosa.Compiler.Framework/Analysis/LoopDetector.cs @@ -0,0 +1,89 @@ +// Copyright (c) MOSA Project. Licensed under the New BSD License. + +using System.Collections; +using Mosa.Compiler.Framework.Common; + +namespace Mosa.Compiler.Framework.Analysis; + +/// +/// Loop Detector +/// +public sealed class LoopDetector +{ + public static List FindLoops(BasicBlocks basicBlocks) + { + var dominance = new SimpleFastDominance(basicBlocks, basicBlocks.PrologueBlock); + + return FindLoops(basicBlocks, dominance); + } + + public static List FindLoops(BasicBlocks basicBlocks, SimpleFastDominance analysisDominance) + { + var loops = new List(); + var lookup = new Dictionary(); + + foreach (var block in basicBlocks) + { + if (block.PreviousBlocks.Count == 0) + continue; + + foreach (var previous in block.PreviousBlocks) + { + // Is this a back-edge? Yes, if "block" dominates "previous" + if (analysisDominance.IsDominator(block, previous)) + { + if (lookup.TryGetValue(block, out Loop loop)) + { + loop.AddBackEdge(previous); + } + else + { + loop = new Loop(block, previous); + loops.Add(loop); + lookup.Add(block, loop); + } + } + } + } + + foreach (var loop in loops) + { + PopulateLoopNodes(basicBlocks, loop); + } + + return loops; + } + + private static void PopulateLoopNodes(BasicBlocks basicBlocks, Loop loop) + { + var worklist = new Stack(); + var array = new BlockBitSet(basicBlocks); + + foreach (var backedge in loop.Backedges) + { + worklist.Push(backedge); + } + + loop.AddNode(loop.Header); + array.Add(loop.Header); + + while (worklist.Count != 0) + { + var node = worklist.Pop(); + + if (!array.Contains(node)) + { + array.Add(node); + loop.LoopBlocks.Add(node); + + foreach (var previous in node.PreviousBlocks) + { + if (previous == loop.Header) + continue; + + worklist.Push(previous); + } + } + } + } +} diff --git a/Source/Mosa.Compiler.Framework/Analysis/SimpleTraceBlockOrder.cs b/Source/Mosa.Compiler.Framework/Analysis/SimpleTraceBlockOrder.cs index eec3aea19e..28ec2fa8bc 100644 --- a/Source/Mosa.Compiler.Framework/Analysis/SimpleTraceBlockOrder.cs +++ b/Source/Mosa.Compiler.Framework/Analysis/SimpleTraceBlockOrder.cs @@ -1,6 +1,7 @@ // Copyright (c) MOSA Project. Licensed under the New BSD License. using System.Collections; +using Mosa.Compiler.Framework.Common; namespace Mosa.Compiler.Framework.Analysis; @@ -22,7 +23,7 @@ public override int GetLoopIndex(BasicBlock block) public override void Analyze(BasicBlocks basicBlocks) { // Create dictionary of referenced blocks - var referenced = new BitArray(basicBlocks.Count); + var referenced = new BlockBitSet(basicBlocks); // Allocate list of ordered Blocks NewBlockOrder = new List(basicBlocks.Count); @@ -38,9 +39,9 @@ public override void Analyze(BasicBlocks basicBlocks) { var block = workList.Pop(); - if (!referenced.Get(block.Sequence)) + if (!referenced.Contains(block)) { - referenced.Set(block.Sequence, true); + referenced.Add(block); NewBlockOrder.Add(block); var nextBlocks = new List(block.NextBlocks); @@ -48,7 +49,7 @@ public override void Analyze(BasicBlocks basicBlocks) foreach (var successor in nextBlocks) { - if (!referenced.Get(successor.Sequence)) + if (!referenced.Contains(successor)) { workList.Push(successor); } diff --git a/Source/Mosa.Compiler.Framework/Common/BlockBitSet.cs b/Source/Mosa.Compiler.Framework/Common/BlockBitSet.cs new file mode 100644 index 0000000000..73b9cf8912 --- /dev/null +++ b/Source/Mosa.Compiler.Framework/Common/BlockBitSet.cs @@ -0,0 +1,72 @@ +// Copyright (c) MOSA Project. Licensed under the New BSD License. + +using System.Collections; + +namespace Mosa.Compiler.Framework.Common; + +public sealed class BlockBitSet +{ + //private readonly BasicBlocks BasicBlocks; + private readonly BitArray ArraySet; + + public BlockBitSet(BasicBlocks basicBlocks) + { + //BasicBlocks = basicBlocks; + ArraySet = new BitArray(basicBlocks.Count, false); + } + + public BlockBitSet(BasicBlocks basicBlocks, List blocks) + { + //BasicBlocks = basicBlocks; + ArraySet = new BitArray(basicBlocks.Count, false); + + if (blocks != null) + { + Add(blocks); + } + } + + public void Add(BasicBlock block) + { + ArraySet.Set(block.Sequence, true); + } + + public void Add(List blocks) + { + foreach (var block in blocks) + { + ArraySet.Set(block.Sequence, true); + } + } + + public bool Contains(BasicBlock block) + { + return ArraySet.Get(block.Sequence); + } + + public void Remove(BasicBlock block) + { + ArraySet.Set(block.Sequence, false); + } + + public void Or(BlockBitSet set) + { + ArraySet.Or(set.ArraySet); + } + + public void And(BlockBitSet set) + { + ArraySet.And(set.ArraySet); + } + + //public IEnumerable GetBlocks() + //{ + // for (var i = 0; i < ArraySet.Count; i++) + // { + // if (ArraySet.Get(i)) + // { + // yield return BasicBlocks[i]; + // } + // } + //} +} diff --git a/Source/Mosa.Compiler.Framework/Common/QuickBlockSetLookup.cs b/Source/Mosa.Compiler.Framework/Common/QuickBlockSetLookup.cs deleted file mode 100644 index bbcc73bd99..0000000000 --- a/Source/Mosa.Compiler.Framework/Common/QuickBlockSetLookup.cs +++ /dev/null @@ -1,59 +0,0 @@ -// Copyright (c) MOSA Project. Licensed under the New BSD License. - -using System.Collections; - -namespace Mosa.Compiler.Framework.Common; - -public sealed class QuickBlockSetLookup -{ - private readonly BitArray array; - - public QuickBlockSetLookup(BasicBlocks basicBlocks) - { - array = new BitArray(basicBlocks.Count, false); - } - - public QuickBlockSetLookup(BasicBlocks basicBlocks, List blocks) - { - array = new BitArray(basicBlocks.Count, false); - - if (blocks != null) - { - Add(blocks); - } - } - - public void Add(List blocks) - { - foreach (var block in blocks) - { - array.Set(block.Sequence, true); - } - } - - public bool Contains(BasicBlock block) - { - return array.Get(block.Sequence); - } - - public void Add(BasicBlock block) - { - array.Set(block.Sequence, true); - } - - public void Remove(BasicBlock block) - { - array.Set(block.Sequence, false); - } - - public IEnumerable GetBlocks(BasicBlocks basicBlocks) - { - for (var i = 0; i < array.Count; i++) - { - if (array.Get(i)) - { - yield return basicBlocks[i]; - } - } - } -} diff --git a/Source/Mosa.Compiler.Framework/Common/Loop.cs b/Source/Mosa.Compiler.Framework/Loop.cs similarity index 93% rename from Source/Mosa.Compiler.Framework/Common/Loop.cs rename to Source/Mosa.Compiler.Framework/Loop.cs index c1080c6806..1fff89812e 100644 --- a/Source/Mosa.Compiler.Framework/Common/Loop.cs +++ b/Source/Mosa.Compiler.Framework/Loop.cs @@ -2,7 +2,7 @@ using System.Diagnostics; -namespace Mosa.Compiler.Framework.Common; +namespace Mosa.Compiler.Framework; public sealed class Loop { diff --git a/Source/Mosa.Compiler.Framework/Stages/LoopInvariantCodeMotionStage.cs b/Source/Mosa.Compiler.Framework/Stages/LoopInvariantCodeMotionStage.cs index 3ef6843d23..eee3d9d485 100644 --- a/Source/Mosa.Compiler.Framework/Stages/LoopInvariantCodeMotionStage.cs +++ b/Source/Mosa.Compiler.Framework/Stages/LoopInvariantCodeMotionStage.cs @@ -5,7 +5,6 @@ using System.Text; using Mosa.Compiler.Common; using Mosa.Compiler.Framework.Analysis; -using Mosa.Compiler.Framework.Common; namespace Mosa.Compiler.Framework.Stages; @@ -18,9 +17,7 @@ public sealed class LoopInvariantCodeMotionStage : BaseMethodCompilerStage private readonly Counter CodeMotionCount = new("LoopInvariantCodeMotion.CodeMotion"); private readonly Counter Methods = new("LoopInvariantCodeMotion.Methods"); - private SimpleFastDominance AnalysisDominance; - - private HashSet ParamStoreSet = new HashSet(); + private HashSet ParamStoreSet = new(); private TraceLog trace; @@ -50,9 +47,7 @@ protected override void Run() ParamStoreSet = CollectParamStores(); - AnalysisDominance = new SimpleFastDominance(BasicBlocks, BasicBlocks.PrologueBlock); - - var loops = FindLoops(); + var loops = LoopDetector.FindLoops(BasicBlocks); if (loops.Count == 0) return; @@ -62,7 +57,7 @@ protected override void Run() DumpLoops(loops); } - SortLoops(loops); + SortLoopsByBlockCount(loops); FindLoopInvariantInstructions(loops); @@ -78,77 +73,6 @@ protected override void Run() protected override void Finish() { ParamStoreSet = null; - AnalysisDominance = null; - } - - private List FindLoops() - { - var loops = new List(); - var lookup = new Dictionary(); - - foreach (var block in BasicBlocks) - { - if (block.PreviousBlocks.Count == 0) - continue; - - foreach (var previous in block.PreviousBlocks) - { - // Is this a back-edge? Yes, if "block" dominates "previous" - if (AnalysisDominance.IsDominator(block, previous)) - { - if (lookup.TryGetValue(block, out Loop loop)) - { - loop.AddBackEdge(previous); - } - else - { - loop = new Loop(block, previous); - loops.Add(loop); - lookup.Add(block, loop); - } - } - } - } - - foreach (var loop in loops) - { - PopulateLoopNodes(loop); - } - - return loops; - } - - private void PopulateLoopNodes(Loop loop) - { - var worklist = new Stack(); - var array = new BitArray(BasicBlocks.Count); - - foreach (var backedge in loop.Backedges) - { - worklist.Push(backedge); - } - - loop.AddNode(loop.Header); - array.Set(loop.Header.Sequence, true); - - while (worklist.Count != 0) - { - var node = worklist.Pop(); - - if (!array.Get(node.Sequence)) - { - array.Set(node.Sequence, true); - loop.LoopBlocks.Add(node); - - foreach (var previous in node.PreviousBlocks) - { - if (previous == loop.Header) - continue; - - worklist.Push(previous); - } - } - } } public void DumpLoops(List loops) @@ -180,7 +104,7 @@ public void DumpLoops(List loops) } } - private void SortLoops(List loops) + private static void SortLoopsByBlockCount(List loops) { loops.Sort((Loop p1, Loop p2) => p1.LoopBlocks.Count < p2.LoopBlocks.Count ? 0 : 1); } diff --git a/Source/Mosa.Compiler.Framework/Stages/ValueNumberingStage.cs b/Source/Mosa.Compiler.Framework/Stages/ValueNumberingStage.cs index 3fe46f062f..ccaeb06fd9 100644 --- a/Source/Mosa.Compiler.Framework/Stages/ValueNumberingStage.cs +++ b/Source/Mosa.Compiler.Framework/Stages/ValueNumberingStage.cs @@ -4,6 +4,7 @@ using System.Diagnostics; using Mosa.Compiler.Common.Exceptions; using Mosa.Compiler.Framework.Analysis; +using Mosa.Compiler.Framework.Common; namespace Mosa.Compiler.Framework.Stages; @@ -16,7 +17,7 @@ public sealed class ValueNumberingStage : BaseMethodCompilerStage private List ReversePostOrder; private Dictionary MapToValueNumber; - private BitArray Processed; + private BlockBitSet Processed; private TraceLog trace; @@ -67,7 +68,7 @@ protected override void Run() MapToValueNumber = new Dictionary(MethodCompiler.VirtualRegisters.Count); Expressions = new Dictionary>(); - Processed = new BitArray(BasicBlocks.Count, false); + Processed = new BlockBitSet(BasicBlocks); AnalysisDominance = new SimpleFastDominance(BasicBlocks, BasicBlocks.PrologueBlock); @@ -203,7 +204,7 @@ private void ValueNumber(BasicBlock block, out List nextblocks, out var successorValidated = false; var successorProcessed = true; - Processed.Set(block.Sequence, true); + Processed.Add(block); for (var node = block.AfterFirst; !node.IsBlockEndInstruction; node = node.Next) { @@ -219,7 +220,7 @@ private void ValueNumber(BasicBlock block, out List nextblocks, out successorValidated = true; foreach (var processed in block.PreviousBlocks) { - if (!Processed.Get(block.Sequence)) + if (!Processed.Contains(block)) { successorProcessed = false; break; diff --git a/Source/Mosa.Compiler.Framework/Transforms/BasicBlocks/RemoveUnreachableBlocks.cs b/Source/Mosa.Compiler.Framework/Transforms/BasicBlocks/RemoveUnreachableBlocks.cs index 944a1624d2..754b010fb3 100644 --- a/Source/Mosa.Compiler.Framework/Transforms/BasicBlocks/RemoveUnreachableBlocks.cs +++ b/Source/Mosa.Compiler.Framework/Transforms/BasicBlocks/RemoveUnreachableBlocks.cs @@ -1,6 +1,7 @@ // Copyright (c) MOSA Project. Licensed under the New BSD License. using System.Collections; +using Mosa.Compiler.Framework.Common; namespace Mosa.Compiler.Framework.Transforms.BasicBlocks; @@ -15,13 +16,13 @@ public override int Process(Transform transform) var emptied = 0; var stack = new Stack(); - var bitmap = new BitArray(basicBlocks.Count, false); + var bitmap = new BlockBitSet(basicBlocks); foreach (var block in basicBlocks) { if (block.IsHeadBlock || block.IsHandlerHeadBlock || block.IsTryHeadBlock) { - bitmap.Set(block.Sequence, true); + bitmap.Add(block); stack.Push(block); } } @@ -36,9 +37,9 @@ public override int Process(Transform transform) { //trace?.Log($"Visited Block: {block}"); - if (!bitmap.Get(next.Sequence)) + if (!bitmap.Contains(next)) { - bitmap.Set(next.Sequence, true); + bitmap.Add(next); stack.Push(next); } } @@ -46,7 +47,7 @@ public override int Process(Transform transform) foreach (var block in basicBlocks) { - if (bitmap.Get(block.Sequence)) + if (bitmap.Contains(block)) continue; if (block.IsHandlerHeadBlock || block.IsTryHeadBlock) diff --git a/Source/Mosa.UnitTests/Optimization/LoopUnrollingTests.cs b/Source/Mosa.UnitTests/Optimization/LoopUnrollingTests.cs index a9f6987c3b..cbd5628357 100644 --- a/Source/Mosa.UnitTests/Optimization/LoopUnrollingTests.cs +++ b/Source/Mosa.UnitTests/Optimization/LoopUnrollingTests.cs @@ -13,7 +13,20 @@ public static int SimpleUnroll() for (var i = 0; i < 2; i++) { - v = v + 1; + v++; + } + + return v; + } + + [MethodImpl(MethodImplOptions.NoInlining)] + public static int SimpleUnroll2(int a) + { + var v = 0; + + for (var i = 0; i < 2; i++) + { + v += a; } return v; From e1ff8fc2a8bad939d495d25369397bcd64225148 Mon Sep 17 00:00:00 2001 From: Phil Date: Sat, 23 Mar 2024 08:46:13 -0700 Subject: [PATCH 12/17] - Utilizing BlockBitSet class --- .../Analysis/LoopDetector.cs | 28 +++++++++---------- 1 file changed, 14 insertions(+), 14 deletions(-) diff --git a/Source/Mosa.Compiler.Framework/Analysis/LoopDetector.cs b/Source/Mosa.Compiler.Framework/Analysis/LoopDetector.cs index d65b5ba18c..6ca01f117b 100644 --- a/Source/Mosa.Compiler.Framework/Analysis/LoopDetector.cs +++ b/Source/Mosa.Compiler.Framework/Analysis/LoopDetector.cs @@ -17,7 +17,7 @@ public static List FindLoops(BasicBlocks basicBlocks) return FindLoops(basicBlocks, dominance); } - public static List FindLoops(BasicBlocks basicBlocks, SimpleFastDominance analysisDominance) + public static List FindLoops(BasicBlocks basicBlocks, SimpleFastDominance dominance) { var loops = new List(); var lookup = new Dictionary(); @@ -30,7 +30,7 @@ public static List FindLoops(BasicBlocks basicBlocks, SimpleFastDominance foreach (var previous in block.PreviousBlocks) { // Is this a back-edge? Yes, if "block" dominates "previous" - if (analysisDominance.IsDominator(block, previous)) + if (dominance.IsDominator(block, previous)) { if (lookup.TryGetValue(block, out Loop loop)) { @@ -57,7 +57,7 @@ public static List FindLoops(BasicBlocks basicBlocks, SimpleFastDominance private static void PopulateLoopNodes(BasicBlocks basicBlocks, Loop loop) { var worklist = new Stack(); - var array = new BlockBitSet(basicBlocks); + var visited = new BlockBitSet(basicBlocks); foreach (var backedge in loop.Backedges) { @@ -65,24 +65,24 @@ private static void PopulateLoopNodes(BasicBlocks basicBlocks, Loop loop) } loop.AddNode(loop.Header); - array.Add(loop.Header); + visited.Add(loop.Header); while (worklist.Count != 0) { var node = worklist.Pop(); - if (!array.Contains(node)) - { - array.Add(node); - loop.LoopBlocks.Add(node); + if (visited.Contains(node)) + continue; - foreach (var previous in node.PreviousBlocks) - { - if (previous == loop.Header) - continue; + visited.Add(node); + loop.LoopBlocks.Add(node); - worklist.Push(previous); - } + foreach (var previous in node.PreviousBlocks) + { + if (previous == loop.Header) + continue; + + worklist.Push(previous); } } } From 87c34b21f4ebaaf5359e5e43a338365d4317a6df Mon Sep 17 00:00:00 2001 From: Phil Date: Tue, 26 Mar 2024 00:19:56 -0700 Subject: [PATCH 13/17] - WIP --- .../Analysis/SimpleTraceBlockOrder.cs | 26 ++++---- .../Stages/LoopInvariantCodeMotionStage.cs | 5 +- .../BitMap/BitMapIndexTable.cs | 2 +- .../IPC/ServiceQueueRegistry.cs | 2 +- .../Messaging/Message.cs | 21 ++++++ .../Messaging/MessageQueue.cs | 42 ++++++++++++ .../Messaging/MessageSystem.cs | 26 ++++++++ .../Messaging/ServiceIdentification.cs | 29 ++++++++ Source/Mosa.Kernel.BareMetal/Scheduler.cs | 16 ++--- .../Optimization/LoopStrengthReduction.cs | 66 +++++++++++++++++++ .../Mosa.Utility.UnitTests.csproj | 1 + 11 files changed, 212 insertions(+), 24 deletions(-) create mode 100644 Source/Mosa.Kernel.BareMetal/Messaging/Message.cs create mode 100644 Source/Mosa.Kernel.BareMetal/Messaging/MessageQueue.cs create mode 100644 Source/Mosa.Kernel.BareMetal/Messaging/MessageSystem.cs create mode 100644 Source/Mosa.Kernel.BareMetal/Messaging/ServiceIdentification.cs create mode 100644 Source/Mosa.UnitTests/Optimization/LoopStrengthReduction.cs diff --git a/Source/Mosa.Compiler.Framework/Analysis/SimpleTraceBlockOrder.cs b/Source/Mosa.Compiler.Framework/Analysis/SimpleTraceBlockOrder.cs index 8266969a8e..f9f65ec4f7 100644 --- a/Source/Mosa.Compiler.Framework/Analysis/SimpleTraceBlockOrder.cs +++ b/Source/Mosa.Compiler.Framework/Analysis/SimpleTraceBlockOrder.cs @@ -38,20 +38,24 @@ public override void Analyze(BasicBlocks basicBlocks) { var block = workList.Pop(); - if (!referenced.Contains(block)) - { - referenced.Add(block); - NewBlockOrder.Add(block); + if (referenced.Contains(block)) + continue; + + referenced.Add(block); + NewBlockOrder.Add(block); - var nextBlocks = new List(block.NextBlocks); - nextBlocks.Sort(); + if (block.NextBlocks.Count == 0) + continue; - foreach (var successor in nextBlocks) + var nextBlocks = (block.NextBlocks.Count == 2 && block.NextBlocks[0].Label > block.NextBlocks[1].Label) + ? new List() { block.NextBlocks[1], block.NextBlocks[0] } + : block.NextBlocks; + + foreach (var successor in nextBlocks) + { + if (!referenced.Contains(successor)) { - if (!referenced.Contains(successor)) - { - workList.Push(successor); - } + workList.Push(successor); } } } diff --git a/Source/Mosa.Compiler.Framework/Stages/LoopInvariantCodeMotionStage.cs b/Source/Mosa.Compiler.Framework/Stages/LoopInvariantCodeMotionStage.cs index eee3d9d485..bd5a2faae9 100644 --- a/Source/Mosa.Compiler.Framework/Stages/LoopInvariantCodeMotionStage.cs +++ b/Source/Mosa.Compiler.Framework/Stages/LoopInvariantCodeMotionStage.cs @@ -1,6 +1,5 @@ // Copyright (c) MOSA Project. Licensed under the New BSD License. -using System.Collections; using System.Diagnostics; using System.Text; using Mosa.Compiler.Common; @@ -135,7 +134,7 @@ private List FindLoopInvariantInstructions(Loop loop) { for (var node = block.AfterFirst; !node.IsBlockEndInstruction; node = node.Next) { - if (node.IsEmpty) + if (node.IsEmptyOrNop) continue; // note - same code from ValueNumberingStage::CanAssignValueNumberToExpression() @@ -145,7 +144,7 @@ private List FindLoopInvariantInstructions(Loop loop) || node.Instruction.IsIOOperation || node.Instruction.HasUnspecifiedSideEffect || node.Instruction.HasVariableOperands - || node.Instruction.IsFlowNext + || !node.Instruction.IsFlowNext || node.Instruction.IgnoreDuringCodeGeneration || node.Operand1.IsUnresolvedConstant || (node.OperandCount == 2 && node.Operand2.IsUnresolvedConstant) diff --git a/Source/Mosa.Kernel.BareMetal/BitMap/BitMapIndexTable.cs b/Source/Mosa.Kernel.BareMetal/BitMap/BitMapIndexTable.cs index bea9be46dc..0b112bbb83 100644 --- a/Source/Mosa.Kernel.BareMetal/BitMap/BitMapIndexTable.cs +++ b/Source/Mosa.Kernel.BareMetal/BitMap/BitMapIndexTable.cs @@ -4,7 +4,7 @@ namespace Mosa.Kernel.BareMetal; -public struct BitMapIndexTable +public readonly struct BitMapIndexTable { private readonly Pointer Pointer; diff --git a/Source/Mosa.Kernel.BareMetal/IPC/ServiceQueueRegistry.cs b/Source/Mosa.Kernel.BareMetal/IPC/ServiceQueueRegistry.cs index c86e8ec7dc..d9997bb2e1 100644 --- a/Source/Mosa.Kernel.BareMetal/IPC/ServiceQueueRegistry.cs +++ b/Source/Mosa.Kernel.BareMetal/IPC/ServiceQueueRegistry.cs @@ -6,7 +6,7 @@ namespace Mosa.Kernel.BareMetal.IPC; internal static class ServiceQueueRegistry { - public static List Queues = new List(); + public static List Queues = new(); public static void Register(ServiceIdentification serviceID, MessageQueue queue) { diff --git a/Source/Mosa.Kernel.BareMetal/Messaging/Message.cs b/Source/Mosa.Kernel.BareMetal/Messaging/Message.cs new file mode 100644 index 0000000000..b94554044c --- /dev/null +++ b/Source/Mosa.Kernel.BareMetal/Messaging/Message.cs @@ -0,0 +1,21 @@ +// Copyright (c) MOSA Project. Licensed under the New BSD License. + +namespace Mosa.Kernel.BareMetal.Messaging; + +internal struct Message +{ + public readonly ServiceIdentification ServiceIdentification; + public readonly object Data; + public readonly bool Direction; + public readonly uint Sequence; + public readonly Thread Thread; + + public Message(ServiceIdentification serviceIdentification, object requestData, bool direction, Thread thread, uint sequence) + { + ServiceIdentification = serviceIdentification; + Data = requestData; + Direction = direction; + Thread = thread; + Sequence = sequence; + } +} diff --git a/Source/Mosa.Kernel.BareMetal/Messaging/MessageQueue.cs b/Source/Mosa.Kernel.BareMetal/Messaging/MessageQueue.cs new file mode 100644 index 0000000000..39dad36530 --- /dev/null +++ b/Source/Mosa.Kernel.BareMetal/Messaging/MessageQueue.cs @@ -0,0 +1,42 @@ +// Copyright (c) MOSA Project. Licensed under the New BSD License. + +using System.Collections.Generic; + +namespace Mosa.Kernel.BareMetal.Messaging; + +internal class MessageQueue +{ + public readonly string Name; + + public readonly ServiceIdentification ServiceIdentification; + + public readonly Thread Thread; + + private readonly Queue Queue = new(); + + public MessageQueue(string name, ServiceIdentification serviceIdentification, Thread thread) + { + Name = name; + ServiceIdentification = serviceIdentification; + Thread = thread; + } + + public void Add(Message message) + { + lock (this) + { + Queue.Enqueue(message); + } + } + + //public Message Pop() + //{ + // lock (this) + // { + // if (Queue.Count == 0) + // return null; + + // return Queue.Dequeue(); + // } + //} +} diff --git a/Source/Mosa.Kernel.BareMetal/Messaging/MessageSystem.cs b/Source/Mosa.Kernel.BareMetal/Messaging/MessageSystem.cs new file mode 100644 index 0000000000..ce6c76327b --- /dev/null +++ b/Source/Mosa.Kernel.BareMetal/Messaging/MessageSystem.cs @@ -0,0 +1,26 @@ +// Copyright (c) MOSA Project. Licensed under the New BSD License. + +using System.Collections.Generic; + +namespace Mosa.Kernel.BareMetal.Messaging; + +internal static class MessageSystem +{ + public static Queue Queue = new(); + + public static void DeliverMessage(ServiceIdentification service, bool direction, object requestData) + { + var thread = Scheduler.GetCurrentThread(); + + // queue the message + lock (Queue) + { + Queue.Enqueue(new Message(service, requestData, direction, thread, 0)); + } + } + + public static void ProcessMessages() + { + // + } +} diff --git a/Source/Mosa.Kernel.BareMetal/Messaging/ServiceIdentification.cs b/Source/Mosa.Kernel.BareMetal/Messaging/ServiceIdentification.cs new file mode 100644 index 0000000000..caf6fe24b6 --- /dev/null +++ b/Source/Mosa.Kernel.BareMetal/Messaging/ServiceIdentification.cs @@ -0,0 +1,29 @@ +// Copyright (c) MOSA Project. Licensed under the New BSD License. + +namespace Mosa.Kernel.BareMetal.Messaging; + +public readonly struct ServiceIdentification +{ + public readonly uint ID { get; } + + public uint ServiceID { get { return ID & 0xFFFF; } } + + public uint FunctionID { get { return ID >> 16 & 0xFFFF; } } + + public uint VersionID { get { return ID >> 24 & 0xFFFF; } } + + public ServiceIdentification(uint serviceID, uint functionID, uint versionID) + { + ID = (serviceID & 0xFFFF) | ((functionID & 0xFF) << 16) | ((versionID & 0xFF) << 24); + } + + public static bool operator ==(ServiceIdentification a, ServiceIdentification b) + { + return a.ID == b.ID; + } + + public static bool operator !=(ServiceIdentification a, ServiceIdentification b) + { + return a.ID != b.ID; + } +} diff --git a/Source/Mosa.Kernel.BareMetal/Scheduler.cs b/Source/Mosa.Kernel.BareMetal/Scheduler.cs index 8aaa364100..552b1ecb03 100644 --- a/Source/Mosa.Kernel.BareMetal/Scheduler.cs +++ b/Source/Mosa.Kernel.BareMetal/Scheduler.cs @@ -167,13 +167,18 @@ internal static object SignalSystemCall() return Platform.Scheduler.SignalSystemCall(); } - internal static void QueueRequestMessage(MessageQueue messageQueue, object data) + internal static void SendMessage(MessageQueue messageQueue, object data, bool async) { var thread = GetCurrentThread(); - var message = new Message(data, thread); + var message = async ? new Message(data, thread) : new Message(data); - // + messageQueue.Add(message); + } + + internal static Thread GetCurrentThread() + { + return CurrentThread; } #endregion Internal API @@ -306,11 +311,6 @@ private static void Sleep(Thread thread) thread.Status = ThreadStatus.Sleeping; } - private static Thread GetCurrentThread() - { - return CurrentThread; - } - private static void SetCurrentThread(Thread thread) { CurrentThread = thread; diff --git a/Source/Mosa.UnitTests/Optimization/LoopStrengthReduction.cs b/Source/Mosa.UnitTests/Optimization/LoopStrengthReduction.cs new file mode 100644 index 0000000000..778258e95a --- /dev/null +++ b/Source/Mosa.UnitTests/Optimization/LoopStrengthReduction.cs @@ -0,0 +1,66 @@ +// Copyright (c) MOSA Project. Licensed under the New BSD License. + +using System.Runtime.CompilerServices; + +namespace Mosa.UnitTests.Optimization; + +public static class LoopStrengthReduction +{ + [MethodImpl(MethodImplOptions.NoInlining)] + public static int Reduction1(int[] n) + { + var a = 0; + + for (var i = 0; i < 100; i++) + { + a *= n[i]; + } + + return a; + } + + [MethodImpl(MethodImplOptions.NoInlining)] + public static int Reduction2(int[] n) + { + var a = 0; + + for (var i = 0; i < 100; i++) + { + a *= n[i]; + } + + return a; + } + + [MethodImpl(MethodImplOptions.NoInlining)] + public static int Reduction3() + { + var a = 8; + var x = 0; + var y = 8; + var z = 1; + var n = 100; + + for (var i = n; i > 0; i--) + { + x = y + z; + a += x * x; + } + + return a; + } + + [MethodImpl(MethodImplOptions.NoInlining)] + public static int Reduction4() + { + var a = 8; + var n = 10; + + for (var i = n; i > 0; i--) + { + a *= i; + } + + return a; + } +} diff --git a/Source/Mosa.Utility.UnitTests/Mosa.Utility.UnitTests.csproj b/Source/Mosa.Utility.UnitTests/Mosa.Utility.UnitTests.csproj index 513d5dd267..60c72fb0f6 100644 --- a/Source/Mosa.Utility.UnitTests/Mosa.Utility.UnitTests.csproj +++ b/Source/Mosa.Utility.UnitTests/Mosa.Utility.UnitTests.csproj @@ -50,6 +50,7 @@ + From d78f08313732dfc75a5434adcacd092541a81297 Mon Sep 17 00:00:00 2001 From: Phil Date: Tue, 26 Mar 2024 00:39:42 -0700 Subject: [PATCH 14/17] - WIP --- Source/Mosa.Compiler.Framework/Node.cs | 2 +- Source/Mosa.Compiler.Framework/Stages/ValueNumberingStage.cs | 2 +- .../Optimizations/Manual/CodeMotion/BaseCodeMotionTransform.cs | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/Source/Mosa.Compiler.Framework/Node.cs b/Source/Mosa.Compiler.Framework/Node.cs index cfeff9f91a..dde45185ea 100644 --- a/Source/Mosa.Compiler.Framework/Node.cs +++ b/Source/Mosa.Compiler.Framework/Node.cs @@ -1207,7 +1207,7 @@ public void SetInstruction(BaseInstruction instruction, int operandCount, int re var label = Label; var block = Block; - Clear(); + Empty(); Instruction = instruction; OperandCount = operandCount; diff --git a/Source/Mosa.Compiler.Framework/Stages/ValueNumberingStage.cs b/Source/Mosa.Compiler.Framework/Stages/ValueNumberingStage.cs index ccaeb06fd9..239f0a1344 100644 --- a/Source/Mosa.Compiler.Framework/Stages/ValueNumberingStage.cs +++ b/Source/Mosa.Compiler.Framework/Stages/ValueNumberingStage.cs @@ -464,7 +464,7 @@ private bool CanAssignValueNumberToExpression(Node node) || node.Instruction.IsIOOperation || node.Instruction.HasUnspecifiedSideEffect || node.Instruction.HasVariableOperands - || node.Instruction.IsFlowNext + || !node.Instruction.IsFlowNext || node.Instruction.IgnoreDuringCodeGeneration || node.Operand1.IsUnresolvedConstant || (node.OperandCount == 2 && node.Operand2.IsUnresolvedConstant)) diff --git a/Source/Mosa.Compiler.Framework/Transforms/Optimizations/Manual/CodeMotion/BaseCodeMotionTransform.cs b/Source/Mosa.Compiler.Framework/Transforms/Optimizations/Manual/CodeMotion/BaseCodeMotionTransform.cs index c076210238..9bd5101045 100644 --- a/Source/Mosa.Compiler.Framework/Transforms/Optimizations/Manual/CodeMotion/BaseCodeMotionTransform.cs +++ b/Source/Mosa.Compiler.Framework/Transforms/Optimizations/Manual/CodeMotion/BaseCodeMotionTransform.cs @@ -82,7 +82,7 @@ protected static Node GetMotionLocation(Node start, Node end, int window) if (next.IsBlockEndInstruction || next.Instruction.IsMemoryWrite - || next.Instruction.IsFlowNext + || !next.Instruction.IsFlowNext || next.Instruction.HasUnspecifiedSideEffect) return next; From e9e3324d4150d9b42b5a594cee38c52644e627de Mon Sep 17 00:00:00 2001 From: Phil Date: Tue, 26 Mar 2024 23:43:12 -0700 Subject: [PATCH 15/17] - Fix --- .../Analysis/SimpleTraceBlockOrder.cs | 8 +++++--- Source/Mosa.Compiler.Framework/Compiler.cs | 2 ++ Source/Mosa.Compiler.Framework/Node.cs | 19 +------------------ 3 files changed, 8 insertions(+), 21 deletions(-) diff --git a/Source/Mosa.Compiler.Framework/Analysis/SimpleTraceBlockOrder.cs b/Source/Mosa.Compiler.Framework/Analysis/SimpleTraceBlockOrder.cs index f9f65ec4f7..7dcd86b9e5 100644 --- a/Source/Mosa.Compiler.Framework/Analysis/SimpleTraceBlockOrder.cs +++ b/Source/Mosa.Compiler.Framework/Analysis/SimpleTraceBlockOrder.cs @@ -47,9 +47,11 @@ public override void Analyze(BasicBlocks basicBlocks) if (block.NextBlocks.Count == 0) continue; - var nextBlocks = (block.NextBlocks.Count == 2 && block.NextBlocks[0].Label > block.NextBlocks[1].Label) - ? new List() { block.NextBlocks[1], block.NextBlocks[0] } - : block.NextBlocks; + var nextBlocks = block.NextBlocks; + + //var nextBlocks = (block.NextBlocks.Count == 2 && block.NextBlocks[0].Label < block.NextBlocks[1].Label) + // ? new List() { block.NextBlocks[1], block.NextBlocks[0] } + // : block.NextBlocks; foreach (var successor in nextBlocks) { diff --git a/Source/Mosa.Compiler.Framework/Compiler.cs b/Source/Mosa.Compiler.Framework/Compiler.cs index 3a6926db22..08b2c9686e 100644 --- a/Source/Mosa.Compiler.Framework/Compiler.cs +++ b/Source/Mosa.Compiler.Framework/Compiler.cs @@ -143,6 +143,8 @@ public sealed class Compiler { new CILDecoderStage(), new ExceptionStage(), + //mosaSettings.Devirtualization ? new DevirtualizeCallStage() : null, + //mosaSettings.BasicOptimizations ? new OptimizationStage(false) : null, new IRTransformsStage(), mosaSettings.Devirtualization ? new DevirtualizeCallStage() : null, new PlugStage(), diff --git a/Source/Mosa.Compiler.Framework/Node.cs b/Source/Mosa.Compiler.Framework/Node.cs index dde45185ea..04093886d7 100644 --- a/Source/Mosa.Compiler.Framework/Node.cs +++ b/Source/Mosa.Compiler.Framework/Node.cs @@ -479,22 +479,6 @@ public void UpdateBranchTarget(int index, BasicBlock block) #region Methods - /// - /// Clears this instance. - /// - private void Clear() - { - Label = -1; - Instruction = null; - - ClearOperands(); - - ConditionCode = ConditionCode.Undefined; - Options = InstructionOption.None; - Block = null; - BranchTargets = null; - } - /// /// Empties this node. /// @@ -507,8 +491,7 @@ public void Empty() Instruction = null; Block.RemoveBranchInstruction(this); BranchTargets = null; - - PhiBlocks?.Clear(); + PhiBlocks = null; if (AdditionalOperands != null) { From e90ca430d58926ec8d019df4822d022ca337bd5d Mon Sep 17 00:00:00 2001 From: Phil Date: Wed, 27 Mar 2024 20:00:32 -0700 Subject: [PATCH 16/17] - Fixed Loop Invariant Code Motion --- .../Analysis/SimpleTraceBlockOrder.cs | 8 +++----- .../Stages/LoopInvariantCodeMotionStage.cs | 2 +- .../Transforms/Exception/ExceptionEnd.cs | 2 +- .../Exception/ExceptionTransforms.cs | 2 +- .../Transforms/Exception/FinallyEnd.cs | 19 +++++++++++-------- .../Transforms/Exception/TryEnd.cs | 2 +- 6 files changed, 18 insertions(+), 17 deletions(-) diff --git a/Source/Mosa.Compiler.Framework/Analysis/SimpleTraceBlockOrder.cs b/Source/Mosa.Compiler.Framework/Analysis/SimpleTraceBlockOrder.cs index 7dcd86b9e5..09699d46c1 100644 --- a/Source/Mosa.Compiler.Framework/Analysis/SimpleTraceBlockOrder.cs +++ b/Source/Mosa.Compiler.Framework/Analysis/SimpleTraceBlockOrder.cs @@ -47,11 +47,9 @@ public override void Analyze(BasicBlocks basicBlocks) if (block.NextBlocks.Count == 0) continue; - var nextBlocks = block.NextBlocks; - - //var nextBlocks = (block.NextBlocks.Count == 2 && block.NextBlocks[0].Label < block.NextBlocks[1].Label) - // ? new List() { block.NextBlocks[1], block.NextBlocks[0] } - // : block.NextBlocks; + var nextBlocks = (block.NextBlocks.Count == 2 && block.NextBlocks[0].Label < block.NextBlocks[1].Label) + ? new List() { block.NextBlocks[1], block.NextBlocks[0] } + : block.NextBlocks; foreach (var successor in nextBlocks) { diff --git a/Source/Mosa.Compiler.Framework/Stages/LoopInvariantCodeMotionStage.cs b/Source/Mosa.Compiler.Framework/Stages/LoopInvariantCodeMotionStage.cs index bd5a2faae9..6b72a69fd6 100644 --- a/Source/Mosa.Compiler.Framework/Stages/LoopInvariantCodeMotionStage.cs +++ b/Source/Mosa.Compiler.Framework/Stages/LoopInvariantCodeMotionStage.cs @@ -137,7 +137,7 @@ private List FindLoopInvariantInstructions(Loop loop) if (node.IsEmptyOrNop) continue; - // note - same code from ValueNumberingStage::CanAssignValueNumberToExpression() + // note - similar code in ValueNumberingStage::CanAssignValueNumberToExpression() if (node.ResultCount != 1 || node.OperandCount is 0 or > 2 || node.Instruction.IsMemoryWrite diff --git a/Source/Mosa.Compiler.Framework/Transforms/Exception/ExceptionEnd.cs b/Source/Mosa.Compiler.Framework/Transforms/Exception/ExceptionEnd.cs index f40a4ad78d..a3166f0a45 100644 --- a/Source/Mosa.Compiler.Framework/Transforms/Exception/ExceptionEnd.cs +++ b/Source/Mosa.Compiler.Framework/Transforms/Exception/ExceptionEnd.cs @@ -28,7 +28,7 @@ public override void Transform(Context context, Transform transform) var handler = FindNextEnclosingFinallyHandler(transform, immediate); - if (handler == null) + if (handler == null || handler.HandlerStart >= target.Label) { context.SetInstruction(IR.Jmp, target); return; diff --git a/Source/Mosa.Compiler.Framework/Transforms/Exception/ExceptionTransforms.cs b/Source/Mosa.Compiler.Framework/Transforms/Exception/ExceptionTransforms.cs index 0e8d65701f..a57f0d3723 100644 --- a/Source/Mosa.Compiler.Framework/Transforms/Exception/ExceptionTransforms.cs +++ b/Source/Mosa.Compiler.Framework/Transforms/Exception/ExceptionTransforms.cs @@ -15,7 +15,7 @@ public static class ExceptionTransforms new ExceptionStart(), new ExceptionEnd(), new Flow(), - new TryEnd(), new TryStart(), + new TryEnd(), }; } diff --git a/Source/Mosa.Compiler.Framework/Transforms/Exception/FinallyEnd.cs b/Source/Mosa.Compiler.Framework/Transforms/Exception/FinallyEnd.cs index af4fd53b23..19c108df89 100644 --- a/Source/Mosa.Compiler.Framework/Transforms/Exception/FinallyEnd.cs +++ b/Source/Mosa.Compiler.Framework/Transforms/Exception/FinallyEnd.cs @@ -64,22 +64,25 @@ public override void Transform(Context context, Transform transform) var target = targets[i]; var conditionBlock = newBlocks[i + 1]; - conditionBlock.AppendInstruction(transform.BranchInstruction, ConditionCode.Equal, null, leaveTargetRegister, Operand.CreateConstant32(target.Label), target); - conditionBlock.AppendInstruction(IR.Jmp, newBlocks[i + 2].Block); + if (next == null && i == targets.Count - 1) + { + conditionBlock.AppendInstruction(IR.Jmp, target); + } + else + { + conditionBlock.AppendInstruction(transform.BranchInstruction, ConditionCode.Equal, null, leaveTargetRegister, Operand.CreateConstant32(target.Label), target); + conditionBlock.AppendInstruction(IR.Jmp, newBlocks[i + 2].Block); + } } } - var finallyCallBlock = newBlocks[targetcount - 1]; - if (next != null) { + var finallyCallBlock = newBlocks[targetcount - 1]; + finallyCallBlock.AppendInstruction(IR.MoveObject, transform.ExceptionRegister, Operand.NullObject); finallyCallBlock.AppendInstruction(IR.MoveObject, transform.LeaveTargetRegister, leaveTargetRegister); finallyCallBlock.AppendInstruction(IR.Jmp, transform.BasicBlocks.GetByLabel(next.HandlerStart)); } - else - { - // should be an unreachable block - } } } diff --git a/Source/Mosa.Compiler.Framework/Transforms/Exception/TryEnd.cs b/Source/Mosa.Compiler.Framework/Transforms/Exception/TryEnd.cs index 1bb3ff2029..ef6127a6c2 100644 --- a/Source/Mosa.Compiler.Framework/Transforms/Exception/TryEnd.cs +++ b/Source/Mosa.Compiler.Framework/Transforms/Exception/TryEnd.cs @@ -34,7 +34,7 @@ public override void Transform(Context context, Transform transform) var next = FindNextEnclosingFinallyHandler(transform, immediate); - if (next != null && next.HandlerEnd > immediate.HandlerEnd) + if (next != null && next.HandlerStart <= target.Label && next.HandlerEnd > immediate.HandlerEnd) { context.SetInstruction(IR.MoveObject, transform.LeaveTargetRegister, Operand.CreateConstant32(target.Label)); context.AppendInstruction(IR.MoveObject, transform.ExceptionRegister, Operand.NullObject); From 557c2689cd6601126853e6d6ef258123c4a6a9a2 Mon Sep 17 00:00:00 2001 From: Phil Date: Wed, 27 Mar 2024 20:36:50 -0700 Subject: [PATCH 17/17] - Fixed Loop Invariant Code Motion --- Source/Mosa.Compiler.Framework/Compiler.cs | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/Source/Mosa.Compiler.Framework/Compiler.cs b/Source/Mosa.Compiler.Framework/Compiler.cs index 08b2c9686e..2aa07be6d3 100644 --- a/Source/Mosa.Compiler.Framework/Compiler.cs +++ b/Source/Mosa.Compiler.Framework/Compiler.cs @@ -143,10 +143,9 @@ public sealed class Compiler { new CILDecoderStage(), new ExceptionStage(), - //mosaSettings.Devirtualization ? new DevirtualizeCallStage() : null, - //mosaSettings.BasicOptimizations ? new OptimizationStage(false) : null, - new IRTransformsStage(), mosaSettings.Devirtualization ? new DevirtualizeCallStage() : null, + mosaSettings.BasicOptimizations ? new OptimizationStage(false) : null, + new IRTransformsStage(), new PlugStage(), new RuntimeStage(),