Rearrange register layout and exclude useless regs from savestat
This changes the savestate format once again.
This commit is contained in:
		
							parent
							
								
									2d34d91c64
								
							
						
					
					
						commit
						5be5015338
					
				
					 7 changed files with 68 additions and 55 deletions
				
			
		| 
						 | 
				
			
			@ -111,7 +111,6 @@ void execute_store_u32_safe(u32 address, u32 source);
 | 
			
		|||
#define reg_x5         ARMREG_R8
 | 
			
		||||
 | 
			
		||||
#define mem_reg        (~0U)
 | 
			
		||||
#define save1_reg      21
 | 
			
		||||
 | 
			
		||||
/*
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -1462,14 +1461,14 @@ u32 execute_store_cpsr_body(u32 _cpsr, u32 store_mask, u32 address)
 | 
			
		|||
  arm_block_memory_offset_##offset_type();                                    \
 | 
			
		||||
  arm_block_memory_writeback_##access_type(writeback_type);                   \
 | 
			
		||||
  ARM_BIC_REG_IMM(0, reg_s0, reg_s0, 0x03, 0);                                \
 | 
			
		||||
  arm_generate_store_reg(reg_s0, save1_reg);                                  \
 | 
			
		||||
  arm_generate_store_reg(reg_s0, REG_SAVE);                                   \
 | 
			
		||||
                                                                              \
 | 
			
		||||
  for(i = 0; i < 16; i++)                                                     \
 | 
			
		||||
  {                                                                           \
 | 
			
		||||
    if((reg_list >> i) & 0x01)                                                \
 | 
			
		||||
    {                                                                         \
 | 
			
		||||
      cycle_count++;                                                          \
 | 
			
		||||
      arm_generate_load_reg(reg_s0, save1_reg);                               \
 | 
			
		||||
      arm_generate_load_reg(reg_s0, REG_SAVE);                                \
 | 
			
		||||
      generate_add_reg_reg_imm(reg_a0, reg_s0, offset, 0);                    \
 | 
			
		||||
      if(reg_list & ~((2 << i) - 1))                                          \
 | 
			
		||||
      {                                                                       \
 | 
			
		||||
| 
						 | 
				
			
			@ -1735,14 +1734,14 @@ u32 execute_store_cpsr_body(u32 _cpsr, u32 store_mask, u32 address)
 | 
			
		|||
#define thumb_block_memory_extra_down()                                       \
 | 
			
		||||
 | 
			
		||||
#define thumb_block_memory_extra_pop_pc()                                     \
 | 
			
		||||
  thumb_generate_load_reg(reg_s0, save1_reg);                                 \
 | 
			
		||||
  thumb_generate_load_reg(reg_s0, REG_SAVE);                                  \
 | 
			
		||||
  generate_add_reg_reg_imm(reg_a0, reg_s0, (bit_count[reg_list] * 4), 0);     \
 | 
			
		||||
  generate_function_call(execute_load_u32);                                   \
 | 
			
		||||
  write32((pc + 4));                                                          \
 | 
			
		||||
  generate_indirect_branch_cycle_update(thumb)                                \
 | 
			
		||||
 | 
			
		||||
#define thumb_block_memory_extra_push_lr(base_reg)                            \
 | 
			
		||||
  thumb_generate_load_reg(reg_s0, save1_reg);                                 \
 | 
			
		||||
  thumb_generate_load_reg(reg_s0, REG_SAVE);                                  \
 | 
			
		||||
  generate_add_reg_reg_imm(reg_a0, reg_s0, (bit_count[reg_list] * 4), 0);     \
 | 
			
		||||
  thumb_generate_load_reg(reg_a1, REG_LR);                                    \
 | 
			
		||||
  generate_function_call(execute_store_u32_safe)                              \
 | 
			
		||||
| 
						 | 
				
			
			@ -1789,14 +1788,14 @@ u32 execute_store_cpsr_body(u32 _cpsr, u32 store_mask, u32 address)
 | 
			
		|||
  ARM_BIC_REG_IMM(0, reg_s0, reg_s0, 0x03, 0);                                \
 | 
			
		||||
  thumb_block_address_preadjust_##pre_op();                                   \
 | 
			
		||||
  thumb_block_address_postadjust_##post_op(base_reg);                         \
 | 
			
		||||
  thumb_generate_store_reg(reg_s0, save1_reg);                                \
 | 
			
		||||
  thumb_generate_store_reg(reg_s0, REG_SAVE);                                 \
 | 
			
		||||
                                                                              \
 | 
			
		||||
  for(i = 0; i < 8; i++)                                                      \
 | 
			
		||||
  {                                                                           \
 | 
			
		||||
    if((reg_list >> i) & 0x01)                                                \
 | 
			
		||||
    {                                                                         \
 | 
			
		||||
      cycle_count++;                                                          \
 | 
			
		||||
      thumb_generate_load_reg(reg_s0, save1_reg);                             \
 | 
			
		||||
      thumb_generate_load_reg(reg_s0, REG_SAVE);                              \
 | 
			
		||||
      generate_add_reg_reg_imm(reg_a0, reg_s0, offset, 0);                    \
 | 
			
		||||
      if(reg_list & ~((2 << i) - 1))                                          \
 | 
			
		||||
      {                                                                       \
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -36,16 +36,17 @@ _##symbol:
 | 
			
		|||
#define REG_C_FLAG        (18 * 4)
 | 
			
		||||
#define REG_V_FLAG        (19 * 4)
 | 
			
		||||
#define REG_CPSR          (20 * 4)
 | 
			
		||||
#define CPU_MODE          (21 * 4)
 | 
			
		||||
#define CPU_HALT_STATE    (22 * 4)
 | 
			
		||||
 | 
			
		||||
#define REG_SAVE          (21 * 4)
 | 
			
		||||
#define REG_SAVE2         (22 * 4)
 | 
			
		||||
#define REG_SAVE3         (23 * 4)
 | 
			
		||||
 | 
			
		||||
#define CPU_MODE          (29 * 4)
 | 
			
		||||
#define CPU_HALT_STATE    (30 * 4)
 | 
			
		||||
#define CHANGED_PC_STATUS (31 * 4)
 | 
			
		||||
#define COMPLETED_FRAME   (32 * 4)
 | 
			
		||||
#define OAM_UPDATED       (33 * 4)
 | 
			
		||||
#define CHANGED_PC_STATUS (24 * 4)
 | 
			
		||||
#define COMPLETED_FRAME   (25 * 4)
 | 
			
		||||
#define OAM_UPDATED       (26 * 4)
 | 
			
		||||
#define REG_SAVE          (27 * 4)
 | 
			
		||||
#define REG_SAVE2         (28 * 4)
 | 
			
		||||
#define REG_SAVE3         (29 * 4)
 | 
			
		||||
#define REG_SAVE4         (30 * 4)
 | 
			
		||||
#define REG_SAVE5         (31 * 4)
 | 
			
		||||
 | 
			
		||||
#define reg_a0            r0
 | 
			
		||||
#define reg_a1            r1
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
							
								
								
									
										12
									
								
								cpu.c
									
										
									
									
									
								
							
							
						
						
									
										12
									
								
								cpu.c
									
										
									
									
									
								
							| 
						 | 
				
			
			@ -3780,12 +3780,12 @@ void init_cpu(void)
 | 
			
		|||
  reg_mode[MODE_SUPERVISOR][5] = 0x03007FE0;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
#define cpu_savestate_builder(type)   \
 | 
			
		||||
void cpu_##type##_savestate(void)     \
 | 
			
		||||
{                                     \
 | 
			
		||||
  state_mem_##type(reg, 0x100);       \
 | 
			
		||||
  state_mem_##type##_array(spsr);     \
 | 
			
		||||
  state_mem_##type##_array(reg_mode); \
 | 
			
		||||
#define cpu_savestate_builder(type)      \
 | 
			
		||||
void cpu_##type##_savestate(void)        \
 | 
			
		||||
{                                        \
 | 
			
		||||
  state_mem_##type(reg, 4 * REG_IGNORE); \
 | 
			
		||||
  state_mem_##type##_array(spsr);        \
 | 
			
		||||
  state_mem_##type##_array(reg_mode);    \
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
cpu_savestate_builder(read)
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
							
								
								
									
										25
									
								
								cpu.h
									
										
									
									
									
								
							
							
						
						
									
										25
									
								
								cpu.h
									
										
									
									
									
								
							| 
						 | 
				
			
			@ -69,6 +69,7 @@ typedef u16 irq_type;
 | 
			
		|||
 | 
			
		||||
typedef enum
 | 
			
		||||
{
 | 
			
		||||
  // CPU status & registers
 | 
			
		||||
  REG_SP            = 13,
 | 
			
		||||
  REG_LR            = 14,
 | 
			
		||||
  REG_PC            = 15,
 | 
			
		||||
| 
						 | 
				
			
			@ -77,14 +78,22 @@ typedef enum
 | 
			
		|||
  REG_C_FLAG        = 18,
 | 
			
		||||
  REG_V_FLAG        = 19,
 | 
			
		||||
  REG_CPSR          = 20,
 | 
			
		||||
  REG_SAVE          = 21,
 | 
			
		||||
  REG_SAVE2         = 22,
 | 
			
		||||
  REG_SAVE3         = 23,
 | 
			
		||||
  CPU_MODE          = 29,
 | 
			
		||||
  CPU_HALT_STATE    = 30,
 | 
			
		||||
  CHANGED_PC_STATUS = 31,
 | 
			
		||||
  COMPLETED_FRAME   = 32,
 | 
			
		||||
  OAM_UPDATED       = 33
 | 
			
		||||
  CPU_MODE          = 21,
 | 
			
		||||
  CPU_HALT_STATE    = 22,
 | 
			
		||||
  REG_IGNORE        = 23,
 | 
			
		||||
 | 
			
		||||
  // Dynarec signaling and spilling
 | 
			
		||||
  // (Not really part of the CPU state)
 | 
			
		||||
  CHANGED_PC_STATUS = 24,
 | 
			
		||||
  COMPLETED_FRAME   = 25,
 | 
			
		||||
  OAM_UPDATED       = 26,
 | 
			
		||||
  REG_SAVE          = 27,
 | 
			
		||||
  REG_SAVE2         = 28,
 | 
			
		||||
  REG_SAVE3         = 29,
 | 
			
		||||
  REG_SAVE4         = 30,
 | 
			
		||||
  REG_SAVE5         = 31,
 | 
			
		||||
 | 
			
		||||
  REG_MAX           = 64
 | 
			
		||||
} ext_reg_numbers;
 | 
			
		||||
 | 
			
		||||
typedef enum
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -2513,13 +2513,13 @@ u8 swi_hle_handle[256] =
 | 
			
		|||
 | 
			
		||||
 | 
			
		||||
// Register save layout as follows:
 | 
			
		||||
#define ReOff_RegPC    (15*4) // REG_PC
 | 
			
		||||
#define ReOff_CPSR     (20*4) // REG_CPSR
 | 
			
		||||
#define ReOff_SaveR1   (21*4) // 3 save scratch regs
 | 
			
		||||
#define ReOff_SaveR2   (22*4)
 | 
			
		||||
#define ReOff_SaveR3   (23*4)
 | 
			
		||||
#define ReOff_OamUpd   (33*4) // OAM_UPDATED
 | 
			
		||||
#define ReOff_GP_Save  (34*4) // GP_SAVE
 | 
			
		||||
#define ReOff_RegPC    (REG_PC    * 4) // REG_PC
 | 
			
		||||
#define ReOff_CPSR     (REG_CPSR  * 4) // REG_CPSR
 | 
			
		||||
#define ReOff_SaveR1   (REG_SAVE  * 4) // 3 save scratch regs
 | 
			
		||||
#define ReOff_SaveR2   (REG_SAVE2 * 4)
 | 
			
		||||
#define ReOff_SaveR3   (REG_SAVE3 * 4)
 | 
			
		||||
#define ReOff_OamUpd   (OAM_UPDATED*4) // OAM_UPDATED
 | 
			
		||||
#define ReOff_GP_Save  (REG_SAVE4 * 4) // GP_SAVE
 | 
			
		||||
 | 
			
		||||
// Saves all regs to their right slot and loads gp
 | 
			
		||||
#define emit_save_regs(save_a2) {                                             \
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -100,16 +100,17 @@ symbol:
 | 
			
		|||
.equ REG_C_FLAG,          (18 * 4)
 | 
			
		||||
.equ REG_V_FLAG,          (19 * 4)
 | 
			
		||||
.equ REG_CPSR,            (20 * 4)
 | 
			
		||||
.equ REG_SAVE,            (21 * 4)
 | 
			
		||||
.equ REG_SAVE2,           (22 * 4)
 | 
			
		||||
.equ REG_SAVE3,           (23 * 4)
 | 
			
		||||
.equ CPU_MODE,            (29 * 4)
 | 
			
		||||
.equ CPU_HALT_STATE,      (30 * 4)
 | 
			
		||||
.equ CHANGED_PC_STATUS,   (31 * 4)
 | 
			
		||||
.equ COMPLETED_FRAME,     (32 * 4)
 | 
			
		||||
.equ OAM_UPDATED,         (33 * 4)
 | 
			
		||||
.equ GP_SAVE,             (34 * 4)
 | 
			
		||||
.equ GP_SAVE_HI,          (35 * 4)
 | 
			
		||||
.equ CPU_MODE,            (21 * 4)
 | 
			
		||||
.equ CPU_HALT_STATE,      (22 * 4)
 | 
			
		||||
 | 
			
		||||
.equ CHANGED_PC_STATUS,   (24 * 4)
 | 
			
		||||
.equ COMPLETED_FRAME,     (25 * 4)
 | 
			
		||||
.equ OAM_UPDATED,         (26 * 4)
 | 
			
		||||
.equ REG_SAVE,            (27 * 4)
 | 
			
		||||
.equ REG_SAVE2,           (28 * 4)
 | 
			
		||||
.equ REG_SAVE3,           (29 * 4)
 | 
			
		||||
.equ GP_SAVE,             (30 * 4)
 | 
			
		||||
.equ GP_SAVE_HI,          (31 * 4)
 | 
			
		||||
 | 
			
		||||
.equ SPSR_BASE,           (0x100 + 0x400 * 3)
 | 
			
		||||
.equ REGMODE_BASE,        (SPSR_BASE + 24)
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -52,14 +52,17 @@ _##symbol:
 | 
			
		|||
.equ REG_C_FLAG,        (18 * 4)
 | 
			
		||||
.equ REG_V_FLAG,        (19 * 4)
 | 
			
		||||
.equ REG_CPSR,          (20 * 4)
 | 
			
		||||
.equ REG_SAVE,          (21 * 4)
 | 
			
		||||
.equ REG_SAVE2,         (22 * 4)
 | 
			
		||||
.equ REG_SAVE3,         (23 * 4)
 | 
			
		||||
.equ CPU_MODE,          (29 * 4)
 | 
			
		||||
.equ CPU_HALT_STATE,    (30 * 4)
 | 
			
		||||
.equ CHANGED_PC_STATUS, (31 * 4)
 | 
			
		||||
.equ COMPLETED_FRAME,   (32 * 4)
 | 
			
		||||
.equ OAM_UPDATED,       (33 * 4)
 | 
			
		||||
.equ CPU_MODE,          (21 * 4)
 | 
			
		||||
.equ CPU_HALT_STATE,    (22 * 4)
 | 
			
		||||
 | 
			
		||||
.equ CHANGED_PC_STATUS, (24 * 4)
 | 
			
		||||
.equ COMPLETED_FRAME,   (25 * 4)
 | 
			
		||||
.equ OAM_UPDATED,       (26 * 4)
 | 
			
		||||
.equ REG_SAVE,          (27 * 4)
 | 
			
		||||
.equ REG_SAVE2,         (28 * 4)
 | 
			
		||||
.equ REG_SAVE3,         (29 * 4)
 | 
			
		||||
.equ REG_SAVE4,         (30 * 4)
 | 
			
		||||
.equ REG_SAVE5,         (31 * 4)
 | 
			
		||||
 | 
			
		||||
.equ ESTORE_U32_TBL,   -(16 * 4)
 | 
			
		||||
.equ ESTORE_U16_TBL,   -(32 * 4)
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
	Add table
		
		Reference in a new issue