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);