mirror of
				https://github.com/Ryujinx/Ryujinx.git
				synced 2025-10-24 18:20:31 -07:00 
			
		
		
		
	* Generalize tail continues * Fix DecodeBasicBlock `Next` and `Branch` would be null, which is not the state expected by the branch instructions. They end up branching or falling into a block which is never populated by the `Translator`. This causes an assert to be fired when building the CFG. * Clean up Decode overloads * Do not synchronize when branching into exit block If we're branching into an exit block, that exit block will tail continue into another translation which already has a synchronization. * Remove A32 predicate tail continue If `block` is not an exit block then the `block.Next` must exist (as per the last instruction of `block`). * Throw if decoded 0 blocks Address gdkchan's feedback * Rebuild block list instead of setting to null Address gdkchan's feedback
		
			
				
	
	
		
			84 lines
		
	
	
		
			2.4 KiB
		
	
	
	
		
			C#
		
	
	
	
	
	
			
		
		
	
	
			84 lines
		
	
	
		
			2.4 KiB
		
	
	
	
		
			C#
		
	
	
	
	
	
| using ARMeilleure.Decoders;
 | |
| using ARMeilleure.IntermediateRepresentation;
 | |
| using ARMeilleure.State;
 | |
| using ARMeilleure.Translation;
 | |
| 
 | |
| using static ARMeilleure.Instructions.InstEmitFlowHelper;
 | |
| using static ARMeilleure.Instructions.InstEmitHelper;
 | |
| using static ARMeilleure.IntermediateRepresentation.OperandHelper;
 | |
| 
 | |
| namespace ARMeilleure.Instructions
 | |
| {
 | |
|     static partial class InstEmit32
 | |
|     {
 | |
|         public static void B(ArmEmitterContext context)
 | |
|         {
 | |
|             IOpCode32BImm op = (IOpCode32BImm)context.CurrOp;
 | |
| 
 | |
|             context.Branch(context.GetLabel((ulong)op.Immediate));
 | |
|         }
 | |
| 
 | |
|         public static void Bl(ArmEmitterContext context)
 | |
|         {
 | |
|             Blx(context, x: false);
 | |
|         }
 | |
| 
 | |
|         public static void Blx(ArmEmitterContext context)
 | |
|         {
 | |
|             Blx(context, x: true);
 | |
|         }
 | |
| 
 | |
|         private static void Blx(ArmEmitterContext context, bool x)
 | |
|         {
 | |
|             IOpCode32BImm op = (IOpCode32BImm)context.CurrOp;
 | |
| 
 | |
|             uint pc = op.GetPc();
 | |
| 
 | |
|             bool isThumb = IsThumb(context.CurrOp);
 | |
| 
 | |
|             uint currentPc = isThumb
 | |
|                 ? pc | 1
 | |
|                 : pc - 4;
 | |
| 
 | |
|             SetIntA32(context, GetBankedRegisterAlias(context.Mode, RegisterAlias.Aarch32Lr), Const(currentPc));
 | |
| 
 | |
|             // If x is true, then this is a branch with link and exchange.
 | |
|             // In this case we need to swap the mode between Arm <-> Thumb.
 | |
|             if (x)
 | |
|             {
 | |
|                 SetFlag(context, PState.TFlag, Const(isThumb ? 0 : 1));
 | |
|             }
 | |
| 
 | |
|             EmitCall(context, (ulong)op.Immediate);
 | |
|         }
 | |
| 
 | |
|         public static void Blxr(ArmEmitterContext context)
 | |
|         {
 | |
|             IOpCode32BReg op = (IOpCode32BReg)context.CurrOp;
 | |
| 
 | |
|             uint pc = op.GetPc();
 | |
| 
 | |
|             Operand addr = context.Copy(GetIntA32(context, op.Rm));
 | |
|             Operand bitOne = context.BitwiseAnd(addr, Const(1));
 | |
| 
 | |
|             bool isThumb = IsThumb(context.CurrOp);
 | |
| 
 | |
|             uint currentPc = isThumb
 | |
|                 ? pc | 1
 | |
|                 : pc - 4;
 | |
| 
 | |
|             SetIntA32(context, GetBankedRegisterAlias(context.Mode, RegisterAlias.Aarch32Lr), Const(currentPc));
 | |
| 
 | |
|             SetFlag(context, PState.TFlag, bitOne);
 | |
| 
 | |
|             EmitVirtualCall(context, addr);
 | |
|         }
 | |
| 
 | |
|         public static void Bx(ArmEmitterContext context)
 | |
|         {
 | |
|             IOpCode32BReg op = (IOpCode32BReg)context.CurrOp;
 | |
| 
 | |
|             EmitBxWritePc(context, GetIntA32(context, op.Rm), op.Rm);
 | |
|         }
 | |
|     }
 | |
| } |