language feature: Extension Members: CPU-related, enums

This commit is contained in:
GreemDev 2025-07-02 02:03:59 -05:00
parent 203a759775
commit 99cbfc3822
16 changed files with 40 additions and 47 deletions

View file

@ -25,9 +25,9 @@ namespace ARMeilleure.CodeGen.Arm64
static class ComparisonArm64Extensions static class ComparisonArm64Extensions
{ {
public static ArmCondition ToArmCondition(this Comparison comp) extension(Comparison comparison)
{ {
return comp switch public ArmCondition Arm => comparison switch
{ {
#pragma warning disable IDE0055 // Disable formatting #pragma warning disable IDE0055 // Disable formatting
Comparison.Equal => ArmCondition.Eq, Comparison.Equal => ArmCondition.Eq,
@ -42,7 +42,7 @@ namespace ARMeilleure.CodeGen.Arm64
Comparison.LessUI => ArmCondition.LtUn, Comparison.LessUI => ArmCondition.LtUn,
#pragma warning restore IDE0055 #pragma warning restore IDE0055
_ => throw new ArgumentException(null, nameof(comp)), _ => throw new ArgumentException(null, nameof(comparison))
}; };
} }
} }

View file

@ -322,7 +322,7 @@ namespace ARMeilleure.CodeGen.Arm64
Debug.Assert(comp.Kind == OperandKind.Constant); Debug.Assert(comp.Kind == OperandKind.Constant);
ArmCondition cond = ((Comparison)comp.AsInt32()).ToArmCondition(); ArmCondition cond = ((Comparison)comp.AsInt32()).Arm;
GenerateCompareCommon(context, operation); GenerateCompareCommon(context, operation);
@ -354,7 +354,7 @@ namespace ARMeilleure.CodeGen.Arm64
Debug.Assert(dest.Type == OperandType.I32); Debug.Assert(dest.Type == OperandType.I32);
Debug.Assert(comp.Kind == OperandKind.Constant); Debug.Assert(comp.Kind == OperandKind.Constant);
ArmCondition cond = ((Comparison)comp.AsInt32()).ToArmCondition(); ArmCondition cond = ((Comparison)comp.AsInt32()).Arm;
GenerateCompareCommon(context, operation); GenerateCompareCommon(context, operation);

View file

@ -51,7 +51,7 @@ namespace ARMeilleure.CodeGen.Optimizations
if (trueSucc == block.ListNext) if (trueSucc == block.ListNext)
{ {
Comparison comp = (Comparison)branchOp.GetSource(2).AsInt32(); Comparison comp = (Comparison)branchOp.GetSource(2).AsInt32();
Comparison compInv = comp.Invert(); Comparison compInv = comp.Inverse;
branchOp.SetSource(2, Const((int)compInv)); branchOp.SetSource(2, Const((int)compInv));

View file

@ -161,7 +161,7 @@ namespace ARMeilleure.CodeGen.Optimizations
} }
else if (otherCompType == Comparison.Equal) else if (otherCompType == Comparison.Equal)
{ {
propCompType = compType.Invert(); propCompType = compType.Inverse;
} }
else else
{ {

View file

@ -623,7 +623,7 @@ namespace ARMeilleure.CodeGen.X86
Debug.Assert(comp.Kind == OperandKind.Constant); Debug.Assert(comp.Kind == OperandKind.Constant);
X86Condition cond = ((Comparison)comp.AsInt32()).ToX86Condition(); X86Condition cond = ((Comparison)comp.AsInt32()).X86;
GenerateCompareCommon(context, operation); GenerateCompareCommon(context, operation);
@ -661,7 +661,7 @@ namespace ARMeilleure.CodeGen.X86
Debug.Assert(dest.Type == OperandType.I32); Debug.Assert(dest.Type == OperandType.I32);
Debug.Assert(comp.Kind == OperandKind.Constant); Debug.Assert(comp.Kind == OperandKind.Constant);
X86Condition cond = ((Comparison)comp.AsInt32()).ToX86Condition(); X86Condition cond = ((Comparison)comp.AsInt32()).X86;
GenerateCompareCommon(context, operation); GenerateCompareCommon(context, operation);

View file

@ -25,9 +25,9 @@ namespace ARMeilleure.CodeGen.X86
static class ComparisonX86Extensions static class ComparisonX86Extensions
{ {
public static X86Condition ToX86Condition(this Comparison comp) extension(Comparison comparison)
{ {
return comp switch public X86Condition X86 => comparison switch
{ {
#pragma warning disable IDE0055 // Disable formatting #pragma warning disable IDE0055 // Disable formatting
Comparison.Equal => X86Condition.Equal, Comparison.Equal => X86Condition.Equal,
@ -42,7 +42,7 @@ namespace ARMeilleure.CodeGen.X86
Comparison.LessUI => X86Condition.Below, Comparison.LessUI => X86Condition.Below,
#pragma warning restore IDE0055 #pragma warning restore IDE0055
_ => throw new ArgumentException(null, nameof(comp)), _ => throw new ArgumentException(null, nameof(comparison))
}; };
} }
} }

View file

@ -22,11 +22,11 @@ namespace ARMeilleure.Decoders
static class ConditionExtensions static class ConditionExtensions
{ {
public static Condition Invert(this Condition cond) extension(Condition condition)
{ {
// Bit 0 of all conditions is basically a negation bit, so // Bit 0 of all conditions is basically a negation bit, so
// inverting this bit has the effect of inverting the condition. // inverting this bit has the effect of inverting the condition.
return (Condition)((int)cond ^ 1); public Condition Inverse => (Condition)((int)condition ^ 1);
} }
} }
} }

