comparison gen_x86.c @ 593:5ef3fe516da9

Z80 core is sort of working again
author Michael Pavone <pavone@retrodev.com>
date Mon, 22 Dec 2014 20:55:10 -0800
parents 8e395210f50f
children 8c7b63f9fab8
comparison
equal deleted inserted replaced
592:4ff7bbb3943b 593:5ef3fe516da9
31 #define OP_JCC 0x70 31 #define OP_JCC 0x70
32 #define OP_IMMED_ARITH 0x80 32 #define OP_IMMED_ARITH 0x80
33 #define OP_TEST 0x84 33 #define OP_TEST 0x84
34 #define OP_XCHG 0x86 34 #define OP_XCHG 0x86
35 #define OP_MOV 0x88 35 #define OP_MOV 0x88
36 #define PRE_XOP 0x8F
36 #define OP_XCHG_AX 0x90 37 #define OP_XCHG_AX 0x90
37 #define OP_CDQ 0x99 38 #define OP_CDQ 0x99
38 #define OP_PUSHF 0x9C 39 #define OP_PUSHF 0x9C
39 #define OP_POPF 0x9D 40 #define OP_POPF 0x9D
40 #define OP_MOV_I8R 0xB0 41 #define OP_MOV_I8R 0xB0
1514 } 1515 }
1515 *(out++) = OP_PUSH | reg; 1516 *(out++) = OP_PUSH | reg;
1516 code->cur = out; 1517 code->cur = out;
1517 } 1518 }
1518 1519
1520 void push_rdisp(code_info *code, uint8_t base, int32_t disp)
1521 {
1522 //This instruction has no explicit size, so we pass SZ_B
1523 //to avoid any prefixes or bits being set
1524 x86_rdisp_size(code, OP_SINGLE_EA, OP_EX_PUSH_EA, base, disp, SZ_B);
1525 }
1526
1519 void pop_r(code_info *code, uint8_t reg) 1527 void pop_r(code_info *code, uint8_t reg)
1520 { 1528 {
1521 check_alloc_code(code, 2); 1529 check_alloc_code(code, 2);
1522 code_ptr out = code->cur; 1530 code_ptr out = code->cur;
1523 if (reg >= R8) { 1531 if (reg >= R8) {
1524 *(out++) = PRE_REX | REX_RM_FIELD; 1532 *(out++) = PRE_REX | REX_RM_FIELD;
1525 reg -= R8 - X86_R8; 1533 reg -= R8 - X86_R8;
1526 } 1534 }
1527 *(out++) = OP_POP | reg; 1535 *(out++) = OP_POP | reg;
1536 code->cur = out;
1537 }
1538
1539 void pop_rind(code_info *code, uint8_t reg)
1540 {
1541 check_alloc_code(code, 3);
1542 code_ptr out = code->cur;
1543 if (reg >= R8) {
1544 *(out++) = PRE_REX | REX_RM_FIELD;
1545 reg -= R8 - X86_R8;
1546 }
1547 *(out++) = PRE_XOP;
1548 *(out++) = MODE_REG_INDIRECT | reg;
1528 code->cur = out; 1549 code->cur = out;
1529 } 1550 }
1530 1551
1531 void setcc_r(code_info *code, uint8_t cc, uint8_t dst) 1552 void setcc_r(code_info *code, uint8_t cc, uint8_t dst)
1532 { 1553 {
1853 *(out++) = OP_SINGLE_EA; 1874 *(out++) = OP_SINGLE_EA;
1854 *(out++) = MODE_REG_DIRECT | dst | (OP_EX_JMP_EA << 3); 1875 *(out++) = MODE_REG_DIRECT | dst | (OP_EX_JMP_EA << 3);
1855 code->cur = out; 1876 code->cur = out;
1856 } 1877 }
1857 1878
1879 void jmp_rind(code_info *code, uint8_t dst)
1880 {
1881 check_alloc_code(code, 3);
1882 code_ptr out = code->cur;
1883 if (dst >= R8) {
1884 dst -= R8 - X86_R8;
1885 *(out++) = PRE_REX | REX_RM_FIELD;
1886 }
1887 *(out++) = OP_SINGLE_EA;
1888 *(out++) = MODE_REG_INDIRECT | dst | (OP_EX_JMP_EA << 3);
1889 code->cur = out;
1890 }
1891
1858 void call(code_info *code, code_ptr fun) 1892 void call(code_info *code, code_ptr fun)
1859 { 1893 {
1860 check_alloc_code(code, 5); 1894 check_alloc_code(code, 5);
1861 code_ptr out = code->cur; 1895 code_ptr out = code->cur;
1862 ptrdiff_t disp = fun-(out+5); 1896 ptrdiff_t disp = fun-(out+5);