Move a few more registers to context
This gets rid of some more absolute addrs in the MIPS dynarec. Tested on several platforms, we should be good.
This commit is contained in:
		
							parent
							
								
									bfc7cc7fdf
								
							
						
					
					
						commit
						46cad2958a
					
				
					 4 changed files with 31 additions and 24 deletions
				
			
		|  | @ -771,6 +771,8 @@ execute_load_builder(u32, 32, ldrne, #0xF0000000) | |||
| .comm memory_map_write 0x8000 | ||||
| .comm palette_ram 0x400 | ||||
| .comm palette_ram_converted 0x400 | ||||
| .comm spsr 24 | ||||
| .comm reg_mode 196 | ||||
| 
 | ||||
| .globl reg
 | ||||
| .globl _reg
 | ||||
|  |  | |||
							
								
								
									
										6
									
								
								cpu.c
									
										
									
									
									
								
							
							
						
						
									
										6
									
								
								cpu.c
									
										
									
									
									
								
							|  | @ -1544,8 +1544,6 @@ const u32 psr_masks[16] = | |||
| // reg_mode[new_mode][6]. When swapping to/from FIQ retire/load reg[8]
 | ||||
| // through reg[14] to/from reg_mode[MODE_FIQ][0] through reg_mode[MODE_FIQ][6].
 | ||||
| 
 | ||||
| u32 reg_mode[7][7]; | ||||
| 
 | ||||
| u32 cpu_modes[32] = | ||||
| { | ||||
|   MODE_INVALID, MODE_INVALID, MODE_INVALID, MODE_INVALID, MODE_INVALID, | ||||
|  | @ -1564,9 +1562,9 @@ u32 cpu_modes_cpsr[7] = { 0x10, 0x11, 0x12, 0x13, 0x17, 0x1B, 0x1F }; | |||
| 
 | ||||
| #ifndef HAVE_DYNAREC | ||||
| u32 reg[64]; | ||||
| #endif | ||||
| 
 | ||||
| u32 spsr[6]; | ||||
| u32 reg_mode[7][7]; | ||||
| #endif | ||||
| 
 | ||||
| // ARM/Thumb mode is stored in the flags directly, this is simpler than
 | ||||
| // shadowing it since it has a constant 1bit represenation.
 | ||||
|  |  | |||
|  | @ -52,8 +52,8 @@ | |||
| .global memory_map_read
 | ||||
| .global memory_map_write
 | ||||
| .global reg
 | ||||
| 
 | ||||
| .extern spsr
 | ||||
| .global spsr
 | ||||
| .global reg_mode
 | ||||
| 
 | ||||
| # MIPS register layout: | ||||
| 
 | ||||
|  | @ -121,8 +121,10 @@ | |||
| .equ COMPLETED_FRAME,     (32 * 4) | ||||
| .equ GP_SAVE,             (33 * 4) | ||||
| 
 | ||||
| .equ SUPERVISOR_LR,       (reg_mode + (3 * (7 * 4)) + (6 * 4)) | ||||
| .equ SUPERVISOR_SPSR,     (spsr + (3 * 4)) | ||||
| .equ SPSR_BASE,           (0x900) | ||||
| .equ REGMODE_BASE,        (0x900 + 24) | ||||
| .equ SUPERVISOR_SPSR,     (3 * 4 + SPSR_BASE) | ||||
| .equ SUPERVISOR_LR,       ((3 * (7 * 4)) + (6 * 4) + REGMODE_BASE) | ||||
| 
 | ||||
| .set noat
 | ||||
| .set noreorder
 | ||||
|  | @ -2558,11 +2560,10 @@ execute_read_cpsr: | |||
| 
 | ||||
| execute_read_spsr: | ||||
|   lw $1, CPU_MODE($16)            # $1 = cpu_mode | ||||
|   lui $2, %hi(spsr) | ||||
|   sll $1, $1, 2                   # adjust to word offset size | ||||
|   addu $2, $2, $1 | ||||
|   addu $2, $1, $16 | ||||
|   jr $ra                          # return | ||||
|   lw $2, %lo(spsr)($2)            # $2 = spsr[cpu_mode] (delay slot) | ||||
|   lw $2, SPSR_BASE($2)            # $2 = spsr[cpu_mode] (delay slot) | ||||
| 
 | ||||
| # Switch into SWI, has to collapse flags | ||||
| # $4: Current pc | ||||
|  | @ -2570,11 +2571,9 @@ execute_read_spsr: | |||
| execute_swi: | ||||
|   add $sp, $sp, -4                # push $ra | ||||
|   sw $ra, ($sp) | ||||
|   lui $1, %hi(SUPERVISOR_LR) | ||||
|   sw $4, %lo(SUPERVISOR_LR)($1)   # store next PC in the supervisor's LR | ||||
|   sw $4, SUPERVISOR_LR($16)       # store next PC in the supervisor's LR | ||||
|   collapse_flags                  # get cpsr in $2 | ||||
|   lui $5, %hi(SUPERVISOR_SPSR) | ||||
|   sw $2, %lo(SUPERVISOR_SPSR)($5) # save cpsr in SUPERVISOR_CPSR | ||||
|   sw $2, SUPERVISOR_SPSR($16)     # save cpsr in SUPERVISOR_CPSR | ||||
|   ins $2, $0, 0, 6                # zero out bottom 6 bits of CPSR | ||||
|   ori $2, 0x13                    # set mode to supervisor | ||||
|   sw $2, REG_CPSR($16)            # write back CPSR | ||||
|  | @ -2593,11 +2592,10 @@ execute_spsr_restore: | |||
|   lw $1, CPU_MODE($16)            # $1 = cpu_mode | ||||
| 
 | ||||
|   beq $1, $0, no_spsr_restore     # only restore if the cpu isn't usermode | ||||
|   lui $2, %hi(spsr)               # start loading SPSR (delay) | ||||
|   sll $2, $1, 2                   # adjust to word offset size (delay) | ||||
| 
 | ||||
|   sll $1, $1, 2                   # adjust to word offset size | ||||
|   addu $2, $2, $1 | ||||
|   lw $1, %lo(spsr)($2)            # $1 = spsr[cpu_mode] | ||||
|   addu $2, $2, $16 | ||||
|   lw $1, SPSR_BASE($2)            # $1 = spsr[cpu_mode] | ||||
|   sw $1, REG_CPSR($16)            # cpsr = spsr[cpu_mode] | ||||
|   extract_flags_body              # extract flags from $1 | ||||
|   addiu $sp, $sp, -4 | ||||
|  | @ -2654,16 +2652,15 @@ changed_pc_cpsr: | |||
| 
 | ||||
| execute_store_spsr: | ||||
|   lw $1, CPU_MODE($16)            # $1 = cpu_mode | ||||
|   lui $2, %hi(spsr) | ||||
|   sll $1, $1, 2                   # adjust to word offset size | ||||
|   addu $1, $2, $1 | ||||
|   lw $2, %lo(spsr)($1)            # $2 = spsr[cpu_mode] | ||||
|   addu $1, $1, $16 | ||||
|   lw $2, SPSR_BASE($1)            # $2 = spsr[cpu_mode] | ||||
|   and $4, $4, $5                  # $4 = new_spsr & store_mask | ||||
|   nor $5, $5, $0                  # $5 = ~store_mask | ||||
|   and $2, $2, $5                  # $2 = (spsr & (~store_mask)) | ||||
|   or $4, $4, $2                   # $4 = new spsr combined with old | ||||
|   jr $ra                          # return | ||||
|   sw $4, %lo(spsr)($1)            # spsr[cpu_mode] = $4 (delay slot) | ||||
|   sw $4, SPSR_BASE($1)            # spsr[cpu_mode] = $4 (delay slot) | ||||
| 
 | ||||
| # $4: value | ||||
| # $5: shift | ||||
|  | @ -2813,7 +2810,10 @@ palette_ram: | |||
|   .space 0x400
 | ||||
| palette_ram_converted: | ||||
|   .space 0x400
 | ||||
| 
 | ||||
| spsr: | ||||
|   .space 24     # u32[6] | ||||
| reg_mode: | ||||
|   .space 196    # u32[7][7];
 | ||||
| 
 | ||||
| memory_map_write: | ||||
|   .space 0x8000
 | ||||
|  |  | |||
|  | @ -31,6 +31,7 @@ | |||
| #define _memory_map_read memory_map_read | ||||
| #define _memory_map_write memory_map_write | ||||
| #define _reg reg | ||||
| #define _reg_mode reg_mode | ||||
| #define _oam_update oam_update | ||||
| #define _iwram iwram | ||||
| #define _ewram ewram | ||||
|  | @ -69,6 +70,8 @@ | |||
| .global _memory_map_read
 | ||||
| .global _memory_map_write
 | ||||
| .global _reg
 | ||||
| .global _reg_mode
 | ||||
| .global _spsr
 | ||||
| .global _palette_ram
 | ||||
| .global _palette_ram_converted
 | ||||
| 
 | ||||
|  | @ -567,6 +570,10 @@ _palette_ram: | |||
|   .space 0x400
 | ||||
| _palette_ram_converted: | ||||
|   .space 0x400
 | ||||
| _spsr: | ||||
|   .space 24
 | ||||
| _reg_mode: | ||||
|   .space 196
 | ||||
| 
 | ||||
| .comm _memory_map_read 0x8000 | ||||
| .comm _memory_map_write 0x8000 | ||||
|  |  | |||
		Loading…
	
	Add table
		
		Reference in a new issue