View file

@ -157,7 +157,7 @@ namespace ARMeilleure.Instructions
context.Copy(temp, value); context.Copy(temp, value);
if (!context.Memory.Type.IsHostMappedOrTracked()) if (!context.Memory.Type.IsHostMappedOrTracked)
{ {
context.Branch(lblEnd); context.Branch(lblEnd);
@ -198,7 +198,7 @@ namespace ARMeilleure.Instructions
SetInt(context, rt, value); SetInt(context, rt, value);
if (!context.Memory.Type.IsHostMappedOrTracked()) if (!context.Memory.Type.IsHostMappedOrTracked)
{ {
context.Branch(lblEnd); context.Branch(lblEnd);
@ -265,7 +265,7 @@ namespace ARMeilleure.Instructions
context.Copy(GetVec(rt), value); context.Copy(GetVec(rt), value);
if (!context.Memory.Type.IsHostMappedOrTracked()) if (!context.Memory.Type.IsHostMappedOrTracked)
{ {
context.Branch(lblEnd); context.Branch(lblEnd);
@ -312,7 +312,7 @@ namespace ARMeilleure.Instructions
break; break;
} }
if (!context.Memory.Type.IsHostMappedOrTracked()) if (!context.Memory.Type.IsHostMappedOrTracked)
{ {
context.Branch(lblEnd); context.Branch(lblEnd);
@ -385,7 +385,7 @@ namespace ARMeilleure.Instructions
break; break;
} }
if (!context.Memory.Type.IsHostMappedOrTracked()) if (!context.Memory.Type.IsHostMappedOrTracked)
{ {
context.Branch(lblEnd); context.Branch(lblEnd);
@ -399,11 +399,11 @@ namespace ARMeilleure.Instructions
public static Operand EmitPtPointerLoad(ArmEmitterContext context, Operand address, Operand lblSlowPath, bool write, int size) public static Operand EmitPtPointerLoad(ArmEmitterContext context, Operand address, Operand lblSlowPath, bool write, int size)
{ {
if (context.Memory.Type.IsHostMapped()) if (context.Memory.Type.IsHostMapped)
{ {
return EmitHostMappedPointer(context, address); return EmitHostMappedPointer(context, address);
} }
else if (context.Memory.Type.IsHostTracked()) else if (context.Memory.Type.IsHostTracked)
{ {
if (address.Type == OperandType.I32) if (address.Type == OperandType.I32)
{ {

View file

@ -16,9 +16,9 @@ namespace ARMeilleure.IntermediateRepresentation
static class ComparisonExtensions static class ComparisonExtensions
{ {
public static Comparison Invert(this Comparison comp) extension(Comparison comparison)
{ {
return (Comparison)((int)comp ^ 1); public Comparison Inverse => (Comparison)((int)comparison ^ 1);
} }
} }
} }

View file

@ -45,19 +45,12 @@ namespace ARMeilleure.Memory
public static class MemoryManagerTypeExtensions public static class MemoryManagerTypeExtensions
{ {
public static bool IsHostMapped(this MemoryManagerType type) extension(MemoryManagerType type)
{ {
return type is MemoryManagerType.HostMapped or MemoryManagerType.HostMappedUnsafe; public bool IsHostMapped => type is MemoryManagerType.HostMapped or MemoryManagerType.HostMappedUnsafe;
} public bool IsHostTracked => type is MemoryManagerType.HostTracked or MemoryManagerType.HostTrackedUnsafe;
public static bool IsHostTracked(this MemoryManagerType type) public bool IsHostMappedOrTracked => type.IsHostMapped || type.IsHostTracked;
{
return type is MemoryManagerType.HostTracked or MemoryManagerType.HostTrackedUnsafe;
}
public static bool IsHostMappedOrTracked(this MemoryManagerType type)
{
return type.IsHostMapped() || type.IsHostTracked();
} }
} }
} }

View file

@ -368,7 +368,7 @@ namespace ARMeilleure.Translation
if (block.Exit) if (block.Exit)
{ {
// Left option here as it may be useful if we need to return to managed rather than tail call in // Left option here as it may be useful if we need to return to managed rather than tail call in
// future. (eg. for debug) // the future. (eg. for debug)
bool useReturns = false; bool useReturns = false;
InstEmitFlowHelper.EmitVirtualJump(context, Const(block.Address), isReturn: useReturns); InstEmitFlowHelper.EmitVirtualJump(context, Const(block.Address), isReturn: useReturns);
@ -387,7 +387,7 @@ namespace ARMeilleure.Translation
{ {
context.SyncQcFlag(); context.SyncQcFlag();
if (block.Branch != null && !block.Branch.Exit && block.Branch.Address <= block.Address) if (block.Branch is { Exit: false } && block.Branch.Address <= block.Address)
{ {
EmitSynchronization(context); EmitSynchronization(context);
} }
@ -399,14 +399,14 @@ namespace ARMeilleure.Translation
{ {
lblPredicateSkip = Label(); lblPredicateSkip = Label();
InstEmitFlowHelper.EmitCondBranch(context, lblPredicateSkip, context.CurrentIfThenBlockCond.Invert()); InstEmitFlowHelper.EmitCondBranch(context, lblPredicateSkip, context.CurrentIfThenBlockCond.Inverse);
} }
if (opCode is OpCode32 op && op.Cond < Condition.Al) if (opCode is OpCode32 { Cond: < Condition.Al } op)
{ {
lblPredicateSkip = Label(); lblPredicateSkip = Label();
InstEmitFlowHelper.EmitCondBranch(context, lblPredicateSkip, op.Cond.Invert()); InstEmitFlowHelper.EmitCondBranch(context, lblPredicateSkip, op.Cond.Inverse);
} }
if (opCode.Instruction.Emitter != null) if (opCode.Instruction.Emitter != null)

View file

@ -17,7 +17,7 @@ namespace Ryujinx.Cpu.Jit
_functionTable = AddressTable<ulong>.CreateForArm(for64Bit, memory.Type); _functionTable = AddressTable<ulong>.CreateForArm(for64Bit, memory.Type);
_translator = new Translator(new JitMemoryAllocator(forJit: true), memory, _functionTable); _translator = new Translator(new JitMemoryAllocator(forJit: true), memory, _functionTable);
if (memory.Type.IsHostMappedOrTracked()) if (memory.Type.IsHostMappedOrTracked)
{ {
NativeSignalHandler.InitializeSignalHandler(); NativeSignalHandler.InitializeSignalHandler();
} }

View file

@ -1129,7 +1129,7 @@ namespace Ryujinx.Cpu.LightningJit.Arm32.Target.Arm64
// We don't need to mask the address for the safe mode, since it is already naturally limited to 32-bit // We don't need to mask the address for the safe mode, since it is already naturally limited to 32-bit
// and can never reach out of the guest address space. // and can never reach out of the guest address space.
if (mmType.IsHostTracked()) if (mmType.IsHostTracked)
{ {
int tempRegister = regAlloc.AllocateTempGprRegister(); int tempRegister = regAlloc.AllocateTempGprRegister();
@ -1141,7 +1141,7 @@ namespace Ryujinx.Cpu.LightningJit.Arm32.Target.Arm64
regAlloc.FreeTempGprRegister(tempRegister); regAlloc.FreeTempGprRegister(tempRegister);
} }
else if (mmType.IsHostMapped()) else if (mmType.IsHostMapped)
{ {
asm.Add(destination64, basePointer, guestAddress); asm.Add(destination64, basePointer, guestAddress);
} }

View file

@ -150,7 +150,7 @@ namespace Ryujinx.Cpu.LightningJit.Arm64
public static int CalculateMaxTemps(MemoryManagerType mmType) public static int CalculateMaxTemps(MemoryManagerType mmType)
{ {
return mmType.IsHostMapped() ? 1 : 2; return mmType.IsHostMapped ? 1 : 2;
} }
public static int CalculateMaxTempsInclFixed(MemoryManagerType mmType) public static int CalculateMaxTempsInclFixed(MemoryManagerType mmType)

View file

@ -544,7 +544,7 @@ namespace Ryujinx.Cpu.LightningJit.Arm64.Target.Arm64
{ {
Operand basePointer = new(regAlloc.FixedPageTableRegister, RegisterType.Integer, OperandType.I64); Operand basePointer = new(regAlloc.FixedPageTableRegister, RegisterType.Integer, OperandType.I64);
if (mmType.IsHostTracked()) if (mmType.IsHostTracked)
{ {
int tempRegister = regAlloc.AllocateTempGprRegister(); int tempRegister = regAlloc.AllocateTempGprRegister();
@ -562,7 +562,7 @@ namespace Ryujinx.Cpu.LightningJit.Arm64.Target.Arm64
regAlloc.FreeTempGprRegister(tempRegister); regAlloc.FreeTempGprRegister(tempRegister);
} }
else if (mmType.IsHostMapped()) else if (mmType.IsHostMapped)
{ {
if (mmType == MemoryManagerType.HostMapped) if (mmType == MemoryManagerType.HostMapped)
{ {

View file

@ -48,7 +48,7 @@ namespace Ryujinx.Cpu.LightningJit
FunctionTable.Fill = (ulong)Stubs.SlowDispatchStub; FunctionTable.Fill = (ulong)Stubs.SlowDispatchStub;
if (memory.Type.IsHostMappedOrTracked()) if (memory.Type.IsHostMappedOrTracked)
{ {
NativeSignalHandler.InitializeSignalHandler(); NativeSignalHandler.InitializeSignalHandler();
} }