Merge pull request #92 from davidgfnet/master

Minor cleanup in ARM and MIPS
This commit is contained in:
Autechre 2021-02-13 02:01:10 +01:00 committed by GitHub
commit fa74054508
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
4 changed files with 8 additions and 371 deletions

View File

@ -115,7 +115,7 @@ void execute_store_u32_safe(u32 address, u32 source);
#define reg_x4 ARMREG_R7 #define reg_x4 ARMREG_R7
#define reg_x5 ARMREG_R8 #define reg_x5 ARMREG_R8
#define mem_reg -1 #define mem_reg (~0U)
/* /*
@ -157,7 +157,7 @@ r15: 0.091287% (-- 100.000000%)
*/ */
s32 arm_register_allocation[] = u32 arm_register_allocation[] =
{ {
reg_x0, /* GBA r0 */ reg_x0, /* GBA r0 */
reg_x1, /* GBA r1 */ reg_x1, /* GBA r1 */
@ -194,7 +194,7 @@ s32 arm_register_allocation[] =
mem_reg, mem_reg,
}; };
s32 thumb_register_allocation[] = u32 thumb_register_allocation[] =
{ {
reg_x0, /* GBA r0 */ reg_x0, /* GBA r0 */
reg_x1, /* GBA r1 */ reg_x1, /* GBA r1 */
@ -552,7 +552,7 @@ u32 arm_disect_imm_32bit(u32 imm, u32 *stores, u32 *rotations)
\ \
void generate_load_reg(u32 ireg, u32 reg_index) \ void generate_load_reg(u32 ireg, u32 reg_index) \
{ \ { \
s32 load_src = arm_register_allocation[reg_index]; \ u32 load_src = arm_register_allocation[reg_index]; \
if(load_src != mem_reg) \ if(load_src != mem_reg) \
{ \ { \
ARM_MOV_REG_REG(0, ireg, load_src); \ ARM_MOV_REG_REG(0, ireg, load_src); \
@ -565,7 +565,7 @@ u32 arm_disect_imm_32bit(u32 imm, u32 *stores, u32 *rotations)
\ \
void generate_store_reg(u32 ireg, u32 reg_index) \ void generate_store_reg(u32 ireg, u32 reg_index) \
{ \ { \
s32 store_dest = arm_register_allocation[reg_index]; \ u32 store_dest = arm_register_allocation[reg_index]; \
if(store_dest != mem_reg) \ if(store_dest != mem_reg) \
{ \ { \
ARM_MOV_REG_REG(0, store_dest, ireg); \ ARM_MOV_REG_REG(0, store_dest, ireg); \
@ -621,7 +621,7 @@ u32 arm_disect_imm_32bit(u32 imm, u32 *stores, u32 *rotations)
\ \
void generate_load_reg(u32 ireg, u32 reg_index) \ void generate_load_reg(u32 ireg, u32 reg_index) \
{ \ { \
s32 load_src = thumb_register_allocation[reg_index]; \ u32 load_src = thumb_register_allocation[reg_index]; \
if(load_src != mem_reg) \ if(load_src != mem_reg) \
{ \ { \
ARM_MOV_REG_REG(0, ireg, load_src); \ ARM_MOV_REG_REG(0, ireg, load_src); \
@ -634,7 +634,7 @@ u32 arm_disect_imm_32bit(u32 imm, u32 *stores, u32 *rotations)
\ \
void generate_store_reg(u32 ireg, u32 reg_index) \ void generate_store_reg(u32 ireg, u32 reg_index) \
{ \ { \
s32 store_dest = thumb_register_allocation[reg_index]; \ u32 store_dest = thumb_register_allocation[reg_index]; \
if(store_dest != mem_reg) \ if(store_dest != mem_reg) \
{ \ { \
ARM_MOV_REG_REG(0, store_dest, ireg); \ ARM_MOV_REG_REG(0, store_dest, ireg); \

View File

@ -939,31 +939,6 @@ _execute_patch_bios_protect:
str r0, [r1, #-REG_BASE_OFFSET] str r0, [r1, #-REG_BASE_OFFSET]
bx lr bx lr
#define save_reg_scratch(reg) ;\
ldr r2, [reg_base, #(REG_BASE_OFFSET + (reg * 4))] ;\
str r2, [reg_base, #(REG_BASE_OFFSET + (reg * 4) + 128)] ;\
#define restore_reg_scratch(reg) ;\
ldr r2, [reg_base, #(REG_BASE_OFFSET + (reg * 4) + 128)] ;\
str r2, [reg_base, #(REG_BASE_OFFSET + (reg * 4))] ;\
#define scratch_regs_thumb(type) ;\
type##_reg_scratch(0) ;\
type##_reg_scratch(1) ;\
type##_reg_scratch(2) ;\
type##_reg_scratch(3) ;\
type##_reg_scratch(4) ;\
type##_reg_scratch(5) ;\
#define scratch_regs_arm(type) ;\
type##_reg_scratch(0) ;\
type##_reg_scratch(1) ;\
type##_reg_scratch(6) ;\
type##_reg_scratch(9) ;\
type##_reg_scratch(12) ;\
type##_reg_scratch(14) ;\
.pool .pool
.comm memory_map_read 0x8000 .comm memory_map_read 0x8000

View File

@ -1974,64 +1974,6 @@ u32 execute_store_cpsr_body(u32 _cpsr, u32 store_mask, u32 address)
generate_indirect_branch_arm(); \ generate_indirect_branch_arm(); \
} \ } \
#define old_arm_block_memory(access_type, pre_op, post_op, wb, s_bit) \
{ \
arm_decode_block_trans(); \
u32 i; \
u32 offset = 0; \
u32 base_reg = arm_to_mips_reg[rn]; \
\
arm_block_address_preadjust_##pre_op(wb); \
arm_block_address_postadjust_##post_op(); \
\
sprint_##s_bit(access_type, pre_op, post_op, wb); \
\
if((rn == REG_SP) && iwram_stack_optimize) \
{ \
mips_emit_andi(reg_a1, reg_a2, 0x7FFC); \
generate_load_imm(reg_a0, ((u32)(iwram + 0x8000))); \
mips_emit_addu(reg_a1, reg_a1, reg_a0); \
\
for(i = 0; i < 16; i++) \
{ \
if((reg_list >> i) & 0x01) \
{ \
cycle_count++; \
arm_block_memory_sp_##access_type(); \
offset += 4; \
} \
} \
\
arm_block_memory_sp_adjust_pc_##access_type(); \
} \
else \
{ \
mips_emit_ins(reg_a2, reg_zero, 0, 2); \
\
for(i = 0; i < 16; i++) \
{ \
if((reg_list >> i) & 0x01) \
{ \
cycle_count++; \
mips_emit_addiu(reg_a0, reg_a2, offset); \
if(reg_list & ~((2 << i) - 1)) \
{ \
arm_block_memory_##access_type(); \
offset += 4; \
} \
else \
{ \
arm_block_memory_final_##access_type(); \
break; \
} \
} \
} \
\
arm_block_memory_adjust_pc_##access_type(); \
} \
}
// This isn't really a correct implementation, may have to fix later. // This isn't really a correct implementation, may have to fix later.

View File

@ -1319,7 +1319,6 @@ execute_load_open_u16u:
ror $2, $2, 8 # rotate value by 8bits ror $2, $2, 8 # rotate value by 8bits
load_u16_ftable: load_u16_ftable:
# .long execute_load_full_u16
.long execute_load_bios_u16 # 0x00 BIOS .long execute_load_bios_u16 # 0x00 BIOS
.long execute_load_open_u16 # 0x01 open address .long execute_load_open_u16 # 0x01 open address
.long execute_load_ewram_u16 # 0x02 EWRAM .long execute_load_ewram_u16 # 0x02 EWRAM
@ -1333,7 +1332,6 @@ load_u16_ftable:
.long execute_load_gamepakA_u16 # 0x0A gamepak .long execute_load_gamepakA_u16 # 0x0A gamepak
.long execute_load_gamepakB_u16 # 0x0B gamepak .long execute_load_gamepakB_u16 # 0x0B gamepak
.long execute_load_gamepakC_u16 # 0x0C gamepak .long execute_load_gamepakC_u16 # 0x0C gamepak
.long execute_load_eeprom_u16 # 0x0D gamepak/eeprom .long execute_load_eeprom_u16 # 0x0D gamepak/eeprom
.long execute_load_backup_u16 # 0x0E Flash ROM/SRAM .long execute_load_backup_u16 # 0x0E Flash ROM/SRAM
.long execute_load_open_u16 # 0x0F open .long execute_load_open_u16 # 0x0F open
@ -1355,42 +1353,6 @@ load_u16_ftable:
.long execute_load_backup_u16u # 0x0E Flash ROM/SRAM unaligned .long execute_load_backup_u16u # 0x0E Flash ROM/SRAM unaligned
.long execute_load_open_u16u # 0x0F open unaligned .long execute_load_open_u16u # 0x0F open unaligned
.long execute_load_full_u16
.long execute_load_full_u16
.long execute_load_full_u16
.long execute_load_full_u16
.long execute_load_full_u16
.long execute_load_full_u16
.long execute_load_full_u16
.long execute_load_full_u16
.long execute_load_full_u16
.long execute_load_full_u16
.long execute_load_full_u16
.long execute_load_full_u16
.long execute_load_full_u16
.long execute_load_full_u16
.long execute_load_full_u16
.long execute_load_full_u16
.long execute_load_full_u16
.long execute_load_full_u16
.long execute_load_full_u16
.long execute_load_full_u16
.long execute_load_full_u16
.long execute_load_full_u16
.long execute_load_full_u16
.long execute_load_full_u16
.long execute_load_full_u16
.long execute_load_full_u16
.long execute_load_full_u16
.long execute_load_full_u16
.long execute_load_full_u16
.long execute_load_full_u16
.long execute_load_full_u16
patch_load_u16: patch_load_u16:
patch_handler_align load_u16_ftable, 1 patch_handler_align load_u16_ftable, 1
@ -1921,7 +1883,6 @@ load_u32_ftable:
.long execute_load_gamepakA_u32 # 0x0A gamepak .long execute_load_gamepakA_u32 # 0x0A gamepak
.long execute_load_gamepakB_u32 # 0x0B gamepak .long execute_load_gamepakB_u32 # 0x0B gamepak
.long execute_load_gamepakC_u32 # 0x0C gamepak .long execute_load_gamepakC_u32 # 0x0C gamepak
.long execute_load_eeprom_u32 # 0x0D gamepak/eeprom .long execute_load_eeprom_u32 # 0x0D gamepak/eeprom
.long execute_load_backup_u32 # 0x0E Flash ROM/SRAM .long execute_load_backup_u32 # 0x0E Flash ROM/SRAM
.long execute_load_open_u32 # 0x0F open .long execute_load_open_u32 # 0x0F open
@ -2001,7 +1962,7 @@ execute_load_bios_u32a:
load_u32 bios_read_protect load_u32 bios_read_protect
2: 2:
open_load32_a open_load32_core
nop nop
execute_load_ewram_u32a: execute_load_ewram_u32a:
@ -2510,163 +2471,6 @@ patch_store_u32a:
patch_handler store_u32a_ftable, 0x0F patch_handler store_u32a_ftable, 0x0F
#execute_load_u8:
execute_load_full_u8:
srl $1, $4, 28 # check if the address is out of range
bne $1, $0, ext_load_u8 # if it is, perform an extended read
srl $2, $4, 15 # $1 = page number of address
sll $2, $2, 2 # adjust to word index
addu $2, $2, $16 # $1 = memory_map_read[address >> 15]
lw $1, -32768($2)
beq $1, $0, ext_load_u8 # if it's NULL perform an extended read
andi $2, $4, 0x7FFF # $2 = low 15bits of address (delay slot)
addu $1, $1, $2 # add the memory map offset
jr $ra # return
lbu $2, ($1) # read the value
ext_load_u8:
addiu $sp, $sp, -4 # make room on the stack for $ra
sw $ra, ($sp) # store return address
save_registers
jal read_memory8 # read the value
nop
restore_registers
lw $ra, ($sp) # restore return address
jr $ra # return
addiu $sp, $sp, 4 # fix stack (delay slot)
#execute_load_s8:
execute_load_full_s8:
srl $1, $4, 28 # check if the address is out of range
bne $1, $0, ext_load_s8 # if it is, perform an extended read
srl $2, $4, 15 # $1 = page number of address
sll $2, $2, 2 # adjust to word index
addu $2, $2, $16 # $1 = memory_map_read[address >> 15]
lw $1, -32768($2)
beq $1, $0, ext_load_s8 # if it's NULL perform an extended read
andi $2, $4, 0x7FFF # $2 = low 15bits of address (delay slot)
addu $1, $1, $2 # add the memory map offset
jr $ra # return
lb $2, ($1) # read the value
ext_load_s8:
addiu $sp, $sp, -4 # make room on the stack for $ra
sw $ra, ($sp) # store return address
save_registers
jal read_memory8 # read the value
nop
restore_registers
seb $2, $2 # sign extend the read value
lw $ra, ($sp) # restore return address
jr $ra # return
addiu $sp, $sp, 4 # fix stack (delay slot)
#execute_load_u16:
execute_load_full_u16:
srl $1, $4, 28 # check if the address is out of range
ins $1, $4, 4, 1 # or unaligned (bottom bit)
bne $1, $0, ext_load_u16 # if it is, perform an extended read
srl $2, $4, 15 # $1 = page number of address
sll $2, $2, 2 # adjust to word index
addu $2, $2, $16 # $1 = memory_map_read[address >> 15]
lw $1, -32768($2)
beq $1, $0, ext_load_u16 # if it's NULL perform an extended read
andi $2, $4, 0x7FFF # $2 = low 15bits of address (delay slot)
addu $1, $1, $2 # add the memory map offset
jr $ra # return
lhu $2, ($1) # read the value
ext_load_u16:
addiu $sp, $sp, -4 # make room on the stack for $ra
sw $ra, ($sp) # store return address
save_registers
jal read_memory16 # read the value
nop
restore_registers
lw $ra, ($sp) # restore return address
jr $ra # return
addiu $sp, $sp, 4 # fix stack (delay slot)
#execute_load_s16:
execute_load_full_s16:
srl $1, $4, 28 # check if the address is out of range
ins $1, $4, 4, 1 # or unaligned (bottom bit)
bne $1, $0, ext_load_s16 # if it is, perform an extended read
srl $2, $4, 15 # $1 = page number of address
sll $2, $2, 2 # adjust to word index
addu $2, $2, $16 # $1 = memory_map_read[address >> 15]
lw $1, -32768($2)
beq $1, $0, ext_load_s16 # if it's NULL perform an extended read
andi $2, $4, 0x7FFF # $2 = low 15bits of address (delay slot)
addu $1, $1, $2 # add the memory map offset
jr $ra # return
lh $2, ($1) # read the value
ext_load_s16:
addiu $sp, $sp, -4 # make room on the stack for $ra
sw $ra, ($sp) # store return address
save_registers
jal read_memory16_signed # read the value
nop
restore_registers
seh $2, $2 # sign extend the return value
lw $ra, ($sp) # restore return address
jr $ra # return
addiu $sp, $sp, 4 # fix stack (delay slot)
#execute_load_u32:
execute_load_full_u32:
srl $1, $4, 28 # check if the address is out of range
ins $1, $4, 4, 2 # or unaligned (bottom two bits)
bne $1, $0, ext_load_u32 # if it is, perform an extended read
srl $2, $4, 15 # $1 = page number of address
sll $2, $2, 2 # adjust to word index
addu $2, $2, $16 # $1 = memory_map_read[address >> 15]
lw $1, -32768($2)
beq $1, $0, ext_load_u32 # if it's NULL perform an extended read
andi $2, $4, 0x7FFF # $2 = low 15bits of address (delay slot)
addu $1, $1, $2 # add the memory map offset
jr $ra # return
lw $2, ($1) # read the value
ext_load_u32:
addiu $sp, $sp, -4 # make room on the stack for $ra
sw $ra, ($sp) # store return address
save_registers
jal read_memory32 # read the value
nop
restore_registers
lw $ra, ($sp) # restore return address
jr $ra # return
addiu $sp, $sp, 4 # fix stack (delay slot)
#execute_aligned_load32:
srl $2, $4, 28 # check if the address is out of range
bne $2, $0, ext_aligned_load32 # if it is, perform an extended load
srl $1, $4, 15 # $1 = page number of address
sll $1, $1, 2 # adjust to word index
addu $1, $1, $16 # $1 = memory_map_read[address >> 15]
lw $1, -32768($1)
beq $1, $0, ext_aligned_load32 # if it's NULL perform an extended read
andi $2, $4, 0x7FFF # $2 = low 15bits of address (delay slot)
addu $1, $1, $2 # add the memory map offset
jr $ra # return
lw $2, ($1) # read the value
ext_aligned_load32:
addiu $sp, $sp, -8 # make room on the stack for $ra
sw $6, 4($sp)
sw $ra, ($sp) # store return address
save_registers
jal read_memory32 # read the value
nop
restore_registers
lw $6, 4($sp)
lw $ra, ($sp) # restore return address
jr $ra # return
addiu $sp, $sp, 8 # fix stack (delay slot)
# General ext memory routines # General ext memory routines
ext_store_ignore: ext_store_ignore:
@ -2804,39 +2608,6 @@ ext_store_u8_jtable:
.long ext_store_ignore # 0x0F invalid .long ext_store_ignore # 0x0F invalid
ext_store_u8:
srl $1, $4, 24 # $1 = address >> 24
sltu $2, $1, 16 # check if the value is out of range
beq $2, $0, ext_store_ignore
sll $1, $1, 2 # make address word indexed (delay)
lui $2, %hi(ext_store_u8_jtable)
addu $2, $2, $1
# $2 = ext_store_u8_jtable[address >> 24]
lw $2, %lo(ext_store_u8_jtable)($2)
jr $2 # jump to table location
nop
# $4: address to write to
# $5: value to write
# $6: current PC
#execute_store_u8:
srl $1, $4, 28 # check if the address is out of range
bne $1, $0, ext_store_u8 # if it is, perform an extended write
srl $2, $4, 15 # $1 = page number of address (delay slot)
sll $2, $2, 2 # adjust to word index
addu $2, $2, $16
lw $1, 256($2) # $1 = memory_map_write[address >> 15]
beq $1, $0, ext_store_u8 # if it's NULL perform an extended write
andi $2, $4, 0x7FFF # $2 = low 15bits of address (delay slot)
addu $1, $1, $2 # add the memory map offset
lb $2, -32768($1) # load the SMC status
bne $2, $0, smc_write # is there code there?
sb $5, ($1) # store the value (delay slot)
jr $ra # return
nop
# 16bit ext memory routines # 16bit ext memory routines
ext_store_io16: ext_store_io16:
@ -2919,39 +2690,6 @@ ext_store_u16_jtable:
.long ext_store_eeprom # 0x0D EEPROM (possibly) .long ext_store_eeprom # 0x0D EEPROM (possibly)
.long ext_store_ignore # 0x0E Flash ROM/SRAM .long ext_store_ignore # 0x0E Flash ROM/SRAM
ext_store_u16:
srl $1, $4, 24 # $1 = address >> 24
sltu $2, $1, 16 # check if the value is out of range
beq $2, $0, ext_store_ignore
sll $1, $1, 2 # make address word indexed (delay)
lui $2, %hi(ext_store_u16_jtable)
addu $2, $2, $1
# $2 = ext_store_u16_jtable[address >> 24]
lw $2, %lo(ext_store_u16_jtable)($2)
jr $2 # jump to table location
nop
#execute_store_u16:
srl $1, $4, 28 # check if the address is out of range
bne $1, $0, ext_store_u16 # if it is, perform an extended write
srl $2, $4, 15 # $1 = page number of address (delay slot)
sll $2, $2, 2 # adjust to word index
addu $2, $2, $16
lw $1, 256($2) # $1 = memory_map_write[address >> 15]
beq $1, $0, ext_store_u16 # if it's NULL perform an extended write
andi $2, $4, 0x7FFE # $2 = low 15bits of address (delay slot)
addu $1, $1, $2 # add the memory map offset
lh $2, -32768($1) # load the SMC status
bne $2, $0, smc_write # is there code there?
sh $5, ($1) # store the value (delay slot)
jr $ra # return
nop
@ -3030,24 +2768,6 @@ ext_store_u32:
jr $2 # jump to table location jr $2 # jump to table location
nop nop
#execute_store_u32:
execute_store_full_u32:
srl $1, $4, 28 # check if the address is out of range
bne $1, $0, ext_store_u32 # if it is, perform an extended write
srl $2, $4, 15 # $1 = page number of address (delay slot)
sll $2, $2, 2 # adjust to word index
addu $2, $2, $16
lw $1, 256($2) # $1 = memory_map_write[address >> 15]
beq $1, $0, ext_store_u32 # if it's NULL perform an extended write
andi $2, $4, 0x7FFC # $2 = low 15bits of address (delay slot)
addu $1, $1, $2 # add the memory map offset
lw $2, -32768($1) # load the SMC status
bne $2, $0, smc_write # is there code there?
sw $5, ($1) # store the value (delay slot)
jr $ra # return
nop
# 32bit ext aligned, non a2 destroying routines # 32bit ext aligned, non a2 destroying routines
ext_store_io32a: ext_store_io32a: