diff --git a/Source/Data/X86-Instructions.json b/Source/Data/X86-Instructions.json
index e1fd5524f9..c6793a499c 100644
--- a/Source/Data/X86-Instructions.json
+++ b/Source/Data/X86-Instructions.json
@@ -563,7 +563,7 @@
"FlagsUnchanged": "C",
"FlagsUndefined": "",
"FlagsUsed": "",
- "OperandCount": 2,
+ "OperandCount": 1,
"ResultCount": 1,
"ThreeTwoAddressConversion": "true",
"OpcodeEncoding": [
@@ -792,7 +792,7 @@
"FlagsUnchanged": "C",
"FlagsUndefined": "",
"FlagsUsed": "",
- "OperandCount": 2,
+ "OperandCount": 1,
"ResultCount": 1,
"ThreeTwoAddressConversion": "false",
"OpcodeEncoding": [
diff --git a/Source/Mosa.Compiler.Framework/BaseMethodCompilerStage.cs b/Source/Mosa.Compiler.Framework/BaseMethodCompilerStage.cs
index 1ebea03b27..877c1827c8 100644
--- a/Source/Mosa.Compiler.Framework/BaseMethodCompilerStage.cs
+++ b/Source/Mosa.Compiler.Framework/BaseMethodCompilerStage.cs
@@ -564,7 +564,7 @@ protected static bool EmptyBlockOfAllInstructions(BasicBlock block, bool useNop
continue;
}
- node.SetInstruction(IRInstruction.Nop);
+ node.SetNop();
found = true;
}
diff --git a/Source/Mosa.Compiler.Framework/Context.cs b/Source/Mosa.Compiler.Framework/Context.cs
index ab1aa5e2d4..f67cfeaafa 100644
--- a/Source/Mosa.Compiler.Framework/Context.cs
+++ b/Source/Mosa.Compiler.Framework/Context.cs
@@ -206,6 +206,11 @@ public Context(BasicBlock block)
#region Methods
+ public void SetNop()
+ {
+ Node.SetNop();
+ }
+
///
/// Clones this instance.
///
diff --git a/Source/Mosa.Compiler.Framework/InstructionNode.cs b/Source/Mosa.Compiler.Framework/InstructionNode.cs
index cdcd65f432..6d1129f6b9 100644
--- a/Source/Mosa.Compiler.Framework/InstructionNode.cs
+++ b/Source/Mosa.Compiler.Framework/InstructionNode.cs
@@ -1082,6 +1082,11 @@ public InstructionNode(BaseInstruction instruction, Operand result, Operand oper
#region SetInstructions
+ public void SetNop()
+ {
+ SetInstruction(IRInstruction.Nop);
+ }
+
///
/// Sets the instruction.
///
diff --git a/Source/Mosa.Compiler.Framework/Stages/BitTrackerStage.cs b/Source/Mosa.Compiler.Framework/Stages/BitTrackerStage.cs
index 2587e41f6b..209c7c9c06 100644
--- a/Source/Mosa.Compiler.Framework/Stages/BitTrackerStage.cs
+++ b/Source/Mosa.Compiler.Framework/Stages/BitTrackerStage.cs
@@ -561,7 +561,7 @@ private void UpdateInstruction(Operand virtualRegister, Value value)
Debug.Assert(virtualRegister.Uses.Count == 0);
trace?.Log($"REMOVED:\t{node}");
- node.SetInstruction(IRInstruction.Nop);
+ node.SetNop();
trace?.Log();
InstructionsRemovedCount++;
@@ -595,7 +595,7 @@ private void UpdateBranchInstructions()
var newBranch = node.BranchTargets[0];
trace?.Log($"REMOVED:\t{node}");
- node.SetInstruction(IRInstruction.Nop);
+ node.SetNop();
InstructionsRemovedCount++;
BranchesRemovedCount++;
diff --git a/Source/Mosa.Compiler.Framework/Stages/CILTransformationStage.cs b/Source/Mosa.Compiler.Framework/Stages/CILTransformationStage.cs
index b5551e7a9b..0c115d6053 100644
--- a/Source/Mosa.Compiler.Framework/Stages/CILTransformationStage.cs
+++ b/Source/Mosa.Compiler.Framework/Stages/CILTransformationStage.cs
@@ -1242,7 +1242,7 @@ private void Newobj(Context context)
/// The context.
private void Nop(InstructionNode node)
{
- node.SetInstruction(IRInstruction.Nop);
+ node.SetNop();
}
///
@@ -1280,7 +1280,7 @@ private void Pop(InstructionNode node)
private void PreReadOnly(Context context)
{
- context.SetInstruction(IRInstruction.Nop);
+ context.SetNop();
}
///
diff --git a/Source/Mosa.Compiler.Framework/Stages/SparseConditionalConstantPropagationStage.cs b/Source/Mosa.Compiler.Framework/Stages/SparseConditionalConstantPropagationStage.cs
index cd2b5f7630..361cc1975e 100644
--- a/Source/Mosa.Compiler.Framework/Stages/SparseConditionalConstantPropagationStage.cs
+++ b/Source/Mosa.Compiler.Framework/Stages/SparseConditionalConstantPropagationStage.cs
@@ -124,7 +124,7 @@ protected void ReplaceVirtualRegisterWithConstant(Operand target, ulong value)
var defNode = target.Definitions[0];
trace?.Log($"REMOVED:\t{defNode}");
- defNode.SetInstruction(IRInstruction.Nop);
+ defNode.SetNop();
InstructionsRemovedCount++;
}
@@ -159,7 +159,7 @@ protected void RemoveBranchesToDeadBlocks(BasicBlock deadBlock)
{
trace?.Log("*** RemoveBranchesToDeadBlocks");
trace?.Log($"REMOVED:\t{node}");
- node.SetInstruction(IRInstruction.Nop);
+ node.SetNop();
InstructionsRemovedCount++;
continue;
}
diff --git a/Source/Mosa.Compiler.Framework/Stages/ValueNumberingStage.cs b/Source/Mosa.Compiler.Framework/Stages/ValueNumberingStage.cs
index 5eaa626f64..a0c7b140cf 100644
--- a/Source/Mosa.Compiler.Framework/Stages/ValueNumberingStage.cs
+++ b/Source/Mosa.Compiler.Framework/Stages/ValueNumberingStage.cs
@@ -246,7 +246,7 @@ private void ValueNumber(BasicBlock block, out List nextblocks, out
trace?.Log($"Removed Unless PHI: {node}");
- node.SetInstruction(IRInstruction.Nop);
+ node.SetNop();
InstructionRemovalCount++;
continue;
}
@@ -261,7 +261,7 @@ private void ValueNumber(BasicBlock block, out List nextblocks, out
trace?.Log($"Removed Redundant PHI: {node}");
- node.SetInstruction(IRInstruction.Nop);
+ node.SetNop();
InstructionRemovalCount++;
continue;
}
@@ -297,7 +297,7 @@ private void ValueNumber(BasicBlock block, out List nextblocks, out
}
SetValueNumber(node.Result, node.Operand1);
- node.SetInstruction(IRInstruction.Nop);
+ node.SetNop();
InstructionRemovalCount++;
continue;
}
@@ -332,7 +332,7 @@ private void ValueNumber(BasicBlock block, out List nextblocks, out
if (node.Instruction.IsParameterLoad)
ParameterLoadEliminationCount++;
- node.SetInstruction(IRInstruction.Nop);
+ node.SetNop();
InstructionRemovalCount++;
SubexpressionEliminationCount++;
continue;
diff --git a/Source/Mosa.Compiler.Framework/Transform/Manual/ConstantFolding/Branch32.cs b/Source/Mosa.Compiler.Framework/Transform/Manual/ConstantFolding/Branch32.cs
index 977e6805da..833faaac76 100644
--- a/Source/Mosa.Compiler.Framework/Transform/Manual/ConstantFolding/Branch32.cs
+++ b/Source/Mosa.Compiler.Framework/Transform/Manual/ConstantFolding/Branch32.cs
@@ -56,7 +56,7 @@ public override void Transform(Context context, TransformContext transformContex
if (!compare)
{
- context.SetInstruction(IRInstruction.Nop);
+ context.SetNop();
}
else
{
@@ -68,7 +68,7 @@ public override void Transform(Context context, TransformContext transformContex
{
if (!context.IsEmptyOrNop)
{
- context.SetInstruction(IRInstruction.Nop);
+ context.SetNop();
}
context.GotoNext();
}
diff --git a/Source/Mosa.Compiler.Framework/Transform/Manual/ConstantFolding/Branch64.cs b/Source/Mosa.Compiler.Framework/Transform/Manual/ConstantFolding/Branch64.cs
index 0d7484f432..cfebedf7cc 100644
--- a/Source/Mosa.Compiler.Framework/Transform/Manual/ConstantFolding/Branch64.cs
+++ b/Source/Mosa.Compiler.Framework/Transform/Manual/ConstantFolding/Branch64.cs
@@ -55,7 +55,7 @@ public override void Transform(Context context, TransformContext transformContex
if (!compare)
{
- context.SetInstruction(IRInstruction.Nop);
+ context.SetNop();
}
else
{
@@ -67,7 +67,7 @@ public override void Transform(Context context, TransformContext transformContex
{
if (!context.IsEmptyOrNop)
{
- context.SetInstruction(IRInstruction.Nop);
+ context.SetNop();
}
context.GotoNext();
}
diff --git a/Source/Mosa.Compiler.Framework/Transform/Manual/ConstantFolding/BranchObject.cs b/Source/Mosa.Compiler.Framework/Transform/Manual/ConstantFolding/BranchObject.cs
index 35984c8364..98f29c5b02 100644
--- a/Source/Mosa.Compiler.Framework/Transform/Manual/ConstantFolding/BranchObject.cs
+++ b/Source/Mosa.Compiler.Framework/Transform/Manual/ConstantFolding/BranchObject.cs
@@ -55,7 +55,7 @@ public override void Transform(Context context, TransformContext transformContex
if (!compare)
{
- context.SetInstruction(IRInstruction.Nop);
+ context.SetNop();
}
else
{
@@ -67,7 +67,7 @@ public override void Transform(Context context, TransformContext transformContex
{
if (!context.IsEmptyOrNop)
{
- context.SetInstruction(IRInstruction.Nop);
+ context.SetNop();
}
context.GotoNext();
}
diff --git a/Source/Mosa.Compiler.Framework/Transform/Manual/Memory/DoubleStoreParam32.cs b/Source/Mosa.Compiler.Framework/Transform/Manual/Memory/DoubleStoreParam32.cs
index ca12aaa49e..239f2642f8 100644
--- a/Source/Mosa.Compiler.Framework/Transform/Manual/Memory/DoubleStoreParam32.cs
+++ b/Source/Mosa.Compiler.Framework/Transform/Manual/Memory/DoubleStoreParam32.cs
@@ -26,7 +26,7 @@ public override bool Match(Context context, TransformContext transformContext)
public override void Transform(Context context, TransformContext transformContext)
{
- context.SetInstruction(IRInstruction.Nop);
+ context.SetNop();
}
}
}
diff --git a/Source/Mosa.Compiler.Framework/Transform/Manual/Memory/DoubleStoreParam64.cs b/Source/Mosa.Compiler.Framework/Transform/Manual/Memory/DoubleStoreParam64.cs
index 6b37745602..2b1dc66c84 100644
--- a/Source/Mosa.Compiler.Framework/Transform/Manual/Memory/DoubleStoreParam64.cs
+++ b/Source/Mosa.Compiler.Framework/Transform/Manual/Memory/DoubleStoreParam64.cs
@@ -26,7 +26,7 @@ public override bool Match(Context context, TransformContext transformContext)
public override void Transform(Context context, TransformContext transformContext)
{
- context.SetInstruction(IRInstruction.Nop);
+ context.SetNop();
}
}
}
diff --git a/Source/Mosa.Compiler.Framework/Transform/Manual/Memory/DoubleStoreParamR4.cs b/Source/Mosa.Compiler.Framework/Transform/Manual/Memory/DoubleStoreParamR4.cs
index eb018c85ae..137e9d3fb1 100644
--- a/Source/Mosa.Compiler.Framework/Transform/Manual/Memory/DoubleStoreParamR4.cs
+++ b/Source/Mosa.Compiler.Framework/Transform/Manual/Memory/DoubleStoreParamR4.cs
@@ -26,7 +26,7 @@ public override bool Match(Context context, TransformContext transformContext)
public override void Transform(Context context, TransformContext transformContext)
{
- context.SetInstruction(IRInstruction.Nop);
+ context.SetNop();
}
}
}
diff --git a/Source/Mosa.Compiler.Framework/Transform/Manual/Memory/DoubleStoreParamR8.cs b/Source/Mosa.Compiler.Framework/Transform/Manual/Memory/DoubleStoreParamR8.cs
index 7ab81f52f2..2578528e27 100644
--- a/Source/Mosa.Compiler.Framework/Transform/Manual/Memory/DoubleStoreParamR8.cs
+++ b/Source/Mosa.Compiler.Framework/Transform/Manual/Memory/DoubleStoreParamR8.cs
@@ -26,7 +26,7 @@ public override bool Match(Context context, TransformContext transformContext)
public override void Transform(Context context, TransformContext transformContext)
{
- context.SetInstruction(IRInstruction.Nop);
+ context.SetNop();
}
}
}
diff --git a/Source/Mosa.Compiler.Framework/Transform/Manual/Memory/StoreLoadParam32.cs b/Source/Mosa.Compiler.Framework/Transform/Manual/Memory/StoreLoadParam32.cs
index 6c1e4ba053..3c982ae2c9 100644
--- a/Source/Mosa.Compiler.Framework/Transform/Manual/Memory/StoreLoadParam32.cs
+++ b/Source/Mosa.Compiler.Framework/Transform/Manual/Memory/StoreLoadParam32.cs
@@ -26,7 +26,7 @@ public override bool Match(Context context, TransformContext transformContext)
public override void Transform(Context context, TransformContext transformContext)
{
- context.SetInstruction(IRInstruction.Nop);
+ context.SetNop();
}
}
}
diff --git a/Source/Mosa.Compiler.Framework/Transform/Manual/Memory/StoreLoadParam64.cs b/Source/Mosa.Compiler.Framework/Transform/Manual/Memory/StoreLoadParam64.cs
index dd65f23a9f..d67c18032c 100644
--- a/Source/Mosa.Compiler.Framework/Transform/Manual/Memory/StoreLoadParam64.cs
+++ b/Source/Mosa.Compiler.Framework/Transform/Manual/Memory/StoreLoadParam64.cs
@@ -26,7 +26,7 @@ public override bool Match(Context context, TransformContext transformContext)
public override void Transform(Context context, TransformContext transformContext)
{
- context.SetInstruction(IRInstruction.Nop);
+ context.SetNop();
}
}
}
diff --git a/Source/Mosa.Compiler.Framework/Transform/Manual/Memory/StoreLoadParamR4.cs b/Source/Mosa.Compiler.Framework/Transform/Manual/Memory/StoreLoadParamR4.cs
index cf89fc1564..5097ad9cb5 100644
--- a/Source/Mosa.Compiler.Framework/Transform/Manual/Memory/StoreLoadParamR4.cs
+++ b/Source/Mosa.Compiler.Framework/Transform/Manual/Memory/StoreLoadParamR4.cs
@@ -26,7 +26,7 @@ public override bool Match(Context context, TransformContext transformContext)
public override void Transform(Context context, TransformContext transformContext)
{
- context.SetInstruction(IRInstruction.Nop);
+ context.SetNop();
}
}
}
diff --git a/Source/Mosa.Compiler.Framework/Transform/Manual/Memory/StoreLoadParamR8.cs b/Source/Mosa.Compiler.Framework/Transform/Manual/Memory/StoreLoadParamR8.cs
index 9fef07cb62..7263b4d01b 100644
--- a/Source/Mosa.Compiler.Framework/Transform/Manual/Memory/StoreLoadParamR8.cs
+++ b/Source/Mosa.Compiler.Framework/Transform/Manual/Memory/StoreLoadParamR8.cs
@@ -26,7 +26,7 @@ public override bool Match(Context context, TransformContext transformContext)
public override void Transform(Context context, TransformContext transformContext)
{
- context.SetInstruction(IRInstruction.Nop);
+ context.SetNop();
}
}
}
diff --git a/Source/Mosa.Compiler.Framework/Transform/Manual/Simplification/Branch32OnlyOneExit.cs b/Source/Mosa.Compiler.Framework/Transform/Manual/Simplification/Branch32OnlyOneExit.cs
index f4b7e26cbb..59325ab62e 100644
--- a/Source/Mosa.Compiler.Framework/Transform/Manual/Simplification/Branch32OnlyOneExit.cs
+++ b/Source/Mosa.Compiler.Framework/Transform/Manual/Simplification/Branch32OnlyOneExit.cs
@@ -21,7 +21,7 @@ public override void Transform(Context context, TransformContext transformContex
var target = context.BranchTargets[0];
var block = context.Block;
- context.SetInstruction(IRInstruction.Nop);
+ context.SetNop();
TransformContext.RemoveBlockFromPHIInstructions(block, target);
}
diff --git a/Source/Mosa.Compiler.Framework/Transform/Manual/Simplification/Branch64OnlyOneExit.cs b/Source/Mosa.Compiler.Framework/Transform/Manual/Simplification/Branch64OnlyOneExit.cs
index ee15d3002e..3fd884a9c3 100644
--- a/Source/Mosa.Compiler.Framework/Transform/Manual/Simplification/Branch64OnlyOneExit.cs
+++ b/Source/Mosa.Compiler.Framework/Transform/Manual/Simplification/Branch64OnlyOneExit.cs
@@ -21,7 +21,7 @@ public override void Transform(Context context, TransformContext transformContex
var target = context.BranchTargets[0];
var block = context.Block;
- context.SetInstruction(IRInstruction.Nop);
+ context.SetNop();
TransformContext.RemoveBlockFromPHIInstructions(block, target);
}
diff --git a/Source/Mosa.Compiler.Framework/Transform/Manual/Simplification/BranchObjectOnlyOneExit.cs b/Source/Mosa.Compiler.Framework/Transform/Manual/Simplification/BranchObjectOnlyOneExit.cs
index f8c8063fb1..078c2a2782 100644
--- a/Source/Mosa.Compiler.Framework/Transform/Manual/Simplification/BranchObjectOnlyOneExit.cs
+++ b/Source/Mosa.Compiler.Framework/Transform/Manual/Simplification/BranchObjectOnlyOneExit.cs
@@ -18,7 +18,7 @@ public override bool Match(Context context, TransformContext transformContext)
public override void Transform(Context context, TransformContext transformContext)
{
- context.SetInstruction(IRInstruction.Nop);
+ context.SetNop();
//context.SetInstruction(IRInstruction.Branch64, context.ConditionCode.GetReverse(), context.Result, context.Operand2, context.Operand1, context.BranchTargets[0]);
}
diff --git a/Source/Mosa.Compiler.Framework/Transform/Manual/Special/Deadcode.cs b/Source/Mosa.Compiler.Framework/Transform/Manual/Special/Deadcode.cs
index 5ceda7e25d..318c417247 100644
--- a/Source/Mosa.Compiler.Framework/Transform/Manual/Special/Deadcode.cs
+++ b/Source/Mosa.Compiler.Framework/Transform/Manual/Special/Deadcode.cs
@@ -48,7 +48,7 @@ public override bool Match(Context context, TransformContext transformContext)
public override void Transform(Context context, TransformContext transformContext)
{
- context.SetInstruction(IRInstruction.Nop);
+ context.SetNop();
}
}
}
diff --git a/Source/Mosa.Compiler.Framework/Transform/Manual/Special/Move32Propagate.cs b/Source/Mosa.Compiler.Framework/Transform/Manual/Special/Move32Propagate.cs
index 8cbaa98f9e..73825f2af0 100644
--- a/Source/Mosa.Compiler.Framework/Transform/Manual/Special/Move32Propagate.cs
+++ b/Source/Mosa.Compiler.Framework/Transform/Manual/Special/Move32Propagate.cs
@@ -37,7 +37,7 @@ public override void Transform(Context context, TransformContext transformContex
}
}
- context.SetInstruction(IRInstruction.Nop);
+ context.SetNop();
}
}
}
diff --git a/Source/Mosa.Compiler.Framework/Transform/Manual/Special/Move32PropagateConstant.cs b/Source/Mosa.Compiler.Framework/Transform/Manual/Special/Move32PropagateConstant.cs
index b97cb268a6..121cfb4f8a 100644
--- a/Source/Mosa.Compiler.Framework/Transform/Manual/Special/Move32PropagateConstant.cs
+++ b/Source/Mosa.Compiler.Framework/Transform/Manual/Special/Move32PropagateConstant.cs
@@ -37,7 +37,7 @@ public override void Transform(Context context, TransformContext transformContex
}
}
- context.SetInstruction(IRInstruction.Nop);
+ context.SetNop();
}
}
}
diff --git a/Source/Mosa.Compiler.Framework/Transform/Manual/Special/Move64Propagate.cs b/Source/Mosa.Compiler.Framework/Transform/Manual/Special/Move64Propagate.cs
index 64ef88ad7b..84af1e2d60 100644
--- a/Source/Mosa.Compiler.Framework/Transform/Manual/Special/Move64Propagate.cs
+++ b/Source/Mosa.Compiler.Framework/Transform/Manual/Special/Move64Propagate.cs
@@ -37,7 +37,7 @@ public override void Transform(Context context, TransformContext transformContex
}
}
- context.SetInstruction(IRInstruction.Nop);
+ context.SetNop();
}
}
}
diff --git a/Source/Mosa.Compiler.Framework/Transform/Manual/Special/Move64PropagateConstant.cs b/Source/Mosa.Compiler.Framework/Transform/Manual/Special/Move64PropagateConstant.cs
index e38294de5c..50ddb7b8a8 100644
--- a/Source/Mosa.Compiler.Framework/Transform/Manual/Special/Move64PropagateConstant.cs
+++ b/Source/Mosa.Compiler.Framework/Transform/Manual/Special/Move64PropagateConstant.cs
@@ -37,7 +37,7 @@ public override void Transform(Context context, TransformContext transformContex
}
}
- context.SetInstruction(IRInstruction.Nop);
+ context.SetNop();
}
}
}
diff --git a/Source/Mosa.Compiler.Framework/Transform/Manual/Special/MoveCompoundPropagate.cs b/Source/Mosa.Compiler.Framework/Transform/Manual/Special/MoveCompoundPropagate.cs
index 292ee5a23d..f45445b8d7 100644
--- a/Source/Mosa.Compiler.Framework/Transform/Manual/Special/MoveCompoundPropagate.cs
+++ b/Source/Mosa.Compiler.Framework/Transform/Manual/Special/MoveCompoundPropagate.cs
@@ -37,7 +37,7 @@ public override void Transform(Context context, TransformContext transformContex
}
}
- context.SetInstruction(IRInstruction.Nop);
+ context.SetNop();
}
}
}
diff --git a/Source/Mosa.Compiler.Framework/Transform/Manual/Special/MoveObjectPropagate.cs b/Source/Mosa.Compiler.Framework/Transform/Manual/Special/MoveObjectPropagate.cs
index 7ff22c5b7f..a1b2038add 100644
--- a/Source/Mosa.Compiler.Framework/Transform/Manual/Special/MoveObjectPropagate.cs
+++ b/Source/Mosa.Compiler.Framework/Transform/Manual/Special/MoveObjectPropagate.cs
@@ -37,7 +37,7 @@ public override void Transform(Context context, TransformContext transformContex
}
}
- context.SetInstruction(IRInstruction.Nop);
+ context.SetNop();
}
}
}
diff --git a/Source/Mosa.Compiler.Framework/Transform/Manual/Special/MoveObjectPropagateConstant.cs b/Source/Mosa.Compiler.Framework/Transform/Manual/Special/MoveObjectPropagateConstant.cs
index d5e5d2d5b9..aa537374de 100644
--- a/Source/Mosa.Compiler.Framework/Transform/Manual/Special/MoveObjectPropagateConstant.cs
+++ b/Source/Mosa.Compiler.Framework/Transform/Manual/Special/MoveObjectPropagateConstant.cs
@@ -37,7 +37,7 @@ public override void Transform(Context context, TransformContext transformContex
}
}
- context.SetInstruction(IRInstruction.Nop);
+ context.SetNop();
}
}
}
diff --git a/Source/Mosa.Compiler.Framework/Transform/Manual/Special/MoveR4Propagate.cs b/Source/Mosa.Compiler.Framework/Transform/Manual/Special/MoveR4Propagate.cs
index 6ef3841c3e..bf01f6e8d6 100644
--- a/Source/Mosa.Compiler.Framework/Transform/Manual/Special/MoveR4Propagate.cs
+++ b/Source/Mosa.Compiler.Framework/Transform/Manual/Special/MoveR4Propagate.cs
@@ -37,7 +37,7 @@ public override void Transform(Context context, TransformContext transformContex
}
}
- context.SetInstruction(IRInstruction.Nop);
+ context.SetNop();
}
}
}
diff --git a/Source/Mosa.Compiler.Framework/Transform/Manual/Special/MoveR8Propagate.cs b/Source/Mosa.Compiler.Framework/Transform/Manual/Special/MoveR8Propagate.cs
index f62492e6d6..5592e05317 100644
--- a/Source/Mosa.Compiler.Framework/Transform/Manual/Special/MoveR8Propagate.cs
+++ b/Source/Mosa.Compiler.Framework/Transform/Manual/Special/MoveR8Propagate.cs
@@ -37,7 +37,7 @@ public override void Transform(Context context, TransformContext transformContex
}
}
- context.SetInstruction(IRInstruction.Nop);
+ context.SetNop();
}
}
}
diff --git a/Source/Mosa.Compiler.Framework/Transform/Manual/Special/Phi32Dead.cs b/Source/Mosa.Compiler.Framework/Transform/Manual/Special/Phi32Dead.cs
index 128691ea87..220df18117 100644
--- a/Source/Mosa.Compiler.Framework/Transform/Manual/Special/Phi32Dead.cs
+++ b/Source/Mosa.Compiler.Framework/Transform/Manual/Special/Phi32Dead.cs
@@ -27,7 +27,7 @@ public override bool Match(Context context, TransformContext transformContext)
public override void Transform(Context context, TransformContext transformContext)
{
- context.SetInstruction(IRInstruction.Nop);
+ context.SetNop();
}
}
}
diff --git a/Source/Mosa.Compiler.Framework/Transform/Manual/Special/Phi32Propagate.cs b/Source/Mosa.Compiler.Framework/Transform/Manual/Special/Phi32Propagate.cs
index bf416f493e..85bd0cf599 100644
--- a/Source/Mosa.Compiler.Framework/Transform/Manual/Special/Phi32Propagate.cs
+++ b/Source/Mosa.Compiler.Framework/Transform/Manual/Special/Phi32Propagate.cs
@@ -42,7 +42,7 @@ public override void Transform(Context context, TransformContext transformContex
}
}
- context.SetInstruction(IRInstruction.Nop);
+ context.SetNop();
}
}
}
diff --git a/Source/Mosa.Compiler.Framework/Transform/Manual/Special/Phi64Dead.cs b/Source/Mosa.Compiler.Framework/Transform/Manual/Special/Phi64Dead.cs
index 6630ae9e0a..871ec8f0ce 100644
--- a/Source/Mosa.Compiler.Framework/Transform/Manual/Special/Phi64Dead.cs
+++ b/Source/Mosa.Compiler.Framework/Transform/Manual/Special/Phi64Dead.cs
@@ -27,7 +27,7 @@ public override bool Match(Context context, TransformContext transformContext)
public override void Transform(Context context, TransformContext transformContext)
{
- context.SetInstruction(IRInstruction.Nop);
+ context.SetNop();
}
}
}
diff --git a/Source/Mosa.Compiler.Framework/Transform/Manual/Special/Phi64Propagate.cs b/Source/Mosa.Compiler.Framework/Transform/Manual/Special/Phi64Propagate.cs
index 51ce632e61..2f33a7212d 100644
--- a/Source/Mosa.Compiler.Framework/Transform/Manual/Special/Phi64Propagate.cs
+++ b/Source/Mosa.Compiler.Framework/Transform/Manual/Special/Phi64Propagate.cs
@@ -42,7 +42,7 @@ public override void Transform(Context context, TransformContext transformContex
}
}
- context.SetInstruction(IRInstruction.Nop);
+ context.SetNop();
}
}
}
diff --git a/Source/Mosa.Compiler.Framework/Transform/Manual/Special/PhiObjectPropagate.cs b/Source/Mosa.Compiler.Framework/Transform/Manual/Special/PhiObjectPropagate.cs
index 6cb402e19a..b1f6187078 100644
--- a/Source/Mosa.Compiler.Framework/Transform/Manual/Special/PhiObjectPropagate.cs
+++ b/Source/Mosa.Compiler.Framework/Transform/Manual/Special/PhiObjectPropagate.cs
@@ -42,7 +42,7 @@ public override void Transform(Context context, TransformContext transformContex
}
}
- context.SetInstruction(IRInstruction.Nop);
+ context.SetNop();
}
}
}
diff --git a/Source/Mosa.Compiler.Framework/Transform/Manual/Special/PhiR4Dead.cs b/Source/Mosa.Compiler.Framework/Transform/Manual/Special/PhiR4Dead.cs
index eba08247f6..d168558a05 100644
--- a/Source/Mosa.Compiler.Framework/Transform/Manual/Special/PhiR4Dead.cs
+++ b/Source/Mosa.Compiler.Framework/Transform/Manual/Special/PhiR4Dead.cs
@@ -27,7 +27,7 @@ public override bool Match(Context context, TransformContext transformContext)
public override void Transform(Context context, TransformContext transformContext)
{
- context.SetInstruction(IRInstruction.Nop);
+ context.SetNop();
}
}
}
diff --git a/Source/Mosa.Compiler.Framework/Transform/Manual/Special/PhiR4Propagate.cs b/Source/Mosa.Compiler.Framework/Transform/Manual/Special/PhiR4Propagate.cs
index f1b8bea3fc..6fe9e26ebd 100644
--- a/Source/Mosa.Compiler.Framework/Transform/Manual/Special/PhiR4Propagate.cs
+++ b/Source/Mosa.Compiler.Framework/Transform/Manual/Special/PhiR4Propagate.cs
@@ -42,7 +42,7 @@ public override void Transform(Context context, TransformContext transformContex
}
}
- context.SetInstruction(IRInstruction.Nop);
+ context.SetNop();
}
}
}
diff --git a/Source/Mosa.Compiler.Framework/Transform/Manual/Special/PhiR8Dead.cs b/Source/Mosa.Compiler.Framework/Transform/Manual/Special/PhiR8Dead.cs
index de5ffa293f..61d6a29f77 100644
--- a/Source/Mosa.Compiler.Framework/Transform/Manual/Special/PhiR8Dead.cs
+++ b/Source/Mosa.Compiler.Framework/Transform/Manual/Special/PhiR8Dead.cs
@@ -27,7 +27,7 @@ public override bool Match(Context context, TransformContext transformContext)
public override void Transform(Context context, TransformContext transformContext)
{
- context.SetInstruction(IRInstruction.Nop);
+ context.SetNop();
}
}
}
diff --git a/Source/Mosa.Compiler.Framework/Transform/Manual/Special/PhiR8Propagate.cs b/Source/Mosa.Compiler.Framework/Transform/Manual/Special/PhiR8Propagate.cs
index 313ef4b8b9..c9a759dd5a 100644
--- a/Source/Mosa.Compiler.Framework/Transform/Manual/Special/PhiR8Propagate.cs
+++ b/Source/Mosa.Compiler.Framework/Transform/Manual/Special/PhiR8Propagate.cs
@@ -42,7 +42,7 @@ public override void Transform(Context context, TransformContext transformContex
}
}
- context.SetInstruction(IRInstruction.Nop);
+ context.SetNop();
}
}
}
diff --git a/Source/Mosa.Platform.x86/Instructions/Dec32.cs b/Source/Mosa.Platform.x86/Instructions/Dec32.cs
index bfdde85079..39286cacb0 100644
--- a/Source/Mosa.Platform.x86/Instructions/Dec32.cs
+++ b/Source/Mosa.Platform.x86/Instructions/Dec32.cs
@@ -13,7 +13,7 @@ namespace Mosa.Platform.x86.Instructions
public sealed class Dec32 : X86Instruction
{
internal Dec32()
- : base(1, 2)
+ : base(1, 1)
{
}
@@ -30,7 +30,7 @@ internal Dec32()
public override void Emit(InstructionNode node, OpcodeEncoder opcodeEncoder)
{
System.Diagnostics.Debug.Assert(node.ResultCount == 1);
- System.Diagnostics.Debug.Assert(node.OperandCount == 2);
+ System.Diagnostics.Debug.Assert(node.OperandCount == 1);
System.Diagnostics.Debug.Assert(node.Result.IsCPURegister);
System.Diagnostics.Debug.Assert(node.Operand1.IsCPURegister);
System.Diagnostics.Debug.Assert(node.Result.Register == node.Operand1.Register);
diff --git a/Source/Mosa.Platform.x86/Instructions/Inc32.cs b/Source/Mosa.Platform.x86/Instructions/Inc32.cs
index 195e5f80e3..acdefff227 100644
--- a/Source/Mosa.Platform.x86/Instructions/Inc32.cs
+++ b/Source/Mosa.Platform.x86/Instructions/Inc32.cs
@@ -13,7 +13,7 @@ namespace Mosa.Platform.x86.Instructions
public sealed class Inc32 : X86Instruction
{
internal Inc32()
- : base(1, 2)
+ : base(1, 1)
{
}
@@ -28,7 +28,7 @@ internal Inc32()
public override void Emit(InstructionNode node, OpcodeEncoder opcodeEncoder)
{
System.Diagnostics.Debug.Assert(node.ResultCount == 1);
- System.Diagnostics.Debug.Assert(node.OperandCount == 2);
+ System.Diagnostics.Debug.Assert(node.OperandCount == 1);
opcodeEncoder.Append4Bits(0b0100);
opcodeEncoder.Append1Bit(0b0);
diff --git a/Source/Mosa.Platform.x86/Stages/EarlyOptimizationStage.cs b/Source/Mosa.Platform.x86/Stages/EarlyOptimizationStage.cs
index 4b757a21ec..78411c9fb0 100644
--- a/Source/Mosa.Platform.x86/Stages/EarlyOptimizationStage.cs
+++ b/Source/Mosa.Platform.x86/Stages/EarlyOptimizationStage.cs
@@ -1,8 +1,6 @@
// Copyright (c) MOSA Project. Licensed under the New BSD License.
using Mosa.Compiler.Framework.Stages;
-using Mosa.Platform.x86.Transform.Manual;
-using Mosa.Platform.x86.Transform.Manual.Special;
namespace Mosa.Platform.x86.Stages
{
@@ -12,22 +10,24 @@ namespace Mosa.Platform.x86.Stages
///
public sealed class EarlyOptimizationStage : BaseOptimizationStage
{
- public override string Name { get { return "X86." + GetType().Name; } }
+ public override string Name { get { return "x86." + GetType().Name; } }
public EarlyOptimizationStage()
: base(false)
{
//AddTranformations(AutoTransforms.List);
- AddTranformation(new Deadcode());
+ AddTranformation(new Transform.Manual.Special.Deadcode());
- //AddTranformation(new Add32ToInc32());
- //AddTranformation(new Sub32ToDec32());
+ AddTranformation(new Transform.Manual.Add32ToInc32());
+ AddTranformation(new Transform.Manual.Sub32ToDec32());
- AddTranformation(new Add32ToLea32());
- AddTranformation(new Sub32ToLea32());
+ AddTranformation(new Transform.Manual.Add32ToLea32());
+ AddTranformation(new Transform.Manual.Sub32ToLea32());
- //AddTranformation(new Mov32Propagate());
+ //AddTranformation(new Transform.Manual.Special.Mov32Propagate());
+
+ AddTranformation(new Transform.Manual.Stack.Add32());
}
protected override void CustomizeTransformationContract()
diff --git a/Source/Mosa.Platform.x86/Stages/PostOptimizationStage.cs b/Source/Mosa.Platform.x86/Stages/PostOptimizationStage.cs
index 551209e57f..3d1bb77e73 100644
--- a/Source/Mosa.Platform.x86/Stages/PostOptimizationStage.cs
+++ b/Source/Mosa.Platform.x86/Stages/PostOptimizationStage.cs
@@ -1,8 +1,6 @@
// Copyright (c) MOSA Project. Licensed under the New BSD License.
using Mosa.Compiler.Framework.Stages;
-using Mosa.Platform.x86.Transform.Manual;
-using Mosa.Platform.x86.Transform.Manual.Special;
namespace Mosa.Platform.x86.Stages
{
@@ -12,17 +10,18 @@ namespace Mosa.Platform.x86.Stages
///
public sealed class PostOptimizationStage : BaseOptimizationStage
{
- public override string Name { get { return "X86." + GetType().Name; } }
+ public override string Name { get { return "x86." + GetType().Name; } }
public PostOptimizationStage()
: base(false)
{
//AddTranformations(AutoTransforms.List);
- //AddTranformation(new Add32ToInc32());
+ AddTranformation(new Transform.Manual.Special.Deadcode());
+ AddTranformation(new Transform.Manual.Mov32ToXor32());
- AddTranformation(new Deadcode());
- AddTranformation(new Mov32ToXor32());
+ AddTranformation(new Transform.Manual.Add32ToInc32());
+ AddTranformation(new Transform.Manual.Sub32ToDec32());
}
protected override void CustomizeTransformationContract()
diff --git a/Source/Mosa.Platform.x86/Transform/Manual/Add32ToInc32.cs b/Source/Mosa.Platform.x86/Transform/Manual/Add32ToInc32.cs
index 10fbd3954f..f64bcab3a3 100644
--- a/Source/Mosa.Platform.x86/Transform/Manual/Add32ToInc32.cs
+++ b/Source/Mosa.Platform.x86/Transform/Manual/Add32ToInc32.cs
@@ -7,9 +7,6 @@
namespace Mosa.Platform.x86.Transform.Manual
{
- ///
- /// Inc32
- ///
public sealed class Add32ToInc32 : BaseTransformation
{
public Add32ToInc32() : base(X86.Add32, true)
@@ -24,7 +21,10 @@ public override bool Match(Context context, TransformContext transformContext)
if (context.Operand2.ConstantUnsigned64 != 1)
return false;
- if (!(AreStatusFlagsUsed(context.Node.Next, true, false, true, true, true) == TriState.No))
+ if (context.Operand1 != context.Result)
+ return false;
+
+ if (!(AreStatusFlagsUsed(context.Node.Next, false, true, false, false, false) == TriState.No))
return false;
return true;
@@ -36,7 +36,7 @@ public override void Transform(Context context, TransformContext transformContex
var t1 = context.Operand1;
- context.SetInstruction(X86.Inc32, result, t1, t1);
+ context.SetInstruction(X86.Inc32, result, t1);
}
}
}
diff --git a/Source/Mosa.Platform.x86/Transform/Manual/Add32ToLea32.cs b/Source/Mosa.Platform.x86/Transform/Manual/Add32ToLea32.cs
index 7514625481..f9c31b02fb 100644
--- a/Source/Mosa.Platform.x86/Transform/Manual/Add32ToLea32.cs
+++ b/Source/Mosa.Platform.x86/Transform/Manual/Add32ToLea32.cs
@@ -25,6 +25,9 @@ public override bool Match(Context context, TransformContext transformContext)
if (context.Operand2.IsCPURegister)
return false;
+ if (context.Operand2.IsResolvedConstant && context.Operand2.ConstantUnsigned64 == 1 && context.Operand1 == context.Result)
+ return false;
+
if (!(AreStatusFlagsUsed(context.Node) == TriState.No))
return false;
diff --git a/Source/Mosa.Platform.x86/Transform/Manual/Stack/Add32.cs b/Source/Mosa.Platform.x86/Transform/Manual/Stack/Add32.cs
new file mode 100644
index 0000000000..49d8508e99
--- /dev/null
+++ b/Source/Mosa.Platform.x86/Transform/Manual/Stack/Add32.cs
@@ -0,0 +1,72 @@
+// Copyright (c) MOSA Project. Licensed under the New BSD License.
+
+// This code was generated by an automated template.
+
+using Mosa.Compiler.Framework;
+using Mosa.Compiler.Framework.Transform;
+using Mosa.Platform.Intel;
+using System.Diagnostics;
+
+namespace Mosa.Platform.x86.Transform.Manual.Stack
+{
+ ///
+ /// Add32
+ ///
+ public sealed class Add32 : BaseTransformation
+ {
+ public Add32() : base(X86.Add32, true)
+ {
+ }
+
+ public override bool Match(Context context, TransformContext transformContext)
+ {
+ if (!context.Operand1.IsCPURegister)
+ return false;
+
+ if (context.Operand1.Register != GeneralPurposeRegister.ESP)
+ return false;
+
+ if (!context.Operand2.IsConstant)
+ return false;
+
+ var next = GetNextNode(context);
+
+ if (next == null)
+ return false;
+
+ if (next.Instruction != X86.Sub32)
+ return false;
+
+ if (!next.Operand2.IsConstant)
+ return false;
+
+ return true;
+ }
+
+ public override void Transform(Context context, TransformContext transformContext)
+ {
+ var next = GetNextNode(context);
+
+ var value1 = context.Operand2.ConstantSigned32;
+ var value2 = next.Operand2.ConstantSigned32;
+
+ var value = value1 - value2;
+
+ next.SetNop();
+
+ if (value > 0)
+ {
+ context.SetInstruction(X86.Add32, context.Result, context.Operand1, transformContext.CreateConstant(value));
+ }
+ else if (value < 0)
+ {
+ context.SetInstruction(X86.Sub32, context.Result, context.Operand1, transformContext.CreateConstant(-value));
+ }
+ else // if (value == 0)
+ {
+ Debug.Assert(value == 0);
+ context.SetNop();
+ }
+ }
+ }
+}
diff --git a/Source/Mosa.Platform.x86/Transform/Manual/Sub32ToDec32.cs b/Source/Mosa.Platform.x86/Transform/Manual/Sub32ToDec32.cs
index 899e2836f5..54242253f0 100644
--- a/Source/Mosa.Platform.x86/Transform/Manual/Sub32ToDec32.cs
+++ b/Source/Mosa.Platform.x86/Transform/Manual/Sub32ToDec32.cs
@@ -7,9 +7,6 @@
namespace Mosa.Platform.x86.Transform.Manual
{
- ///
- /// Dec32
- ///
public sealed class Sub32ToDec32 : BaseTransformation
{
public Sub32ToDec32() : base(X86.Sub32, true)
@@ -24,7 +21,13 @@ public override bool Match(Context context, TransformContext transformContext)
if (context.Operand2.ConstantUnsigned64 != 1)
return false;
- if (!(AreStatusFlagsUsed(context.Node.Next, true, false, true, true, true) == TriState.No))
+ if (context.Operand1.IsCPURegister)
+ return false;
+
+ if (context.Operand1 != context.Result)
+ return false;
+
+ if (!(AreStatusFlagsUsed(context.Node.Next, false, true, false, false, false) == TriState.No))
return false;
return true;
@@ -36,7 +39,7 @@ public override void Transform(Context context, TransformContext transformContex
var t1 = context.Operand1;
- context.SetInstruction(X86.Dec32, result, t1, t1);
+ context.SetInstruction(X86.Dec32, result, t1);
}
}
}
diff --git a/Source/Mosa.Platform.x86/Transform/Manual/Sub32ToLea32.cs b/Source/Mosa.Platform.x86/Transform/Manual/Sub32ToLea32.cs
index b82ae0ce58..4fe96bec51 100644
--- a/Source/Mosa.Platform.x86/Transform/Manual/Sub32ToLea32.cs
+++ b/Source/Mosa.Platform.x86/Transform/Manual/Sub32ToLea32.cs
@@ -25,6 +25,9 @@ public override bool Match(Context context, TransformContext transformContext)
if (!context.Operand2.IsResolvedConstant)
return false;
+ if (context.Operand2.IsResolvedConstant && context.Operand2.ConstantUnsigned64 == 1 && context.Operand1 == context.Result)
+ return false;
+
if (!(AreStatusFlagsUsed(context.Node) == TriState.No))
return false;
diff --git a/Source/Mosa.UnitTests/SpecificTests.cs b/Source/Mosa.UnitTests/SpecificTests.cs
index 89a17cb38c..f10e30379e 100644
--- a/Source/Mosa.UnitTests/SpecificTests.cs
+++ b/Source/Mosa.UnitTests/SpecificTests.cs
@@ -4,6 +4,18 @@ namespace Mosa.UnitTests
{
public static class SpecificTests
{
+ [MosaUnitTest(Series = "I4")]
+ public static int IncBy1(int a)
+ {
+ return a + 1;
+ }
+
+ [MosaUnitTest(Series = "I4")]
+ public static int DecBy1(int a)
+ {
+ return a - 1;
+ }
+
[MosaUnitTest((byte)0)]
[MosaUnitTest((byte)1)]
[MosaUnitTest((byte)2)]