filename | src/sh4/ia32abi.h |
changeset | 991:60c7fab9c880 |
prev | 968:6fb1481859a4 |
author | nkeynes |
date | Wed Mar 04 23:12:21 2009 +0000 (15 years ago) |
permissions | -rw-r--r-- |
last change | Move xltcache to xlat/ src directory Commit new and improved x86 opcode file - cleaned up and added support for amd64 extended registers |
file | annotate | diff | log | raw |
1.1 --- a/src/sh4/ia32abi.h Thu Jan 15 11:23:20 2009 +00001.2 +++ b/src/sh4/ia32abi.h Wed Mar 04 23:12:21 2009 +00001.3 @@ -27,9 +27,9 @@1.4 static inline void decode_address( int addr_reg )1.5 {1.6 uintptr_t base = (sh4r.xlat_sh4_mode&SR_MD) ? (uintptr_t)sh4_address_space : (uintptr_t)sh4_user_address_space;1.7 - MOV_r32_r32( addr_reg, R_ECX );1.8 - SHR_imm8_r32( 12, R_ECX );1.9 - MOV_r32disp32x4_r32( R_ECX, base, R_ECX );1.10 + MOVL_r32_r32( addr_reg, REG_ECX );1.11 + SHRL_imm_r32( 12, REG_ECX );1.12 + MOVP_sib_rptr( 2, REG_ECX, -1, base, REG_ECX );1.13 }1.15 /**1.16 @@ -38,134 +38,138 @@1.17 */1.18 static inline void call_func0( void *ptr )1.19 {1.20 - load_imm32(R_ECX, (uint32_t)ptr);1.21 - CALL_r32(R_ECX);1.22 + load_imm32(REG_ECX, (uint32_t)ptr);1.23 + CALL_r32(REG_ECX);1.24 }1.26 #ifdef HAVE_FASTCALL1.27 static inline void call_func1( void *ptr, int arg1 )1.28 {1.29 - if( arg1 != R_EAX ) {1.30 - MOV_r32_r32( arg1, R_EAX );1.31 + if( arg1 != REG_EAX ) {1.32 + MOVL_r32_r32( arg1, REG_EAX );1.33 }1.34 - load_imm32(R_ECX, (uint32_t)ptr);1.35 - CALL_r32(R_ECX);1.36 + MOVP_immptr_rptr((uintptr_t)ptr, REG_ECX);1.37 + CALL_r32(REG_ECX);1.38 }1.40 static inline void call_func1_r32( int addr_reg, int arg1 )1.41 {1.42 - if( arg1 != R_EAX ) {1.43 - MOV_r32_r32( arg1, R_EAX );1.44 + if( arg1 != REG_EAX ) {1.45 + MOVL_r32_r32( arg1, REG_EAX );1.46 }1.47 CALL_r32(addr_reg);1.48 }1.50 static inline void call_func1_r32disp8( int preg, uint32_t disp8, int arg1 )1.51 {1.52 - if( arg1 != R_EAX ) {1.53 - MOV_r32_r32( arg1, R_EAX );1.54 + if( arg1 != REG_EAX ) {1.55 + MOVL_r32_r32( arg1, REG_EAX );1.56 }1.57 - CALL_r32disp8(preg, disp8);1.58 + CALL_r32disp(preg, disp8);1.59 }1.61 static inline void call_func1_r32disp8_exc( int preg, uint32_t disp8, int arg1, int pc )1.62 {1.63 - if( arg1 != R_EAX ) {1.64 - MOV_r32_r32( arg1, R_EAX );1.65 + if( arg1 != REG_EAX ) {1.66 + MOVL_r32_r32( arg1, REG_EAX );1.67 }1.68 - load_exc_backpatch(R_EDX);1.69 - CALL_r32disp8(preg, disp8);1.70 + MOVP_immptr_rptr(0,REG_EDX);1.71 + sh4_x86_add_backpatch(xlat_output, pc, -2);1.72 + CALL_r32disp(preg, disp8);1.73 }1.75 static inline void call_func2( void *ptr, int arg1, int arg2 )1.76 {1.77 - if( arg2 != R_EDX ) {1.78 - MOV_r32_r32( arg2, R_EDX );1.79 + if( arg2 != REG_EDX ) {1.80 + MOVL_r32_r32( arg2, REG_EDX );1.81 }1.82 - if( arg1 != R_EAX ) {1.83 - MOV_r32_r32( arg1, R_EAX );1.84 + if( arg1 != REG_EAX ) {1.85 + MOVL_r32_r32( arg1, REG_EAX );1.86 }1.87 - load_imm32(R_ECX, (uint32_t)ptr);1.88 - CALL_r32(R_ECX);1.89 + MOVP_immptr_rptr((uint32_t)ptr, REG_ECX);1.90 + CALL_r32(REG_ECX);1.91 }1.93 static inline void call_func2_r32( int addr_reg, int arg1, int arg2 )1.94 {1.95 - if( arg2 != R_EDX ) {1.96 - MOV_r32_r32( arg2, R_EDX );1.97 + if( arg2 != REG_EDX ) {1.98 + MOVL_r32_r32( arg2, REG_EDX );1.99 }1.100 - if( arg1 != R_EAX ) {1.101 - MOV_r32_r32( arg1, R_EAX );1.102 + if( arg1 != REG_EAX ) {1.103 + MOVL_r32_r32( arg1, REG_EAX );1.104 }1.105 CALL_r32(addr_reg);1.106 }1.108 static inline void call_func2_r32disp8( int preg, uint32_t disp8, int arg1, int arg2 )1.109 {1.110 - if( arg2 != R_EDX ) {1.111 - MOV_r32_r32( arg2, R_EDX );1.112 + if( arg2 != REG_EDX ) {1.113 + MOVL_r32_r32( arg2, REG_EDX );1.114 }1.115 - if( arg1 != R_EAX ) {1.116 - MOV_r32_r32( arg1, R_EAX );1.117 + if( arg1 != REG_EAX ) {1.118 + MOVL_r32_r32( arg1, REG_EAX );1.119 }1.120 - CALL_r32disp8(preg, disp8);1.121 + CALL_r32disp(preg, disp8);1.122 }1.124 static inline void call_func2_r32disp8_exc( int preg, uint32_t disp8, int arg1, int arg2, int pc )1.125 {1.126 - if( arg2 != R_EDX ) {1.127 - MOV_r32_r32( arg2, R_EDX );1.128 + if( arg2 != REG_EDX ) {1.129 + MOVL_r32_r32( arg2, REG_EDX );1.130 }1.131 - if( arg1 != R_EAX ) {1.132 - MOV_r32_r32( arg1, R_EAX );1.133 + if( arg1 != REG_EAX ) {1.134 + MOVL_r32_r32( arg1, REG_EAX );1.135 }1.136 - MOV_backpatch_esp8( 0 );1.137 - CALL_r32disp8(preg, disp8);1.138 + MOVL_imm32_rspdisp(0,0);1.139 + sh4_x86_add_backpatch(xlat_output, pc, -2);1.140 + CALL_r32disp(preg, disp8);1.141 }1.145 static inline void call_func1_exc( void *ptr, int arg1, int pc )1.146 {1.147 - if( arg1 != R_EAX ) {1.148 - MOV_r32_r32( arg1, R_EAX );1.149 + if( arg1 != REG_EAX ) {1.150 + MOVL_r32_r32( arg1, REG_EAX );1.151 }1.152 - load_exc_backpatch(R_EDX);1.153 - load_imm32(R_ECX, (uint32_t)ptr);1.154 - CALL_r32(R_ECX);1.155 + MOVP_immptr_rptr(0,REG_EDX);1.156 + sh4_x86_add_backpatch(xlat_output, pc, -2);1.157 + MOVP_immptr_rptr((uint32_t)ptr, REG_ECX);1.158 + CALL_r32(REG_ECX);1.159 }1.161 static inline void call_func2_exc( void *ptr, int arg1, int arg2, int pc )1.162 {1.163 - if( arg2 != R_EDX ) {1.164 - MOV_r32_r32( arg2, R_EDX );1.165 + if( arg2 != REG_EDX ) {1.166 + MOVL_r32_r32( arg2, REG_EDX );1.167 }1.168 - if( arg1 != R_EAX ) {1.169 - MOV_r32_r32( arg1, R_EAX );1.170 + if( arg1 != REG_EAX ) {1.171 + MOVL_r32_r32( arg1, REG_EAX );1.172 }1.173 - MOV_backpatch_esp8(0);1.174 - load_imm32(R_ECX, (uint32_t)ptr);1.175 - CALL_r32(R_ECX);1.176 + MOVL_imm32_rspdisp(0,0);1.177 + sh4_x86_add_backpatch(xlat_output, pc, -2);1.178 + MOVP_immptr_rptr((uint32_t)ptr, REG_ECX);1.179 + CALL_r32(REG_ECX);1.180 }1.182 #else1.183 static inline void call_func1( void *ptr, int arg1 )1.184 {1.185 - SUB_imm8s_r32( 12, R_ESP );1.186 + SUBL_imms_r32( 12, REG_ESP );1.187 PUSH_r32(arg1);1.188 - load_imm32(R_ECX, (uint32_t)ptr);1.189 - CALL_r32(R_ECX);1.190 - ADD_imm8s_r32( 16, R_ESP );1.191 + MOVP_immptr_rptr((uint32_t)ptr, REG_ECX);1.192 + CALL_r32(REG_ECX);1.193 + ADDL_imms_r32( 16, REG_ESP );1.194 }1.196 static inline void call_func2( void *ptr, int arg1, int arg2 )1.197 {1.198 - SUB_imm8s_r32( 8, R_ESP );1.199 + SUBL_imms_r32( 8, REG_ESP );1.200 PUSH_r32(arg2);1.201 PUSH_r32(arg1);1.202 - load_imm32(R_ECX, (uint32_t)ptr);1.203 - CALL_r32(R_ECX);1.204 - ADD_imm8s_r32( 16, R_ESP );1.205 + MOVP_immptr_rptr((uint32_t)ptr, REG_ECX);1.206 + CALL_r32(REG_ECX);1.207 + ADDL_imms_r32( 16, REG_ESP );1.208 }1.210 #endif1.211 @@ -178,15 +182,15 @@1.212 */1.213 void enter_block( )1.214 {1.215 - PUSH_r32(R_EBP);1.216 - load_ptr( R_EBP, ((uint8_t *)&sh4r) + 128 );1.217 - SUB_imm8s_r32( 8, R_ESP );1.218 + PUSH_r32(REG_EBP);1.219 + load_ptr( REG_EBP, ((uint8_t *)&sh4r) + 128 );1.220 + SUBL_imms_r32( 8, REG_ESP );1.221 }1.223 static inline void exit_block( )1.224 {1.225 - ADD_imm8s_r32( 8, R_ESP );1.226 - POP_r32(R_EBP);1.227 + ADDL_imms_r32( 8, REG_ESP );1.228 + POP_r32(REG_EBP);1.229 RET();1.230 }1.232 @@ -195,13 +199,13 @@1.233 */1.234 void exit_block_pcset( sh4addr_t pc )1.235 {1.236 - load_imm32( R_ECX, ((pc - sh4_x86.block_start_pc)>>1)*sh4_cpu_period ); // 51.237 - ADD_r32_sh4r( R_ECX, REG_OFFSET(slice_cycle) ); // 61.238 - load_spreg( R_EAX, R_PC );1.239 + load_imm32( REG_ECX, ((pc - sh4_x86.block_start_pc)>>1)*sh4_cpu_period ); // 51.240 + ADDL_r32_rbpdisp( REG_ECX, REG_OFFSET(slice_cycle) ); // 61.241 + load_spreg( REG_EAX, R_PC );1.242 if( sh4_x86.tlb_on ) {1.243 - call_func1(xlat_get_code_by_vma,R_EAX);1.244 + call_func1(xlat_get_code_by_vma,REG_EAX);1.245 } else {1.246 - call_func1(xlat_get_code,R_EAX);1.247 + call_func1(xlat_get_code,REG_EAX);1.248 }1.249 exit_block();1.250 }1.251 @@ -211,14 +215,14 @@1.252 */1.253 void exit_block_newpcset( sh4addr_t pc )1.254 {1.255 - load_imm32( R_ECX, ((pc - sh4_x86.block_start_pc)>>1)*sh4_cpu_period ); // 51.256 - ADD_r32_sh4r( R_ECX, REG_OFFSET(slice_cycle) ); // 61.257 - load_spreg( R_EAX, R_NEW_PC );1.258 - store_spreg( R_EAX, R_PC );1.259 + load_imm32( REG_ECX, ((pc - sh4_x86.block_start_pc)>>1)*sh4_cpu_period ); // 51.260 + ADDL_r32_rbpdisp( REG_ECX, REG_OFFSET(slice_cycle) ); // 61.261 + load_spreg( REG_EAX, R_NEW_PC );1.262 + store_spreg( REG_EAX, R_PC );1.263 if( sh4_x86.tlb_on ) {1.264 - call_func1(xlat_get_code_by_vma,R_EAX);1.265 + call_func1(xlat_get_code_by_vma,REG_EAX);1.266 } else {1.267 - call_func1(xlat_get_code,R_EAX);1.268 + call_func1(xlat_get_code,REG_EAX);1.269 }1.270 exit_block();1.271 }1.272 @@ -229,18 +233,18 @@1.273 */1.274 void exit_block_abs( sh4addr_t pc, sh4addr_t endpc )1.275 {1.276 - load_imm32( R_ECX, pc ); // 51.277 - store_spreg( R_ECX, REG_OFFSET(pc) ); // 31.278 + load_imm32( REG_ECX, pc ); // 51.279 + store_spreg( REG_ECX, REG_OFFSET(pc) ); // 31.280 if( IS_IN_ICACHE(pc) ) {1.281 - MOV_moff32_EAX( xlat_get_lut_entry(GET_ICACHE_PHYS(pc)) ); // 51.282 - AND_imm8s_r32( 0xFC, R_EAX ); // 31.283 + MOVP_moffptr_rax( xlat_get_lut_entry(GET_ICACHE_PHYS(pc)) ); // 51.284 + ANDL_imms_r32( 0xFFFFFFFC, REG_EAX ); // 31.285 } else if( sh4_x86.tlb_on ) {1.286 - call_func1(xlat_get_code_by_vma,R_ECX);1.287 + call_func1(xlat_get_code_by_vma,REG_ECX);1.288 } else {1.289 - call_func1(xlat_get_code,R_ECX);1.290 + call_func1(xlat_get_code,REG_ECX);1.291 }1.292 - load_imm32( R_ECX, ((endpc - sh4_x86.block_start_pc)>>1)*sh4_cpu_period ); // 51.293 - ADD_r32_sh4r( R_ECX, REG_OFFSET(slice_cycle) ); // 61.294 + load_imm32( REG_ECX, ((endpc - sh4_x86.block_start_pc)>>1)*sh4_cpu_period ); // 51.295 + ADDL_r32_rbpdisp( REG_ECX, REG_OFFSET(slice_cycle) ); // 61.296 exit_block();1.297 }1.299 @@ -249,19 +253,19 @@1.300 */1.301 void exit_block_rel( sh4addr_t pc, sh4addr_t endpc )1.302 {1.303 - load_imm32( R_ECX, pc - sh4_x86.block_start_pc ); // 51.304 - ADD_sh4r_r32( R_PC, R_ECX );1.305 - store_spreg( R_ECX, REG_OFFSET(pc) ); // 31.306 + load_imm32( REG_ECX, pc - sh4_x86.block_start_pc ); // 51.307 + ADDL_rbpdisp_r32( R_PC, REG_ECX );1.308 + store_spreg( REG_ECX, R_PC ); // 31.309 if( IS_IN_ICACHE(pc) ) {1.310 - MOV_moff32_EAX( xlat_get_lut_entry(GET_ICACHE_PHYS(pc)) ); // 51.311 - AND_imm8s_r32( 0xFC, R_EAX ); // 31.312 + MOVP_moffptr_rax( xlat_get_lut_entry(GET_ICACHE_PHYS(pc)) ); // 51.313 + ANDL_imms_r32( 0xFFFFFFFC, REG_EAX ); // 31.314 } else if( sh4_x86.tlb_on ) {1.315 - call_func1(xlat_get_code_by_vma,R_ECX);1.316 + call_func1(xlat_get_code_by_vma,REG_ECX);1.317 } else {1.318 - call_func1(xlat_get_code,R_ECX);1.319 + call_func1(xlat_get_code,REG_ECX);1.320 }1.321 - load_imm32( R_ECX, ((endpc - sh4_x86.block_start_pc)>>1)*sh4_cpu_period ); // 51.322 - ADD_r32_sh4r( R_ECX, REG_OFFSET(slice_cycle) ); // 61.323 + load_imm32( REG_ECX, ((endpc - sh4_x86.block_start_pc)>>1)*sh4_cpu_period ); // 51.324 + ADDL_r32_rbpdisp( REG_ECX, REG_OFFSET(slice_cycle) ); // 61.325 exit_block();1.326 }1.328 @@ -270,18 +274,18 @@1.329 */1.330 void exit_block_exc( int code, sh4addr_t pc )1.331 {1.332 - load_imm32( R_ECX, pc - sh4_x86.block_start_pc ); // 51.333 - ADD_r32_sh4r( R_ECX, R_PC );1.334 - load_imm32( R_ECX, ((pc - sh4_x86.block_start_pc)>>1)*sh4_cpu_period ); // 51.335 - ADD_r32_sh4r( R_ECX, REG_OFFSET(slice_cycle) ); // 61.336 - load_imm32( R_EAX, code );1.337 - call_func1( sh4_raise_exception, R_EAX );1.338 + load_imm32( REG_ECX, pc - sh4_x86.block_start_pc ); // 51.339 + ADDL_r32_rbpdisp( REG_ECX, R_PC );1.340 + load_imm32( REG_ECX, ((pc - sh4_x86.block_start_pc)>>1)*sh4_cpu_period ); // 51.341 + ADDL_r32_rbpdisp( REG_ECX, REG_OFFSET(slice_cycle) ); // 61.342 + load_imm32( REG_EAX, code );1.343 + call_func1( sh4_raise_exception, REG_EAX );1.345 - load_spreg( R_EAX, R_PC );1.346 + load_spreg( REG_EAX, R_PC );1.347 if( sh4_x86.tlb_on ) {1.348 - call_func1(xlat_get_code_by_vma,R_EAX);1.349 + call_func1(xlat_get_code_by_vma,REG_EAX);1.350 } else {1.351 - call_func1(xlat_get_code,R_EAX);1.352 + call_func1(xlat_get_code,REG_EAX);1.353 }1.355 exit_block();1.356 @@ -299,36 +303,36 @@1.357 unsigned int i;1.358 // Raise exception1.359 uint8_t *end_ptr = xlat_output;1.360 - MOV_r32_r32( R_EDX, R_ECX );1.361 - ADD_r32_r32( R_EDX, R_ECX );1.362 - ADD_r32_sh4r( R_ECX, R_PC );1.363 - MOV_moff32_EAX( &sh4_cpu_period );1.364 - MUL_r32( R_EDX );1.365 - ADD_r32_sh4r( R_EAX, REG_OFFSET(slice_cycle) );1.366 + MOVL_r32_r32( REG_EDX, REG_ECX );1.367 + ADDL_r32_r32( REG_EDX, REG_ECX );1.368 + ADDL_r32_rbpdisp( REG_ECX, R_PC );1.369 + MOVL_moffptr_eax( &sh4_cpu_period );1.370 + MULL_r32( REG_EDX );1.371 + ADDL_r32_rbpdisp( REG_EAX, REG_OFFSET(slice_cycle) );1.373 - POP_r32(R_EAX);1.374 - call_func1( sh4_raise_exception, R_EAX );1.375 - load_spreg( R_EAX, R_PC );1.376 + POP_r32(REG_EAX);1.377 + call_func1( sh4_raise_exception, REG_EAX );1.378 + load_spreg( REG_EAX, R_PC );1.379 if( sh4_x86.tlb_on ) {1.380 - call_func1(xlat_get_code_by_vma,R_EAX);1.381 + call_func1(xlat_get_code_by_vma,REG_EAX);1.382 } else {1.383 - call_func1(xlat_get_code,R_EAX);1.384 + call_func1(xlat_get_code,REG_EAX);1.385 }1.386 exit_block();1.388 // Exception already raised - just cleanup1.389 uint8_t *preexc_ptr = xlat_output;1.390 - MOV_r32_r32( R_EDX, R_ECX );1.391 - ADD_r32_r32( R_EDX, R_ECX );1.392 - ADD_r32_sh4r( R_ECX, R_SPC );1.393 - MOV_moff32_EAX( &sh4_cpu_period );1.394 - MUL_r32( R_EDX );1.395 - ADD_r32_sh4r( R_EAX, REG_OFFSET(slice_cycle) );1.396 - load_spreg( R_EAX, R_PC );1.397 + MOVL_r32_r32( REG_EDX, REG_ECX );1.398 + ADDL_r32_r32( REG_EDX, REG_ECX );1.399 + ADDL_r32_rbpdisp( REG_ECX, R_SPC );1.400 + MOVL_moffptr_eax( &sh4_cpu_period );1.401 + MULL_r32( REG_EDX );1.402 + ADDL_r32_rbpdisp( REG_EAX, REG_OFFSET(slice_cycle) );1.403 + load_spreg( REG_EAX, R_PC );1.404 if( sh4_x86.tlb_on ) {1.405 - call_func1(xlat_get_code_by_vma,R_EAX);1.406 + call_func1(xlat_get_code_by_vma,REG_EAX);1.407 } else {1.408 - call_func1(xlat_get_code,R_EAX);1.409 + call_func1(xlat_get_code,REG_EAX);1.410 }1.411 exit_block();1.413 @@ -340,15 +344,15 @@1.414 } else {1.415 *fixup_addr += xlat_output - (uint8_t *)&xlat_current_block->code[sh4_x86.backpatch_list[i].fixup_offset] - 4;1.416 }1.417 - load_imm32( R_EDX, sh4_x86.backpatch_list[i].fixup_icount );1.418 + load_imm32( REG_EDX, sh4_x86.backpatch_list[i].fixup_icount );1.419 int rel = preexc_ptr - xlat_output;1.420 - JMP_rel(rel);1.421 + JMP_prerel(rel);1.422 } else {1.423 *fixup_addr += xlat_output - (uint8_t *)&xlat_current_block->code[sh4_x86.backpatch_list[i].fixup_offset] - 4;1.424 PUSH_imm32( sh4_x86.backpatch_list[i].exc_code );1.425 - load_imm32( R_EDX, sh4_x86.backpatch_list[i].fixup_icount );1.426 + load_imm32( REG_EDX, sh4_x86.backpatch_list[i].fixup_icount );1.427 int rel = end_ptr - xlat_output;1.428 - JMP_rel(rel);1.429 + JMP_prerel(rel);1.430 }1.431 }1.432 }
.