diff --git a/Readme.md b/Readme.md index 3bcd3ea677..0f2873f2c7 100644 --- a/Readme.md +++ b/Readme.md @@ -4,7 +4,7 @@ [build-status-image]: https://github.com/mosa/MOSA-Project/workflows/Builds/badge.svg?branch=master [build-status]: https://github.com/mosa/MOSA-Project/actions -[test-status-image]: https://github.com/mosa/MOSA-Project/workflows/Unit%20Tests/badge.svg +[test-status-image]: https://github.com/mosa/MOSA-Project/workflows/Builds/badge.svg [test-status]: https://github.com/mosa/MOSA-Project/actions [pull-requests-image]: http://www.issuestats.com/github/mosa/mosa-project/badge/pr [pull-requests]: http://www.issuestats.com/github/mosa/mosa-project diff --git a/Source/Data/IR-Instructions.json b/Source/Data/IR-Instructions.json index 32fd5e9a45..24c4b650e9 100644 --- a/Source/Data/IR-Instructions.json +++ b/Source/Data/IR-Instructions.json @@ -409,7 +409,7 @@ "Name": "ExceptionEnd", "FamilyName": "IR", "ResultCount": 0, - "OperandCount": 1, + "OperandCount": 0, "IgnoreDuringCodeGeneration": "true" }, { diff --git a/Source/Data/IR-Optimizations-Simplification.json b/Source/Data/IR-Optimizations-Simplification.json index d15a518c09..4a68670ea5 100644 --- a/Source/Data/IR-Optimizations-Simplification.json +++ b/Source/Data/IR-Optimizations-Simplification.json @@ -46,7 +46,7 @@ "Name": "MoveObject", "SubName": "Coalescing", "Expression": "IR.MoveObject (IR.MoveObject a)", - "Filter": "", + "Filter": "!IsCPURegister(a)", "Result": "(IR.MoveObject a)", "Priority": "25" }, @@ -55,7 +55,7 @@ "Name": "MoveManagedPointer", "SubName": "Coalescing", "Expression": "IR.MoveManagedPointer (IR.MoveManagedPointer a)", - "Filter": "", + "Filter": "!IsCPURegister(a)", "Result": "(IR.MoveManagedPointer a)", "Priority": "25" }, diff --git a/Source/Data/X64-Optimizations-ConstantMove.json b/Source/Data/X64-Optimizations-ConstantMove.json index 9f498cbdcb..50c7e9ddc8 100644 --- a/Source/Data/X64-Optimizations-ConstantMove.json +++ b/Source/Data/X64-Optimizations-ConstantMove.json @@ -17,7 +17,7 @@ "Name": "Add##", "SubName": "", "Expression": "X64.Add## a (X64.Mov## c)", - "Filter": "IsConstant(c) && !AreAnyStatusFlagsUsed(@)", + "Filter": "IsConstant(c) && !AreAnyStatusFlagsUsed(@, $Window)", "Result": "(X64.Add## a c)", "Variations": "No", "Log": "No" @@ -27,7 +27,7 @@ "Name": "Sub##", "SubName": "", "Expression": "X64.Sub## a (X64.Mov## c)", - "Filter": "IsConstant(c) && !AreAnyStatusFlagsUsed(@)", + "Filter": "IsConstant(c) && !AreAnyStatusFlagsUsed(@, $Window)", "Result": "(X64.Sub## a c)", "Variations": "No", "Log": "No" @@ -37,7 +37,7 @@ "Name": "And##", "SubName": "", "Expression": "X64.And## a (X64.Mov## c)", - "Filter": "IsConstant(c) && !AreAnyStatusFlagsUsed(@)", + "Filter": "IsConstant(c) && !AreAnyStatusFlagsUsed(@, $Window)", "Result": "(X64.And## a c)", "Variations": "No", "Log": "No" @@ -47,7 +47,7 @@ "Name": "Or##", "SubName": "", "Expression": "X64.Or## a (X64.Mov## c)", - "Filter": "IsConstant(c) && !AreAnyStatusFlagsUsed(@)", + "Filter": "IsConstant(c) && !AreAnyStatusFlagsUsed(@, $Window)", "Result": "(X64.Or## a c)", "Variations": "No", "Log": "No" @@ -57,7 +57,7 @@ "Name": "Xor##", "SubName": "", "Expression": "X64.Xor## a (X64.Mov## c)", - "Filter": "IsConstant(c) && !AreAnyStatusFlagsUsed(@)", + "Filter": "IsConstant(c) && !AreAnyStatusFlagsUsed(@, $Window)", "Result": "(X64.Xor## a c)", "Variations": "No", "Log": "No" @@ -67,7 +67,7 @@ "Name": "Sar##", "SubName": "", "Expression": "X64.Sar## a (X64.Mov## c)", - "Filter": "IsConstant(c) && !AreAnyStatusFlagsUsed(@)", + "Filter": "IsConstant(c) && !AreAnyStatusFlagsUsed(@, $Window)", "Result": "(X64.Sar## a c)", "Variations": "No", "Log": "No" @@ -77,7 +77,7 @@ "Name": "Shl##", "SubName": "", "Expression": "X64.Shl## a (X64.Mov## c)", - "Filter": "IsConstant(c) && !AreAnyStatusFlagsUsed(@)", + "Filter": "IsConstant(c) && !AreAnyStatusFlagsUsed(@, $Window)", "Result": "(X64.Shl## a c)", "Variations": "No", "Log": "No" @@ -87,7 +87,7 @@ "Name": "Shr##", "SubName": "", "Expression": "X64.Shr## a (X64.Mov## c)", - "Filter": "IsConstant(c) && !AreAnyStatusFlagsUsed(@)", + "Filter": "IsConstant(c) && !AreAnyStatusFlagsUsed(@, $Window)", "Result": "(X64.Shr## a c)", "Variations": "No", "Log": "No" diff --git a/Source/Data/X64-Optimizations-Lea.json b/Source/Data/X64-Optimizations-Lea.json index cbe7c6259a..df50cc54ce 100644 --- a/Source/Data/X64-Optimizations-Lea.json +++ b/Source/Data/X64-Optimizations-Lea.json @@ -47,7 +47,7 @@ "Name": "Mul##ToLea##", "SubName": "By3Or5Or9", "Expression": "X64.Mul## a b", - "Filter": "!IsResult2Used(@) && !IsZero(a) && Contains(b, 3, 5, 9) && !AreAnyStatusFlagsUsed(@)", + "Filter": "!IsResult2Used(@) && !IsZero(a) && Contains(b, 3, 5, 9) && !AreAnyStatusFlagsUsed(@, $Window)", "Result": "(X64.Lea## a a [Sub##(To##(b),1)] [To##(0)])", "Variations": "No", "Log": "No" diff --git a/Source/Data/X64-Optimizations-Standard.json b/Source/Data/X64-Optimizations-Standard.json index 956aa83130..5dc5da6010 100644 --- a/Source/Data/X64-Optimizations-Standard.json +++ b/Source/Data/X64-Optimizations-Standard.json @@ -26,7 +26,7 @@ "Name": "Add##", "SubName": "ByZero", "Expression": "X64.Add## a 0", - "Filter": "!AreAnyStatusFlagsUsed(@)", + "Filter": "!AreAnyStatusFlagsUsed(@, $Window)", "Result": "(X64.Mov## a)", "Variations": "No" }, @@ -35,7 +35,7 @@ "Name": "Sub##", "SubName": "ByZero", "Expression": "X64.Sub## a 0", - "Filter": "!AreAnyStatusFlagsUsed(@)", + "Filter": "!AreAnyStatusFlagsUsed(@, $Window)", "Result": "(X64.Mov## a)", "Variations": "Yes" }, @@ -44,7 +44,7 @@ "Name": "IMul##", "SubName": "ByZero", "Expression": "X64.IMul## a 0", - "Filter": "!AreAnyStatusFlagsUsed(@)", + "Filter": "!AreAnyStatusFlagsUsed(@, $Window)", "Result": "(X64.Mov## 0)", "Variations": "No", "Log": "No" @@ -54,7 +54,7 @@ "Name": "IMul##", "SubName": "ByOne", "Expression": "X64.IMul## a 1", - "Filter": "!AreAnyStatusFlagsUsed(@)", + "Filter": "!AreAnyStatusFlagsUsed(@, $Window)", "Result": "(X64.Mov## 1)", "Variations": "No", "Log": "No" @@ -64,7 +64,7 @@ "Name": "And##", "SubName": "ByFF", "Expression": "X64.And## a 0xFF", - "Filter": "!IsCPURegister(a,%ESI) && !IsCPURegister(a,%EDI) && !AreAnyStatusFlagsUsed(@)", + "Filter": "!IsCPURegister(a,%ESI) && !IsCPURegister(a,%EDI) && !AreAnyStatusFlagsUsed(@, $Window)", "Result": "(X64.Movzx8To## a)", "Variations": "Yes", "Log": "No", @@ -75,7 +75,7 @@ "Name": "Add##By1Not##", "SubName": "", "Expression": "X64.Add## (X64.Not## x) 1", - "Filter": "IsVirtualRegister(x) && !IsCarryFlagUsed(@)", + "Filter": "IsVirtualRegister(x) && !IsCarryFlagUsed(@, $Window)", "Result": "(X64.Neg## x)", "Variations": "Yes" }, @@ -84,7 +84,7 @@ "Name": "Inc##Not##", "SubName": "", "Expression": "X64.Inc## (X64.Not## x)", - "Filter": "IsVirtualRegister(x) && !IsCarryFlagUsed(@)", + "Filter": "IsVirtualRegister(x) && !IsCarryFlagUsed(@, $Window)", "Result": "(X64.Neg## x)", "Variations": "No" }, @@ -93,7 +93,7 @@ "Name": "And##Add##", "SubName": "ToBlsr##", "Expression": "X64.And## x (X64.Add## x -1)", - "Filter": "IsVirtualRegister(x) && !IsCarryFlagUsed(@)", + "Filter": "IsVirtualRegister(x) && !IsCarryFlagUsed(@, $Window)", "Result": "(X64.Blsr## x)", "Variations": "Yes" }, @@ -112,7 +112,7 @@ "Name": "And##", "SubName": "ByZero", "Expression": "X64.And## a 0", - "Filter": "!AreAnyStatusFlagsUsed(@)", + "Filter": "!AreAnyStatusFlagsUsed(@, $Window)", "Result": "(X64.Mov## 0)", "Variations": "Yes", "Log": "No" @@ -122,7 +122,7 @@ "Name": "And##", "SubName": "ByMax", "Expression": "X64.And## a 0xFFFFFFFF", - "Filter": "!AreAnyStatusFlagsUsed(@)", + "Filter": "!AreAnyStatusFlagsUsed(@, $Window)", "Result": "(X64.Mov## [To##(0xFFFFFFFF)])", "Variations": "Yes", "Log": "No" @@ -132,7 +132,7 @@ "Name": "Sar##", "SubName": "ZeroValue", "Expression": "X64.Sar## 0 a", - "Filter": "!AreAnyStatusFlagsUsed(@)", + "Filter": "!AreAnyStatusFlagsUsed(@, $Window)", "Result": "(X64.Mov## 0)", "Priority": "80" }, @@ -141,7 +141,7 @@ "Name": "Sar##", "SubName": "ByZero", "Expression": "X64.Sar## a 0", - "Filter": "!AreAnyStatusFlagsUsed(@)", + "Filter": "!AreAnyStatusFlagsUsed(@, $Window)", "Result": "(X64.Mov## a)", "Priority": "80" }, @@ -150,7 +150,7 @@ "Name": "Shl##", "SubName": "ZeroValue", "Expression": "X64.Shl## 0 a", - "Filter": "!AreAnyStatusFlagsUsed(@)", + "Filter": "!AreAnyStatusFlagsUsed(@, $Window)", "Result": "(X64.Mov## 0)", "Priority": "80" }, @@ -159,7 +159,7 @@ "Name": "Shl##", "SubName": "ByZero", "Expression": "X64.Shl## a 0", - "Filter": "!AreAnyStatusFlagsUsed(@)", + "Filter": "!AreAnyStatusFlagsUsed(@, $Window)", "Result": "(X64.Mov## a)", "Priority": "80" }, @@ -168,7 +168,7 @@ "Name": "Shr##", "SubName": "ZeroValue", "Expression": "X64.Shr## 0 a", - "Filter": "!AreAnyStatusFlagsUsed(@)", + "Filter": "!AreAnyStatusFlagsUsed(@, $Window)", "Result": "(X64.Mov## 0)", "Priority": "80" }, @@ -177,7 +177,7 @@ "Name": "Shr##", "SubName": "ByZero", "Expression": "X64.Shr## a 0", - "Filter": "!AreAnyStatusFlagsUsed(@)", + "Filter": "!AreAnyStatusFlagsUsed(@, $Window)", "Result": "(X64.Mov## a)", "Priority": "80" }, @@ -186,7 +186,7 @@ "Name": "IMul##Mov##", "SubName": "ByZero", "Expression": "X64.IMul## a (X64.Mov## 0)", - "Filter": "!AreAnyStatusFlagsUsed(@)", + "Filter": "!AreAnyStatusFlagsUsed(@, $Window)", "Result": "(X64.Mov## 0)", "Variations": "No", "Log": "No" @@ -196,7 +196,7 @@ "Name": "IMul##Mov##", "SubName": "ByOne", "Expression": "X64.IMul## a (X64.Mov## 1)", - "Filter": "!AreAnyStatusFlagsUsed(@)", + "Filter": "!AreAnyStatusFlagsUsed(@, $Window)", "Result": "(X64.Mov## a)", "Variations": "No", "Log": "No" diff --git a/Source/Data/X86-Optimizations-ConstantMove.json b/Source/Data/X86-Optimizations-ConstantMove.json index 0be2cb05a4..a94161ec8a 100644 --- a/Source/Data/X86-Optimizations-ConstantMove.json +++ b/Source/Data/X86-Optimizations-ConstantMove.json @@ -13,7 +13,7 @@ "Name": "Add32", "SubName": "", "Expression": "X86.Add32 a (X86.Mov32 c)", - "Filter": "IsConstant(c) && !AreAnyStatusFlagsUsed(@)", + "Filter": "IsConstant(c) && !AreAnyStatusFlagsUsed(@, $Window)", "Result": "(X86.Add32 a c)", "Variations": "No", "Log": "No" @@ -23,7 +23,7 @@ "Name": "Sub32", "SubName": "", "Expression": "X86.Sub32 a (X86.Mov32 c)", - "Filter": "IsConstant(c) && !AreAnyStatusFlagsUsed(@)", + "Filter": "IsConstant(c) && !AreAnyStatusFlagsUsed(@, $Window)", "Result": "(X86.Sub32 a c)", "Variations": "No", "Log": "No" @@ -33,7 +33,7 @@ "Name": "And32", "SubName": "", "Expression": "X86.And32 a (X86.Mov32 c)", - "Filter": "IsConstant(c) && !AreAnyStatusFlagsUsed(@)", + "Filter": "IsConstant(c) && !AreAnyStatusFlagsUsed(@, $Window)", "Result": "(X86.And32 a c)", "Variations": "No", "Log": "No" @@ -43,7 +43,7 @@ "Name": "Or32", "SubName": "", "Expression": "X86.Or32 a (X86.Mov32 c)", - "Filter": "IsConstant(c) && !AreAnyStatusFlagsUsed(@)", + "Filter": "IsConstant(c) && !AreAnyStatusFlagsUsed(@, $Window)", "Result": "(X86.Or32 a c)", "Variations": "No", "Log": "No" @@ -53,7 +53,7 @@ "Name": "Xor32", "SubName": "", "Expression": "X86.Xor32 a (X86.Mov32 c)", - "Filter": "IsConstant(c) && !AreAnyStatusFlagsUsed(@)", + "Filter": "IsConstant(c) && !AreAnyStatusFlagsUsed(@, $Window)", "Result": "(X86.Xor32 a c)", "Variations": "No", "Log": "No" @@ -63,7 +63,7 @@ "Name": "Sar32", "SubName": "", "Expression": "X86.Sar32 a (X86.Mov32 c)", - "Filter": "IsConstant(c) && !AreAnyStatusFlagsUsed(@)", + "Filter": "IsConstant(c) && !AreAnyStatusFlagsUsed(@, $Window)", "Result": "(X86.Sar32 a c)", "Variations": "No", "Log": "No" @@ -73,7 +73,7 @@ "Name": "Shl32", "SubName": "", "Expression": "X86.Shl32 a (X86.Mov32 c)", - "Filter": "IsConstant(c) && !AreAnyStatusFlagsUsed(@)", + "Filter": "IsConstant(c) && !AreAnyStatusFlagsUsed(@, $Window)", "Result": "(X86.Shl32 a c)", "Variations": "No", "Log": "No" @@ -83,7 +83,7 @@ "Name": "Shr32", "SubName": "", "Expression": "X86.Shr32 a (X86.Mov32 c)", - "Filter": "IsConstant(c) && !AreAnyStatusFlagsUsed(@)", + "Filter": "IsConstant(c) && !AreAnyStatusFlagsUsed(@, $Window)", "Result": "(X86.Shr32 a c)", "Variations": "No", "Log": "No" diff --git a/Source/Data/X86-Optimizations-Lea.json b/Source/Data/X86-Optimizations-Lea.json index f4d1a8a4cf..9c535fc6a8 100644 --- a/Source/Data/X86-Optimizations-Lea.json +++ b/Source/Data/X86-Optimizations-Lea.json @@ -43,7 +43,7 @@ "Name": "Mul32ToLea32", "SubName": "By3Or5Or9", "Expression": "X86.Mul32 a b", - "Filter": "!IsResult2Used(@) && !IsZero(a) && Contains(b, 3, 5, 9) && !AreAnyStatusFlagsUsed(@)", + "Filter": "!IsResult2Used(@) && !IsZero(a) && Contains(b, 3, 5, 9) && !AreAnyStatusFlagsUsed(@, $Window)", "Result": "(X86.Lea32 a a [Sub32(To32(b),1)] [To32(0)])", "Variations": "No", "Log": "No" diff --git a/Source/Data/X86-Optimizations-Standard.json b/Source/Data/X86-Optimizations-Standard.json index ea7bbca2cf..c31892d846 100644 --- a/Source/Data/X86-Optimizations-Standard.json +++ b/Source/Data/X86-Optimizations-Standard.json @@ -22,7 +22,7 @@ "Name": "Add32", "SubName": "ByZero", "Expression": "X86.Add32 a 0", - "Filter": "!AreAnyStatusFlagsUsed(@)", + "Filter": "!AreAnyStatusFlagsUsed(@, $Window)", "Result": "(X86.Mov32 a)", "Variations": "No" }, @@ -31,7 +31,7 @@ "Name": "Sub32", "SubName": "ByZero", "Expression": "X86.Sub32 a 0", - "Filter": "!AreAnyStatusFlagsUsed(@)", + "Filter": "!AreAnyStatusFlagsUsed(@, $Window)", "Result": "(X86.Mov32 a)", "Variations": "Yes" }, @@ -40,7 +40,7 @@ "Name": "IMul32", "SubName": "ByZero", "Expression": "X86.IMul32 a 0", - "Filter": "!AreAnyStatusFlagsUsed(@)", + "Filter": "!AreAnyStatusFlagsUsed(@, $Window)", "Result": "(X86.Mov32 0)", "Variations": "No", "Log": "No" @@ -50,7 +50,7 @@ "Name": "IMul32", "SubName": "ByOne", "Expression": "X86.IMul32 a 1", - "Filter": "!AreAnyStatusFlagsUsed(@)", + "Filter": "!AreAnyStatusFlagsUsed(@, $Window)", "Result": "(X86.Mov32 1)", "Variations": "No", "Log": "No" @@ -60,7 +60,7 @@ "Name": "And32", "SubName": "ByFF", "Expression": "X86.And32 a 0xFF", - "Filter": "!IsCPURegister(a,%ESI) && !IsCPURegister(a,%EDI) && !AreAnyStatusFlagsUsed(@)", + "Filter": "!IsCPURegister(a,%ESI) && !IsCPURegister(a,%EDI) && !AreAnyStatusFlagsUsed(@, $Window)", "Result": "(X86.Movzx8To32 a)", "Variations": "Yes", "Log": "No", @@ -71,7 +71,7 @@ "Name": "Add32By1Not32", "SubName": "", "Expression": "X86.Add32 (X86.Not32 x) 1", - "Filter": "IsVirtualRegister(x) && !IsCarryFlagUsed(@)", + "Filter": "IsVirtualRegister(x) && !IsCarryFlagUsed(@, $Window)", "Result": "(X86.Neg32 x)", "Variations": "Yes" }, @@ -80,7 +80,7 @@ "Name": "Inc32Not32", "SubName": "", "Expression": "X86.Inc32 (X86.Not32 x)", - "Filter": "IsVirtualRegister(x) && !IsCarryFlagUsed(@)", + "Filter": "IsVirtualRegister(x) && !IsCarryFlagUsed(@, $Window)", "Result": "(X86.Neg32 x)", "Variations": "No" }, @@ -89,7 +89,7 @@ "Name": "And32Add32", "SubName": "ToBlsr32", "Expression": "X86.And32 x (X86.Add32 x -1)", - "Filter": "IsVirtualRegister(x) && !IsCarryFlagUsed(@)", + "Filter": "IsVirtualRegister(x) && !IsCarryFlagUsed(@, $Window)", "Result": "(X86.Blsr32 x)", "Variations": "Yes" }, @@ -108,7 +108,7 @@ "Name": "And32", "SubName": "ByZero", "Expression": "X86.And32 a 0", - "Filter": "!AreAnyStatusFlagsUsed(@)", + "Filter": "!AreAnyStatusFlagsUsed(@, $Window)", "Result": "(X86.Mov32 0)", "Variations": "Yes", "Log": "No" @@ -118,7 +118,7 @@ "Name": "And32", "SubName": "ByMax", "Expression": "X86.And32 a 0xFFFFFFFF", - "Filter": "!AreAnyStatusFlagsUsed(@)", + "Filter": "!AreAnyStatusFlagsUsed(@, $Window)", "Result": "(X86.Mov32 [To32(0xFFFFFFFF)])", "Variations": "Yes", "Log": "No" @@ -128,7 +128,7 @@ "Name": "Sar32", "SubName": "ZeroValue", "Expression": "X86.Sar32 0 a", - "Filter": "!AreAnyStatusFlagsUsed(@)", + "Filter": "!AreAnyStatusFlagsUsed(@, $Window)", "Result": "(X86.Mov32 0)", "Priority": "80" }, @@ -137,7 +137,7 @@ "Name": "Sar32", "SubName": "ByZero", "Expression": "X86.Sar32 a 0", - "Filter": "!AreAnyStatusFlagsUsed(@)", + "Filter": "!AreAnyStatusFlagsUsed(@, $Window)", "Result": "(X86.Mov32 a)", "Priority": "80" }, @@ -146,7 +146,7 @@ "Name": "Shl32", "SubName": "ZeroValue", "Expression": "X86.Shl32 0 a", - "Filter": "!AreAnyStatusFlagsUsed(@)", + "Filter": "!AreAnyStatusFlagsUsed(@, $Window)", "Result": "(X86.Mov32 0)", "Priority": "80" }, @@ -155,7 +155,7 @@ "Name": "Shl32", "SubName": "ByZero", "Expression": "X86.Shl32 a 0", - "Filter": "!AreAnyStatusFlagsUsed(@)", + "Filter": "!AreAnyStatusFlagsUsed(@, $Window)", "Result": "(X86.Mov32 a)", "Priority": "80" }, @@ -164,7 +164,7 @@ "Name": "Shr32", "SubName": "ZeroValue", "Expression": "X86.Shr32 0 a", - "Filter": "!AreAnyStatusFlagsUsed(@)", + "Filter": "!AreAnyStatusFlagsUsed(@, $Window)", "Result": "(X86.Mov32 0)", "Priority": "80" }, @@ -173,7 +173,7 @@ "Name": "Shr32", "SubName": "ByZero", "Expression": "X86.Shr32 a 0", - "Filter": "!AreAnyStatusFlagsUsed(@)", + "Filter": "!AreAnyStatusFlagsUsed(@, $Window)", "Result": "(X86.Mov32 a)", "Priority": "80" }, @@ -182,7 +182,7 @@ "Name": "IMul32Mov32", "SubName": "ByZero", "Expression": "X86.IMul32 a (X86.Mov32 0)", - "Filter": "!AreAnyStatusFlagsUsed(@)", + "Filter": "!AreAnyStatusFlagsUsed(@, $Window)", "Result": "(X86.Mov32 0)", "Variations": "No", "Log": "No" @@ -192,7 +192,7 @@ "Name": "IMul32Mov32", "SubName": "ByOne", "Expression": "X86.IMul32 a (X86.Mov32 1)", - "Filter": "!AreAnyStatusFlagsUsed(@)", + "Filter": "!AreAnyStatusFlagsUsed(@, $Window)", "Result": "(X86.Mov32 a)", "Variations": "No", "Log": "No" diff --git a/Source/Docs/build-status.rst b/Source/Docs/build-status.rst index b71d21108a..20f618e812 100644 --- a/Source/Docs/build-status.rst +++ b/Source/Docs/build-status.rst @@ -5,13 +5,13 @@ .. |build| image:: https://img.shields.io/github/workflow/status/mosa/MOSA-Project/Builds :target: https://github.com/mosa/MOSA-Project/actions -.. |unittests| image:: https://img.shields.io/github/workflow/status/mosa/MOSA-Project/Unit%20Tests +.. |unittests| image:: https://img.shields.io/github/workflow/status/mosa/MOSA-Project/Builds :target: https://github.com/mosa/MOSA-Project/actions .. |github-build| image:: https://github.com/mosa/MOSA-Project/workflows/Builds/badge.svg?branch=master :target: https://github.com/mosa/MOSA-Project/actions -.. |github-unittests| image:: https://github.com/mosa/MOSA-Project/workflows/Unit%20Tests/badge.svg?branch=master +.. |github-unittests| image:: https://github.com/mosa/MOSA-Project/workflows/Builds/badge.svg?branch=master :target: https://github.com/mosa/MOSA-Project/actions .. |license| image:: https://img.shields.io/badge/License-New%20BSD-blue.svg diff --git a/Source/Docs/command-line-arguments.rst b/Source/Docs/command-line-arguments.rst index a4806fa1dc..857131a10a 100644 --- a/Source/Docs/command-line-arguments.rst +++ b/Source/Docs/command-line-arguments.rst @@ -50,7 +50,7 @@ Below are the command line arguments available: -devirtualization,Optimizations.Devirtualization,true -devirtualization-off,Optimizations.Devirtualization,false -inline-level,Optimizations.Inline.Maximum,{value} - -reducesize,Optimizations.ReduceCodeSize,true + -reduce-size,Optimizations.ReduceCodeSize,true -platform,Compiler.Platform,{value} -x86,Compiler.Platform,x86 @@ -174,6 +174,7 @@ Below are the command line arguments available: Unit Testings: -maxerrors,UnitTest.MaxErrors,{value} + -filter,UnitTest.Filter,{value} Optimization Levels: -o0,Optimizations.Basic,false diff --git a/Source/Mosa.BareMetal.TestWorld.x86/Boot.cs b/Source/Mosa.BareMetal.TestWorld.x86/Boot.cs index ad1e3906ba..d64843975a 100644 --- a/Source/Mosa.BareMetal.TestWorld.x86/Boot.cs +++ b/Source/Mosa.BareMetal.TestWorld.x86/Boot.cs @@ -5,6 +5,7 @@ using System.Threading; using Mosa.Kernel.BareMetal; using Mosa.UnitTests.Optimization; +using Mosa.UnitTests.Primitive; namespace Mosa.BareMetal.TestWorld.x86; @@ -20,7 +21,15 @@ public static void Main() Console.WriteLine("Mosa.BareMetal.TextWorld.x86"); Console.WriteLine(); - Division.DivisionBy7(254u); + //Division.DivisionBy7(254u); + if (SingleTests.CeqR4R4(2, -1)) + { + Console.WriteLine("FALSE"); + } + else + { + Console.WriteLine("PASS"); + } //InterruptManager.SetHandler(ProcessInterrupt); diff --git a/Source/Mosa.Compiler.Common.xUnit/Mosa.Compiler.Common.xUnit.csproj b/Source/Mosa.Compiler.Common.xUnit/Mosa.Compiler.Common.xUnit.csproj index 7921cd4d8c..ad7d0a2e74 100644 --- a/Source/Mosa.Compiler.Common.xUnit/Mosa.Compiler.Common.xUnit.csproj +++ b/Source/Mosa.Compiler.Common.xUnit/Mosa.Compiler.Common.xUnit.csproj @@ -6,17 +6,17 @@ - + - - - - - - + + + + + + all - + all diff --git a/Source/Mosa.Compiler.Framework.xUnit/Mosa.Compiler.Framework.xUnit.csproj b/Source/Mosa.Compiler.Framework.xUnit/Mosa.Compiler.Framework.xUnit.csproj index 7921cd4d8c..ad7d0a2e74 100644 --- a/Source/Mosa.Compiler.Framework.xUnit/Mosa.Compiler.Framework.xUnit.csproj +++ b/Source/Mosa.Compiler.Framework.xUnit/Mosa.Compiler.Framework.xUnit.csproj @@ -6,17 +6,17 @@ - + - - - - - - + + + + + + all - + all diff --git a/Source/Mosa.Compiler.Framework/Analysis/SimpleFastDominance.cs b/Source/Mosa.Compiler.Framework/Analysis/SimpleFastDominance.cs index 89418210a4..bea04e4674 100644 --- a/Source/Mosa.Compiler.Framework/Analysis/SimpleFastDominance.cs +++ b/Source/Mosa.Compiler.Framework/Analysis/SimpleFastDominance.cs @@ -111,7 +111,7 @@ private void CalculateDominance() } } - if (doms[b.Sequence] != newIDom || doms[b.Sequence] == null) + if (doms[b.Sequence] != newIDom) { doms[b.Sequence] = newIDom; changed = true; diff --git a/Source/Mosa.Compiler.Framework/BaseInstruction.cs b/Source/Mosa.Compiler.Framework/BaseInstruction.cs index 44f971a5f2..2e704410b1 100644 --- a/Source/Mosa.Compiler.Framework/BaseInstruction.cs +++ b/Source/Mosa.Compiler.Framework/BaseInstruction.cs @@ -35,8 +35,6 @@ public abstract class BaseInstruction public virtual string FamilyName => null; - public virtual string Modifier => null; - public virtual string FullName { get; private set; } public virtual string OpcodeName { get; private set; } diff --git a/Source/Mosa.Compiler.Framework/BaseTransform.cs b/Source/Mosa.Compiler.Framework/BaseTransform.cs index 029a6047d3..dc98f8ec9c 100644 --- a/Source/Mosa.Compiler.Framework/BaseTransform.cs +++ b/Source/Mosa.Compiler.Framework/BaseTransform.cs @@ -294,14 +294,14 @@ protected static bool IsZero(ulong value) return value == 0; } - public static bool AreAnyStatusFlagsUsed(Context context) + public static bool AreAnyStatusFlagsUsed(Context context, int window) { - return AreStatusFlagsUsed(context.Instruction, context.Node) != TriState.No; + return AreStatusFlagsUsed(context.Instruction, context.Node, window) != TriState.No; } - public static bool IsCarryFlagUsed(Context context) + public static bool IsCarryFlagUsed(Context context, int window) { - return IsCarryFlagUsed(context.Node) != TriState.No; + return IsCarryFlagUsed(context.Node, window) != TriState.No; } protected static bool IsResultAndOperand1Same(Context context) @@ -900,27 +900,28 @@ protected static ulong SignExtend8x64(byte value) public enum TriState { Yes, No, Unknown }; - public static TriState AreAnyStatusFlagsUsed(Node node) + public static TriState AreAnyStatusFlagsUsed(Node node, int window) { - return AreStatusFlagsUsed(node.Next, true, true, true, true, true); + return AreStatusFlagsUsed(node.Next, true, true, true, true, true, window); } - public static TriState IsCarryFlagUsed(Node node) + public static TriState IsCarryFlagUsed(Node node, int window) { - return AreStatusFlagsUsed(node.Next, false, true, false, false, false); + return AreStatusFlagsUsed(node.Next, false, true, false, false, false, window); } - public static TriState AreStatusFlagsUsed(BaseInstruction instruction, Node node) + public static TriState AreStatusFlagsUsed(BaseInstruction instruction, Node node, int window) { return AreStatusFlagsUsed(node.Next, instruction.IsZeroFlagModified, instruction.IsCarryFlagModified, instruction.IsSignFlagModified, instruction.IsOverflowFlagModified, - instruction.IsParityFlagModified); + instruction.IsParityFlagModified, + window); } - public static TriState AreStatusFlagsUsed(Node node, bool checkZero, bool checkCarry, bool checkSign, bool checkOverlow, bool checkParity) + public static TriState AreStatusFlagsUsed(Node node, bool checkZero, bool checkCarry, bool checkSign, bool checkOverlow, bool checkParity, int window) { // if none are being checked, then for sure it's a no if (!checkZero && !checkCarry && !checkSign && !checkOverlow && !checkParity) @@ -928,9 +929,14 @@ public static TriState AreStatusFlagsUsed(Node node, bool checkZero, bool checkC for (var at = node; ; at = at.Next) { + if (window <= 0) + return TriState.Unknown; + if (at.IsEmptyOrNop) continue; + window--; + if (at.IsBlockEndInstruction) return TriState.Unknown; diff --git a/Source/Mosa.Compiler.Framework/Compiler.cs b/Source/Mosa.Compiler.Framework/Compiler.cs index 797dc82b11..20be2d0537 100644 --- a/Source/Mosa.Compiler.Framework/Compiler.cs +++ b/Source/Mosa.Compiler.Framework/Compiler.cs @@ -143,6 +143,7 @@ public sealed class Compiler { new CILDecoderStage(), new ExceptionStage(), + new FastBlockOrderingStage(), mosaSettings.Devirtualization ? new DevirtualizeCallStage() : null, mosaSettings.BasicOptimizations ? new OptimizationStage(false) : null, new IRTransformsStage(), diff --git a/Source/Mosa.Compiler.Framework/CompilerVersion.cs b/Source/Mosa.Compiler.Framework/CompilerVersion.cs index c6491dd607..56d720772f 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, 6, 0, 0); + version = new Version(2, 6, 0, 1); } return version; diff --git a/Source/Mosa.Compiler.Framework/Context.cs b/Source/Mosa.Compiler.Framework/Context.cs index bf39b981d8..211cc28acc 100644 --- a/Source/Mosa.Compiler.Framework/Context.cs +++ b/Source/Mosa.Compiler.Framework/Context.cs @@ -469,6 +469,17 @@ public void SetInstruction(BaseInstruction instruction, ConditionCode condition, Node.SetInstruction(instruction, condition, block); } + /// + /// Sets the instruction. + /// + /// The instruction. + /// The condition. + /// The result. + public void SetInstruction(BaseInstruction instruction, ConditionCode condition, Operand result) + { + Node.SetInstruction(instruction, condition, result); + } + /// /// Sets the instruction. /// diff --git a/Source/Mosa.Compiler.Framework/InstructionTrace.cs b/Source/Mosa.Compiler.Framework/InstructionTrace.cs index 18d3d1ea6b..ef168357af 100644 --- a/Source/Mosa.Compiler.Framework/InstructionTrace.cs +++ b/Source/Mosa.Compiler.Framework/InstructionTrace.cs @@ -13,61 +13,65 @@ public static TraceLog Run(string stage, MosaMethod method, BasicBlocks basicBlo { var traceLog = new TraceLog(TraceType.MethodInstructions, method, stage, section, version, step); - traceLog?.Log($"{method.FullName} [v{version}] @ {step} after stage {stage}:"); - traceLog?.Log(); + traceLog?.Log($"M\t{method.FullName}\t{version}\t{stage}\t{step}"); - if (basicBlocks.Count > 0) + var sb = new StringBuilder(); + + foreach (var block in basicBlocks) { - foreach (var block in basicBlocks) + traceLog?.Log($"S\t{block}\t{block.Sequence}\t{(block.IsHeadBlock ? "Header" : string.Empty)}\t{block.PreviousBlocks.Count}\t{GetTabBlocks(block.PreviousBlocks)}"); + + for (var node = block.First; !node.IsBlockEndInstruction; node = node.Next) { - traceLog?.Log($"Block #{block.Sequence} - Label L_{block.Label:X5}" + (block.IsHeadBlock ? " [Header]" : string.Empty)); - traceLog?.Log($" Prev: {ListBlocks(block.PreviousBlocks)}"); + if (node.IsEmpty) + continue; - LogInstructions(traceLog, block.First); + sb.Clear(); - traceLog?.Log($" Next: {ListBlocks(block.NextBlocks)}"); - traceLog?.Log(); - } - } - else - { - traceLog?.Log("No instructions."); - } + sb.Append($"I\t{node.Label:X5}\t{(node.IsMarked ? "*" : string.Empty)}\t{node.Instruction}\t"); + sb.Append($"{(node.ConditionCode != ConditionCode.Undefined ? node.ConditionCode.GetConditionString() : string.Empty)}\t"); - return traceLog; - } + sb.Append($"{node.ResultCount}\t"); + sb.Append($"{node.OperandCount}\t"); + sb.Append($"{node.BranchTargetsCount}\t"); + sb.Append($"{node.PhiBlockCount}\t"); - private static string ListBlocks(IList blocks) - { - var text = new StringBuilder(); + foreach (var operand in node.Results) + { + sb.Append($"{operand}\t"); + } - foreach (var next in blocks) - { - if (text.Length != 0) - text.Append(", "); + foreach (var operand in node.Operands) + { + sb.Append($"{operand}\t"); + } + + sb.Append($"{GetTabBlocks(node.BranchTargets)}"); + sb.Append($"{GetTabBlocks(node.PhiBlocks)}"); + + sb.Length--; + + traceLog?.Log(sb.ToString()); + } - text.AppendFormat(next.ToString()); + traceLog?.Log($"E\t{block}\t{block.Sequence}\t{block.NextBlocks.Count}\t{GetTabBlocks(block.NextBlocks)}"); } - return text.ToString(); + return traceLog; } - /// - /// Logs the instructions in the given enumerable to the trace. - /// - /// The trace log. - /// The context. - private static void LogInstructions(TraceLog traceLog, Node node) + private static string GetTabBlocks(IList blocks) { - for (; !node.IsBlockEndInstruction; node = node.Next) - { - if (node.IsEmpty) - continue; + if (blocks == null || blocks.Count == 0) + return string.Empty; - traceLog.Log(node.ToString()); + var sb = new StringBuilder(); - if (node.IsBlockEndInstruction) - return; + foreach (var next in blocks) + { + sb.AppendFormat($"{next}\t"); } + + return sb.ToString(); } } diff --git a/Source/Mosa.Compiler.Framework/Instructions/ExceptionEnd.cs b/Source/Mosa.Compiler.Framework/Instructions/ExceptionEnd.cs index f60a90b0e3..0f914df998 100644 --- a/Source/Mosa.Compiler.Framework/Instructions/ExceptionEnd.cs +++ b/Source/Mosa.Compiler.Framework/Instructions/ExceptionEnd.cs @@ -10,7 +10,7 @@ namespace Mosa.Compiler.Framework.Instructions; public sealed class ExceptionEnd : BaseIRInstruction { public ExceptionEnd() - : base(1, 0) + : base(0, 0) { } diff --git a/Source/Mosa.Compiler.Framework/MethodCompiler.cs b/Source/Mosa.Compiler.Framework/MethodCompiler.cs index bb5c583798..b11e71fb7e 100644 --- a/Source/Mosa.Compiler.Framework/MethodCompiler.cs +++ b/Source/Mosa.Compiler.Framework/MethodCompiler.cs @@ -194,6 +194,8 @@ public LinkerSymbol Symbol public int? MethodTraceLevel { get; } + public bool IsTraceTransforms => NotifyTranformTraceHandler != null || NotifyInstructionTraceHandler != null; + #endregion Properties #region Properties - Operand diff --git a/Source/Mosa.Compiler.Framework/Node.cs b/Source/Mosa.Compiler.Framework/Node.cs index 04093886d7..53b20243d9 100644 --- a/Source/Mosa.Compiler.Framework/Node.cs +++ b/Source/Mosa.Compiler.Framework/Node.cs @@ -391,6 +391,11 @@ public bool IsDownDirection /// public int BranchTargetsCount => BranchTargets?.Count ?? 0; + /// + /// Gets the PHI block count. + /// + public int PhiBlockCount => PhiBlocks?.Count ?? 0; + /// /// Sets the branch target. /// @@ -489,7 +494,7 @@ public void Empty() ConditionCode = ConditionCode.Undefined; Options = InstructionOption.None; Instruction = null; - Block.RemoveBranchInstruction(this); + Block?.RemoveBranchInstruction(this); BranchTargets = null; PhiBlocks = null; @@ -854,11 +859,6 @@ public override string ToString() sb.Append($" [{ConditionCode.GetConditionString()}]"); } - if (Instruction.Modifier != null) - { - sb.Append($" [{Instruction.Modifier}]"); - } - for (var i = 0; i < ResultCount; i++) { var op = GetResult(i); @@ -1375,7 +1375,7 @@ public void SetInstruction(BaseInstruction instruction, InstructionOption option /// The result2. public void SetInstruction2(BaseInstruction instruction, Operand result, Operand result2) { - SetInstruction(instruction, 1, 2); + SetInstruction(instruction, 0, 2); Result = result; Result2 = result2; } diff --git a/Source/Mosa.Compiler.Framework/Stages/BaseTransformStage.cs b/Source/Mosa.Compiler.Framework/Stages/BaseTransformStage.cs index 4489f3626a..f4590467d7 100644 --- a/Source/Mosa.Compiler.Framework/Stages/BaseTransformStage.cs +++ b/Source/Mosa.Compiler.Framework/Stages/BaseTransformStage.cs @@ -25,7 +25,6 @@ public abstract class BaseTransformStage : BaseMethodCompilerStage protected bool AreCPURegistersAllocated; protected int MaxPasses; - protected int Steps; protected readonly Dictionary TransformCounters = new(); @@ -49,9 +48,9 @@ protected override void Initialize() protected override void Finish() { - UpdateCounter("Transform.Total", Transform.TotalTransformCount); - UpdateCounter("Transform.Transforms", TransformCount); - UpdateCounter("Transform.Optimizations", OptimizationCount); + UpdateCounter("Transform.Count", Transform.TransformCount); + UpdateCounter("Transform.Count.Transforms", TransformCount); + UpdateCounter("Transform.Count.Optimizations", OptimizationCount); UpdateCounter(TransformCountStage, TransformCount); UpdateCounter(OptimizationCountStage, OptimizationCount); @@ -72,13 +71,12 @@ protected override void Run() AreCPURegistersAllocated = MethodCompiler.AreCPURegistersAllocated; - Steps = 0; - MethodCompiler.CreateTranformInstructionTrace(this, Steps++); - SpecialTrace = new TraceLog(TraceType.GlobalDebug, null, null, "Special Optimizations"); Transform.SetLogs(Trace, SpecialTrace); + Transform.TraceInstructions(); + Setup(); ExecutePhases(); @@ -252,8 +250,6 @@ private bool ApplyTransformations(Context context, int id) if (MethodCompiler.Statistics) UpdateCounter(transform.Name, 1); - MethodCompiler.CreateTranformInstructionTrace(this, Steps++); - if (MosaSettings.FullCheckMode) FullCheck(false); @@ -277,8 +273,6 @@ private bool ApplyBlockTransforms() if (updated) { - MethodCompiler.CreateTranformInstructionTrace(this, Steps++); - if (MosaSettings.FullCheckMode) FullCheck(false); diff --git a/Source/Mosa.Compiler.Framework/Stages/CILDecoderStage.cs b/Source/Mosa.Compiler.Framework/Stages/CILDecoderStage.cs index 374c65d322..c205db0183 100644 --- a/Source/Mosa.Compiler.Framework/Stages/CILDecoderStage.cs +++ b/Source/Mosa.Compiler.Framework/Stages/CILDecoderStage.cs @@ -100,6 +100,8 @@ public void ResetAll() private TraceLog trace; + private Operand ReturnOperand; + #endregion Data Members #region Overrides Methods @@ -130,6 +132,8 @@ protected override void Run() CreateParameters(); + CreateReturnOperand(); + CollectTargets(); CreateBasicBlocks(); @@ -140,13 +144,7 @@ protected override void Run() CreateInstructions(); - var epilogueBlock = BasicBlocks.EpilogueBlock; - - if (epilogueBlock != null) - { - var epilogue = new Context(epilogueBlock.First); - epilogue.AppendInstruction(IR.Epilogue); - } + PopulateEpilogueBlock(); MethodCompiler.ProtectedRegions = ProtectedRegion.CreateProtectedRegions(BasicBlocks, Method.ExceptionHandlers); @@ -161,6 +159,7 @@ protected override void Finish() { Targets = null; trace = null; + ReturnOperand = null; } #endregion Overrides Methods @@ -219,6 +218,20 @@ public static void CreateParameters(MethodCompiler methodCompiler) } } + public void CreateReturnOperand() + { + if (Method.Signature.ReturnType.IsVoid) + { + ReturnOperand = null; + } + else + { + var underlyingType = MosaTypeLayout.GetUnderlyingType(Method.Signature.ReturnType); + + ReturnOperand = MethodCompiler.AllocateVirtualRegisterOrStackLocal(underlyingType); + } + } + private void AddTarget(int target) { if (!Targets.ContainsKey(target)) @@ -574,6 +587,61 @@ private void CreateInstructions() } } + private void PopulateEpilogueBlock() + { + var epilogueBlock = BasicBlocks.EpilogueBlock; + + if (epilogueBlock == null) + return; + + var context = new Context(epilogueBlock.First); + + if (!Method.Signature.ReturnType.IsVoid) + { + var underlyingType = MosaTypeLayout.GetUnderlyingType(Method.Signature.ReturnType); + var primitiveType = MethodCompiler.GetPrimitiveType(underlyingType); + + switch (primitiveType) + { + case PrimitiveType.Int32: + context.AppendInstruction(IR.SetReturn32, null, ReturnOperand); + break; + + case PrimitiveType.Int64: + context.AppendInstruction(IR.SetReturn64, null, ReturnOperand); + break; + + case PrimitiveType.R4: + context.AppendInstruction(IR.SetReturnR4, null, ReturnOperand); + break; + + case PrimitiveType.R8: + context.AppendInstruction(IR.SetReturnR8, null, ReturnOperand); + break; + + case PrimitiveType.Object: + context.AppendInstruction(IR.SetReturnObject, null, ReturnOperand); + break; + + case PrimitiveType.ValueType: + context.AppendInstruction(IR.SetReturnCompound, null, ReturnOperand); + break; + + case PrimitiveType.ManagedPointer when Is32BitPlatform: + context.AppendInstruction(IR.SetReturn32, null, ReturnOperand); + break; + + case PrimitiveType.ManagedPointer when Is64BitPlatform: + context.AppendInstruction(IR.SetReturn64, null, ReturnOperand); + break; + + default: break; + } + } + + context.AppendInstruction(IR.Epilogue); + } + #endregion Initialize Methods private bool Translate(Stack stack, Context context, MosaInstruction instruction, CILOpCode opcode, BasicBlock block, PrefixValues prefixValues, int label) @@ -4435,35 +4503,35 @@ private bool Ret(Context context, Stack stack) switch (entry.PrimitiveType) { case PrimitiveType.Int32: - context.AppendInstruction(IR.SetReturn32, null, entry.Operand); + context.AppendInstruction(IR.Move32, ReturnOperand, entry.Operand); break; case PrimitiveType.Int64: - context.AppendInstruction(IR.SetReturn64, null, entry.Operand); + context.AppendInstruction(IR.Move64, ReturnOperand, entry.Operand); break; case PrimitiveType.R4: - context.AppendInstruction(IR.SetReturnR4, null, entry.Operand); + context.AppendInstruction(IR.MoveR4, ReturnOperand, entry.Operand); break; case PrimitiveType.R8: - context.AppendInstruction(IR.SetReturnR8, null, entry.Operand); + context.AppendInstruction(IR.MoveR8, ReturnOperand, entry.Operand); break; case PrimitiveType.Object: - context.AppendInstruction(IR.SetReturnObject, null, entry.Operand); + context.AppendInstruction(IR.MoveObject, ReturnOperand, entry.Operand); break; case PrimitiveType.ValueType: - context.AppendInstruction(IR.SetReturnCompound, null, entry.Operand); + context.AppendInstruction(IR.MoveCompound, ReturnOperand, entry.Operand); break; case PrimitiveType.ManagedPointer when Is32BitPlatform: - context.AppendInstruction(IR.SetReturn32, null, entry.Operand); + context.AppendInstruction(IR.MoveManagedPointer, ReturnOperand, entry.Operand); break; case PrimitiveType.ManagedPointer when Is64BitPlatform: - context.AppendInstruction(IR.SetReturn64, null, entry.Operand); + context.AppendInstruction(IR.MoveManagedPointer, ReturnOperand, entry.Operand); break; default: return false; diff --git a/Source/Mosa.Compiler.Framework/Stages/Diagnostic/GraphVizStage.cs b/Source/Mosa.Compiler.Framework/Stages/Diagnostic/ControlFlowGraphStage.cs similarity index 64% rename from Source/Mosa.Compiler.Framework/Stages/Diagnostic/GraphVizStage.cs rename to Source/Mosa.Compiler.Framework/Stages/Diagnostic/ControlFlowGraphStage.cs index 863531b5c8..d0abd4c786 100644 --- a/Source/Mosa.Compiler.Framework/Stages/Diagnostic/GraphVizStage.cs +++ b/Source/Mosa.Compiler.Framework/Stages/Diagnostic/ControlFlowGraphStage.cs @@ -2,23 +2,21 @@ namespace Mosa.Compiler.Framework.Stages.Diagnostic; -public class GraphVizStage : BaseMethodCompilerStage +public class ControlFlowGraphStage : BaseMethodCompilerStage { - private const int TraceLevel = 6; - protected override void Run() { - if (!IsTraceable(TraceLevel)) - return; + CreateDiagram(); + } - var trace = CreateTraceLog(); + protected void CreateDiagram() + { + var trace = CreateTraceLog("graphviz"); trace.Log("digraph blocks {"); foreach (var block in BasicBlocks) { - //trace.Log("\t" + block); - foreach (var next in block.NextBlocks) { trace.Log($"\t{block} -> {next}"); diff --git a/Source/Mosa.Compiler.Framework/Stages/Diagnostic/DominanceAnalysisStage.cs b/Source/Mosa.Compiler.Framework/Stages/Diagnostic/DominanceAnalysisStage.cs index 40e31d7513..b94d45d0ee 100644 --- a/Source/Mosa.Compiler.Framework/Stages/Diagnostic/DominanceAnalysisStage.cs +++ b/Source/Mosa.Compiler.Framework/Stages/Diagnostic/DominanceAnalysisStage.cs @@ -2,8 +2,7 @@ using System.Text; using Mosa.Compiler.Framework.Analysis; - -namespace Mosa.Compiler.Framework.Stages.Diagnostic; +using Mosa.Compiler.Framework; public class DominanceAnalysisStage : BaseMethodCompilerStage { @@ -27,17 +26,14 @@ private void OutputList() foreach (var headBlock in BasicBlocks.HeadBlocks) { trace.Log($"Head: {headBlock}"); - var dominance = new SimpleFastDominance(BasicBlocks, headBlock); - for (int i = 0; i < BasicBlocks.Count; i++) + var dominance = new SimpleFastDominance(BasicBlocks, headBlock); + foreach (var block in BasicBlocks) { - var block = BasicBlocks[i]; - sb.Clear(); sb.Append($" Block {block} : "); var children = dominance.GetChildren(block); - if (children != null && children.Count != 0) { foreach (var child in children) @@ -58,8 +54,7 @@ private void OutputList() private void OutputDiagram() { - var trace = CreateTraceLog("Diagram"); - var sb = new StringBuilder(); + var trace = CreateTraceLog("DominanceTree-graphviz"); trace.Log("digraph blocks {"); @@ -67,18 +62,14 @@ private void OutputDiagram() { var dominance = new SimpleFastDominance(BasicBlocks, headBlock); - for (int i = 0; i < BasicBlocks.Count; i++) + foreach (var block in BasicBlocks) { - var block = BasicBlocks[i]; - var children = dominance.GetChildren(block); - if (children != null && children.Count != 0) - { - foreach (var child in children) - { - trace.Log($"\t{block} -> {child}"); - } - } + if (children == null || children.Count == 0) + continue; + + foreach (var child in children) + trace.Log($"\t{block} -> {child}"); } } @@ -95,7 +86,7 @@ private void OutputDominanceBlock() trace.Log($"Head: {headBlock}"); var dominance = new SimpleFastDominance(BasicBlocks, headBlock); - for (int i = 0; i < BasicBlocks.Count; i++) + for (var i = 0; i < BasicBlocks.Count; i++) { var block = BasicBlocks[i]; diff --git a/Source/Mosa.Compiler.Framework/Stages/Diagnostic/LoopAnalysisStage.cs b/Source/Mosa.Compiler.Framework/Stages/Diagnostic/LoopAnalysisStage.cs index db6f5dc986..0e7325c937 100644 --- a/Source/Mosa.Compiler.Framework/Stages/Diagnostic/LoopAnalysisStage.cs +++ b/Source/Mosa.Compiler.Framework/Stages/Diagnostic/LoopAnalysisStage.cs @@ -28,19 +28,21 @@ protected override void Initialize() protected override void Run() { + // Method is empty - must be a plugged method if (HasProtectedRegions) return; - // Method is empty - must be a plugged method if (BasicBlocks.HeadBlocks.Count != 1) return; if (BasicBlocks.PrologueBlock == null) return; - if (!MethodCompiler.IsInSSAForm) - return; + OutputLoops(); + } + private void OutputLoops() + { var loops = LoopDetector.FindLoops(BasicBlocks); LoopCount.Set(loops.Count); diff --git a/Source/Mosa.Compiler.Framework/Stages/ValueNumberingStage.cs b/Source/Mosa.Compiler.Framework/Stages/ValueNumberingStage.cs index 239f0a1344..a2e4208b36 100644 --- a/Source/Mosa.Compiler.Framework/Stages/ValueNumberingStage.cs +++ b/Source/Mosa.Compiler.Framework/Stages/ValueNumberingStage.cs @@ -518,8 +518,15 @@ private static bool IsEqual(Operand operand1, Operand operand2, BaseInstruction if (operand1.IsResolvedConstant && operand2.IsResolvedConstant - && operand1.IsFloatingPoint - && operand2.IsFloatingPoint + && operand1.IsR4 + && operand2.IsR4 + && operand1.ConstantFloat == operand2.ConstantFloat) + return true; + + if (operand1.IsResolvedConstant + && operand2.IsResolvedConstant + && operand1.IsR8 + && operand2.IsR8 && operand1.ConstantDouble == operand2.ConstantDouble) return true; diff --git a/Source/Mosa.Compiler.Framework/Transform.cs b/Source/Mosa.Compiler.Framework/Transform.cs index e1f71185d4..97b5937d32 100644 --- a/Source/Mosa.Compiler.Framework/Transform.cs +++ b/Source/Mosa.Compiler.Framework/Transform.cs @@ -40,7 +40,7 @@ public sealed class Transform public BaseMethodCompilerStage Stage { get; private set; } - public int TotalTransformCount { get; private set; } + public int TransformCount { get; private set; } public bool IsInSSAForm { get; private set; } @@ -48,6 +48,10 @@ public sealed class Transform public bool IsLowerCodeSize => Options.HasFlag(TransformStageOption.ReduceCodeSize); + public bool IsSSAEnabled { get; private set; } = false; + + public bool IsTraceTransforms = false; + #endregion Properties #region Properties - Indirect @@ -143,6 +147,8 @@ public void SetCompiler(Compiler compiler) MulUnsignedInstruction = Is32BitPlatform ? IR.MulUnsigned32 : IR.MulUnsigned64; BranchInstruction = Is32BitPlatform ? IR.Branch32 : IR.Branch64; + IsSSAEnabled = Compiler.MosaSettings.SSA; + Options = TransformStageOption.None; TraceLog = null; @@ -167,6 +173,8 @@ public void SetMethodCompiler(MethodCompiler methodCompiler) Options = TransformStageOption.None; + IsTraceTransforms = methodCompiler.IsTraceTransforms; + TraceLog = null; Managers.Clear(); @@ -176,7 +184,7 @@ public void SetMethodCompiler(MethodCompiler methodCompiler) public void SetStage(BaseMethodCompilerStage stage) { Stage = stage; - TotalTransformCount = 0; + TransformCount = 0; IsInSSAForm = MethodCompiler.IsInSSAForm; Managers.Clear(); } @@ -241,42 +249,66 @@ public bool ApplyTransform(Context context, BaseTransform transform) #region Trace - public void TraceBefore(Context context, BaseTransform transformation) + private void TraceBefore(Context context, BaseTransform transformation) { - TraceLog?.Log($"{TotalTransformCount,-7}\t| {transformation.Name}"); + TransformCount++; + + if (!IsTraceTransforms) + return; + + TraceLog?.Log($"{TransformCount,-7}\t| {transformation.Name}"); if (transformation.Log) SpecialTraceLog?.Log($"{transformation.Name}\t{Method.FullName} at {context}"); TraceLog?.Log($"{context.Block}\t| {context}"); - - TotalTransformCount++; } - public void TraceAfter(Context context) + private void TraceAfter(Context context) { + if (!IsTraceTransforms) + return; + + TraceInstructions(); + TraceLog?.Log($" \t| {context}"); TraceLog?.Log(); } public void TraceBefore(BaseBlockTransform transformation, BasicBlock block) { - TraceLog?.Log($"{TotalTransformCount,-7}\t| {transformation.Name}"); + TransformCount++; + + if (!IsTraceTransforms) + return; + + TraceLog?.Log($"{TransformCount,-7}\t| {transformation.Name}"); if (transformation.Log) SpecialTraceLog?.Log($"{transformation.Name}\t{Method.FullName}"); TraceLog?.Log($"{block}\t| {transformation.Name}"); - - TotalTransformCount++; } public void TraceAfter(BaseBlockTransform transformation) { + if (!IsTraceTransforms) + return; + + TraceInstructions(); + TraceLog?.Log($" \t| {transformation.Name}"); TraceLog?.Log(); } + public void TraceInstructions() + { + if (!IsTraceTransforms) + return; + + MethodCompiler.CreateTranformInstructionTrace(Stage, TransformCount); + } + #endregion Trace #region Basic Block Helpers diff --git a/Source/Mosa.Compiler.Framework/Transforms/BasicBlocks/RemoveUnreachableBlocks.cs b/Source/Mosa.Compiler.Framework/Transforms/BasicBlocks/RemoveUnreachableBlocks.cs index 754b010fb3..21d8b377a6 100644 --- a/Source/Mosa.Compiler.Framework/Transforms/BasicBlocks/RemoveUnreachableBlocks.cs +++ b/Source/Mosa.Compiler.Framework/Transforms/BasicBlocks/RemoveUnreachableBlocks.cs @@ -2,6 +2,7 @@ using System.Collections; using Mosa.Compiler.Framework.Common; +using static System.Net.Mime.MediaTypeNames; namespace Mosa.Compiler.Framework.Transforms.BasicBlocks; @@ -61,12 +62,16 @@ public override int Process(Transform transform) var nextBlocks = block.NextBlocks.ToArray(); + transform.TraceBefore(this, block); + block.EmptyBlockOfAllInstructions(true); PhiHelper.UpdatePhiBlocks(nextBlocks); emptied++; trace?.Log($"Removed Unreachable Block: {block}"); + + transform.TraceAfter(this); } return emptied; diff --git a/Source/Mosa.Compiler.Framework/Transforms/BasicBlocks/SkipEmptyBlocks.cs b/Source/Mosa.Compiler.Framework/Transforms/BasicBlocks/SkipEmptyBlocks.cs index 0295825fcd..5729bbbfbc 100644 --- a/Source/Mosa.Compiler.Framework/Transforms/BasicBlocks/SkipEmptyBlocks.cs +++ b/Source/Mosa.Compiler.Framework/Transforms/BasicBlocks/SkipEmptyBlocks.cs @@ -46,6 +46,8 @@ public override int Process(Transform transform) trace?.Log($"Removed Block: {block} - Skipped to: {block.NextBlocks[0]}"); + transform.TraceBefore(this, block); + if (isInSSAForm) { PhiHelper.UpdatePhiTargets(block.NextBlocks, block, block.PreviousBlocks[0]); @@ -54,6 +56,8 @@ public override int Process(Transform transform) block.RemoveEmptyBlockWithSingleJump(true); emptied++; + + transform.TraceAfter(this); } return emptied; diff --git a/Source/Mosa.Compiler.Framework/Transforms/Optimizations/Auto/Simplification/MoveManagedPointerCoalescing.cs b/Source/Mosa.Compiler.Framework/Transforms/Optimizations/Auto/Simplification/MoveManagedPointerCoalescing.cs index 9bd1157fc5..749f22146f 100644 --- a/Source/Mosa.Compiler.Framework/Transforms/Optimizations/Auto/Simplification/MoveManagedPointerCoalescing.cs +++ b/Source/Mosa.Compiler.Framework/Transforms/Optimizations/Auto/Simplification/MoveManagedPointerCoalescing.cs @@ -23,6 +23,9 @@ public override bool Match(Context context, Transform transform) if (context.Operand1.Definitions[0].Instruction != IR.MoveManagedPointer) return false; + if (IsCPURegister(context.Operand1.Definitions[0].Operand1)) + return false; + return true; } diff --git a/Source/Mosa.Compiler.Framework/Transforms/Optimizations/Auto/Simplification/MoveObjectCoalescing.cs b/Source/Mosa.Compiler.Framework/Transforms/Optimizations/Auto/Simplification/MoveObjectCoalescing.cs index 59fcfb36b8..945c031542 100644 --- a/Source/Mosa.Compiler.Framework/Transforms/Optimizations/Auto/Simplification/MoveObjectCoalescing.cs +++ b/Source/Mosa.Compiler.Framework/Transforms/Optimizations/Auto/Simplification/MoveObjectCoalescing.cs @@ -23,6 +23,9 @@ public override bool Match(Context context, Transform transform) if (context.Operand1.Definitions[0].Instruction != IR.MoveObject) return false; + if (IsCPURegister(context.Operand1.Definitions[0].Operand1)) + return false; + return true; } diff --git a/Source/Mosa.Compiler.Framework/Transforms/Optimizations/Manual/ManualTransforms.cs b/Source/Mosa.Compiler.Framework/Transforms/Optimizations/Manual/ManualTransforms.cs index 3f631a80d0..a6c25aa8b6 100644 --- a/Source/Mosa.Compiler.Framework/Transforms/Optimizations/Manual/ManualTransforms.cs +++ b/Source/Mosa.Compiler.Framework/Transforms/Optimizations/Manual/ManualTransforms.cs @@ -289,5 +289,8 @@ public static class ManualTransforms new StrengthReduction.DivUnsignedMagicNumber32(), new StrengthReduction.DivUnsignedMagicNumber64(), + + new NonSSA.Move32(), + new NonSSA.Move32Constant(), }; } diff --git a/Source/Mosa.Compiler.Framework/Transforms/Optimizations/Manual/NonSSA/BaseNonSA.cs b/Source/Mosa.Compiler.Framework/Transforms/Optimizations/Manual/NonSSA/BaseNonSA.cs new file mode 100644 index 0000000000..16b102aa93 --- /dev/null +++ b/Source/Mosa.Compiler.Framework/Transforms/Optimizations/Manual/NonSSA/BaseNonSA.cs @@ -0,0 +1,59 @@ +// Copyright (c) MOSA Project. Licensed under the New BSD License. + +namespace Mosa.Compiler.Framework.Transforms.Optimizations.Manual.NonSSA; + +public abstract class BaseNonSA : BaseTransform +{ + public BaseNonSA(BaseInstruction instruction, TransformType type, bool log = false) + : base(instruction, type, log) + { } + + protected static Node Find(Node start, Operand target, Operand replacement, int window) + { + for (var at = start; ; at = at.Next) + { + if (window <= 0) + return null; + + if (at.IsEmptyOrNop) + continue; + + window--; + + if (at.IsBlockEndInstruction) + return null; + + if (at.Instruction.IsReturn) + return null; + + if (at.Instruction == IR.Epilogue) + return null; + + if (at.Instruction.IsUnconditionalBranch) + { + if (at.Block.NextBlocks.Count == 1 && at.BranchTargets[0].PreviousBlocks.Count == 1) + { + at = at.BranchTargets[0].First; + continue; + } + + return null; + } + + if (at.ResultCount >= 1 && (at.Result == target || at.Result == replacement)) + return null; + + if (at.ResultCount == 2 && (at.Result2 == target || at.Result2 == replacement)) + return null; + + if (at.OperandCount == 0) + continue; + + foreach (var operand in at.Operands) + { + if (operand == target) + return at; + } + } + } +} diff --git a/Source/Mosa.Compiler.Framework/Transforms/Optimizations/Manual/NonSSA/Move32.cs b/Source/Mosa.Compiler.Framework/Transforms/Optimizations/Manual/NonSSA/Move32.cs new file mode 100644 index 0000000000..a88a3a9aee --- /dev/null +++ b/Source/Mosa.Compiler.Framework/Transforms/Optimizations/Manual/NonSSA/Move32.cs @@ -0,0 +1,37 @@ +// Copyright (c) MOSA Project. Licensed under the New BSD License. + +using System.Diagnostics; + +namespace Mosa.Compiler.Framework.Transforms.Optimizations.Manual.NonSSA; + +public sealed class Move32 : BaseNonSA +{ + public Move32() : base(IR.Move32, TransformType.Manual | TransformType.Optimization, true) + { + } + + public override bool Match(Context context, Transform transform) + { + if (!transform.MethodCompiler.HasProtectedRegions || !transform.IsSSAEnabled) + return false; + + if (!context.Result.IsUsedOnce) + return false; + + if (Find(context.Node.Next, context.Result, context.Operand1, transform.Window) == null) + return false; + + return true; + } + + public override void Transform(Context context, Transform transform) + { + var node = Find(context.Node.Next, context.Result, context.Operand1, transform.Window); + + node.ReplaceOperand(context.Result, context.Operand1); + + Debug.Assert(!context.Result.IsUsed); + + context.SetNop(); + } +} diff --git a/Source/Mosa.Compiler.Framework/Transforms/Optimizations/Manual/NonSSA/Move32Constant.cs b/Source/Mosa.Compiler.Framework/Transforms/Optimizations/Manual/NonSSA/Move32Constant.cs new file mode 100644 index 0000000000..d8b796d7a1 --- /dev/null +++ b/Source/Mosa.Compiler.Framework/Transforms/Optimizations/Manual/NonSSA/Move32Constant.cs @@ -0,0 +1,34 @@ +// Copyright (c) MOSA Project. Licensed under the New BSD License. + +namespace Mosa.Compiler.Framework.Transforms.Optimizations.Manual.NonSSA; + +public sealed class Move32Constant : BaseNonSA +{ + public Move32Constant() : base(IR.Move32, TransformType.Manual | TransformType.Optimization, true) + { + } + + public override bool Match(Context context, Transform transform) + { + if (!transform.MethodCompiler.HasProtectedRegions || !transform.IsSSAEnabled) + return false; + + if (!context.Operand1.IsConstant) + return false; + + if (!context.Result.IsUsed) + return false; + + if (Find(context.Node.Next, context.Result, context.Operand1, transform.Window) == null) + return false; + + return true; + } + + public override void Transform(Context context, Transform transform) + { + var node = Find(context.Node.Next, context.Result, context.Operand1, transform.Window); + + node.ReplaceOperand(context.Result, context.Operand1); + } +} diff --git a/Source/Mosa.Compiler.Framework/Transforms/Optimizations/Manual/Propagate/Move32Propagate.cs b/Source/Mosa.Compiler.Framework/Transforms/Optimizations/Manual/Propagate/Move32Propagate.cs index 8e64ac3331..3da54c99a3 100644 --- a/Source/Mosa.Compiler.Framework/Transforms/Optimizations/Manual/Propagate/Move32Propagate.cs +++ b/Source/Mosa.Compiler.Framework/Transforms/Optimizations/Manual/Propagate/Move32Propagate.cs @@ -8,6 +8,8 @@ public Move32Propagate() : base(IR.Move32, TransformType.Manual | TransformType. { } + public override int Priority => 40; + public override bool Match(Context context, Transform transform) { if (!context.Result.IsDefinedOnce) diff --git a/Source/Mosa.Compiler.Framework/Transforms/Optimizations/Manual/Propagate/Move32PropagateConstant.cs b/Source/Mosa.Compiler.Framework/Transforms/Optimizations/Manual/Propagate/Move32PropagateConstant.cs index 307f485316..81e3a98ad7 100644 --- a/Source/Mosa.Compiler.Framework/Transforms/Optimizations/Manual/Propagate/Move32PropagateConstant.cs +++ b/Source/Mosa.Compiler.Framework/Transforms/Optimizations/Manual/Propagate/Move32PropagateConstant.cs @@ -8,6 +8,8 @@ public Move32PropagateConstant() : base(IR.Move32, TransformType.Manual | Transf { } + public override int Priority => 40; + public override bool Match(Context context, Transform transform) { if (!context.Result.IsDefinedOnce) diff --git a/Source/Mosa.Compiler.Framework/Transforms/Optimizations/Manual/Propagate/Move64Propagate.cs b/Source/Mosa.Compiler.Framework/Transforms/Optimizations/Manual/Propagate/Move64Propagate.cs index 9eedbad127..cf4689861b 100644 --- a/Source/Mosa.Compiler.Framework/Transforms/Optimizations/Manual/Propagate/Move64Propagate.cs +++ b/Source/Mosa.Compiler.Framework/Transforms/Optimizations/Manual/Propagate/Move64Propagate.cs @@ -8,6 +8,8 @@ public Move64Propagate() : base(IR.Move64, TransformType.Manual | TransformType. { } + public override int Priority => 40; + public override bool Match(Context context, Transform transform) { if (!context.Result.IsDefinedOnce) diff --git a/Source/Mosa.Compiler.Framework/Transforms/Optimizations/Manual/Propagate/Move64PropagateConstant.cs b/Source/Mosa.Compiler.Framework/Transforms/Optimizations/Manual/Propagate/Move64PropagateConstant.cs index 6232730d25..8616158327 100644 --- a/Source/Mosa.Compiler.Framework/Transforms/Optimizations/Manual/Propagate/Move64PropagateConstant.cs +++ b/Source/Mosa.Compiler.Framework/Transforms/Optimizations/Manual/Propagate/Move64PropagateConstant.cs @@ -8,6 +8,8 @@ public Move64PropagateConstant() : base(IR.Move64, TransformType.Manual | Transf { } + public override int Priority => 40; + public override bool Match(Context context, Transform transform) { if (!context.Result.IsDefinedOnce) diff --git a/Source/Mosa.Compiler.Framework/Transforms/Optimizations/Manual/Propagate/MoveCompoundPropagate.cs b/Source/Mosa.Compiler.Framework/Transforms/Optimizations/Manual/Propagate/MoveCompoundPropagate.cs index 0bf7dce01a..6602a34f39 100644 --- a/Source/Mosa.Compiler.Framework/Transforms/Optimizations/Manual/Propagate/MoveCompoundPropagate.cs +++ b/Source/Mosa.Compiler.Framework/Transforms/Optimizations/Manual/Propagate/MoveCompoundPropagate.cs @@ -8,6 +8,8 @@ public MoveCompoundPropagate() : base(IR.MoveCompound, TransformType.Manual | Tr { } + public override int Priority => 40; + public override bool Match(Context context, Transform transform) { if (!context.Result.IsDefinedOnce) diff --git a/Source/Mosa.Compiler.Framework/Transforms/Optimizations/Manual/Propagate/MoveManagedPointerPropagate.cs b/Source/Mosa.Compiler.Framework/Transforms/Optimizations/Manual/Propagate/MoveManagedPointerPropagate.cs index 0184e07e15..d67fa839fd 100644 --- a/Source/Mosa.Compiler.Framework/Transforms/Optimizations/Manual/Propagate/MoveManagedPointerPropagate.cs +++ b/Source/Mosa.Compiler.Framework/Transforms/Optimizations/Manual/Propagate/MoveManagedPointerPropagate.cs @@ -8,6 +8,8 @@ public MoveManagedPointerPropagate() : base(IR.MoveManagedPointer, TransformType { } + public override int Priority => 40; + public override bool Match(Context context, Transform transform) { if (!context.Result.IsDefinedOnce) diff --git a/Source/Mosa.Compiler.Framework/Transforms/Optimizations/Manual/Propagate/MoveManagedPointerPropagateConstant.cs b/Source/Mosa.Compiler.Framework/Transforms/Optimizations/Manual/Propagate/MoveManagedPointerPropagateConstant.cs index ad5b8f1aa0..4fea07802c 100644 --- a/Source/Mosa.Compiler.Framework/Transforms/Optimizations/Manual/Propagate/MoveManagedPointerPropagateConstant.cs +++ b/Source/Mosa.Compiler.Framework/Transforms/Optimizations/Manual/Propagate/MoveManagedPointerPropagateConstant.cs @@ -8,6 +8,8 @@ public MoveManagedPointerPropagateConstant() : base(IR.MoveManagedPointer, Trans { } + public override int Priority => 40; + public override bool Match(Context context, Transform transform) { if (!context.Result.IsDefinedOnce) diff --git a/Source/Mosa.Compiler.Framework/Transforms/Optimizations/Manual/Propagate/MoveObjectPropagate.cs b/Source/Mosa.Compiler.Framework/Transforms/Optimizations/Manual/Propagate/MoveObjectPropagate.cs index e2880476ac..11c963135a 100644 --- a/Source/Mosa.Compiler.Framework/Transforms/Optimizations/Manual/Propagate/MoveObjectPropagate.cs +++ b/Source/Mosa.Compiler.Framework/Transforms/Optimizations/Manual/Propagate/MoveObjectPropagate.cs @@ -8,6 +8,8 @@ public MoveObjectPropagate() : base(IR.MoveObject, TransformType.Manual | Transf { } + public override int Priority => 40; + public override bool Match(Context context, Transform transform) { if (!context.Result.IsDefinedOnce) diff --git a/Source/Mosa.Compiler.Framework/Transforms/Optimizations/Manual/Propagate/MoveObjectPropagateConstant.cs b/Source/Mosa.Compiler.Framework/Transforms/Optimizations/Manual/Propagate/MoveObjectPropagateConstant.cs index f1ae47f3ba..948bce7cab 100644 --- a/Source/Mosa.Compiler.Framework/Transforms/Optimizations/Manual/Propagate/MoveObjectPropagateConstant.cs +++ b/Source/Mosa.Compiler.Framework/Transforms/Optimizations/Manual/Propagate/MoveObjectPropagateConstant.cs @@ -8,6 +8,8 @@ public MoveObjectPropagateConstant() : base(IR.MoveObject, TransformType.Manual { } + public override int Priority => 40; + public override bool Match(Context context, Transform transform) { if (!context.Result.IsDefinedOnce) diff --git a/Source/Mosa.Compiler.Framework/Transforms/Optimizations/Manual/Propagate/MoveR4Propagate.cs b/Source/Mosa.Compiler.Framework/Transforms/Optimizations/Manual/Propagate/MoveR4Propagate.cs index eb502ec0af..7e7050445d 100644 --- a/Source/Mosa.Compiler.Framework/Transforms/Optimizations/Manual/Propagate/MoveR4Propagate.cs +++ b/Source/Mosa.Compiler.Framework/Transforms/Optimizations/Manual/Propagate/MoveR4Propagate.cs @@ -8,6 +8,8 @@ public MoveR4Propagate() : base(IR.MoveR4, TransformType.Manual | TransformType. { } + public override int Priority => 40; + public override bool Match(Context context, Transform transform) { if (!context.Result.IsDefinedOnce) diff --git a/Source/Mosa.Compiler.Framework/Transforms/Optimizations/Manual/Propagate/MoveR8Propagate.cs b/Source/Mosa.Compiler.Framework/Transforms/Optimizations/Manual/Propagate/MoveR8Propagate.cs index ae8c6ba479..c2118a7e43 100644 --- a/Source/Mosa.Compiler.Framework/Transforms/Optimizations/Manual/Propagate/MoveR8Propagate.cs +++ b/Source/Mosa.Compiler.Framework/Transforms/Optimizations/Manual/Propagate/MoveR8Propagate.cs @@ -8,6 +8,8 @@ public MoveR8Propagate() : base(IR.MoveR8, TransformType.Manual | TransformType. { } + public override int Priority => 40; + public override bool Match(Context context, Transform transform) { if (!context.Result.IsDefinedOnce) diff --git a/Source/Mosa.Compiler.Framework/Transforms/Optimizations/Manual/Propagate/Phi32Propagate.cs b/Source/Mosa.Compiler.Framework/Transforms/Optimizations/Manual/Propagate/Phi32Propagate.cs index a89707fba4..54ffc97925 100644 --- a/Source/Mosa.Compiler.Framework/Transforms/Optimizations/Manual/Propagate/Phi32Propagate.cs +++ b/Source/Mosa.Compiler.Framework/Transforms/Optimizations/Manual/Propagate/Phi32Propagate.cs @@ -8,6 +8,8 @@ public Phi32Propagate() : base(IR.Phi32, TransformType.Manual | TransformType.Op { } + public override int Priority => 40; + public override bool Match(Context context, Transform transform) { if (context.OperandCount == 1) diff --git a/Source/Mosa.Compiler.Framework/Transforms/Optimizations/Manual/Propagate/Phi64Propagate.cs b/Source/Mosa.Compiler.Framework/Transforms/Optimizations/Manual/Propagate/Phi64Propagate.cs index ca8b156034..18e24d7111 100644 --- a/Source/Mosa.Compiler.Framework/Transforms/Optimizations/Manual/Propagate/Phi64Propagate.cs +++ b/Source/Mosa.Compiler.Framework/Transforms/Optimizations/Manual/Propagate/Phi64Propagate.cs @@ -8,6 +8,8 @@ public Phi64Propagate() : base(IR.Phi64, TransformType.Manual | TransformType.Op { } + public override int Priority => 40; + public override bool Match(Context context, Transform transform) { if (context.OperandCount == 1) diff --git a/Source/Mosa.Compiler.Framework/Transforms/Optimizations/Manual/Propagate/PhiManagedPointerPropagate.cs b/Source/Mosa.Compiler.Framework/Transforms/Optimizations/Manual/Propagate/PhiManagedPointerPropagate.cs index 19a68668e2..a30c31cf22 100644 --- a/Source/Mosa.Compiler.Framework/Transforms/Optimizations/Manual/Propagate/PhiManagedPointerPropagate.cs +++ b/Source/Mosa.Compiler.Framework/Transforms/Optimizations/Manual/Propagate/PhiManagedPointerPropagate.cs @@ -8,6 +8,8 @@ public PhiManagedPointerPropagate() : base(IR.PhiManagedPointer, TransformType.M { } + public override int Priority => 40; + public override bool Match(Context context, Transform transform) { if (context.OperandCount == 1) diff --git a/Source/Mosa.Compiler.Framework/Transforms/Optimizations/Manual/Propagate/PhiObjectPropagate.cs b/Source/Mosa.Compiler.Framework/Transforms/Optimizations/Manual/Propagate/PhiObjectPropagate.cs index e57ce4dec5..95f1dc1af6 100644 --- a/Source/Mosa.Compiler.Framework/Transforms/Optimizations/Manual/Propagate/PhiObjectPropagate.cs +++ b/Source/Mosa.Compiler.Framework/Transforms/Optimizations/Manual/Propagate/PhiObjectPropagate.cs @@ -8,6 +8,8 @@ public PhiObjectPropagate() : base(IR.PhiObject, TransformType.Manual | Transfor { } + public override int Priority => 40; + public override bool Match(Context context, Transform transform) { if (context.OperandCount == 1) diff --git a/Source/Mosa.Compiler.Framework/Transforms/Optimizations/Manual/Propagate/PhiR4Propagate.cs b/Source/Mosa.Compiler.Framework/Transforms/Optimizations/Manual/Propagate/PhiR4Propagate.cs index 2a7960edcd..70852519a0 100644 --- a/Source/Mosa.Compiler.Framework/Transforms/Optimizations/Manual/Propagate/PhiR4Propagate.cs +++ b/Source/Mosa.Compiler.Framework/Transforms/Optimizations/Manual/Propagate/PhiR4Propagate.cs @@ -8,6 +8,8 @@ public PhiR4Propagate() : base(IR.PhiR4, TransformType.Manual | TransformType.Op { } + public override int Priority => 40; + public override bool Match(Context context, Transform transform) { if (context.OperandCount == 1) diff --git a/Source/Mosa.Compiler.Framework/Transforms/Optimizations/Manual/Propagate/PhiR8Propagate.cs b/Source/Mosa.Compiler.Framework/Transforms/Optimizations/Manual/Propagate/PhiR8Propagate.cs index 341eec197e..bb4f1f0ff7 100644 --- a/Source/Mosa.Compiler.Framework/Transforms/Optimizations/Manual/Propagate/PhiR8Propagate.cs +++ b/Source/Mosa.Compiler.Framework/Transforms/Optimizations/Manual/Propagate/PhiR8Propagate.cs @@ -8,6 +8,8 @@ public PhiR8Propagate() : base(IR.PhiR8, TransformType.Manual | TransformType.Op { } + public override int Priority => 40; + public override bool Match(Context context, Transform transform) { if (context.OperandCount == 1) diff --git a/Source/Mosa.Compiler.x64/Transforms/Optimizations/Auto/Consolidation/IMul32Mov32ByOne.cs b/Source/Mosa.Compiler.x64/Transforms/Optimizations/Auto/Consolidation/IMul32Mov32ByOne.cs index 6afad8b1b3..1c1df1938a 100644 --- a/Source/Mosa.Compiler.x64/Transforms/Optimizations/Auto/Consolidation/IMul32Mov32ByOne.cs +++ b/Source/Mosa.Compiler.x64/Transforms/Optimizations/Auto/Consolidation/IMul32Mov32ByOne.cs @@ -26,7 +26,7 @@ public override bool Match(Context context, Transform transform) if (!context.Operand2.Definitions[0].Operand1.IsConstantOne) return false; - if (AreAnyStatusFlagsUsed(context)) + if (AreAnyStatusFlagsUsed(context, transform.Window)) return false; return true; diff --git a/Source/Mosa.Compiler.x64/Transforms/Optimizations/Auto/Consolidation/IMul32Mov32ByZero.cs b/Source/Mosa.Compiler.x64/Transforms/Optimizations/Auto/Consolidation/IMul32Mov32ByZero.cs index 149798ec5c..bbc7d4ca00 100644 --- a/Source/Mosa.Compiler.x64/Transforms/Optimizations/Auto/Consolidation/IMul32Mov32ByZero.cs +++ b/Source/Mosa.Compiler.x64/Transforms/Optimizations/Auto/Consolidation/IMul32Mov32ByZero.cs @@ -26,7 +26,7 @@ public override bool Match(Context context, Transform transform) if (!context.Operand2.Definitions[0].Operand1.IsConstantZero) return false; - if (AreAnyStatusFlagsUsed(context)) + if (AreAnyStatusFlagsUsed(context, transform.Window)) return false; return true; diff --git a/Source/Mosa.Compiler.x64/Transforms/Optimizations/Auto/Consolidation/IMul64Mov64ByOne.cs b/Source/Mosa.Compiler.x64/Transforms/Optimizations/Auto/Consolidation/IMul64Mov64ByOne.cs index f3c71dc50a..04a3c5aab8 100644 --- a/Source/Mosa.Compiler.x64/Transforms/Optimizations/Auto/Consolidation/IMul64Mov64ByOne.cs +++ b/Source/Mosa.Compiler.x64/Transforms/Optimizations/Auto/Consolidation/IMul64Mov64ByOne.cs @@ -26,7 +26,7 @@ public override bool Match(Context context, Transform transform) if (!context.Operand2.Definitions[0].Operand1.IsConstantOne) return false; - if (AreAnyStatusFlagsUsed(context)) + if (AreAnyStatusFlagsUsed(context, transform.Window)) return false; return true; diff --git a/Source/Mosa.Compiler.x64/Transforms/Optimizations/Auto/Consolidation/IMul64Mov64ByZero.cs b/Source/Mosa.Compiler.x64/Transforms/Optimizations/Auto/Consolidation/IMul64Mov64ByZero.cs index 0c198feea1..a00c99a814 100644 --- a/Source/Mosa.Compiler.x64/Transforms/Optimizations/Auto/Consolidation/IMul64Mov64ByZero.cs +++ b/Source/Mosa.Compiler.x64/Transforms/Optimizations/Auto/Consolidation/IMul64Mov64ByZero.cs @@ -26,7 +26,7 @@ public override bool Match(Context context, Transform transform) if (!context.Operand2.Definitions[0].Operand1.IsConstantZero) return false; - if (AreAnyStatusFlagsUsed(context)) + if (AreAnyStatusFlagsUsed(context, transform.Window)) return false; return true; diff --git a/Source/Mosa.Compiler.x64/Transforms/Optimizations/Auto/ConstantMove/Add32.cs b/Source/Mosa.Compiler.x64/Transforms/Optimizations/Auto/ConstantMove/Add32.cs index 99a8e5d060..cd72a5af85 100644 --- a/Source/Mosa.Compiler.x64/Transforms/Optimizations/Auto/ConstantMove/Add32.cs +++ b/Source/Mosa.Compiler.x64/Transforms/Optimizations/Auto/ConstantMove/Add32.cs @@ -26,7 +26,7 @@ public override bool Match(Context context, Transform transform) if (!IsConstant(context.Operand2.Definitions[0].Operand1)) return false; - if (AreAnyStatusFlagsUsed(context)) + if (AreAnyStatusFlagsUsed(context, transform.Window)) return false; return true; diff --git a/Source/Mosa.Compiler.x64/Transforms/Optimizations/Auto/ConstantMove/Add64.cs b/Source/Mosa.Compiler.x64/Transforms/Optimizations/Auto/ConstantMove/Add64.cs index 600380da5e..2d3541edb2 100644 --- a/Source/Mosa.Compiler.x64/Transforms/Optimizations/Auto/ConstantMove/Add64.cs +++ b/Source/Mosa.Compiler.x64/Transforms/Optimizations/Auto/ConstantMove/Add64.cs @@ -26,7 +26,7 @@ public override bool Match(Context context, Transform transform) if (!IsConstant(context.Operand2.Definitions[0].Operand1)) return false; - if (AreAnyStatusFlagsUsed(context)) + if (AreAnyStatusFlagsUsed(context, transform.Window)) return false; return true; diff --git a/Source/Mosa.Compiler.x64/Transforms/Optimizations/Auto/ConstantMove/And32.cs b/Source/Mosa.Compiler.x64/Transforms/Optimizations/Auto/ConstantMove/And32.cs index d2643ff032..4ab9872855 100644 --- a/Source/Mosa.Compiler.x64/Transforms/Optimizations/Auto/ConstantMove/And32.cs +++ b/Source/Mosa.Compiler.x64/Transforms/Optimizations/Auto/ConstantMove/And32.cs @@ -26,7 +26,7 @@ public override bool Match(Context context, Transform transform) if (!IsConstant(context.Operand2.Definitions[0].Operand1)) return false; - if (AreAnyStatusFlagsUsed(context)) + if (AreAnyStatusFlagsUsed(context, transform.Window)) return false; return true; diff --git a/Source/Mosa.Compiler.x64/Transforms/Optimizations/Auto/ConstantMove/And64.cs b/Source/Mosa.Compiler.x64/Transforms/Optimizations/Auto/ConstantMove/And64.cs index 45824e73e0..244fbb5c22 100644 --- a/Source/Mosa.Compiler.x64/Transforms/Optimizations/Auto/ConstantMove/And64.cs +++ b/Source/Mosa.Compiler.x64/Transforms/Optimizations/Auto/ConstantMove/And64.cs @@ -26,7 +26,7 @@ public override bool Match(Context context, Transform transform) if (!IsConstant(context.Operand2.Definitions[0].Operand1)) return false; - if (AreAnyStatusFlagsUsed(context)) + if (AreAnyStatusFlagsUsed(context, transform.Window)) return false; return true; diff --git a/Source/Mosa.Compiler.x64/Transforms/Optimizations/Auto/ConstantMove/Or32.cs b/Source/Mosa.Compiler.x64/Transforms/Optimizations/Auto/ConstantMove/Or32.cs index d55ea22a99..929b20fe11 100644 --- a/Source/Mosa.Compiler.x64/Transforms/Optimizations/Auto/ConstantMove/Or32.cs +++ b/Source/Mosa.Compiler.x64/Transforms/Optimizations/Auto/ConstantMove/Or32.cs @@ -26,7 +26,7 @@ public override bool Match(Context context, Transform transform) if (!IsConstant(context.Operand2.Definitions[0].Operand1)) return false; - if (AreAnyStatusFlagsUsed(context)) + if (AreAnyStatusFlagsUsed(context, transform.Window)) return false; return true; diff --git a/Source/Mosa.Compiler.x64/Transforms/Optimizations/Auto/ConstantMove/Or64.cs b/Source/Mosa.Compiler.x64/Transforms/Optimizations/Auto/ConstantMove/Or64.cs index b480d33874..4910a61c79 100644 --- a/Source/Mosa.Compiler.x64/Transforms/Optimizations/Auto/ConstantMove/Or64.cs +++ b/Source/Mosa.Compiler.x64/Transforms/Optimizations/Auto/ConstantMove/Or64.cs @@ -26,7 +26,7 @@ public override bool Match(Context context, Transform transform) if (!IsConstant(context.Operand2.Definitions[0].Operand1)) return false; - if (AreAnyStatusFlagsUsed(context)) + if (AreAnyStatusFlagsUsed(context, transform.Window)) return false; return true; diff --git a/Source/Mosa.Compiler.x64/Transforms/Optimizations/Auto/ConstantMove/Sar32.cs b/Source/Mosa.Compiler.x64/Transforms/Optimizations/Auto/ConstantMove/Sar32.cs index 249be09745..16a45e5150 100644 --- a/Source/Mosa.Compiler.x64/Transforms/Optimizations/Auto/ConstantMove/Sar32.cs +++ b/Source/Mosa.Compiler.x64/Transforms/Optimizations/Auto/ConstantMove/Sar32.cs @@ -26,7 +26,7 @@ public override bool Match(Context context, Transform transform) if (!IsConstant(context.Operand2.Definitions[0].Operand1)) return false; - if (AreAnyStatusFlagsUsed(context)) + if (AreAnyStatusFlagsUsed(context, transform.Window)) return false; return true; diff --git a/Source/Mosa.Compiler.x64/Transforms/Optimizations/Auto/ConstantMove/Sar64.cs b/Source/Mosa.Compiler.x64/Transforms/Optimizations/Auto/ConstantMove/Sar64.cs index c4a8340ab7..f60deaba54 100644 --- a/Source/Mosa.Compiler.x64/Transforms/Optimizations/Auto/ConstantMove/Sar64.cs +++ b/Source/Mosa.Compiler.x64/Transforms/Optimizations/Auto/ConstantMove/Sar64.cs @@ -26,7 +26,7 @@ public override bool Match(Context context, Transform transform) if (!IsConstant(context.Operand2.Definitions[0].Operand1)) return false; - if (AreAnyStatusFlagsUsed(context)) + if (AreAnyStatusFlagsUsed(context, transform.Window)) return false; return true; diff --git a/Source/Mosa.Compiler.x64/Transforms/Optimizations/Auto/ConstantMove/Shl32.cs b/Source/Mosa.Compiler.x64/Transforms/Optimizations/Auto/ConstantMove/Shl32.cs index 9b9b115942..679a69a578 100644 --- a/Source/Mosa.Compiler.x64/Transforms/Optimizations/Auto/ConstantMove/Shl32.cs +++ b/Source/Mosa.Compiler.x64/Transforms/Optimizations/Auto/ConstantMove/Shl32.cs @@ -26,7 +26,7 @@ public override bool Match(Context context, Transform transform) if (!IsConstant(context.Operand2.Definitions[0].Operand1)) return false; - if (AreAnyStatusFlagsUsed(context)) + if (AreAnyStatusFlagsUsed(context, transform.Window)) return false; return true; diff --git a/Source/Mosa.Compiler.x64/Transforms/Optimizations/Auto/ConstantMove/Shl64.cs b/Source/Mosa.Compiler.x64/Transforms/Optimizations/Auto/ConstantMove/Shl64.cs index 39a0a26588..2f91aa98ef 100644 --- a/Source/Mosa.Compiler.x64/Transforms/Optimizations/Auto/ConstantMove/Shl64.cs +++ b/Source/Mosa.Compiler.x64/Transforms/Optimizations/Auto/ConstantMove/Shl64.cs @@ -26,7 +26,7 @@ public override bool Match(Context context, Transform transform) if (!IsConstant(context.Operand2.Definitions[0].Operand1)) return false; - if (AreAnyStatusFlagsUsed(context)) + if (AreAnyStatusFlagsUsed(context, transform.Window)) return false; return true; diff --git a/Source/Mosa.Compiler.x64/Transforms/Optimizations/Auto/ConstantMove/Shr32.cs b/Source/Mosa.Compiler.x64/Transforms/Optimizations/Auto/ConstantMove/Shr32.cs index 0b05ffa339..fb0c9e701e 100644 --- a/Source/Mosa.Compiler.x64/Transforms/Optimizations/Auto/ConstantMove/Shr32.cs +++ b/Source/Mosa.Compiler.x64/Transforms/Optimizations/Auto/ConstantMove/Shr32.cs @@ -26,7 +26,7 @@ public override bool Match(Context context, Transform transform) if (!IsConstant(context.Operand2.Definitions[0].Operand1)) return false; - if (AreAnyStatusFlagsUsed(context)) + if (AreAnyStatusFlagsUsed(context, transform.Window)) return false; return true; diff --git a/Source/Mosa.Compiler.x64/Transforms/Optimizations/Auto/ConstantMove/Shr64.cs b/Source/Mosa.Compiler.x64/Transforms/Optimizations/Auto/ConstantMove/Shr64.cs index 49be3537c6..48a313c4d9 100644 --- a/Source/Mosa.Compiler.x64/Transforms/Optimizations/Auto/ConstantMove/Shr64.cs +++ b/Source/Mosa.Compiler.x64/Transforms/Optimizations/Auto/ConstantMove/Shr64.cs @@ -26,7 +26,7 @@ public override bool Match(Context context, Transform transform) if (!IsConstant(context.Operand2.Definitions[0].Operand1)) return false; - if (AreAnyStatusFlagsUsed(context)) + if (AreAnyStatusFlagsUsed(context, transform.Window)) return false; return true; diff --git a/Source/Mosa.Compiler.x64/Transforms/Optimizations/Auto/ConstantMove/Sub32.cs b/Source/Mosa.Compiler.x64/Transforms/Optimizations/Auto/ConstantMove/Sub32.cs index 1aa291eefc..12c055957d 100644 --- a/Source/Mosa.Compiler.x64/Transforms/Optimizations/Auto/ConstantMove/Sub32.cs +++ b/Source/Mosa.Compiler.x64/Transforms/Optimizations/Auto/ConstantMove/Sub32.cs @@ -26,7 +26,7 @@ public override bool Match(Context context, Transform transform) if (!IsConstant(context.Operand2.Definitions[0].Operand1)) return false; - if (AreAnyStatusFlagsUsed(context)) + if (AreAnyStatusFlagsUsed(context, transform.Window)) return false; return true; diff --git a/Source/Mosa.Compiler.x64/Transforms/Optimizations/Auto/ConstantMove/Sub64.cs b/Source/Mosa.Compiler.x64/Transforms/Optimizations/Auto/ConstantMove/Sub64.cs index 37b12cde61..83b60f0332 100644 --- a/Source/Mosa.Compiler.x64/Transforms/Optimizations/Auto/ConstantMove/Sub64.cs +++ b/Source/Mosa.Compiler.x64/Transforms/Optimizations/Auto/ConstantMove/Sub64.cs @@ -26,7 +26,7 @@ public override bool Match(Context context, Transform transform) if (!IsConstant(context.Operand2.Definitions[0].Operand1)) return false; - if (AreAnyStatusFlagsUsed(context)) + if (AreAnyStatusFlagsUsed(context, transform.Window)) return false; return true; diff --git a/Source/Mosa.Compiler.x64/Transforms/Optimizations/Auto/ConstantMove/Xor32.cs b/Source/Mosa.Compiler.x64/Transforms/Optimizations/Auto/ConstantMove/Xor32.cs index 80c09a6454..774f6004e8 100644 --- a/Source/Mosa.Compiler.x64/Transforms/Optimizations/Auto/ConstantMove/Xor32.cs +++ b/Source/Mosa.Compiler.x64/Transforms/Optimizations/Auto/ConstantMove/Xor32.cs @@ -26,7 +26,7 @@ public override bool Match(Context context, Transform transform) if (!IsConstant(context.Operand2.Definitions[0].Operand1)) return false; - if (AreAnyStatusFlagsUsed(context)) + if (AreAnyStatusFlagsUsed(context, transform.Window)) return false; return true; diff --git a/Source/Mosa.Compiler.x64/Transforms/Optimizations/Auto/ConstantMove/Xor64.cs b/Source/Mosa.Compiler.x64/Transforms/Optimizations/Auto/ConstantMove/Xor64.cs index ebc842eb5f..c8b1b482a1 100644 --- a/Source/Mosa.Compiler.x64/Transforms/Optimizations/Auto/ConstantMove/Xor64.cs +++ b/Source/Mosa.Compiler.x64/Transforms/Optimizations/Auto/ConstantMove/Xor64.cs @@ -26,7 +26,7 @@ public override bool Match(Context context, Transform transform) if (!IsConstant(context.Operand2.Definitions[0].Operand1)) return false; - if (AreAnyStatusFlagsUsed(context)) + if (AreAnyStatusFlagsUsed(context, transform.Window)) return false; return true; diff --git a/Source/Mosa.Compiler.x64/Transforms/Optimizations/Auto/Lea/Mul32ToLea32By3Or5Or9.cs b/Source/Mosa.Compiler.x64/Transforms/Optimizations/Auto/Lea/Mul32ToLea32By3Or5Or9.cs index 7f014f7d72..cd572740e4 100644 --- a/Source/Mosa.Compiler.x64/Transforms/Optimizations/Auto/Lea/Mul32ToLea32By3Or5Or9.cs +++ b/Source/Mosa.Compiler.x64/Transforms/Optimizations/Auto/Lea/Mul32ToLea32By3Or5Or9.cs @@ -23,7 +23,7 @@ public override bool Match(Context context, Transform transform) if (!Contains(context.Operand2, 3, 5, 9)) return false; - if (AreAnyStatusFlagsUsed(context)) + if (AreAnyStatusFlagsUsed(context, transform.Window)) return false; return true; diff --git a/Source/Mosa.Compiler.x64/Transforms/Optimizations/Auto/Lea/Mul64ToLea64By3Or5Or9.cs b/Source/Mosa.Compiler.x64/Transforms/Optimizations/Auto/Lea/Mul64ToLea64By3Or5Or9.cs index 4f649e38cd..c9b9698850 100644 --- a/Source/Mosa.Compiler.x64/Transforms/Optimizations/Auto/Lea/Mul64ToLea64By3Or5Or9.cs +++ b/Source/Mosa.Compiler.x64/Transforms/Optimizations/Auto/Lea/Mul64ToLea64By3Or5Or9.cs @@ -23,7 +23,7 @@ public override bool Match(Context context, Transform transform) if (!Contains(context.Operand2, 3, 5, 9)) return false; - if (AreAnyStatusFlagsUsed(context)) + if (AreAnyStatusFlagsUsed(context, transform.Window)) return false; return true; diff --git a/Source/Mosa.Compiler.x64/Transforms/Optimizations/Auto/Specific/And32Add32ToBlsr32.cs b/Source/Mosa.Compiler.x64/Transforms/Optimizations/Auto/Specific/And32Add32ToBlsr32.cs index 37b14baaf0..bf031c1fa6 100644 --- a/Source/Mosa.Compiler.x64/Transforms/Optimizations/Auto/Specific/And32Add32ToBlsr32.cs +++ b/Source/Mosa.Compiler.x64/Transforms/Optimizations/Auto/Specific/And32Add32ToBlsr32.cs @@ -35,7 +35,7 @@ public override bool Match(Context context, Transform transform) if (!IsVirtualRegister(context.Operand1)) return false; - if (IsCarryFlagUsed(context)) + if (IsCarryFlagUsed(context, transform.Window)) return false; return true; @@ -80,7 +80,7 @@ public override bool Match(Context context, Transform transform) if (!IsVirtualRegister(context.Operand1.Definitions[0].Operand1)) return false; - if (IsCarryFlagUsed(context)) + if (IsCarryFlagUsed(context, transform.Window)) return false; return true; @@ -125,7 +125,7 @@ public override bool Match(Context context, Transform transform) if (!IsVirtualRegister(context.Operand1)) return false; - if (IsCarryFlagUsed(context)) + if (IsCarryFlagUsed(context, transform.Window)) return false; return true; @@ -170,7 +170,7 @@ public override bool Match(Context context, Transform transform) if (!IsVirtualRegister(context.Operand1.Definitions[0].Operand2)) return false; - if (IsCarryFlagUsed(context)) + if (IsCarryFlagUsed(context, transform.Window)) return false; return true; diff --git a/Source/Mosa.Compiler.x64/Transforms/Optimizations/Auto/Specific/And64Add64ToBlsr64.cs b/Source/Mosa.Compiler.x64/Transforms/Optimizations/Auto/Specific/And64Add64ToBlsr64.cs index 69d696765b..00946dff4d 100644 --- a/Source/Mosa.Compiler.x64/Transforms/Optimizations/Auto/Specific/And64Add64ToBlsr64.cs +++ b/Source/Mosa.Compiler.x64/Transforms/Optimizations/Auto/Specific/And64Add64ToBlsr64.cs @@ -35,7 +35,7 @@ public override bool Match(Context context, Transform transform) if (!IsVirtualRegister(context.Operand1)) return false; - if (IsCarryFlagUsed(context)) + if (IsCarryFlagUsed(context, transform.Window)) return false; return true; @@ -80,7 +80,7 @@ public override bool Match(Context context, Transform transform) if (!IsVirtualRegister(context.Operand1.Definitions[0].Operand1)) return false; - if (IsCarryFlagUsed(context)) + if (IsCarryFlagUsed(context, transform.Window)) return false; return true; @@ -125,7 +125,7 @@ public override bool Match(Context context, Transform transform) if (!IsVirtualRegister(context.Operand1)) return false; - if (IsCarryFlagUsed(context)) + if (IsCarryFlagUsed(context, transform.Window)) return false; return true; @@ -170,7 +170,7 @@ public override bool Match(Context context, Transform transform) if (!IsVirtualRegister(context.Operand1.Definitions[0].Operand2)) return false; - if (IsCarryFlagUsed(context)) + if (IsCarryFlagUsed(context, transform.Window)) return false; return true; diff --git a/Source/Mosa.Compiler.x64/Transforms/Optimizations/Auto/StrengthReduction/Add32By1Not32.cs b/Source/Mosa.Compiler.x64/Transforms/Optimizations/Auto/StrengthReduction/Add32By1Not32.cs index b401e4cc91..a36ece23ec 100644 --- a/Source/Mosa.Compiler.x64/Transforms/Optimizations/Auto/StrengthReduction/Add32By1Not32.cs +++ b/Source/Mosa.Compiler.x64/Transforms/Optimizations/Auto/StrengthReduction/Add32By1Not32.cs @@ -29,7 +29,7 @@ public override bool Match(Context context, Transform transform) if (!IsVirtualRegister(context.Operand1.Definitions[0].Operand1)) return false; - if (IsCarryFlagUsed(context)) + if (IsCarryFlagUsed(context, transform.Window)) return false; return true; @@ -68,7 +68,7 @@ public override bool Match(Context context, Transform transform) if (!IsVirtualRegister(context.Operand2.Definitions[0].Operand1)) return false; - if (IsCarryFlagUsed(context)) + if (IsCarryFlagUsed(context, transform.Window)) return false; return true; diff --git a/Source/Mosa.Compiler.x64/Transforms/Optimizations/Auto/StrengthReduction/Add32ByZero.cs b/Source/Mosa.Compiler.x64/Transforms/Optimizations/Auto/StrengthReduction/Add32ByZero.cs index 063fe4eab6..7330cd568b 100644 --- a/Source/Mosa.Compiler.x64/Transforms/Optimizations/Auto/StrengthReduction/Add32ByZero.cs +++ b/Source/Mosa.Compiler.x64/Transforms/Optimizations/Auto/StrengthReduction/Add32ByZero.cs @@ -17,7 +17,7 @@ public override bool Match(Context context, Transform transform) if (!context.Operand2.IsConstantZero) return false; - if (AreAnyStatusFlagsUsed(context)) + if (AreAnyStatusFlagsUsed(context, transform.Window)) return false; return true; diff --git a/Source/Mosa.Compiler.x64/Transforms/Optimizations/Auto/StrengthReduction/Add64By1Not64.cs b/Source/Mosa.Compiler.x64/Transforms/Optimizations/Auto/StrengthReduction/Add64By1Not64.cs index a83fb1f12e..c97625b9ec 100644 --- a/Source/Mosa.Compiler.x64/Transforms/Optimizations/Auto/StrengthReduction/Add64By1Not64.cs +++ b/Source/Mosa.Compiler.x64/Transforms/Optimizations/Auto/StrengthReduction/Add64By1Not64.cs @@ -29,7 +29,7 @@ public override bool Match(Context context, Transform transform) if (!IsVirtualRegister(context.Operand1.Definitions[0].Operand1)) return false; - if (IsCarryFlagUsed(context)) + if (IsCarryFlagUsed(context, transform.Window)) return false; return true; @@ -68,7 +68,7 @@ public override bool Match(Context context, Transform transform) if (!IsVirtualRegister(context.Operand2.Definitions[0].Operand1)) return false; - if (IsCarryFlagUsed(context)) + if (IsCarryFlagUsed(context, transform.Window)) return false; return true; diff --git a/Source/Mosa.Compiler.x64/Transforms/Optimizations/Auto/StrengthReduction/Add64ByZero.cs b/Source/Mosa.Compiler.x64/Transforms/Optimizations/Auto/StrengthReduction/Add64ByZero.cs index b7b4072076..491ec0b95a 100644 --- a/Source/Mosa.Compiler.x64/Transforms/Optimizations/Auto/StrengthReduction/Add64ByZero.cs +++ b/Source/Mosa.Compiler.x64/Transforms/Optimizations/Auto/StrengthReduction/Add64ByZero.cs @@ -17,7 +17,7 @@ public override bool Match(Context context, Transform transform) if (!context.Operand2.IsConstantZero) return false; - if (AreAnyStatusFlagsUsed(context)) + if (AreAnyStatusFlagsUsed(context, transform.Window)) return false; return true; diff --git a/Source/Mosa.Compiler.x64/Transforms/Optimizations/Auto/StrengthReduction/And32ByMax.cs b/Source/Mosa.Compiler.x64/Transforms/Optimizations/Auto/StrengthReduction/And32ByMax.cs index 959afcc567..8bff019693 100644 --- a/Source/Mosa.Compiler.x64/Transforms/Optimizations/Auto/StrengthReduction/And32ByMax.cs +++ b/Source/Mosa.Compiler.x64/Transforms/Optimizations/Auto/StrengthReduction/And32ByMax.cs @@ -20,7 +20,7 @@ public override bool Match(Context context, Transform transform) if (context.Operand2.ConstantUnsigned64 != 0xFFFFFFFF) return false; - if (AreAnyStatusFlagsUsed(context)) + if (AreAnyStatusFlagsUsed(context, transform.Window)) return false; return true; @@ -50,7 +50,7 @@ public override bool Match(Context context, Transform transform) if (context.Operand1.ConstantUnsigned64 != 0xFFFFFFFF) return false; - if (AreAnyStatusFlagsUsed(context)) + if (AreAnyStatusFlagsUsed(context, transform.Window)) return false; return true; diff --git a/Source/Mosa.Compiler.x64/Transforms/Optimizations/Auto/StrengthReduction/And32ByZero.cs b/Source/Mosa.Compiler.x64/Transforms/Optimizations/Auto/StrengthReduction/And32ByZero.cs index 3c5aef41fb..5eee2211c0 100644 --- a/Source/Mosa.Compiler.x64/Transforms/Optimizations/Auto/StrengthReduction/And32ByZero.cs +++ b/Source/Mosa.Compiler.x64/Transforms/Optimizations/Auto/StrengthReduction/And32ByZero.cs @@ -17,7 +17,7 @@ public override bool Match(Context context, Transform transform) if (!context.Operand2.IsConstantZero) return false; - if (AreAnyStatusFlagsUsed(context)) + if (AreAnyStatusFlagsUsed(context, transform.Window)) return false; return true; @@ -44,7 +44,7 @@ public override bool Match(Context context, Transform transform) if (!context.Operand1.IsConstantZero) return false; - if (AreAnyStatusFlagsUsed(context)) + if (AreAnyStatusFlagsUsed(context, transform.Window)) return false; return true; diff --git a/Source/Mosa.Compiler.x64/Transforms/Optimizations/Auto/StrengthReduction/And64ByMax.cs b/Source/Mosa.Compiler.x64/Transforms/Optimizations/Auto/StrengthReduction/And64ByMax.cs index 98e14dd82c..9d41d8afee 100644 --- a/Source/Mosa.Compiler.x64/Transforms/Optimizations/Auto/StrengthReduction/And64ByMax.cs +++ b/Source/Mosa.Compiler.x64/Transforms/Optimizations/Auto/StrengthReduction/And64ByMax.cs @@ -20,7 +20,7 @@ public override bool Match(Context context, Transform transform) if (context.Operand2.ConstantUnsigned64 != 0xFFFFFFFF) return false; - if (AreAnyStatusFlagsUsed(context)) + if (AreAnyStatusFlagsUsed(context, transform.Window)) return false; return true; @@ -50,7 +50,7 @@ public override bool Match(Context context, Transform transform) if (context.Operand1.ConstantUnsigned64 != 0xFFFFFFFF) return false; - if (AreAnyStatusFlagsUsed(context)) + if (AreAnyStatusFlagsUsed(context, transform.Window)) return false; return true; diff --git a/Source/Mosa.Compiler.x64/Transforms/Optimizations/Auto/StrengthReduction/And64ByZero.cs b/Source/Mosa.Compiler.x64/Transforms/Optimizations/Auto/StrengthReduction/And64ByZero.cs index 6c736eb2f8..062e8bee8c 100644 --- a/Source/Mosa.Compiler.x64/Transforms/Optimizations/Auto/StrengthReduction/And64ByZero.cs +++ b/Source/Mosa.Compiler.x64/Transforms/Optimizations/Auto/StrengthReduction/And64ByZero.cs @@ -17,7 +17,7 @@ public override bool Match(Context context, Transform transform) if (!context.Operand2.IsConstantZero) return false; - if (AreAnyStatusFlagsUsed(context)) + if (AreAnyStatusFlagsUsed(context, transform.Window)) return false; return true; @@ -44,7 +44,7 @@ public override bool Match(Context context, Transform transform) if (!context.Operand1.IsConstantZero) return false; - if (AreAnyStatusFlagsUsed(context)) + if (AreAnyStatusFlagsUsed(context, transform.Window)) return false; return true; diff --git a/Source/Mosa.Compiler.x64/Transforms/Optimizations/Auto/StrengthReduction/IMul32ByOne.cs b/Source/Mosa.Compiler.x64/Transforms/Optimizations/Auto/StrengthReduction/IMul32ByOne.cs index 41c4686f28..b07e358ddf 100644 --- a/Source/Mosa.Compiler.x64/Transforms/Optimizations/Auto/StrengthReduction/IMul32ByOne.cs +++ b/Source/Mosa.Compiler.x64/Transforms/Optimizations/Auto/StrengthReduction/IMul32ByOne.cs @@ -17,7 +17,7 @@ public override bool Match(Context context, Transform transform) if (!context.Operand2.IsConstantOne) return false; - if (AreAnyStatusFlagsUsed(context)) + if (AreAnyStatusFlagsUsed(context, transform.Window)) return false; return true; diff --git a/Source/Mosa.Compiler.x64/Transforms/Optimizations/Auto/StrengthReduction/IMul32ByZero.cs b/Source/Mosa.Compiler.x64/Transforms/Optimizations/Auto/StrengthReduction/IMul32ByZero.cs index f2f8b080c9..dd666263c8 100644 --- a/Source/Mosa.Compiler.x64/Transforms/Optimizations/Auto/StrengthReduction/IMul32ByZero.cs +++ b/Source/Mosa.Compiler.x64/Transforms/Optimizations/Auto/StrengthReduction/IMul32ByZero.cs @@ -17,7 +17,7 @@ public override bool Match(Context context, Transform transform) if (!context.Operand2.IsConstantZero) return false; - if (AreAnyStatusFlagsUsed(context)) + if (AreAnyStatusFlagsUsed(context, transform.Window)) return false; return true; diff --git a/Source/Mosa.Compiler.x64/Transforms/Optimizations/Auto/StrengthReduction/IMul64ByOne.cs b/Source/Mosa.Compiler.x64/Transforms/Optimizations/Auto/StrengthReduction/IMul64ByOne.cs index 2b1c9da798..9fe5944250 100644 --- a/Source/Mosa.Compiler.x64/Transforms/Optimizations/Auto/StrengthReduction/IMul64ByOne.cs +++ b/Source/Mosa.Compiler.x64/Transforms/Optimizations/Auto/StrengthReduction/IMul64ByOne.cs @@ -17,7 +17,7 @@ public override bool Match(Context context, Transform transform) if (!context.Operand2.IsConstantOne) return false; - if (AreAnyStatusFlagsUsed(context)) + if (AreAnyStatusFlagsUsed(context, transform.Window)) return false; return true; diff --git a/Source/Mosa.Compiler.x64/Transforms/Optimizations/Auto/StrengthReduction/IMul64ByZero.cs b/Source/Mosa.Compiler.x64/Transforms/Optimizations/Auto/StrengthReduction/IMul64ByZero.cs index 21211ed7fb..87161b7dea 100644 --- a/Source/Mosa.Compiler.x64/Transforms/Optimizations/Auto/StrengthReduction/IMul64ByZero.cs +++ b/Source/Mosa.Compiler.x64/Transforms/Optimizations/Auto/StrengthReduction/IMul64ByZero.cs @@ -17,7 +17,7 @@ public override bool Match(Context context, Transform transform) if (!context.Operand2.IsConstantZero) return false; - if (AreAnyStatusFlagsUsed(context)) + if (AreAnyStatusFlagsUsed(context, transform.Window)) return false; return true; diff --git a/Source/Mosa.Compiler.x64/Transforms/Optimizations/Auto/StrengthReduction/Inc32Not32.cs b/Source/Mosa.Compiler.x64/Transforms/Optimizations/Auto/StrengthReduction/Inc32Not32.cs index 0d01553c28..d7ac774cdc 100644 --- a/Source/Mosa.Compiler.x64/Transforms/Optimizations/Auto/StrengthReduction/Inc32Not32.cs +++ b/Source/Mosa.Compiler.x64/Transforms/Optimizations/Auto/StrengthReduction/Inc32Not32.cs @@ -26,7 +26,7 @@ public override bool Match(Context context, Transform transform) if (!IsVirtualRegister(context.Operand1.Definitions[0].Operand1)) return false; - if (IsCarryFlagUsed(context)) + if (IsCarryFlagUsed(context, transform.Window)) return false; return true; diff --git a/Source/Mosa.Compiler.x64/Transforms/Optimizations/Auto/StrengthReduction/Inc64Not64.cs b/Source/Mosa.Compiler.x64/Transforms/Optimizations/Auto/StrengthReduction/Inc64Not64.cs index 390bd58f21..d4dabb7b9b 100644 --- a/Source/Mosa.Compiler.x64/Transforms/Optimizations/Auto/StrengthReduction/Inc64Not64.cs +++ b/Source/Mosa.Compiler.x64/Transforms/Optimizations/Auto/StrengthReduction/Inc64Not64.cs @@ -26,7 +26,7 @@ public override bool Match(Context context, Transform transform) if (!IsVirtualRegister(context.Operand1.Definitions[0].Operand1)) return false; - if (IsCarryFlagUsed(context)) + if (IsCarryFlagUsed(context, transform.Window)) return false; return true; diff --git a/Source/Mosa.Compiler.x64/Transforms/Optimizations/Auto/StrengthReduction/Sar32ByZero.cs b/Source/Mosa.Compiler.x64/Transforms/Optimizations/Auto/StrengthReduction/Sar32ByZero.cs index ab38e95691..540106d971 100644 --- a/Source/Mosa.Compiler.x64/Transforms/Optimizations/Auto/StrengthReduction/Sar32ByZero.cs +++ b/Source/Mosa.Compiler.x64/Transforms/Optimizations/Auto/StrengthReduction/Sar32ByZero.cs @@ -19,7 +19,7 @@ public override bool Match(Context context, Transform transform) if (!context.Operand2.IsConstantZero) return false; - if (AreAnyStatusFlagsUsed(context)) + if (AreAnyStatusFlagsUsed(context, transform.Window)) return false; return true; diff --git a/Source/Mosa.Compiler.x64/Transforms/Optimizations/Auto/StrengthReduction/Sar32ZeroValue.cs b/Source/Mosa.Compiler.x64/Transforms/Optimizations/Auto/StrengthReduction/Sar32ZeroValue.cs index 91b24d5094..61fec46b94 100644 --- a/Source/Mosa.Compiler.x64/Transforms/Optimizations/Auto/StrengthReduction/Sar32ZeroValue.cs +++ b/Source/Mosa.Compiler.x64/Transforms/Optimizations/Auto/StrengthReduction/Sar32ZeroValue.cs @@ -19,7 +19,7 @@ public override bool Match(Context context, Transform transform) if (!context.Operand1.IsConstantZero) return false; - if (AreAnyStatusFlagsUsed(context)) + if (AreAnyStatusFlagsUsed(context, transform.Window)) return false; return true; diff --git a/Source/Mosa.Compiler.x64/Transforms/Optimizations/Auto/StrengthReduction/Sar64ByZero.cs b/Source/Mosa.Compiler.x64/Transforms/Optimizations/Auto/StrengthReduction/Sar64ByZero.cs index 1b794e41bc..ed41f6bc32 100644 --- a/Source/Mosa.Compiler.x64/Transforms/Optimizations/Auto/StrengthReduction/Sar64ByZero.cs +++ b/Source/Mosa.Compiler.x64/Transforms/Optimizations/Auto/StrengthReduction/Sar64ByZero.cs @@ -19,7 +19,7 @@ public override bool Match(Context context, Transform transform) if (!context.Operand2.IsConstantZero) return false; - if (AreAnyStatusFlagsUsed(context)) + if (AreAnyStatusFlagsUsed(context, transform.Window)) return false; return true; diff --git a/Source/Mosa.Compiler.x64/Transforms/Optimizations/Auto/StrengthReduction/Sar64ZeroValue.cs b/Source/Mosa.Compiler.x64/Transforms/Optimizations/Auto/StrengthReduction/Sar64ZeroValue.cs index 1c72fb1884..ed566e6920 100644 --- a/Source/Mosa.Compiler.x64/Transforms/Optimizations/Auto/StrengthReduction/Sar64ZeroValue.cs +++ b/Source/Mosa.Compiler.x64/Transforms/Optimizations/Auto/StrengthReduction/Sar64ZeroValue.cs @@ -19,7 +19,7 @@ public override bool Match(Context context, Transform transform) if (!context.Operand1.IsConstantZero) return false; - if (AreAnyStatusFlagsUsed(context)) + if (AreAnyStatusFlagsUsed(context, transform.Window)) return false; return true; diff --git a/Source/Mosa.Compiler.x64/Transforms/Optimizations/Auto/StrengthReduction/Shl32ByZero.cs b/Source/Mosa.Compiler.x64/Transforms/Optimizations/Auto/StrengthReduction/Shl32ByZero.cs index 1892836c4c..1ee5d04c6a 100644 --- a/Source/Mosa.Compiler.x64/Transforms/Optimizations/Auto/StrengthReduction/Shl32ByZero.cs +++ b/Source/Mosa.Compiler.x64/Transforms/Optimizations/Auto/StrengthReduction/Shl32ByZero.cs @@ -19,7 +19,7 @@ public override bool Match(Context context, Transform transform) if (!context.Operand2.IsConstantZero) return false; - if (AreAnyStatusFlagsUsed(context)) + if (AreAnyStatusFlagsUsed(context, transform.Window)) return false; return true; diff --git a/Source/Mosa.Compiler.x64/Transforms/Optimizations/Auto/StrengthReduction/Shl32ZeroValue.cs b/Source/Mosa.Compiler.x64/Transforms/Optimizations/Auto/StrengthReduction/Shl32ZeroValue.cs index d7c7e24517..e56010be74 100644 --- a/Source/Mosa.Compiler.x64/Transforms/Optimizations/Auto/StrengthReduction/Shl32ZeroValue.cs +++ b/Source/Mosa.Compiler.x64/Transforms/Optimizations/Auto/StrengthReduction/Shl32ZeroValue.cs @@ -19,7 +19,7 @@ public override bool Match(Context context, Transform transform) if (!context.Operand1.IsConstantZero) return false; - if (AreAnyStatusFlagsUsed(context)) + if (AreAnyStatusFlagsUsed(context, transform.Window)) return false; return true; diff --git a/Source/Mosa.Compiler.x64/Transforms/Optimizations/Auto/StrengthReduction/Shl64ByZero.cs b/Source/Mosa.Compiler.x64/Transforms/Optimizations/Auto/StrengthReduction/Shl64ByZero.cs index 8f94ec96af..2a22c3f284 100644 --- a/Source/Mosa.Compiler.x64/Transforms/Optimizations/Auto/StrengthReduction/Shl64ByZero.cs +++ b/Source/Mosa.Compiler.x64/Transforms/Optimizations/Auto/StrengthReduction/Shl64ByZero.cs @@ -19,7 +19,7 @@ public override bool Match(Context context, Transform transform) if (!context.Operand2.IsConstantZero) return false; - if (AreAnyStatusFlagsUsed(context)) + if (AreAnyStatusFlagsUsed(context, transform.Window)) return false; return true; diff --git a/Source/Mosa.Compiler.x64/Transforms/Optimizations/Auto/StrengthReduction/Shl64ZeroValue.cs b/Source/Mosa.Compiler.x64/Transforms/Optimizations/Auto/StrengthReduction/Shl64ZeroValue.cs index e891db3e0e..c86e00480c 100644 --- a/Source/Mosa.Compiler.x64/Transforms/Optimizations/Auto/StrengthReduction/Shl64ZeroValue.cs +++ b/Source/Mosa.Compiler.x64/Transforms/Optimizations/Auto/StrengthReduction/Shl64ZeroValue.cs @@ -19,7 +19,7 @@ public override bool Match(Context context, Transform transform) if (!context.Operand1.IsConstantZero) return false; - if (AreAnyStatusFlagsUsed(context)) + if (AreAnyStatusFlagsUsed(context, transform.Window)) return false; return true; diff --git a/Source/Mosa.Compiler.x64/Transforms/Optimizations/Auto/StrengthReduction/Shr32ByZero.cs b/Source/Mosa.Compiler.x64/Transforms/Optimizations/Auto/StrengthReduction/Shr32ByZero.cs index 4ad71d012b..520e7b16d7 100644 --- a/Source/Mosa.Compiler.x64/Transforms/Optimizations/Auto/StrengthReduction/Shr32ByZero.cs +++ b/Source/Mosa.Compiler.x64/Transforms/Optimizations/Auto/StrengthReduction/Shr32ByZero.cs @@ -19,7 +19,7 @@ public override bool Match(Context context, Transform transform) if (!context.Operand2.IsConstantZero) return false; - if (AreAnyStatusFlagsUsed(context)) + if (AreAnyStatusFlagsUsed(context, transform.Window)) return false; return true; diff --git a/Source/Mosa.Compiler.x64/Transforms/Optimizations/Auto/StrengthReduction/Shr32ZeroValue.cs b/Source/Mosa.Compiler.x64/Transforms/Optimizations/Auto/StrengthReduction/Shr32ZeroValue.cs index d5234f2804..f9ff471fbe 100644 --- a/Source/Mosa.Compiler.x64/Transforms/Optimizations/Auto/StrengthReduction/Shr32ZeroValue.cs +++ b/Source/Mosa.Compiler.x64/Transforms/Optimizations/Auto/StrengthReduction/Shr32ZeroValue.cs @@ -19,7 +19,7 @@ public override bool Match(Context context, Transform transform) if (!context.Operand1.IsConstantZero) return false; - if (AreAnyStatusFlagsUsed(context)) + if (AreAnyStatusFlagsUsed(context, transform.Window)) return false; return true; diff --git a/Source/Mosa.Compiler.x64/Transforms/Optimizations/Auto/StrengthReduction/Shr64ByZero.cs b/Source/Mosa.Compiler.x64/Transforms/Optimizations/Auto/StrengthReduction/Shr64ByZero.cs index a21f3570ec..c2aec9cf1a 100644 --- a/Source/Mosa.Compiler.x64/Transforms/Optimizations/Auto/StrengthReduction/Shr64ByZero.cs +++ b/Source/Mosa.Compiler.x64/Transforms/Optimizations/Auto/StrengthReduction/Shr64ByZero.cs @@ -19,7 +19,7 @@ public override bool Match(Context context, Transform transform) if (!context.Operand2.IsConstantZero) return false; - if (AreAnyStatusFlagsUsed(context)) + if (AreAnyStatusFlagsUsed(context, transform.Window)) return false; return true; diff --git a/Source/Mosa.Compiler.x64/Transforms/Optimizations/Auto/StrengthReduction/Shr64ZeroValue.cs b/Source/Mosa.Compiler.x64/Transforms/Optimizations/Auto/StrengthReduction/Shr64ZeroValue.cs index 410362b2c1..1698fbe0b2 100644 --- a/Source/Mosa.Compiler.x64/Transforms/Optimizations/Auto/StrengthReduction/Shr64ZeroValue.cs +++ b/Source/Mosa.Compiler.x64/Transforms/Optimizations/Auto/StrengthReduction/Shr64ZeroValue.cs @@ -19,7 +19,7 @@ public override bool Match(Context context, Transform transform) if (!context.Operand1.IsConstantZero) return false; - if (AreAnyStatusFlagsUsed(context)) + if (AreAnyStatusFlagsUsed(context, transform.Window)) return false; return true; diff --git a/Source/Mosa.Compiler.x64/Transforms/Optimizations/Auto/StrengthReduction/Sub32ByZero.cs b/Source/Mosa.Compiler.x64/Transforms/Optimizations/Auto/StrengthReduction/Sub32ByZero.cs index eb03ea5b10..620b52c353 100644 --- a/Source/Mosa.Compiler.x64/Transforms/Optimizations/Auto/StrengthReduction/Sub32ByZero.cs +++ b/Source/Mosa.Compiler.x64/Transforms/Optimizations/Auto/StrengthReduction/Sub32ByZero.cs @@ -17,7 +17,7 @@ public override bool Match(Context context, Transform transform) if (!context.Operand2.IsConstantZero) return false; - if (AreAnyStatusFlagsUsed(context)) + if (AreAnyStatusFlagsUsed(context, transform.Window)) return false; return true; diff --git a/Source/Mosa.Compiler.x64/Transforms/Optimizations/Auto/StrengthReduction/Sub64ByZero.cs b/Source/Mosa.Compiler.x64/Transforms/Optimizations/Auto/StrengthReduction/Sub64ByZero.cs index 6e8da78a82..7e059e3e3b 100644 --- a/Source/Mosa.Compiler.x64/Transforms/Optimizations/Auto/StrengthReduction/Sub64ByZero.cs +++ b/Source/Mosa.Compiler.x64/Transforms/Optimizations/Auto/StrengthReduction/Sub64ByZero.cs @@ -17,7 +17,7 @@ public override bool Match(Context context, Transform transform) if (!context.Operand2.IsConstantZero) return false; - if (AreAnyStatusFlagsUsed(context)) + if (AreAnyStatusFlagsUsed(context, transform.Window)) return false; return true; diff --git a/Source/Mosa.Compiler.x64/Transforms/Optimizations/Manual/Rewrite/Add32ToInc32.cs b/Source/Mosa.Compiler.x64/Transforms/Optimizations/Manual/Rewrite/Add32ToInc32.cs index 407d539f94..5e1a268519 100644 --- a/Source/Mosa.Compiler.x64/Transforms/Optimizations/Manual/Rewrite/Add32ToInc32.cs +++ b/Source/Mosa.Compiler.x64/Transforms/Optimizations/Manual/Rewrite/Add32ToInc32.cs @@ -24,7 +24,7 @@ public override bool Match(Context context, Transform transform) if (!AreSame(context.Operand1, context.Result)) return false; - if (!(AreStatusFlagsUsed(context.Node.Next, false, true, false, false, false) == TriState.No)) + if (!(AreStatusFlagsUsed(context.Node.Next, false, true, false, false, false, transform.Window) == TriState.No)) return false; return true; diff --git a/Source/Mosa.Compiler.x64/Transforms/Optimizations/Manual/Rewrite/Add32ToLea32.cs b/Source/Mosa.Compiler.x64/Transforms/Optimizations/Manual/Rewrite/Add32ToLea32.cs index 8ab0918d32..b4d12fd9d9 100644 --- a/Source/Mosa.Compiler.x64/Transforms/Optimizations/Manual/Rewrite/Add32ToLea32.cs +++ b/Source/Mosa.Compiler.x64/Transforms/Optimizations/Manual/Rewrite/Add32ToLea32.cs @@ -29,7 +29,7 @@ public override bool Match(Context context, Transform transform) if (context.Operand2.IsResolvedConstant && context.Operand2.ConstantUnsigned64 == 1 && context.Operand1 == context.Result) return false; - if (AreAnyStatusFlagsUsed(context)) + if (AreAnyStatusFlagsUsed(context, transform.Window)) return false; return true; diff --git a/Source/Mosa.Compiler.x64/Transforms/Optimizations/Manual/Rewrite/Add64ToLea64.cs b/Source/Mosa.Compiler.x64/Transforms/Optimizations/Manual/Rewrite/Add64ToLea64.cs index d39e5ce752..631ecaf57f 100644 --- a/Source/Mosa.Compiler.x64/Transforms/Optimizations/Manual/Rewrite/Add64ToLea64.cs +++ b/Source/Mosa.Compiler.x64/Transforms/Optimizations/Manual/Rewrite/Add64ToLea64.cs @@ -29,7 +29,7 @@ public override bool Match(Context context, Transform transform) if (context.Operand2.IsResolvedConstant && context.Operand2.ConstantUnsigned64 == 1 && context.Operand1 == context.Result) return false; - if (AreAnyStatusFlagsUsed(context)) + if (AreAnyStatusFlagsUsed(context, transform.Window)) return false; return true; diff --git a/Source/Mosa.Compiler.x64/Transforms/Optimizations/Manual/Rewrite/Lea32ToDec32.cs b/Source/Mosa.Compiler.x64/Transforms/Optimizations/Manual/Rewrite/Lea32ToDec32.cs index e2ea5b5a61..bff8c9ba74 100644 --- a/Source/Mosa.Compiler.x64/Transforms/Optimizations/Manual/Rewrite/Lea32ToDec32.cs +++ b/Source/Mosa.Compiler.x64/Transforms/Optimizations/Manual/Rewrite/Lea32ToDec32.cs @@ -27,7 +27,7 @@ public override bool Match(Context context, Transform transform) if (context.Operand1.Register == CPURegister.RSP) return false; - if (!(AreStatusFlagsUsed(context.Node.Next, false, true, false, false, false) == TriState.No)) + if (!(AreStatusFlagsUsed(context.Node.Next, false, true, false, false, false, transform.Window) == TriState.No)) return false; return true; diff --git a/Source/Mosa.Compiler.x64/Transforms/Optimizations/Manual/Rewrite/Lea32ToInc32.cs b/Source/Mosa.Compiler.x64/Transforms/Optimizations/Manual/Rewrite/Lea32ToInc32.cs index 31aea2c5f4..f68e609bd0 100644 --- a/Source/Mosa.Compiler.x64/Transforms/Optimizations/Manual/Rewrite/Lea32ToInc32.cs +++ b/Source/Mosa.Compiler.x64/Transforms/Optimizations/Manual/Rewrite/Lea32ToInc32.cs @@ -27,7 +27,7 @@ public override bool Match(Context context, Transform transform) if (context.Operand1.Register == CPURegister.RSP) return false; - if (!(AreStatusFlagsUsed(context.Node.Next, false, true, false, false, false) == TriState.No)) + if (!(AreStatusFlagsUsed(context.Node.Next, false, true, false, false, false, transform.Window) == TriState.No)) return false; return true; diff --git a/Source/Mosa.Compiler.x64/Transforms/Optimizations/Manual/Rewrite/Lea64ToDec64.cs b/Source/Mosa.Compiler.x64/Transforms/Optimizations/Manual/Rewrite/Lea64ToDec64.cs index 582a07d5d1..209b424cc0 100644 --- a/Source/Mosa.Compiler.x64/Transforms/Optimizations/Manual/Rewrite/Lea64ToDec64.cs +++ b/Source/Mosa.Compiler.x64/Transforms/Optimizations/Manual/Rewrite/Lea64ToDec64.cs @@ -27,7 +27,7 @@ public override bool Match(Context context, Transform transform) if (context.Operand1.Register == CPURegister.RSP) return false; - if (!(AreStatusFlagsUsed(context.Node.Next, false, true, false, false, false) == TriState.No)) + if (!(AreStatusFlagsUsed(context.Node.Next, false, true, false, false, false, transform.Window) == TriState.No)) return false; return true; diff --git a/Source/Mosa.Compiler.x64/Transforms/Optimizations/Manual/Rewrite/Lea64ToInc64.cs b/Source/Mosa.Compiler.x64/Transforms/Optimizations/Manual/Rewrite/Lea64ToInc64.cs index 249ee5a681..87d060b33f 100644 --- a/Source/Mosa.Compiler.x64/Transforms/Optimizations/Manual/Rewrite/Lea64ToInc64.cs +++ b/Source/Mosa.Compiler.x64/Transforms/Optimizations/Manual/Rewrite/Lea64ToInc64.cs @@ -27,7 +27,7 @@ public override bool Match(Context context, Transform transform) if (context.Operand1.Register == CPURegister.RSP) return false; - if (!(AreStatusFlagsUsed(context.Node.Next, false, true, false, false, false) == TriState.No)) + if (!(AreStatusFlagsUsed(context.Node.Next, false, true, false, false, false, transform.Window) == TriState.No)) return false; return true; diff --git a/Source/Mosa.Compiler.x64/Transforms/Optimizations/Manual/Rewrite/Mov32ToXor32.cs b/Source/Mosa.Compiler.x64/Transforms/Optimizations/Manual/Rewrite/Mov32ToXor32.cs index 6a5eda3f78..947a5a43ab 100644 --- a/Source/Mosa.Compiler.x64/Transforms/Optimizations/Manual/Rewrite/Mov32ToXor32.cs +++ b/Source/Mosa.Compiler.x64/Transforms/Optimizations/Manual/Rewrite/Mov32ToXor32.cs @@ -15,7 +15,7 @@ public override bool Match(Context context, Transform transform) if (!context.Operand1.IsConstantZero) return false; - if (AreAnyStatusFlagsUsed(context)) + if (AreAnyStatusFlagsUsed(context, transform.Window)) return false; return true; diff --git a/Source/Mosa.Compiler.x64/Transforms/Optimizations/Manual/Rewrite/Mov64ToXor64.cs b/Source/Mosa.Compiler.x64/Transforms/Optimizations/Manual/Rewrite/Mov64ToXor64.cs index 50de5d8738..791522aea1 100644 --- a/Source/Mosa.Compiler.x64/Transforms/Optimizations/Manual/Rewrite/Mov64ToXor64.cs +++ b/Source/Mosa.Compiler.x64/Transforms/Optimizations/Manual/Rewrite/Mov64ToXor64.cs @@ -15,7 +15,7 @@ public override bool Match(Context context, Transform transform) if (!context.Operand1.IsConstantZero) return false; - if (AreAnyStatusFlagsUsed(context)) + if (AreAnyStatusFlagsUsed(context, transform.Window)) return false; return true; diff --git a/Source/Mosa.Compiler.x64/Transforms/Optimizations/Manual/Rewrite/Sub32ToDec32.cs b/Source/Mosa.Compiler.x64/Transforms/Optimizations/Manual/Rewrite/Sub32ToDec32.cs index f0356dbdaf..d856eda4cc 100644 --- a/Source/Mosa.Compiler.x64/Transforms/Optimizations/Manual/Rewrite/Sub32ToDec32.cs +++ b/Source/Mosa.Compiler.x64/Transforms/Optimizations/Manual/Rewrite/Sub32ToDec32.cs @@ -24,7 +24,7 @@ public override bool Match(Context context, Transform transform) if (context.Operand1.Register == CPURegister.RSP) return false; - if (!(AreStatusFlagsUsed(context.Node.Next, false, true, false, false, false) == TriState.No)) + if (!(AreStatusFlagsUsed(context.Node.Next, false, true, false, false, false, transform.Window) == TriState.No)) return false; return true; diff --git a/Source/Mosa.Compiler.x64/Transforms/Optimizations/Manual/Rewrite/Sub32ToLea32.cs b/Source/Mosa.Compiler.x64/Transforms/Optimizations/Manual/Rewrite/Sub32ToLea32.cs index 771fef6e28..0960382500 100644 --- a/Source/Mosa.Compiler.x64/Transforms/Optimizations/Manual/Rewrite/Sub32ToLea32.cs +++ b/Source/Mosa.Compiler.x64/Transforms/Optimizations/Manual/Rewrite/Sub32ToLea32.cs @@ -29,7 +29,7 @@ public override bool Match(Context context, Transform transform) if (context.Operand2.IsResolvedConstant && context.Operand2.ConstantUnsigned64 == 1 && context.Operand1 == context.Result) return false; - if (AreAnyStatusFlagsUsed(context)) + if (AreAnyStatusFlagsUsed(context, transform.Window)) return false; return true; diff --git a/Source/Mosa.Compiler.x64/Transforms/Optimizations/Manual/Rewrite/Sub64ToLea64.cs b/Source/Mosa.Compiler.x64/Transforms/Optimizations/Manual/Rewrite/Sub64ToLea64.cs index c178ea4345..35f2772f8f 100644 --- a/Source/Mosa.Compiler.x64/Transforms/Optimizations/Manual/Rewrite/Sub64ToLea64.cs +++ b/Source/Mosa.Compiler.x64/Transforms/Optimizations/Manual/Rewrite/Sub64ToLea64.cs @@ -29,7 +29,7 @@ public override bool Match(Context context, Transform transform) if (context.Operand2.IsResolvedConstant && context.Operand2.ConstantUnsigned64 == 1 && context.Operand1 == context.Result) return false; - if (AreAnyStatusFlagsUsed(context)) + if (AreAnyStatusFlagsUsed(context, transform.Window)) return false; return true; diff --git a/Source/Mosa.Compiler.x64/Transforms/Optimizations/Manual/Special/Deadcode.cs b/Source/Mosa.Compiler.x64/Transforms/Optimizations/Manual/Special/Deadcode.cs index f5f4626e1a..f2ed7451a2 100644 --- a/Source/Mosa.Compiler.x64/Transforms/Optimizations/Manual/Special/Deadcode.cs +++ b/Source/Mosa.Compiler.x64/Transforms/Optimizations/Manual/Special/Deadcode.cs @@ -47,7 +47,7 @@ public override bool Match(Context context, Transform transform) || instruction.IsSignFlagModified || instruction.IsParityFlagModified) { - return !AreAnyStatusFlagsUsed(context); + return !AreAnyStatusFlagsUsed(context, transform.Window); } return true; diff --git a/Source/Mosa.Compiler.x86/Transforms/BaseIR/CompareR4.cs b/Source/Mosa.Compiler.x86/Transforms/BaseIR/CompareR4.cs index cb78e38e53..c797681222 100644 --- a/Source/Mosa.Compiler.x86/Transforms/BaseIR/CompareR4.cs +++ b/Source/Mosa.Compiler.x86/Transforms/BaseIR/CompareR4.cs @@ -18,8 +18,6 @@ public override void Transform(Context context, Transform transform) { Debug.Assert(context.ConditionCode != ConditionCode.Undefined); - //FloatCompare(context, X86.Ucomiss); - var instruction = X86.Ucomiss; var result = context.Result; @@ -34,20 +32,38 @@ public override void Transform(Context context, Transform transform) if (condition == ConditionCode.Equal) { + var nextBlock = transform.Split(context); + var newBlocks = transform.CreateNewBlockContexts(2, context.Label); + context.SetInstruction(instruction, null, operand1, operand2); context.AppendInstruction(X86.Setcc, ConditionCode.NoParity, result); - context.AppendInstruction(X86.Mov32, v1, Operand.Constant32_0); - context.AppendInstruction(X86.CMov32, ConditionCode.NotEqual, result, result, v1); - context.AppendInstruction(X86.Movzx8To32, result, result); + context.AppendInstruction(X86.Branch, ConditionCode.Parity, newBlocks[1].Block); + context.AppendInstruction(X86.Jmp, newBlocks[0].Block); + + newBlocks[0].AppendInstruction(X86.Setcc, ConditionCode.Equal, result); + newBlocks[0].AppendInstruction(X86.Jmp, newBlocks[1].Block); + + newBlocks[1].AppendInstruction(X86.Movzx8To32, result, result); + newBlocks[1].AppendInstruction(X86.Jmp, nextBlock.Block); + return; } else if (condition == ConditionCode.NotEqual) { + var nextBlock = transform.Split(context); + var newBlocks = transform.CreateNewBlockContexts(2, context.Label); + context.SetInstruction(instruction, null, operand1, operand2); context.AppendInstruction(X86.Setcc, ConditionCode.Parity, result); - context.AppendInstruction(X86.Mov32, v1, Operand.Constant32_1); - context.AppendInstruction(X86.CMov32, ConditionCode.NotEqual, result, result, v1); - context.AppendInstruction(X86.Movzx8To32, result, result); + context.AppendInstruction(X86.Branch, ConditionCode.Parity, newBlocks[1].Block); + context.AppendInstruction(X86.Jmp, newBlocks[0].Block); + + newBlocks[0].AppendInstruction(X86.Setcc, ConditionCode.NotEqual, result); + newBlocks[0].AppendInstruction(X86.Jmp, newBlocks[1].Block); + + newBlocks[1].AppendInstruction(X86.Movzx8To32, result, result); + newBlocks[1].AppendInstruction(X86.Jmp, nextBlock.Block); + return; } else if (condition is ConditionCode.Greater or ConditionCode.UnsignedGreater) @@ -66,15 +82,15 @@ public override void Transform(Context context, Transform transform) } else if (condition is ConditionCode.GreaterOrEqual or ConditionCode.UnsignedGreaterOrEqual) { - context.SetInstruction(instruction, null, operand2, operand1); - context.AppendInstruction(X86.Setcc, ConditionCode.NoCarry, v1); + context.SetInstruction(instruction, null, operand1, operand2); + context.AppendInstruction(X86.Setcc, ConditionCode.UnsignedGreaterOrEqual, v1); context.AppendInstruction(X86.Movzx8To32, result, v1); return; } else if (condition is ConditionCode.LessOrEqual or ConditionCode.UnsignedLessOrEqual) { context.SetInstruction(instruction, null, operand2, operand1); - context.AppendInstruction(X86.Setcc, ConditionCode.NoCarry, v1); + context.AppendInstruction(X86.Setcc, ConditionCode.UnsignedGreaterOrEqual, v1); context.AppendInstruction(X86.Movzx8To32, result, v1); return; } diff --git a/Source/Mosa.Compiler.x86/Transforms/BaseIR/CompareR8.cs b/Source/Mosa.Compiler.x86/Transforms/BaseIR/CompareR8.cs index 7996abdb93..9bbf43a4fb 100644 --- a/Source/Mosa.Compiler.x86/Transforms/BaseIR/CompareR8.cs +++ b/Source/Mosa.Compiler.x86/Transforms/BaseIR/CompareR8.cs @@ -34,20 +34,38 @@ public override void Transform(Context context, Transform transform) if (condition == ConditionCode.Equal) { + var nextBlock = transform.Split(context); + var newBlocks = transform.CreateNewBlockContexts(2, context.Label); + context.SetInstruction(instruction, null, operand1, operand2); context.AppendInstruction(X86.Setcc, ConditionCode.NoParity, result); - context.AppendInstruction(X86.Mov32, v1, Operand.Constant32_0); - context.AppendInstruction(X86.CMov32, ConditionCode.NotEqual, result, result, v1); - context.AppendInstruction(X86.Movzx8To32, result, result); + context.AppendInstruction(X86.Branch, ConditionCode.Parity, newBlocks[1].Block); + context.AppendInstruction(X86.Jmp, newBlocks[0].Block); + + newBlocks[0].AppendInstruction(X86.Setcc, ConditionCode.Equal, result); + newBlocks[0].AppendInstruction(X86.Jmp, newBlocks[1].Block); + + newBlocks[1].AppendInstruction(X86.Movzx8To32, result, result); + newBlocks[1].AppendInstruction(X86.Jmp, nextBlock.Block); + return; } else if (condition == ConditionCode.NotEqual) { + var nextBlock = transform.Split(context); + var newBlocks = transform.CreateNewBlockContexts(2, context.Label); + context.SetInstruction(instruction, null, operand1, operand2); context.AppendInstruction(X86.Setcc, ConditionCode.Parity, result); - context.AppendInstruction(X86.Mov32, v1, Operand.Constant32_1); - context.AppendInstruction(X86.CMov32, ConditionCode.NotEqual, result, result, v1); - context.AppendInstruction(X86.Movzx8To32, result, result); + context.AppendInstruction(X86.Branch, ConditionCode.Parity, newBlocks[1].Block); + context.AppendInstruction(X86.Jmp, newBlocks[0].Block); + + newBlocks[0].AppendInstruction(X86.Setcc, ConditionCode.NotEqual, result); + newBlocks[0].AppendInstruction(X86.Jmp, newBlocks[1].Block); + + newBlocks[1].AppendInstruction(X86.Movzx8To32, result, result); + newBlocks[1].AppendInstruction(X86.Jmp, nextBlock.Block); + return; } else if (condition is ConditionCode.Greater or ConditionCode.UnsignedGreater) @@ -66,15 +84,15 @@ public override void Transform(Context context, Transform transform) } else if (condition is ConditionCode.GreaterOrEqual or ConditionCode.UnsignedGreaterOrEqual) { - context.SetInstruction(instruction, null, operand2, operand1); - context.AppendInstruction(X86.Setcc, ConditionCode.NoCarry, v1); + context.SetInstruction(instruction, null, operand1, operand2); + context.AppendInstruction(X86.Setcc, ConditionCode.UnsignedGreaterOrEqual, v1); context.AppendInstruction(X86.Movzx8To32, result, v1); return; } else if (condition is ConditionCode.LessOrEqual or ConditionCode.UnsignedLessOrEqual) { context.SetInstruction(instruction, null, operand2, operand1); - context.AppendInstruction(X86.Setcc, ConditionCode.NoCarry, v1); + context.AppendInstruction(X86.Setcc, ConditionCode.UnsignedGreaterOrEqual, v1); context.AppendInstruction(X86.Movzx8To32, result, v1); return; } diff --git a/Source/Mosa.Compiler.x86/Transforms/Optimizations/Auto/Consolidation/IMul32Mov32ByOne.cs b/Source/Mosa.Compiler.x86/Transforms/Optimizations/Auto/Consolidation/IMul32Mov32ByOne.cs index 20b70a852b..b141dcb5c0 100644 --- a/Source/Mosa.Compiler.x86/Transforms/Optimizations/Auto/Consolidation/IMul32Mov32ByOne.cs +++ b/Source/Mosa.Compiler.x86/Transforms/Optimizations/Auto/Consolidation/IMul32Mov32ByOne.cs @@ -26,7 +26,7 @@ public override bool Match(Context context, Transform transform) if (!context.Operand2.Definitions[0].Operand1.IsConstantOne) return false; - if (AreAnyStatusFlagsUsed(context)) + if (AreAnyStatusFlagsUsed(context, transform.Window)) return false; return true; diff --git a/Source/Mosa.Compiler.x86/Transforms/Optimizations/Auto/Consolidation/IMul32Mov32ByZero.cs b/Source/Mosa.Compiler.x86/Transforms/Optimizations/Auto/Consolidation/IMul32Mov32ByZero.cs index 9ef0eb681f..63398312fd 100644 --- a/Source/Mosa.Compiler.x86/Transforms/Optimizations/Auto/Consolidation/IMul32Mov32ByZero.cs +++ b/Source/Mosa.Compiler.x86/Transforms/Optimizations/Auto/Consolidation/IMul32Mov32ByZero.cs @@ -26,7 +26,7 @@ public override bool Match(Context context, Transform transform) if (!context.Operand2.Definitions[0].Operand1.IsConstantZero) return false; - if (AreAnyStatusFlagsUsed(context)) + if (AreAnyStatusFlagsUsed(context, transform.Window)) return false; return true; diff --git a/Source/Mosa.Compiler.x86/Transforms/Optimizations/Auto/ConstantMove/Add32.cs b/Source/Mosa.Compiler.x86/Transforms/Optimizations/Auto/ConstantMove/Add32.cs index d677eba3a8..5f59407c23 100644 --- a/Source/Mosa.Compiler.x86/Transforms/Optimizations/Auto/ConstantMove/Add32.cs +++ b/Source/Mosa.Compiler.x86/Transforms/Optimizations/Auto/ConstantMove/Add32.cs @@ -26,7 +26,7 @@ public override bool Match(Context context, Transform transform) if (!IsConstant(context.Operand2.Definitions[0].Operand1)) return false; - if (AreAnyStatusFlagsUsed(context)) + if (AreAnyStatusFlagsUsed(context, transform.Window)) return false; return true; diff --git a/Source/Mosa.Compiler.x86/Transforms/Optimizations/Auto/ConstantMove/And32.cs b/Source/Mosa.Compiler.x86/Transforms/Optimizations/Auto/ConstantMove/And32.cs index 299bbadf49..897c6fb871 100644 --- a/Source/Mosa.Compiler.x86/Transforms/Optimizations/Auto/ConstantMove/And32.cs +++ b/Source/Mosa.Compiler.x86/Transforms/Optimizations/Auto/ConstantMove/And32.cs @@ -26,7 +26,7 @@ public override bool Match(Context context, Transform transform) if (!IsConstant(context.Operand2.Definitions[0].Operand1)) return false; - if (AreAnyStatusFlagsUsed(context)) + if (AreAnyStatusFlagsUsed(context, transform.Window)) return false; return true; diff --git a/Source/Mosa.Compiler.x86/Transforms/Optimizations/Auto/ConstantMove/Or32.cs b/Source/Mosa.Compiler.x86/Transforms/Optimizations/Auto/ConstantMove/Or32.cs index 279cba651e..c8d2ffd3f0 100644 --- a/Source/Mosa.Compiler.x86/Transforms/Optimizations/Auto/ConstantMove/Or32.cs +++ b/Source/Mosa.Compiler.x86/Transforms/Optimizations/Auto/ConstantMove/Or32.cs @@ -26,7 +26,7 @@ public override bool Match(Context context, Transform transform) if (!IsConstant(context.Operand2.Definitions[0].Operand1)) return false; - if (AreAnyStatusFlagsUsed(context)) + if (AreAnyStatusFlagsUsed(context, transform.Window)) return false; return true; diff --git a/Source/Mosa.Compiler.x86/Transforms/Optimizations/Auto/ConstantMove/Sar32.cs b/Source/Mosa.Compiler.x86/Transforms/Optimizations/Auto/ConstantMove/Sar32.cs index ee73a4bc34..b5ee99f277 100644 --- a/Source/Mosa.Compiler.x86/Transforms/Optimizations/Auto/ConstantMove/Sar32.cs +++ b/Source/Mosa.Compiler.x86/Transforms/Optimizations/Auto/ConstantMove/Sar32.cs @@ -26,7 +26,7 @@ public override bool Match(Context context, Transform transform) if (!IsConstant(context.Operand2.Definitions[0].Operand1)) return false; - if (AreAnyStatusFlagsUsed(context)) + if (AreAnyStatusFlagsUsed(context, transform.Window)) return false; return true; diff --git a/Source/Mosa.Compiler.x86/Transforms/Optimizations/Auto/ConstantMove/Shl32.cs b/Source/Mosa.Compiler.x86/Transforms/Optimizations/Auto/ConstantMove/Shl32.cs index 710332852a..ad24abab44 100644 --- a/Source/Mosa.Compiler.x86/Transforms/Optimizations/Auto/ConstantMove/Shl32.cs +++ b/Source/Mosa.Compiler.x86/Transforms/Optimizations/Auto/ConstantMove/Shl32.cs @@ -26,7 +26,7 @@ public override bool Match(Context context, Transform transform) if (!IsConstant(context.Operand2.Definitions[0].Operand1)) return false; - if (AreAnyStatusFlagsUsed(context)) + if (AreAnyStatusFlagsUsed(context, transform.Window)) return false; return true; diff --git a/Source/Mosa.Compiler.x86/Transforms/Optimizations/Auto/ConstantMove/Shr32.cs b/Source/Mosa.Compiler.x86/Transforms/Optimizations/Auto/ConstantMove/Shr32.cs index 97fc8d81a6..5c41541412 100644 --- a/Source/Mosa.Compiler.x86/Transforms/Optimizations/Auto/ConstantMove/Shr32.cs +++ b/Source/Mosa.Compiler.x86/Transforms/Optimizations/Auto/ConstantMove/Shr32.cs @@ -26,7 +26,7 @@ public override bool Match(Context context, Transform transform) if (!IsConstant(context.Operand2.Definitions[0].Operand1)) return false; - if (AreAnyStatusFlagsUsed(context)) + if (AreAnyStatusFlagsUsed(context, transform.Window)) return false; return true; diff --git a/Source/Mosa.Compiler.x86/Transforms/Optimizations/Auto/ConstantMove/Sub32.cs b/Source/Mosa.Compiler.x86/Transforms/Optimizations/Auto/ConstantMove/Sub32.cs index 7300a2f364..03465d2763 100644 --- a/Source/Mosa.Compiler.x86/Transforms/Optimizations/Auto/ConstantMove/Sub32.cs +++ b/Source/Mosa.Compiler.x86/Transforms/Optimizations/Auto/ConstantMove/Sub32.cs @@ -26,7 +26,7 @@ public override bool Match(Context context, Transform transform) if (!IsConstant(context.Operand2.Definitions[0].Operand1)) return false; - if (AreAnyStatusFlagsUsed(context)) + if (AreAnyStatusFlagsUsed(context, transform.Window)) return false; return true; diff --git a/Source/Mosa.Compiler.x86/Transforms/Optimizations/Auto/ConstantMove/Xor32.cs b/Source/Mosa.Compiler.x86/Transforms/Optimizations/Auto/ConstantMove/Xor32.cs index 42ab20983d..2448735e41 100644 --- a/Source/Mosa.Compiler.x86/Transforms/Optimizations/Auto/ConstantMove/Xor32.cs +++ b/Source/Mosa.Compiler.x86/Transforms/Optimizations/Auto/ConstantMove/Xor32.cs @@ -26,7 +26,7 @@ public override bool Match(Context context, Transform transform) if (!IsConstant(context.Operand2.Definitions[0].Operand1)) return false; - if (AreAnyStatusFlagsUsed(context)) + if (AreAnyStatusFlagsUsed(context, transform.Window)) return false; return true; diff --git a/Source/Mosa.Compiler.x86/Transforms/Optimizations/Auto/Lea/Mul32ToLea32By3Or5Or9.cs b/Source/Mosa.Compiler.x86/Transforms/Optimizations/Auto/Lea/Mul32ToLea32By3Or5Or9.cs index 8c40ce04f0..2a6ee6f019 100644 --- a/Source/Mosa.Compiler.x86/Transforms/Optimizations/Auto/Lea/Mul32ToLea32By3Or5Or9.cs +++ b/Source/Mosa.Compiler.x86/Transforms/Optimizations/Auto/Lea/Mul32ToLea32By3Or5Or9.cs @@ -23,7 +23,7 @@ public override bool Match(Context context, Transform transform) if (!Contains(context.Operand2, 3, 5, 9)) return false; - if (AreAnyStatusFlagsUsed(context)) + if (AreAnyStatusFlagsUsed(context, transform.Window)) return false; return true; diff --git a/Source/Mosa.Compiler.x86/Transforms/Optimizations/Auto/Specific/And32Add32ToBlsr32.cs b/Source/Mosa.Compiler.x86/Transforms/Optimizations/Auto/Specific/And32Add32ToBlsr32.cs index f762aef707..02066dc614 100644 --- a/Source/Mosa.Compiler.x86/Transforms/Optimizations/Auto/Specific/And32Add32ToBlsr32.cs +++ b/Source/Mosa.Compiler.x86/Transforms/Optimizations/Auto/Specific/And32Add32ToBlsr32.cs @@ -35,7 +35,7 @@ public override bool Match(Context context, Transform transform) if (!IsVirtualRegister(context.Operand1)) return false; - if (IsCarryFlagUsed(context)) + if (IsCarryFlagUsed(context, transform.Window)) return false; return true; @@ -80,7 +80,7 @@ public override bool Match(Context context, Transform transform) if (!IsVirtualRegister(context.Operand1.Definitions[0].Operand1)) return false; - if (IsCarryFlagUsed(context)) + if (IsCarryFlagUsed(context, transform.Window)) return false; return true; @@ -125,7 +125,7 @@ public override bool Match(Context context, Transform transform) if (!IsVirtualRegister(context.Operand1)) return false; - if (IsCarryFlagUsed(context)) + if (IsCarryFlagUsed(context, transform.Window)) return false; return true; @@ -170,7 +170,7 @@ public override bool Match(Context context, Transform transform) if (!IsVirtualRegister(context.Operand1.Definitions[0].Operand2)) return false; - if (IsCarryFlagUsed(context)) + if (IsCarryFlagUsed(context, transform.Window)) return false; return true; diff --git a/Source/Mosa.Compiler.x86/Transforms/Optimizations/Auto/StrengthReduction/Add32By1Not32.cs b/Source/Mosa.Compiler.x86/Transforms/Optimizations/Auto/StrengthReduction/Add32By1Not32.cs index 1608c879ae..fc4a38bacf 100644 --- a/Source/Mosa.Compiler.x86/Transforms/Optimizations/Auto/StrengthReduction/Add32By1Not32.cs +++ b/Source/Mosa.Compiler.x86/Transforms/Optimizations/Auto/StrengthReduction/Add32By1Not32.cs @@ -29,7 +29,7 @@ public override bool Match(Context context, Transform transform) if (!IsVirtualRegister(context.Operand1.Definitions[0].Operand1)) return false; - if (IsCarryFlagUsed(context)) + if (IsCarryFlagUsed(context, transform.Window)) return false; return true; @@ -68,7 +68,7 @@ public override bool Match(Context context, Transform transform) if (!IsVirtualRegister(context.Operand2.Definitions[0].Operand1)) return false; - if (IsCarryFlagUsed(context)) + if (IsCarryFlagUsed(context, transform.Window)) return false; return true; diff --git a/Source/Mosa.Compiler.x86/Transforms/Optimizations/Auto/StrengthReduction/Add32ByZero.cs b/Source/Mosa.Compiler.x86/Transforms/Optimizations/Auto/StrengthReduction/Add32ByZero.cs index e4f2122596..f52b7c6be9 100644 --- a/Source/Mosa.Compiler.x86/Transforms/Optimizations/Auto/StrengthReduction/Add32ByZero.cs +++ b/Source/Mosa.Compiler.x86/Transforms/Optimizations/Auto/StrengthReduction/Add32ByZero.cs @@ -17,7 +17,7 @@ public override bool Match(Context context, Transform transform) if (!context.Operand2.IsConstantZero) return false; - if (AreAnyStatusFlagsUsed(context)) + if (AreAnyStatusFlagsUsed(context, transform.Window)) return false; return true; diff --git a/Source/Mosa.Compiler.x86/Transforms/Optimizations/Auto/StrengthReduction/And32ByMax.cs b/Source/Mosa.Compiler.x86/Transforms/Optimizations/Auto/StrengthReduction/And32ByMax.cs index 4f066c1d46..35890fc57f 100644 --- a/Source/Mosa.Compiler.x86/Transforms/Optimizations/Auto/StrengthReduction/And32ByMax.cs +++ b/Source/Mosa.Compiler.x86/Transforms/Optimizations/Auto/StrengthReduction/And32ByMax.cs @@ -20,7 +20,7 @@ public override bool Match(Context context, Transform transform) if (context.Operand2.ConstantUnsigned64 != 0xFFFFFFFF) return false; - if (AreAnyStatusFlagsUsed(context)) + if (AreAnyStatusFlagsUsed(context, transform.Window)) return false; return true; @@ -50,7 +50,7 @@ public override bool Match(Context context, Transform transform) if (context.Operand1.ConstantUnsigned64 != 0xFFFFFFFF) return false; - if (AreAnyStatusFlagsUsed(context)) + if (AreAnyStatusFlagsUsed(context, transform.Window)) return false; return true; diff --git a/Source/Mosa.Compiler.x86/Transforms/Optimizations/Auto/StrengthReduction/And32ByZero.cs b/Source/Mosa.Compiler.x86/Transforms/Optimizations/Auto/StrengthReduction/And32ByZero.cs index b04afc89c3..066422f129 100644 --- a/Source/Mosa.Compiler.x86/Transforms/Optimizations/Auto/StrengthReduction/And32ByZero.cs +++ b/Source/Mosa.Compiler.x86/Transforms/Optimizations/Auto/StrengthReduction/And32ByZero.cs @@ -17,7 +17,7 @@ public override bool Match(Context context, Transform transform) if (!context.Operand2.IsConstantZero) return false; - if (AreAnyStatusFlagsUsed(context)) + if (AreAnyStatusFlagsUsed(context, transform.Window)) return false; return true; @@ -44,7 +44,7 @@ public override bool Match(Context context, Transform transform) if (!context.Operand1.IsConstantZero) return false; - if (AreAnyStatusFlagsUsed(context)) + if (AreAnyStatusFlagsUsed(context, transform.Window)) return false; return true; diff --git a/Source/Mosa.Compiler.x86/Transforms/Optimizations/Auto/StrengthReduction/IMul32ByOne.cs b/Source/Mosa.Compiler.x86/Transforms/Optimizations/Auto/StrengthReduction/IMul32ByOne.cs index bc2a30822c..a5c6ea90f9 100644 --- a/Source/Mosa.Compiler.x86/Transforms/Optimizations/Auto/StrengthReduction/IMul32ByOne.cs +++ b/Source/Mosa.Compiler.x86/Transforms/Optimizations/Auto/StrengthReduction/IMul32ByOne.cs @@ -17,7 +17,7 @@ public override bool Match(Context context, Transform transform) if (!context.Operand2.IsConstantOne) return false; - if (AreAnyStatusFlagsUsed(context)) + if (AreAnyStatusFlagsUsed(context, transform.Window)) return false; return true; diff --git a/Source/Mosa.Compiler.x86/Transforms/Optimizations/Auto/StrengthReduction/IMul32ByZero.cs b/Source/Mosa.Compiler.x86/Transforms/Optimizations/Auto/StrengthReduction/IMul32ByZero.cs index 2b0056d24f..f01dbe23e1 100644 --- a/Source/Mosa.Compiler.x86/Transforms/Optimizations/Auto/StrengthReduction/IMul32ByZero.cs +++ b/Source/Mosa.Compiler.x86/Transforms/Optimizations/Auto/StrengthReduction/IMul32ByZero.cs @@ -17,7 +17,7 @@ public override bool Match(Context context, Transform transform) if (!context.Operand2.IsConstantZero) return false; - if (AreAnyStatusFlagsUsed(context)) + if (AreAnyStatusFlagsUsed(context, transform.Window)) return false; return true; diff --git a/Source/Mosa.Compiler.x86/Transforms/Optimizations/Auto/StrengthReduction/Inc32Not32.cs b/Source/Mosa.Compiler.x86/Transforms/Optimizations/Auto/StrengthReduction/Inc32Not32.cs index 4b8a666f42..fdb7467c42 100644 --- a/Source/Mosa.Compiler.x86/Transforms/Optimizations/Auto/StrengthReduction/Inc32Not32.cs +++ b/Source/Mosa.Compiler.x86/Transforms/Optimizations/Auto/StrengthReduction/Inc32Not32.cs @@ -26,7 +26,7 @@ public override bool Match(Context context, Transform transform) if (!IsVirtualRegister(context.Operand1.Definitions[0].Operand1)) return false; - if (IsCarryFlagUsed(context)) + if (IsCarryFlagUsed(context, transform.Window)) return false; return true; diff --git a/Source/Mosa.Compiler.x86/Transforms/Optimizations/Auto/StrengthReduction/Sar32ByZero.cs b/Source/Mosa.Compiler.x86/Transforms/Optimizations/Auto/StrengthReduction/Sar32ByZero.cs index e11da82cc3..9cd57d50fa 100644 --- a/Source/Mosa.Compiler.x86/Transforms/Optimizations/Auto/StrengthReduction/Sar32ByZero.cs +++ b/Source/Mosa.Compiler.x86/Transforms/Optimizations/Auto/StrengthReduction/Sar32ByZero.cs @@ -19,7 +19,7 @@ public override bool Match(Context context, Transform transform) if (!context.Operand2.IsConstantZero) return false; - if (AreAnyStatusFlagsUsed(context)) + if (AreAnyStatusFlagsUsed(context, transform.Window)) return false; return true; diff --git a/Source/Mosa.Compiler.x86/Transforms/Optimizations/Auto/StrengthReduction/Sar32ZeroValue.cs b/Source/Mosa.Compiler.x86/Transforms/Optimizations/Auto/StrengthReduction/Sar32ZeroValue.cs index a5ffa1b2fc..19c17f98cd 100644 --- a/Source/Mosa.Compiler.x86/Transforms/Optimizations/Auto/StrengthReduction/Sar32ZeroValue.cs +++ b/Source/Mosa.Compiler.x86/Transforms/Optimizations/Auto/StrengthReduction/Sar32ZeroValue.cs @@ -19,7 +19,7 @@ public override bool Match(Context context, Transform transform) if (!context.Operand1.IsConstantZero) return false; - if (AreAnyStatusFlagsUsed(context)) + if (AreAnyStatusFlagsUsed(context, transform.Window)) return false; return true; diff --git a/Source/Mosa.Compiler.x86/Transforms/Optimizations/Auto/StrengthReduction/Shl32ByZero.cs b/Source/Mosa.Compiler.x86/Transforms/Optimizations/Auto/StrengthReduction/Shl32ByZero.cs index 77b7fffb27..b0ec741726 100644 --- a/Source/Mosa.Compiler.x86/Transforms/Optimizations/Auto/StrengthReduction/Shl32ByZero.cs +++ b/Source/Mosa.Compiler.x86/Transforms/Optimizations/Auto/StrengthReduction/Shl32ByZero.cs @@ -19,7 +19,7 @@ public override bool Match(Context context, Transform transform) if (!context.Operand2.IsConstantZero) return false; - if (AreAnyStatusFlagsUsed(context)) + if (AreAnyStatusFlagsUsed(context, transform.Window)) return false; return true; diff --git a/Source/Mosa.Compiler.x86/Transforms/Optimizations/Auto/StrengthReduction/Shl32ZeroValue.cs b/Source/Mosa.Compiler.x86/Transforms/Optimizations/Auto/StrengthReduction/Shl32ZeroValue.cs index 8fe8296327..b5dc303d64 100644 --- a/Source/Mosa.Compiler.x86/Transforms/Optimizations/Auto/StrengthReduction/Shl32ZeroValue.cs +++ b/Source/Mosa.Compiler.x86/Transforms/Optimizations/Auto/StrengthReduction/Shl32ZeroValue.cs @@ -19,7 +19,7 @@ public override bool Match(Context context, Transform transform) if (!context.Operand1.IsConstantZero) return false; - if (AreAnyStatusFlagsUsed(context)) + if (AreAnyStatusFlagsUsed(context, transform.Window)) return false; return true; diff --git a/Source/Mosa.Compiler.x86/Transforms/Optimizations/Auto/StrengthReduction/Shr32ByZero.cs b/Source/Mosa.Compiler.x86/Transforms/Optimizations/Auto/StrengthReduction/Shr32ByZero.cs index e733ed75ae..37f7934dce 100644 --- a/Source/Mosa.Compiler.x86/Transforms/Optimizations/Auto/StrengthReduction/Shr32ByZero.cs +++ b/Source/Mosa.Compiler.x86/Transforms/Optimizations/Auto/StrengthReduction/Shr32ByZero.cs @@ -19,7 +19,7 @@ public override bool Match(Context context, Transform transform) if (!context.Operand2.IsConstantZero) return false; - if (AreAnyStatusFlagsUsed(context)) + if (AreAnyStatusFlagsUsed(context, transform.Window)) return false; return true; diff --git a/Source/Mosa.Compiler.x86/Transforms/Optimizations/Auto/StrengthReduction/Shr32ZeroValue.cs b/Source/Mosa.Compiler.x86/Transforms/Optimizations/Auto/StrengthReduction/Shr32ZeroValue.cs index 8106901aea..32b8bfd9e5 100644 --- a/Source/Mosa.Compiler.x86/Transforms/Optimizations/Auto/StrengthReduction/Shr32ZeroValue.cs +++ b/Source/Mosa.Compiler.x86/Transforms/Optimizations/Auto/StrengthReduction/Shr32ZeroValue.cs @@ -19,7 +19,7 @@ public override bool Match(Context context, Transform transform) if (!context.Operand1.IsConstantZero) return false; - if (AreAnyStatusFlagsUsed(context)) + if (AreAnyStatusFlagsUsed(context, transform.Window)) return false; return true; diff --git a/Source/Mosa.Compiler.x86/Transforms/Optimizations/Auto/StrengthReduction/Sub32ByZero.cs b/Source/Mosa.Compiler.x86/Transforms/Optimizations/Auto/StrengthReduction/Sub32ByZero.cs index 04eb58a0ea..a21b57d2fd 100644 --- a/Source/Mosa.Compiler.x86/Transforms/Optimizations/Auto/StrengthReduction/Sub32ByZero.cs +++ b/Source/Mosa.Compiler.x86/Transforms/Optimizations/Auto/StrengthReduction/Sub32ByZero.cs @@ -17,7 +17,7 @@ public override bool Match(Context context, Transform transform) if (!context.Operand2.IsConstantZero) return false; - if (AreAnyStatusFlagsUsed(context)) + if (AreAnyStatusFlagsUsed(context, transform.Window)) return false; return true; diff --git a/Source/Mosa.Compiler.x86/Transforms/Optimizations/Manual/Rewrite/Add32ToInc32.cs b/Source/Mosa.Compiler.x86/Transforms/Optimizations/Manual/Rewrite/Add32ToInc32.cs index a46a477e30..77bd272a84 100644 --- a/Source/Mosa.Compiler.x86/Transforms/Optimizations/Manual/Rewrite/Add32ToInc32.cs +++ b/Source/Mosa.Compiler.x86/Transforms/Optimizations/Manual/Rewrite/Add32ToInc32.cs @@ -24,7 +24,7 @@ public override bool Match(Context context, Transform transform) if (!AreSame(context.Operand1, context.Result)) return false; - if (!(AreStatusFlagsUsed(context.Node.Next, false, true, false, false, false) == TriState.No)) + if (!(AreStatusFlagsUsed(context.Node.Next, false, true, false, false, false, transform.Window) == TriState.No)) return false; return true; diff --git a/Source/Mosa.Compiler.x86/Transforms/Optimizations/Manual/Rewrite/Add32ToLea32.cs b/Source/Mosa.Compiler.x86/Transforms/Optimizations/Manual/Rewrite/Add32ToLea32.cs index 438e2e6aa1..fe693088c0 100644 --- a/Source/Mosa.Compiler.x86/Transforms/Optimizations/Manual/Rewrite/Add32ToLea32.cs +++ b/Source/Mosa.Compiler.x86/Transforms/Optimizations/Manual/Rewrite/Add32ToLea32.cs @@ -29,7 +29,7 @@ public override bool Match(Context context, Transform transform) if (context.Operand2.IsResolvedConstant && context.Operand2.ConstantUnsigned64 == 1 && context.Operand1 == context.Result) return false; - if (AreAnyStatusFlagsUsed(context)) + if (AreAnyStatusFlagsUsed(context, transform.Window)) return false; return true; diff --git a/Source/Mosa.Compiler.x86/Transforms/Optimizations/Manual/Rewrite/Lea32ToDec32.cs b/Source/Mosa.Compiler.x86/Transforms/Optimizations/Manual/Rewrite/Lea32ToDec32.cs index c814ce46a1..251076ba36 100644 --- a/Source/Mosa.Compiler.x86/Transforms/Optimizations/Manual/Rewrite/Lea32ToDec32.cs +++ b/Source/Mosa.Compiler.x86/Transforms/Optimizations/Manual/Rewrite/Lea32ToDec32.cs @@ -27,7 +27,7 @@ public override bool Match(Context context, Transform transform) if (context.Operand1.Register == CPURegister.ESP) return false; - if (!(AreStatusFlagsUsed(context.Node.Next, false, true, false, false, false) == TriState.No)) + if (!(AreStatusFlagsUsed(context.Node.Next, false, true, false, false, false, transform.Window) == TriState.No)) return false; return true; diff --git a/Source/Mosa.Compiler.x86/Transforms/Optimizations/Manual/Rewrite/Lea32ToInc32.cs b/Source/Mosa.Compiler.x86/Transforms/Optimizations/Manual/Rewrite/Lea32ToInc32.cs index 77bfab6dc6..e61cd0c083 100644 --- a/Source/Mosa.Compiler.x86/Transforms/Optimizations/Manual/Rewrite/Lea32ToInc32.cs +++ b/Source/Mosa.Compiler.x86/Transforms/Optimizations/Manual/Rewrite/Lea32ToInc32.cs @@ -27,7 +27,7 @@ public override bool Match(Context context, Transform transform) if (context.Operand1.Register == CPURegister.ESP) return false; - if (!(AreStatusFlagsUsed(context.Node.Next, false, true, false, false, false) == TriState.No)) + if (!(AreStatusFlagsUsed(context.Node.Next, false, true, false, false, false, transform.Window) == TriState.No)) return false; return true; diff --git a/Source/Mosa.Compiler.x86/Transforms/Optimizations/Manual/Rewrite/Mov32ToXor32.cs b/Source/Mosa.Compiler.x86/Transforms/Optimizations/Manual/Rewrite/Mov32ToXor32.cs index aa1fe4735e..0034a9c92b 100644 --- a/Source/Mosa.Compiler.x86/Transforms/Optimizations/Manual/Rewrite/Mov32ToXor32.cs +++ b/Source/Mosa.Compiler.x86/Transforms/Optimizations/Manual/Rewrite/Mov32ToXor32.cs @@ -15,7 +15,7 @@ public override bool Match(Context context, Transform transform) if (!context.Operand1.IsConstantZero) return false; - if (AreAnyStatusFlagsUsed(context)) + if (AreAnyStatusFlagsUsed(context, transform.Window)) return false; return true; diff --git a/Source/Mosa.Compiler.x86/Transforms/Optimizations/Manual/Rewrite/Sub32ToDec32.cs b/Source/Mosa.Compiler.x86/Transforms/Optimizations/Manual/Rewrite/Sub32ToDec32.cs index e987b6f3d2..26f3815fa2 100644 --- a/Source/Mosa.Compiler.x86/Transforms/Optimizations/Manual/Rewrite/Sub32ToDec32.cs +++ b/Source/Mosa.Compiler.x86/Transforms/Optimizations/Manual/Rewrite/Sub32ToDec32.cs @@ -24,7 +24,7 @@ public override bool Match(Context context, Transform transform) if (context.Operand1.Register == CPURegister.ESP) return false; - if (!(AreStatusFlagsUsed(context.Node.Next, false, true, false, false, false) == TriState.No)) + if (!(AreStatusFlagsUsed(context.Node.Next, false, true, false, false, false, transform.Window) == TriState.No)) return false; return true; diff --git a/Source/Mosa.Compiler.x86/Transforms/Optimizations/Manual/Rewrite/Sub32ToLea32.cs b/Source/Mosa.Compiler.x86/Transforms/Optimizations/Manual/Rewrite/Sub32ToLea32.cs index e12de1440d..59174e1b81 100644 --- a/Source/Mosa.Compiler.x86/Transforms/Optimizations/Manual/Rewrite/Sub32ToLea32.cs +++ b/Source/Mosa.Compiler.x86/Transforms/Optimizations/Manual/Rewrite/Sub32ToLea32.cs @@ -29,7 +29,7 @@ public override bool Match(Context context, Transform transform) if (context.Operand2.IsResolvedConstant && context.Operand2.ConstantUnsigned64 == 1 && context.Operand1 == context.Result) return false; - if (AreAnyStatusFlagsUsed(context)) + if (AreAnyStatusFlagsUsed(context, transform.Window)) return false; return true; diff --git a/Source/Mosa.Compiler.x86/Transforms/Optimizations/Manual/Size/Add32ToInc32x2.cs b/Source/Mosa.Compiler.x86/Transforms/Optimizations/Manual/Size/Add32ToInc32x2.cs index 90d7b9322f..554541c3f6 100644 --- a/Source/Mosa.Compiler.x86/Transforms/Optimizations/Manual/Size/Add32ToInc32x2.cs +++ b/Source/Mosa.Compiler.x86/Transforms/Optimizations/Manual/Size/Add32ToInc32x2.cs @@ -29,7 +29,7 @@ public override bool Match(Context context, Transform transform) if (!AreSame(context.Operand1, context.Result)) return false; - if (AreAnyStatusFlagsUsed(context)) + if (AreAnyStatusFlagsUsed(context, transform.Window)) return false; return true; diff --git a/Source/Mosa.Compiler.x86/Transforms/Optimizations/Manual/Special/Deadcode.cs b/Source/Mosa.Compiler.x86/Transforms/Optimizations/Manual/Special/Deadcode.cs index a1ab87f162..4c38fe9385 100644 --- a/Source/Mosa.Compiler.x86/Transforms/Optimizations/Manual/Special/Deadcode.cs +++ b/Source/Mosa.Compiler.x86/Transforms/Optimizations/Manual/Special/Deadcode.cs @@ -49,7 +49,7 @@ public override bool Match(Context context, Transform transform) || instruction.IsSignFlagModified || instruction.IsParityFlagModified) { - return !AreAnyStatusFlagsUsed(context); + return !AreAnyStatusFlagsUsed(context, transform.Window); } return true; diff --git a/Source/Mosa.Compiler.x86/Transforms/Optimizations/Manual/StrengthReduction/Mul32ByZero.cs b/Source/Mosa.Compiler.x86/Transforms/Optimizations/Manual/StrengthReduction/Mul32ByZero.cs index 344ee5b2a3..4da090eb83 100644 --- a/Source/Mosa.Compiler.x86/Transforms/Optimizations/Manual/StrengthReduction/Mul32ByZero.cs +++ b/Source/Mosa.Compiler.x86/Transforms/Optimizations/Manual/StrengthReduction/Mul32ByZero.cs @@ -15,7 +15,7 @@ public override bool Match(Context context, Transform transform) if (!(context.Operand1.IsConstantZero || context.Operand2.IsConstantZero)) return false; - if (!(AreStatusFlagsUsed(context.Instruction, context.Node.Next) == TriState.No)) + if (!(AreStatusFlagsUsed(context.Instruction, context.Node.Next, transform.Window) == TriState.No)) return false; return true; diff --git a/Source/Mosa.Compiler.x86/Transforms/Optimizations/Manual/StrengthReduction/Mul32WithMov32ByZero.cs b/Source/Mosa.Compiler.x86/Transforms/Optimizations/Manual/StrengthReduction/Mul32WithMov32ByZero.cs index 59e0e40c69..df650edf49 100644 --- a/Source/Mosa.Compiler.x86/Transforms/Optimizations/Manual/StrengthReduction/Mul32WithMov32ByZero.cs +++ b/Source/Mosa.Compiler.x86/Transforms/Optimizations/Manual/StrengthReduction/Mul32WithMov32ByZero.cs @@ -30,7 +30,7 @@ public override bool Match(Context context, Transform transform) if (!context.Operand2.Definitions[0].Operand1.IsConstantZero) return false; - if (!(AreStatusFlagsUsed(context.Instruction, context.Node.Next) == TriState.No)) + if (!(AreStatusFlagsUsed(context.Instruction, context.Node.Next, transform.Window) == TriState.No)) return false; return true; diff --git a/Source/Mosa.Compiler.x86/X86Instruction.cs b/Source/Mosa.Compiler.x86/X86Instruction.cs index 1195e95aff..af2d66b913 100644 --- a/Source/Mosa.Compiler.x86/X86Instruction.cs +++ b/Source/Mosa.Compiler.x86/X86Instruction.cs @@ -1,6 +1,5 @@ // Copyright (c) MOSA Project. Licensed under the New BSD License. -using System; using Mosa.Compiler.Framework; using Mosa.Compiler.Framework.Platform; @@ -46,13 +45,13 @@ public static byte GetConditionCode(ConditionCode condition) ConditionCode.Zero => 0x4, // Zero (ZF = 1) ConditionCode.NotZero => 0x5, // NotEqual (ZF = 0) ConditionCode.GreaterOrEqual => 0xD, // GreaterOrEqual (SF = OF) - ConditionCode.Greater => 0xF, // GreaterThan (ZF = 0 and SF = OF) + ConditionCode.Greater => 0xF, // Greater (ZF = 0 and SF = OF) ConditionCode.LessOrEqual => 0xE, // LessOrEqual (ZF = 1 or SF <> OF) ConditionCode.Less => 0xC, // LessThan (SF <> OF) ConditionCode.UnsignedGreaterOrEqual => 0x3, // UnsignedGreaterOrEqual (CF = 0) - ConditionCode.UnsignedGreater => 0x7, // UnsignedGreaterThan (CF = 0 & ZF = 0) + ConditionCode.UnsignedGreater => 0x7, // UnsignedGreater (CF = 0 & ZF = 0) ConditionCode.UnsignedLessOrEqual => 0x6, // UnsignedLessOrEqual (CF = 1 or ZF = 1) - ConditionCode.UnsignedLess => 0x2, // UnsignedLessThan (CF = 1) + ConditionCode.UnsignedLess => 0x2, // UnsignedLess (CF = 1) ConditionCode.Signed => 0x8, // Signed (SF = 1) ConditionCode.NotSigned => 0x9, // NotSigned (SF = 0) ConditionCode.Carry => 0x2, // Carry (CF = 1) diff --git a/Source/Mosa.Korlib/System/Single.cs b/Source/Mosa.Korlib/System/Single.cs index 71f2c0b5b9..5562847999 100644 --- a/Source/Mosa.Korlib/System/Single.cs +++ b/Source/Mosa.Korlib/System/Single.cs @@ -40,6 +40,7 @@ public static bool IsPositiveInfinity(float s) return (s > 0.0f && (s == NegativeInfinity || s == PositiveInfinity)); } + [MethodImpl(MethodImplOptions.AggressiveInlining)] public static bool IsInfinity(float s) { return (s == PositiveInfinity || s == NegativeInfinity); diff --git a/Source/Mosa.Tool.Explorer.Avalonia/Stages/DominanceOutputStage.cs b/Source/Mosa.Tool.Explorer.Avalonia/Stages/DominanceOutputStage.cs deleted file mode 100755 index def97f19a6..0000000000 --- a/Source/Mosa.Tool.Explorer.Avalonia/Stages/DominanceOutputStage.cs +++ /dev/null @@ -1,107 +0,0 @@ -// Copyright (c) MOSA Project. Licensed under the New BSD License. - -using System.Text; -using Mosa.Compiler.Framework; -using Mosa.Compiler.Framework.Analysis; - -namespace Mosa.Tool.Explorer.Avalonia.Stages; - -public class DominanceOutputStage : BaseMethodCompilerStage -{ - private const int TraceLevel = 5; - - protected override void Run() - { - if (!IsTraceable(TraceLevel)) - return; - - OutputList(); - OutputDiagram(); - OutputDominanceBlock(); - } - - private void OutputList() - { - var trace = CreateTraceLog("List"); - var sb = new StringBuilder(); - - foreach (var headBlock in BasicBlocks.HeadBlocks) - { - trace.Log($"Head: {headBlock}"); - - var dominance = new SimpleFastDominance(BasicBlocks, headBlock); - foreach (var block in BasicBlocks) - { - sb.Clear(); - sb.Append($" Block {block} : "); - - var children = dominance.GetChildren(block); - if (children != null && children.Count != 0) - { - foreach (var child in children) - { - sb.Append(child); - sb.Append(", "); - } - - sb.Length -= 2; - } - - trace.Log(sb); - } - - trace.Log(); - } - } - - private void OutputDiagram() - { - var trace = CreateTraceLog("Diagram"); - trace.Log("digraph blocks {"); - - foreach (var headBlock in BasicBlocks.HeadBlocks) - { - var dominance = new SimpleFastDominance(BasicBlocks, headBlock); - - foreach (var block in BasicBlocks) - { - var children = dominance.GetChildren(block); - if (children == null || children.Count == 0) - continue; - - foreach (var child in children) - trace.Log($"\t{block} -> {child}"); - } - } - - trace.Log("}"); - } - - private void OutputDominanceBlock() - { - var trace = CreateTraceLog("DominanceBlock"); - var sb = new StringBuilder(); - - foreach (var headBlock in BasicBlocks.HeadBlocks) - { - trace.Log($"Head: {headBlock}"); - var dominance = new SimpleFastDominance(BasicBlocks, headBlock); - - for (var i = 0; i < BasicBlocks.Count; i++) - { - var block = BasicBlocks[i]; - - sb.Clear(); - sb.Append($" Block {block} : "); - - var dom = dominance.GetImmediateDominator(block); - - sb.Append((dom != null) ? dom.ToString() : string.Empty); - - trace.Log(sb); - } - - trace.Log(); - } - } -} diff --git a/Source/Mosa.Tool.Explorer/CompilerStage/ExplorerMethodCompileTimeStage.cs b/Source/Mosa.Tool.Explorer/CompilerStage/ExplorerMethodCompileTimeStage.cs index dc201fc1c1..360b2283ac 100644 --- a/Source/Mosa.Tool.Explorer/CompilerStage/ExplorerMethodCompileTimeStage.cs +++ b/Source/Mosa.Tool.Explorer/CompilerStage/ExplorerMethodCompileTimeStage.cs @@ -1,7 +1,7 @@ // Copyright (c) MOSA Project. Licensed under the New BSD License. -using Mosa.Compiler.Framework.CompilerStages; using Mosa.Compiler.Framework; +using Mosa.Compiler.Framework.CompilerStages; namespace Mosa.Tool.Explorer.Stages; diff --git a/Source/Mosa.Tool.Explorer/FormatInstructions.cs b/Source/Mosa.Tool.Explorer/FormatInstructions.cs new file mode 100644 index 0000000000..6f8b51281c --- /dev/null +++ b/Source/Mosa.Tool.Explorer/FormatInstructions.cs @@ -0,0 +1,206 @@ +// Copyright (c) MOSA Project. Licensed under the New BSD License. + +using System.Text; + +namespace Mosa.Tool.Explorer; + +public class FormatInstructions +{ + private const int Padding = 34; + + public static string Format(List records, string blockLabel, bool strip, bool removeNop, bool lineBetweenBlocks) + { + var sb = new StringBuilder(); + var blocks = new StringBuilder(); + + if (records == null || records.Count == 0) + return string.Empty; + + var allLines = string.IsNullOrWhiteSpace(blockLabel); + var inblock = allLines; + + foreach (var record in records) + { + switch (record.Type) + { + case "M": + { + sb.AppendLine($"{record.MethodName} [v{record.Version}] @ {record.Stage}:"); + sb.AppendLine(); + break; + } + case "S": + { + inblock = record.BlockLabel == blockLabel; + + if (!inblock && !allLines) + continue; + + sb.Append($"{record.BlockLabel}:"); + + blocks.Clear(); + + // Previous Branch Targets + if (record.PreviousBlockCount != 0) + { + for (int i = 0; i < record.PreviousBlockCount; i++) + { + if (i != 0) + blocks.Append(' '); + + var op = record.GetPreviousBlocks(i); + + blocks.Append(op); + } + + sb.Append("".PadRight(record.PreviousBlockCount == 1 ? Padding : Padding - 8)); + + sb.Append(blocks); + } + + sb.AppendLine(); + break; + } + case "I": + { + if (!inblock && !allLines) + continue; + + if (record.Instruction == "IR.BlockStart" || record.Instruction == "IR.BlockEnd") + break; + + if (removeNop && record.Instruction == "IR.Nop") + continue; + + sb.Append($" "); + + var instruction = record.Instruction; + var condition = !string.IsNullOrEmpty(record.Condition) ? " [" + record.Condition + "]" : string.Empty; + + var both = $"{instruction}{condition}"; + + blocks.Clear(); + + // Branch Targets + if (record.BranchTargetCount != 0) + { + if (condition.Length != 0) + blocks.Append(' '); + + for (int i = 0; i < record.BranchTargetCount; i++) + { + if (i != 0) + blocks.Append(' '); + + var op = record.GetBranchTarget(i); + + blocks.Append(op); + } + } + + var count = Padding + 2 - both.Length - blocks.Length; + + if (count < 0) + count = 1; + + var padding = string.Empty.PadRight(count); + + sb.Append($"{record.Label[..5]}:{record.Mark.PadLeft(1)}{both}{padding}{blocks} "); + + // Result + for (int i = 0; i < record.ResultCount; i++) + { + if (i != 0) + sb.Append(", "); + + var op = record.GetResult(i); + + op = Simplify(op); + + if (strip) + op = StripBracketData(op); + + sb.Append(op); + } + + if (record.ResultCount != 0 && record.OperandCount != 0) + { + sb.Append(" <= "); + } + + // Operands + for (int i = 0; i < record.OperandCount; i++) + { + if (i != 0) + sb.Append(", "); + + var op = record.GetOperand(i); + + op = Simplify(op); + + if (strip) + op = StripBracketData(op); + + sb.Append(op); + } + + // Phi Blocks + if (record.PhiBlockCount != 0) + { + sb.Append(" ("); + + for (int i = 0; i < record.PhiBlockCount; i++) + { + if (i != 0) + sb.Append(", "); + + var op = record.GetPhilBlock(i); + + sb.Append(op); + } + + sb.Append(") "); + } + + while (sb.Length > 0 && sb[sb.Length - 1] == ' ') + { + sb.Length--; + } + + sb.AppendLine(); + break; + } + case "E": + { + inblock = false; + + if (!inblock && !allLines) + continue; + + if (lineBetweenBlocks) + sb.AppendLine(); + + break; + } + default: break; + } + } + + return sb.ToString(); + } + + private static string StripBracketData(string s) + { + int i = s.IndexOf('['); + + if (i <= 0) + return s; + + return s.Substring(0, i - 1).Trim(); + } + + private static string Simplify(string s) + { + return s.Replace("const=", string.Empty); + } +} diff --git a/Source/Mosa.Tool.Explorer/InstructionRecord.cs b/Source/Mosa.Tool.Explorer/InstructionRecord.cs new file mode 100644 index 0000000000..db93dca8c5 --- /dev/null +++ b/Source/Mosa.Tool.Explorer/InstructionRecord.cs @@ -0,0 +1,96 @@ +// Copyright (c) MOSA Project. Licensed under the New BSD License. + +namespace Mosa.Tool.Explorer +{ + public class InstructionRecord + { + public readonly string Data; + + public readonly string[] Parts; + + public readonly string Type; + + public readonly bool IsInstruction; + + public readonly bool IsMethod; + + public readonly bool IsStartBlock; + + public readonly bool IsEndBlock; + + public string Label => Parts[1]; + + // Block + public string BlockLabel => Parts[1]; + + // Start Block + public string BlockSequence => Parts[2]; + + public string BlockType => Parts[3]; + + public readonly int PreviousBlockCount; + + public string GetPreviousBlocks(int index) => Parts[5 + index]; + + // End Block + public int NextBlockCount => Convert.ToInt32(Parts[2]); + + // Instruction + public string Mark => Parts[2]; + + public string Instruction => Parts[3]; + + public string Condition => Parts[4]; + + public readonly int ResultCount = 0; + + public readonly int OperandCount = 0; + + public readonly int BranchTargetCount = 0; + + public readonly int PhiBlockCount = 0; + + public string GetResult(int index) => Parts[9 + index]; + + public string GetOperand(int index) => Parts[9 + ResultCount + index]; + + public string GetBranchTarget(int index) => Parts[9 + ResultCount + OperandCount + index]; + + public string GetPhilBlock(int index) => Parts[9 + ResultCount + OperandCount + BranchTargetCount + index]; + + // Method + + public string MethodName => Parts[1]; + + public int Version => Convert.ToInt32(Parts[2]); + + public string Stage => Parts[3]; + + public int Step => Convert.ToInt32(Parts[4]); + + public InstructionRecord(string data) + { + Data = data; + Parts = data.Split('\t'); + + Type = Parts[0]; + + IsInstruction = Type == "I"; + IsMethod = Type == "M"; + IsStartBlock = Type == "S"; + IsEndBlock = Type == "E"; + + if (IsInstruction) + { + ResultCount = Convert.ToInt32(Parts[5]); + OperandCount = Convert.ToInt32(Parts[6]); + BranchTargetCount = Convert.ToInt32(Parts[7]); + PhiBlockCount = Convert.ToInt32(Parts[8]); + } + else if (IsStartBlock) + { + PreviousBlockCount = Convert.ToInt32(Parts[4]); + } + } + } +} diff --git a/Source/Mosa.Tool.Explorer/MainForm.Designer.cs b/Source/Mosa.Tool.Explorer/MainForm.Designer.cs index ecdc98b7c3..a05583ab56 100644 --- a/Source/Mosa.Tool.Explorer/MainForm.Designer.cs +++ b/Source/Mosa.Tool.Explorer/MainForm.Designer.cs @@ -55,15 +55,16 @@ private void InitializeComponent() cbEnableLongExpansion = new ToolStripMenuItem(); cbLoopInvariantCodeMotion = new ToolStripMenuItem(); cbEnableBitTracker = new ToolStripMenuItem(); + cbEnableLoopRangeTracker = new ToolStripMenuItem(); cbEnableTwoPassOptimizations = new ToolStripMenuItem(); cbPlatformOptimizations = new ToolStripMenuItem(); cbEnableBinaryCodeGeneration = new ToolStripMenuItem(); cbEnableCodeSizeReduction = new ToolStripMenuItem(); displayOptionsToolStripMenuItem = new ToolStripMenuItem(); - showOperandTypes = new ToolStripMenuItem(); - padInstructions = new ToolStripMenuItem(); + cbRemoveIRNop = new ToolStripMenuItem(); + cbLineBetweenBlocks = new ToolStripMenuItem(); + cbShowOperandTypes = new ToolStripMenuItem(); showSizes = new ToolStripMenuItem(); - removeIRNop = new ToolStripMenuItem(); advanceToolStripMenuItem = new ToolStripMenuItem(); cbEnableMultithreading = new ToolStripMenuItem(); cbEnableMethodScanner = new ToolStripMenuItem(); @@ -136,7 +137,6 @@ private void InitializeComponent() folderBrowserDialog1 = new FolderBrowserDialog(); timer1 = new System.Windows.Forms.Timer(components); saveFileDialog1 = new SaveFileDialog(); - cbEnableLoopRangeTracker = new ToolStripMenuItem(); statusStrip1.SuspendLayout(); menuStrip1.SuspendLayout(); ((System.ComponentModel.ISupportInitialize)splitContainer1).BeginInit(); @@ -359,6 +359,15 @@ private void InitializeComponent() cbEnableBitTracker.Size = new Size(293, 22); cbEnableBitTracker.Text = "Enable Bit Tracker"; // + // cbEnableLoopRangeTracker + // + cbEnableLoopRangeTracker.Checked = true; + cbEnableLoopRangeTracker.CheckOnClick = true; + cbEnableLoopRangeTracker.CheckState = CheckState.Checked; + cbEnableLoopRangeTracker.Name = "cbEnableLoopRangeTracker"; + cbEnableLoopRangeTracker.Size = new Size(293, 22); + cbEnableLoopRangeTracker.Text = "Enable Loop Range Tracker"; + // // cbEnableTwoPassOptimizations // cbEnableTwoPassOptimizations.Checked = true; @@ -395,28 +404,36 @@ private void InitializeComponent() // // displayOptionsToolStripMenuItem // - displayOptionsToolStripMenuItem.DropDownItems.AddRange(new ToolStripItem[] { showOperandTypes, padInstructions, showSizes, removeIRNop }); + displayOptionsToolStripMenuItem.DropDownItems.AddRange(new ToolStripItem[] { cbRemoveIRNop, cbLineBetweenBlocks, cbShowOperandTypes, showSizes }); displayOptionsToolStripMenuItem.Name = "displayOptionsToolStripMenuItem"; displayOptionsToolStripMenuItem.Size = new Size(57, 20); displayOptionsToolStripMenuItem.Text = "Display"; // - // showOperandTypes + // cbRemoveIRNop + // + cbRemoveIRNop.CheckOnClick = true; + cbRemoveIRNop.Name = "cbRemoveIRNop"; + cbRemoveIRNop.Size = new Size(184, 22); + cbRemoveIRNop.Text = "Remove IR.Nop"; + cbRemoveIRNop.CheckStateChanged += DisplayCheckStateChanged; // - showOperandTypes.CheckOnClick = true; - showOperandTypes.Name = "showOperandTypes"; - showOperandTypes.Size = new Size(184, 22); - showOperandTypes.Text = "Show Operand Types"; - showOperandTypes.CheckStateChanged += DisplayCheckStateChanged; + // cbLineBetweenBlocks // - // padInstructions + cbLineBetweenBlocks.Checked = true; + cbLineBetweenBlocks.CheckOnClick = true; + cbLineBetweenBlocks.CheckState = CheckState.Checked; + cbLineBetweenBlocks.Name = "cbLineBetweenBlocks"; + cbLineBetweenBlocks.Size = new Size(184, 22); + cbLineBetweenBlocks.Text = "Line Between Blocks"; + cbLineBetweenBlocks.CheckStateChanged += DisplayCheckStateChanged; // - padInstructions.Checked = true; - padInstructions.CheckOnClick = true; - padInstructions.CheckState = CheckState.Checked; - padInstructions.Name = "padInstructions"; - padInstructions.Size = new Size(184, 22); - padInstructions.Text = "Pad Instructions"; - padInstructions.CheckStateChanged += DisplayCheckStateChanged; + // cbShowOperandTypes + // + cbShowOperandTypes.CheckOnClick = true; + cbShowOperandTypes.Name = "cbShowOperandTypes"; + cbShowOperandTypes.Size = new Size(184, 22); + cbShowOperandTypes.Text = "Show Operand Types"; + cbShowOperandTypes.CheckStateChanged += DisplayCheckStateChanged; // // showSizes // @@ -429,14 +446,6 @@ private void InitializeComponent() showSizes.CheckStateChanged += DisplayCheckStateChanged; showSizes.Click += showSizesToolStripMenuItem_Click; // - // removeIRNop - // - removeIRNop.CheckOnClick = true; - removeIRNop.Name = "removeIRNop"; - removeIRNop.Size = new Size(184, 22); - removeIRNop.Text = "Remove IR.Nop"; - removeIRNop.CheckStateChanged += DisplayCheckStateChanged; - // // advanceToolStripMenuItem // advanceToolStripMenuItem.CheckOnClick = true; @@ -1245,15 +1254,6 @@ private void InitializeComponent() timer1.Enabled = true; timer1.Tick += timer1_Tick; // - // cbEnableLoopRangeTracker - // - cbEnableLoopRangeTracker.Checked = true; - cbEnableLoopRangeTracker.CheckOnClick = true; - cbEnableLoopRangeTracker.CheckState = CheckState.Checked; - cbEnableLoopRangeTracker.Name = "cbEnableLoopRangeTracker"; - cbEnableLoopRangeTracker.Size = new Size(293, 22); - cbEnableLoopRangeTracker.Text = "Enable Loop Range Tracker"; - // // MainForm // AutoScaleDimensions = new SizeF(7F, 15F); @@ -1342,9 +1342,8 @@ private void InitializeComponent() private ToolStripMenuItem cbEnableLongExpansion; private ToolStripMenuItem cbEnableTwoPassOptimizations; private ToolStripMenuItem displayOptionsToolStripMenuItem; - private ToolStripMenuItem showOperandTypes; + private ToolStripMenuItem cbShowOperandTypes; private ToolStripMenuItem showSizes; - private ToolStripMenuItem padInstructions; private ToolStripMenuItem cbEnableValueNumbering; private ToolStripMenuItem cbEnableMethodScanner; private TextBox tbFilter; @@ -1399,7 +1398,7 @@ private void InitializeComponent() private Button btnSaveB; private Button btnSaveA; private SaveFileDialog saveFileDialog1; - private ToolStripMenuItem removeIRNop; + private ToolStripMenuItem cbRemoveIRNop; private ToolStripMenuItem cbEnableDebugDiagnostic; private ToolStripButton tsbRefresh; private CheckBox cbGraphviz; @@ -1418,5 +1417,6 @@ private void InitializeComponent() private Button button2; private ToolStripMenuItem cbEnableCodeSizeReduction; private ToolStripMenuItem cbEnableLoopRangeTracker; + private ToolStripMenuItem cbLineBetweenBlocks; } } diff --git a/Source/Mosa.Tool.Explorer/MainForm.cs b/Source/Mosa.Tool.Explorer/MainForm.cs index d5f8dde7fe..5c1ff64b4b 100644 --- a/Source/Mosa.Tool.Explorer/MainForm.cs +++ b/Source/Mosa.Tool.Explorer/MainForm.cs @@ -13,6 +13,7 @@ using Mosa.Compiler.MosaTypeSystem.CLR; using Mosa.Tool.Explorer.Stages; using Mosa.Utility.Configuration; +using Reko.Core; using static Mosa.Utility.Configuration.MosaSettings; namespace Mosa.Tool.Explorer; @@ -314,19 +315,19 @@ private static CounterEntry ExtractCounterData(string line) return entry; } - private static List ExtractLabels(List lines) + private static List ExtractLabels(List records) { - if (lines == null) + if (records == null) return null; var labels = new List(); - foreach (var line in lines) + foreach (var record in records) { - if (!line.StartsWith("Block #")) - continue; - - labels.Add(line.Substring(line.IndexOf("L_"))); + if (record.IsStartBlock) + { + labels.Add(record.BlockLabel); + } } return labels; @@ -581,13 +582,25 @@ private void ExtendMethodCompilerPipeline(Pipeline pipe { for (int i = 1; i < pipeline.Count; i += 2) { - pipeline.Insert(i, new GraphVizStage()); + pipeline.Insert(i, new ControlFlowGraphStage()); } } else { - pipeline.InsertAfterLast(new GraphVizStage()); - pipeline.Add(new GraphVizStage()); + if (MosaSettings.InlineMethods || MosaSettings.InlineExplicit) + { + pipeline.InsertBefore(new ControlFlowGraphStage()); + pipeline.InsertAfterLast(new ControlFlowGraphStage()); + } + + if (MosaSettings.SSA) + { + pipeline.InsertBefore(new DominanceAnalysisStage()); + pipeline.InsertBefore(new ControlFlowGraphStage()); + } + + pipeline.InsertAfterLast(new ControlFlowGraphStage()); + pipeline.Add(new ControlFlowGraphStage()); } } @@ -611,7 +624,7 @@ private string GetCurrentInstructionLabel() return cbInstructionLabels.SelectedItem as string; } - private List GetCurrentInstructionLines() + private List GetCurrentInstructionLines() { if (CurrentMethodData == null) return null; @@ -650,7 +663,7 @@ private string GetCurrentTransformLabel() return cbTransformLabels.SelectedItem as string; } - private List GetCurrentTransformLines() + private List GetCurrentTransformRecords() { if (CurrentMethodData == null) return null; @@ -1099,12 +1112,12 @@ private void UpdateDisplay() private void UpdateInstructionLabels() { - var lines = GetCurrentInstructionLines(); + var records = GetCurrentInstructionLines(); cbInstructionLabels.Items.Clear(); cbInstructionLabels.Items.Add("All"); - var labels = ExtractLabels(lines); + var labels = ExtractLabels(records); if (labels != null) { @@ -1119,18 +1132,18 @@ private void UpdateInstructions() if (CurrentMethod == null) return; - var lines = GetCurrentInstructionLines(); + var records = GetCurrentInstructionLines(); var label = GetCurrentInstructionLabel(); SetStatus(CurrentMethod.FullName); - if (lines == null) + if (records == null) return; if (string.IsNullOrWhiteSpace(label) || label == "All") label = string.Empty; - tbInstructions.Text = MethodStore.GetStageInstructions(lines, label, !showOperandTypes.Checked, padInstructions.Checked, removeIRNop.Checked); + tbInstructions.Text = FormatInstructions.Format(records, label, !cbShowOperandTypes.Checked, cbRemoveIRNop.Checked, cbLineBetweenBlocks.Checked); } private void UpdateInstructionStages() @@ -1230,12 +1243,12 @@ private void UpdateSettings(string filename) private void UpdateTransformLabels() { - var lines = GetCurrentTransformLines(); + var records = GetCurrentTransformRecords(); cbTransformLabels.Items.Clear(); cbTransformLabels.Items.Add("All"); - var labels = ExtractLabels(lines); + var labels = ExtractLabels(records); if (labels != null) { @@ -1250,16 +1263,16 @@ private void UpdateTransforms() if (CurrentMethod == null) return; - var lines = GetCurrentTransformLines(); + var records = GetCurrentTransformRecords(); var label = GetCurrentTransformLabel(); - if (lines == null) + if (records == null) return; if (string.IsNullOrWhiteSpace(label) || label == "All") label = string.Empty; - tbTransforms.Text = MethodStore.GetStageInstructions(lines, label, !showOperandTypes.Checked, padInstructions.Checked, removeIRNop.Checked); + tbTransforms.Text = FormatInstructions.Format(records, label, !cbShowOperandTypes.Checked, cbRemoveIRNop.Checked, cbLineBetweenBlocks.Checked); } private void UpdateTransformStages() @@ -1438,7 +1451,7 @@ private void PopulateTransformList() continue; } - if (parts[0].StartsWith(" ")) + if (parts[0].StartsWith(' ')) { entry.After = part1; continue; @@ -1446,7 +1459,7 @@ private void PopulateTransformList() entry = new TranformEntry { - ID = Convert.ToInt32(parts[0].Trim()) + 1, + ID = Convert.ToInt32(parts[0].Trim()), Name = part1, Pass = pass }; diff --git a/Source/Mosa.Tool.Explorer/MethodData.cs b/Source/Mosa.Tool.Explorer/MethodData.cs index 058817c0bf..313ce90921 100644 --- a/Source/Mosa.Tool.Explorer/MethodData.cs +++ b/Source/Mosa.Tool.Explorer/MethodData.cs @@ -13,10 +13,10 @@ public class MethodData public List OrderedTransformStageNames = new List(); - public Dictionary> InstructionLogs = new Dictionary>(); + public Dictionary> InstructionLogs = new Dictionary>(); + public Dictionary>> TransformLogs = new Dictionary>>(); + public Dictionary> DebugLogs = new Dictionary>(); public List MethodCounters = new List(); - - public Dictionary>> TransformLogs = new Dictionary>>(); } diff --git a/Source/Mosa.Tool.Explorer/MethodStore.cs b/Source/Mosa.Tool.Explorer/MethodStore.cs index a7543d0d29..796776b000 100644 --- a/Source/Mosa.Tool.Explorer/MethodStore.cs +++ b/Source/Mosa.Tool.Explorer/MethodStore.cs @@ -1,6 +1,5 @@ // Copyright (c) MOSA Project. Licensed under the New BSD License. -using System.Text; using Mosa.Compiler.Common; using Mosa.Compiler.MosaTypeSystem; @@ -50,13 +49,20 @@ public void SetInstructionTraceInformation(MosaMethod method, string stage, List { var methodData = GetMethodData(method, true); + var records = new List(); + + foreach (var line in lines) + { + records.Add(new InstructionRecord(line)); + } + lock (methodData) { ClearMethodDataOnNewVersion(version, methodData); methodData.OrderedStageNames.AddIfNew(stage); methodData.InstructionLogs.Remove(stage); - methodData.InstructionLogs.Add(stage, lines); + methodData.InstructionLogs.Add(stage, records); } } @@ -64,6 +70,13 @@ public void SetTransformTraceInformation(MosaMethod method, string stage, List(); + + foreach (var line in lines) + { + records.Add(new InstructionRecord(line)); + } + lock (methodData) { ClearMethodDataOnNewVersion(version, methodData); @@ -72,11 +85,11 @@ public void SetTransformTraceInformation(MosaMethod method, string stage, List>(); + directionary = new Dictionary>(); methodData.TransformLogs.Add(stage, directionary); } - directionary.Add(step, lines); + directionary.Add(step, records); } } @@ -105,144 +118,4 @@ public void SetMethodCounterInformation(MosaMethod method, List lines, i methodData.MethodCounters = lines; } } - - public string GetStageInstructions(List lines, string blockLabel, bool strip, bool pad, bool removeNop) - { - var result = new StringBuilder(); - - if (lines == null) - return string.Empty; - - if (string.IsNullOrWhiteSpace(blockLabel)) - { - foreach (var l in lines) - { - var line = l; - - if (line.Contains("IR.BlockStart") || line.Contains("IR.BlockEnd")) - continue; - - if (removeNop && line.Contains("IR.Nop")) - continue; - - if (strip) - line = StripBracketContents(line); - - if (pad) - line = PadInstruction(line); - - line = Simplify(line); - - result.Append(line); - result.Append('\n'); - } - - return result.ToString(); - } - - bool inBlock = false; - - foreach (var l in lines) - { - string line = l; - - if ((!inBlock) && line.StartsWith("Block #") && line.EndsWith(blockLabel)) - { - inBlock = true; - } - - if (inBlock) - { - if (line.Contains("IR.BlockStart") || line.Contains("IR.BlockEnd")) - continue; - - if (strip) - line = StripBracketContents(line); - - if (pad) - line = PadInstruction(line); - - line = Simplify(line); - - result.Append(line); - result.Append("\n"); - - if (line.StartsWith(" Next:")) - { - return result.ToString(); - } - } - } - - return result.ToString(); - } - - private string StripBracketContents(string s) - { - if (string.IsNullOrEmpty(s) || s.Length < 5) - return s; - - if (!char.IsDigit(s[0])) - return s; - - int at = 0; - - while (true) - { - int open = s.IndexOf(" [", at); - - if (open < 0) - return s; - - int close = s.IndexOf(']', open); - - if (close < 0) - return s; - - var part = s.Substring(open + 2, close - open - 2); - - if (part == "NULL" || char.IsSymbol(part[0]) || char.IsPunctuation(part[0])) - { - at = close; - continue; - } - - s = s.Remove(open, close - open + 1); - - at = open; - } - } - - private string PadInstruction(string s) - { - const int padding = 30; - - if (string.IsNullOrEmpty(s) || s.Length < 5) - return s; - - if (!char.IsDigit(s[0])) - return s; - - int first = s.IndexOf(':'); - - if (first < 0 || first > 15) - return s; - - int second = s.IndexOf(' ', first + 2); - - if (second < 0) - return s; - - if (second > padding) - return s; - - s = s.Insert(second, new string(' ', padding - second)); - - return s; - } - - private string Simplify(string s) - { - return s.Replace("const=", string.Empty); - } } diff --git a/Source/Mosa.Utility.Configuration/CommandLineArguments.cs b/Source/Mosa.Utility.Configuration/CommandLineArguments.cs index 2062023d4a..330527a488 100644 --- a/Source/Mosa.Utility.Configuration/CommandLineArguments.cs +++ b/Source/Mosa.Utility.Configuration/CommandLineArguments.cs @@ -54,7 +54,7 @@ private static List GetMap() new Argument { Name = "-devirtualization-off", Setting = Name.Optimizations_Devirtualization, Value = "false"}, new Argument { Name = "-inline-level", Setting = Name.Optimizations_Inline_Maximum}, new Argument { Name = "-basic-optimization-window", Setting = Name.Optimizations_Basic_Window}, - new Argument { Name = "-reducesize", Setting = Name.Optimizations_ReduceCodeSize, Value = "true"}, + new Argument { Name = "-reduce-size", Setting = Name.Optimizations_ReduceCodeSize, Value = "true"}, // Compiler - Platforms: new Argument { Name = "-platform", Setting = Name.Compiler_Platform}, diff --git a/Source/Mosa.Utility.SourceCodeGenerator/BuildTransformations.cs b/Source/Mosa.Utility.SourceCodeGenerator/BuildTransformations.cs index 5e64170d4a..ab06bd73bc 100644 --- a/Source/Mosa.Utility.SourceCodeGenerator/BuildTransformations.cs +++ b/Source/Mosa.Utility.SourceCodeGenerator/BuildTransformations.cs @@ -607,7 +607,11 @@ private string ProcessPrefilters(Method filter) { sb.Append(CreateConstantName(parameter)); } - if (parameter.IsAt) + else if (parameter.IsDollar) + { + sb.Append($"transform.{parameter.Value}"); + } + else if (parameter.IsAt) { sb.Length--; return sb.ToString(); @@ -678,6 +682,10 @@ private string ProcessFilters(Method filter, Transformation transform) { sb.Append("context"); } + else if (parameter.IsDollar) + { + sb.Append($"transform.{parameter.Value}"); + } else if (parameter.IsPercent) { sb.Append("CPURegister."); diff --git a/Source/Mosa.Utility.SourceCodeGenerator/TransformExpressions/FilterParser.cs b/Source/Mosa.Utility.SourceCodeGenerator/TransformExpressions/FilterParser.cs index 2e3e5a844d..86682013ff 100644 --- a/Source/Mosa.Utility.SourceCodeGenerator/TransformExpressions/FilterParser.cs +++ b/Source/Mosa.Utility.SourceCodeGenerator/TransformExpressions/FilterParser.cs @@ -84,6 +84,21 @@ private static (Method method, int end) ParseMethod(List tokens, int star { method.Parameters.Add(new Operand(token, method.Parameters.Count)); } + else if (token.TokenType == TokenType.Dollar && method.MethodName != null) + { + // peak ahead + var next = tokens[index]; + + if (next.TokenType == TokenType.Word) + { + method.Parameters.Add(new Operand(new Token(TokenType.Dollar, token.Position, next.Value), method.Parameters.Count)); + index++; // skip word + } + else + { + throw new Exception($"parsing error {token}"); + } + } else if (token.TokenType == TokenType.Comma) { // skip diff --git a/Source/Mosa.Utility.SourceCodeGenerator/TransformExpressions/Operand.cs b/Source/Mosa.Utility.SourceCodeGenerator/TransformExpressions/Operand.cs index 7cf7f09f7c..e7a38843dc 100644 --- a/Source/Mosa.Utility.SourceCodeGenerator/TransformExpressions/Operand.cs +++ b/Source/Mosa.Utility.SourceCodeGenerator/TransformExpressions/Operand.cs @@ -24,6 +24,8 @@ public class Operand public bool IsAt => Token != null && Token.TokenType == TokenType.At; + public bool IsDollar => Token != null && Token.TokenType == TokenType.Dollar; + public bool IsPercent => Token != null && Token.TokenType == TokenType.Percent; public bool IsInteger => Token != null && Token.TokenType == TokenType.IntegerConstant; @@ -100,6 +102,8 @@ public override string ToString() return $"{Index} : {Node}"; else if (IsMethod) return $"{Index} : {Method}"; + else if (IsDollar) + return $"{Index} : {LabelName}"; else return $"{Index} : {Token}"; } diff --git a/Source/Mosa.Utility.SourceCodeGenerator/TransformExpressions/PrefilterParser.cs b/Source/Mosa.Utility.SourceCodeGenerator/TransformExpressions/PrefilterParser.cs index eac127ad92..8790e1d345 100644 --- a/Source/Mosa.Utility.SourceCodeGenerator/TransformExpressions/PrefilterParser.cs +++ b/Source/Mosa.Utility.SourceCodeGenerator/TransformExpressions/PrefilterParser.cs @@ -92,6 +92,21 @@ private static (Method method, int end) ParseMethod(List tokens, int star { return (method, index); } + else if (token.TokenType == TokenType.Dollar && method.MethodName != null) + { + // peak ahead + var next = tokens[index]; + + if (next.TokenType == TokenType.Word) + { + method.Parameters.Add(new Operand(new Token(TokenType.Dollar, token.Position, next.Value), method.Parameters.Count)); + index++; // skip word + } + else + { + throw new Exception($"parsing error {token}"); + } + } else { throw new Exception($"parsing error {token}"); diff --git a/Source/Mosa.Utility.SourceCodeGenerator/TransformExpressions/TokenType.cs b/Source/Mosa.Utility.SourceCodeGenerator/TransformExpressions/TokenType.cs index 290699049d..0c8f718586 100644 --- a/Source/Mosa.Utility.SourceCodeGenerator/TransformExpressions/TokenType.cs +++ b/Source/Mosa.Utility.SourceCodeGenerator/TransformExpressions/TokenType.cs @@ -9,7 +9,7 @@ public enum TokenType { Unknown, - Word, // temporary - until deducted + Word, // temporary Method, Instruction, Label, @@ -24,6 +24,7 @@ public enum TokenType Hash, Minus, Dollar, + Top, Greater, Less, diff --git a/Source/Mosa.Utility.SourceCodeGenerator/TransformExpressions/Tokenizer.cs b/Source/Mosa.Utility.SourceCodeGenerator/TransformExpressions/Tokenizer.cs index a13fd78f12..81c9ace2f8 100644 --- a/Source/Mosa.Utility.SourceCodeGenerator/TransformExpressions/Tokenizer.cs +++ b/Source/Mosa.Utility.SourceCodeGenerator/TransformExpressions/Tokenizer.cs @@ -148,6 +148,10 @@ public static List Parse(string expression) { tokens.Add(new Token(TokenType.Percent, index++, "%")); } + else if (c == '^') + { + tokens.Add(new Token(TokenType.Top, index++, "^")); + } else { throw new CompilerException($"tokensizer: syntax error at {index}"); diff --git a/Source/Mosa.sln b/Source/Mosa.sln index 4fd9dc8e79..96f56a44c5 100644 --- a/Source/Mosa.sln +++ b/Source/Mosa.sln @@ -252,8 +252,6 @@ Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Template", "Template", "{A1 TemplateLibrary.txt = TemplateLibrary.txt EndProjectSection EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Mosa.Tool.Explorer.Avalonia", "Mosa.Tool.Explorer.Avalonia\Mosa.Tool.Explorer.Avalonia.csproj", "{95FD51DF-AFE1-4762-89A7-91F99437E807}" -EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution Debug|Any CPU = Debug|Any CPU @@ -1438,24 +1436,6 @@ Global {26667157-E909-4F7A-9130-F8B5C15A1E4E}.Release|Mixed Platforms.Build.0 = Release|Any CPU {26667157-E909-4F7A-9130-F8B5C15A1E4E}.Release|x86.ActiveCfg = Release|Any CPU {26667157-E909-4F7A-9130-F8B5C15A1E4E}.Release|x86.Build.0 = Release|Any CPU - {95FD51DF-AFE1-4762-89A7-91F99437E807}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {95FD51DF-AFE1-4762-89A7-91F99437E807}.Debug|Any CPU.Build.0 = Debug|Any CPU - {95FD51DF-AFE1-4762-89A7-91F99437E807}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU - {95FD51DF-AFE1-4762-89A7-91F99437E807}.Debug|Mixed Platforms.Build.0 = Debug|Any CPU - {95FD51DF-AFE1-4762-89A7-91F99437E807}.Debug|x86.ActiveCfg = Debug|Any CPU - {95FD51DF-AFE1-4762-89A7-91F99437E807}.Debug|x86.Build.0 = Debug|Any CPU - {95FD51DF-AFE1-4762-89A7-91F99437E807}.Description|Any CPU.ActiveCfg = Debug|Any CPU - {95FD51DF-AFE1-4762-89A7-91F99437E807}.Description|Any CPU.Build.0 = Debug|Any CPU - {95FD51DF-AFE1-4762-89A7-91F99437E807}.Description|Mixed Platforms.ActiveCfg = Debug|Any CPU - {95FD51DF-AFE1-4762-89A7-91F99437E807}.Description|Mixed Platforms.Build.0 = Debug|Any CPU - {95FD51DF-AFE1-4762-89A7-91F99437E807}.Description|x86.ActiveCfg = Debug|Any CPU - {95FD51DF-AFE1-4762-89A7-91F99437E807}.Description|x86.Build.0 = Debug|Any CPU - {95FD51DF-AFE1-4762-89A7-91F99437E807}.Release|Any CPU.ActiveCfg = Release|Any CPU - {95FD51DF-AFE1-4762-89A7-91F99437E807}.Release|Any CPU.Build.0 = Release|Any CPU - {95FD51DF-AFE1-4762-89A7-91F99437E807}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU - {95FD51DF-AFE1-4762-89A7-91F99437E807}.Release|Mixed Platforms.Build.0 = Release|Any CPU - {95FD51DF-AFE1-4762-89A7-91F99437E807}.Release|x86.ActiveCfg = Release|Any CPU - {95FD51DF-AFE1-4762-89A7-91F99437E807}.Release|x86.Build.0 = Release|Any CPU EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE @@ -1532,7 +1512,6 @@ Global {E94607AB-584E-4D15-B0FA-68E086FE9E70} = {75BB6B40-C122-422F-8B40-F50A70A08E0D} {26667157-E909-4F7A-9130-F8B5C15A1E4E} = {3A538FDC-0226-4971-A3C0-31570CDA340D} {A1660856-2153-477F-BAAC-39E8BEB75971} = {F0EFF742-92D5-4219-939A-8F6F8DAB24E5} - {95FD51DF-AFE1-4762-89A7-91F99437E807} = {D032B24A-CE3A-4881-BACE-CC4FE0AFD69D} EndGlobalSection GlobalSection(ExtensibilityGlobals) = postSolution SolutionGuid = {C22A5C94-6B05-4B1B-845A-A2EA7615E093}