Mercurial > repos > blastem
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); |