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}