mirror of
				https://github.com/Ryujinx/Ryujinx.git
				synced 2025-10-25 04:32:34 -07:00 
			
		
		
		
	* Implement JIT Arm64 backend * PPTC version bump * Address some feedback from Arm64 JIT PR * Address even more PR feedback * Remove unused IsPageAligned function * Sync Qc flag before calls * Fix comment and remove unused enum * Address riperiperi PR feedback * Delete Breakpoint IR instruction that was only implemented for Arm64
		
			
				
	
	
		
			85 lines
		
	
	
		
			3.0 KiB
		
	
	
	
		
			C#
		
	
	
	
	
	
			
		
		
	
	
			85 lines
		
	
	
		
			3.0 KiB
		
	
	
	
		
			C#
		
	
	
	
	
	
| using ARMeilleure.IntermediateRepresentation;
 | |
| using ARMeilleure.Translation;
 | |
| using System;
 | |
| using System.Runtime.InteropServices;
 | |
| using static ARMeilleure.IntermediateRepresentation.Operand.Factory;
 | |
| 
 | |
| namespace ARMeilleure.Signal
 | |
| {
 | |
|     public struct NativeWriteLoopState
 | |
|     {
 | |
|         public int Running;
 | |
|         public int Error;
 | |
|     }
 | |
| 
 | |
|     public static class TestMethods
 | |
|     {
 | |
|         public delegate bool DebugPartialUnmap();
 | |
|         public delegate int DebugThreadLocalMapGetOrReserve(int threadId, int initialState);
 | |
|         public delegate void DebugNativeWriteLoop(IntPtr nativeWriteLoopPtr, IntPtr writePtr);
 | |
| 
 | |
|         public static DebugPartialUnmap GenerateDebugPartialUnmap()
 | |
|         {
 | |
|             EmitterContext context = new EmitterContext();
 | |
| 
 | |
|             var result = WindowsPartialUnmapHandler.EmitRetryFromAccessViolation(context);
 | |
| 
 | |
|             context.Return(result);
 | |
| 
 | |
|             // Compile and return the function.
 | |
| 
 | |
|             ControlFlowGraph cfg = context.GetControlFlowGraph();
 | |
| 
 | |
|             OperandType[] argTypes = new OperandType[] { OperandType.I64 };
 | |
| 
 | |
|             return Compiler.Compile(cfg, argTypes, OperandType.I32, CompilerOptions.HighCq, RuntimeInformation.ProcessArchitecture).Map<DebugPartialUnmap>();
 | |
|         }
 | |
| 
 | |
|         public static DebugThreadLocalMapGetOrReserve GenerateDebugThreadLocalMapGetOrReserve(IntPtr structPtr)
 | |
|         {
 | |
|             EmitterContext context = new EmitterContext();
 | |
| 
 | |
|             var result = WindowsPartialUnmapHandler.EmitThreadLocalMapIntGetOrReserve(context, structPtr, context.LoadArgument(OperandType.I32, 0), context.LoadArgument(OperandType.I32, 1));
 | |
| 
 | |
|             context.Return(result);
 | |
| 
 | |
|             // Compile and return the function.
 | |
| 
 | |
|             ControlFlowGraph cfg = context.GetControlFlowGraph();
 | |
| 
 | |
|             OperandType[] argTypes = new OperandType[] { OperandType.I64 };
 | |
| 
 | |
|             return Compiler.Compile(cfg, argTypes, OperandType.I32, CompilerOptions.HighCq, RuntimeInformation.ProcessArchitecture).Map<DebugThreadLocalMapGetOrReserve>();
 | |
|         }
 | |
| 
 | |
|         public static DebugNativeWriteLoop GenerateDebugNativeWriteLoop()
 | |
|         {
 | |
|             EmitterContext context = new EmitterContext();
 | |
| 
 | |
|             // Loop a write to the target address until "running" is false.
 | |
| 
 | |
|             Operand structPtr = context.Copy(context.LoadArgument(OperandType.I64, 0));
 | |
|             Operand writePtr = context.Copy(context.LoadArgument(OperandType.I64, 1));
 | |
| 
 | |
|             Operand loopLabel = Label();
 | |
|             context.MarkLabel(loopLabel);
 | |
| 
 | |
|             context.Store(writePtr, Const(12345));
 | |
| 
 | |
|             Operand running = context.Load(OperandType.I32, structPtr);
 | |
| 
 | |
|             context.BranchIfTrue(loopLabel, running);
 | |
| 
 | |
|             context.Return();
 | |
| 
 | |
|             // Compile and return the function.
 | |
| 
 | |
|             ControlFlowGraph cfg = context.GetControlFlowGraph();
 | |
| 
 | |
|             OperandType[] argTypes = new OperandType[] { OperandType.I64 };
 | |
| 
 | |
|             return Compiler.Compile(cfg, argTypes, OperandType.None, CompilerOptions.HighCq, RuntimeInformation.ProcessArchitecture).Map<DebugNativeWriteLoop>();
 | |
|         }
 | |
|     }
 | |
| }
 |