Mercurial > repos > blastem
comparison gen_x86.c @ 420:9fb111b5641f
Fix access to int_enable_cycle in EI
author | Mike Pavone <pavone@retrodev.com> |
---|---|
date | Mon, 24 Jun 2013 21:32:25 -0700 |
parents | ad493d38964e |
children | 140af5509ce7 |
comparison
equal
deleted
inserted
replaced
419:d1bf9734ce94 | 420:9fb111b5641f |
---|---|
515 } | 515 } |
516 } | 516 } |
517 return out; | 517 return out; |
518 } | 518 } |
519 | 519 |
520 uint8_t * x86_irdisp32(uint8_t * out, uint8_t opcode, uint8_t op_ex, int32_t val, uint8_t dst, int32_t disp, uint8_t size) | |
521 { | |
522 uint8_t sign_extend = 0; | |
523 if ((size == SZ_D || size == SZ_Q) && val <= 0x7F && val >= -0x80) { | |
524 sign_extend = 1; | |
525 opcode |= BIT_DIR; | |
526 } | |
527 if (size == SZ_W) { | |
528 *(out++) = PRE_SIZE; | |
529 } | |
530 | |
531 if (size == SZ_Q || dst >= R8) { | |
532 *out = PRE_REX; | |
533 if (size == SZ_Q) { | |
534 *out |= REX_QUAD; | |
535 } | |
536 if (dst >= R8) { | |
537 *out |= REX_RM_FIELD; | |
538 dst -= (R8 - X86_R8); | |
539 } | |
540 out++; | |
541 } | |
542 if (size != SZ_B) { | |
543 opcode |= BIT_SIZE; | |
544 } | |
545 *(out++) = opcode; | |
546 *(out++) = MODE_REG_DISPLACE32 | dst | (op_ex << 3); | |
547 *(out++) = disp; | |
548 disp >>= 8; | |
549 *(out++) = disp; | |
550 disp >>= 8; | |
551 *(out++) = disp; | |
552 disp >>= 8; | |
553 *(out++) = disp; | |
554 *(out++) = val; | |
555 if (size != SZ_B && !sign_extend) { | |
556 val >>= 8; | |
557 *(out++) = val; | |
558 if (size != SZ_W) { | |
559 val >>= 8; | |
560 *(out++) = val; | |
561 val >>= 8; | |
562 *(out++) = val; | |
563 } | |
564 } | |
565 return out; | |
566 } | |
567 | |
520 | 568 |
521 uint8_t * x86_shiftrot_ir(uint8_t * out, uint8_t op_ex, uint8_t val, uint8_t dst, uint8_t size) | 569 uint8_t * x86_shiftrot_ir(uint8_t * out, uint8_t op_ex, uint8_t val, uint8_t dst, uint8_t size) |
522 { | 570 { |
523 if (size == SZ_W) { | 571 if (size == SZ_W) { |
524 *(out++) = PRE_SIZE; | 572 *(out++) = PRE_SIZE; |
777 } | 825 } |
778 | 826 |
779 uint8_t * add_irdisp8(uint8_t * out, int32_t val, uint8_t dst_base, int8_t disp, uint8_t size) | 827 uint8_t * add_irdisp8(uint8_t * out, int32_t val, uint8_t dst_base, int8_t disp, uint8_t size) |
780 { | 828 { |
781 return x86_irdisp8(out, OP_IMMED_ARITH, OP_EX_ADDI, val, dst_base, disp, size); | 829 return x86_irdisp8(out, OP_IMMED_ARITH, OP_EX_ADDI, val, dst_base, disp, size); |
830 } | |
831 | |
832 uint8_t * add_irdisp32(uint8_t * out, int32_t val, uint8_t dst_base, int32_t disp, uint8_t size) | |
833 { | |
834 return x86_irdisp32(out, OP_IMMED_ARITH, OP_EX_ADDI, val, dst_base, disp, size); | |
782 } | 835 } |
783 | 836 |
784 uint8_t * add_rrdisp8(uint8_t * out, uint8_t src, uint8_t dst_base, int8_t disp, uint8_t size) | 837 uint8_t * add_rrdisp8(uint8_t * out, uint8_t src, uint8_t dst_base, int8_t disp, uint8_t size) |
785 { | 838 { |
786 return x86_rrdisp8_sizedir(out, OP_ADD, src, dst_base, disp, size, 0); | 839 return x86_rrdisp8_sizedir(out, OP_ADD, src, dst_base, disp, size, 0); |