Mercurial > repos > blastem
comparison gen_arm.h @ 553:1af6c1052993
Added untested code for generating ARM machine code
author | Mike Pavone <pavone@retrodev.com> |
---|---|
date | Sun, 23 Feb 2014 21:37:19 -0800 |
parents | |
children | c8fefa140c80 |
comparison
equal
deleted
inserted
replaced
552:0687b05061dd | 553:1af6c1052993 |
---|---|
1 /* | |
2 Copyright 2014 Michael Pavone | |
3 This file is part of BlastEm. | |
4 BlastEm is free software distributed under the terms of the GNU General Public License version 3 or greater. See COPYING for full license text. | |
5 */ | |
6 #ifndef GEN_ARM_H_ | |
7 #define GEN_ARM_H_ | |
8 | |
9 #include <stdint.h> | |
10 | |
11 typedef struct { | |
12 uint32_t *cur; | |
13 uint32_t *last; | |
14 } code_info; | |
15 | |
16 #define SET_COND 0x100000u | |
17 #define NO_COND 0u | |
18 | |
19 #define CC_FIELD_SHIFT 28 | |
20 | |
21 #define CC_EQ 0x0u | |
22 #define CC_NE (0x1u << CC_FIELD_SHIFT) | |
23 #define CC_CS (0x2u << CC_FIELD_SHIFT) | |
24 #define CC_CC (0x3u << CC_FIELD_SHIFT) | |
25 #define CC_MI (0x4u << CC_FIELD_SHIFT) | |
26 #define CC_PL (0x5u << CC_FIELD_SHIFT) | |
27 #define CC_VS (0x6u << CC_FIELD_SHIFT) | |
28 #define CC_VC (0x7u << CC_FIELD_SHIFT) | |
29 #define CC_HI (0x8u << CC_FIELD_SHIFT) | |
30 #define CC_LS (0x9u << CC_FIELD_SHIFT) | |
31 #define CC_GE (0xAu << CC_FIELD_SHIFT) | |
32 #define CC_LT (0xBu << CC_FIELD_SHIFT) | |
33 #define CC_GT (0xCu << CC_FIELD_SHIFT) | |
34 #define CC_LE (0xDu << CC_FIELD_SHIFT) | |
35 #define CC_AL (0xEu << CC_FIELD_SHIFT) | |
36 | |
37 #define INVALID_IMMED 0xFFFFFFFFu | |
38 #define CODE_OK 0u | |
39 | |
40 enum { | |
41 r0, | |
42 r1, | |
43 r2, | |
44 r3, | |
45 r4, | |
46 r5, | |
47 r6, | |
48 r7, | |
49 r8, | |
50 r9, | |
51 r10, | |
52 r11, | |
53 r12, | |
54 sp, | |
55 lr, | |
56 pc | |
57 }; | |
58 | |
59 #define R0 0x1 | |
60 #define R1 0x2 | |
61 #define R2 0x4 | |
62 #define R3 0x8 | |
63 #define R4 0x10 | |
64 #define R5 0x20 | |
65 #define R6 0x40 | |
66 #define R7 0x80 | |
67 #define R8 0x100 | |
68 #define R9 0x200 | |
69 #define R10 0x400 | |
70 #define R11 0x800 | |
71 #define R12 0x1000 | |
72 #define SP 0x2000 | |
73 #define LR 0x4000 | |
74 #define PC 0x8000 | |
75 | |
76 void init_code_info(code_info *code); | |
77 | |
78 uint32_t and(code_info *code, uint32_t dst, uint32_t src1, uint32_t src2, uint32_t set_cond); | |
79 uint32_t andi(code_info *code, uint32_t dst, uint32_t src1, uint32_t immed, uint32_t set_cond); | |
80 uint32_t and_cc(code_info *code, uint32_t dst, uint32_t src1, uint32_t src2, uint32_t cc, uint32_t set_cond); | |
81 uint32_t andi_cc(code_info *code, uint32_t dst, uint32_t src1, uint32_t immed, uint32_t cc, uint32_t set_cond); | |
82 uint32_t eor(code_info *code, uint32_t dst, uint32_t src1, uint32_t src2, uint32_t set_cond); | |
83 uint32_t eori(code_info *code, uint32_t dst, uint32_t src1, uint32_t immed, uint32_t set_cond); | |
84 uint32_t eor_cc(code_info *code, uint32_t dst, uint32_t src1, uint32_t src2, uint32_t cc, uint32_t set_cond); | |
85 uint32_t eori_cc(code_info *code, uint32_t dst, uint32_t src1, uint32_t immed, uint32_t cc, uint32_t set_cond); | |
86 uint32_t sub(code_info *code, uint32_t dst, uint32_t src1, uint32_t src2, uint32_t set_cond); | |
87 uint32_t subi(code_info *code, uint32_t dst, uint32_t src1, uint32_t immed, uint32_t set_cond); | |
88 uint32_t sub_cc(code_info *code, uint32_t dst, uint32_t src1, uint32_t src2, uint32_t cc, uint32_t set_cond); | |
89 uint32_t subi_cc(code_info *code, uint32_t dst, uint32_t src1, uint32_t immed, uint32_t cc, uint32_t set_cond); | |
90 uint32_t rsb(code_info *code, uint32_t dst, uint32_t src1, uint32_t src2, uint32_t set_cond); | |
91 uint32_t rsbi(code_info *code, uint32_t dst, uint32_t src1, uint32_t immed, uint32_t set_cond); | |
92 uint32_t rsb_cc(code_info *code, uint32_t dst, uint32_t src1, uint32_t src2, uint32_t cc, uint32_t set_cond); | |
93 uint32_t rsbi_cc(code_info *code, uint32_t dst, uint32_t src1, uint32_t immed, uint32_t cc, uint32_t set_cond); | |
94 uint32_t add(code_info *code, uint32_t dst, uint32_t src1, uint32_t src2, uint32_t set_cond); | |
95 uint32_t addi(code_info *code, uint32_t dst, uint32_t src1, uint32_t immed, uint32_t set_cond); | |
96 uint32_t add_cc(code_info *code, uint32_t dst, uint32_t src1, uint32_t src2, uint32_t cc, uint32_t set_cond); | |
97 uint32_t addi_cc(code_info *code, uint32_t dst, uint32_t src1, uint32_t immed, uint32_t cc, uint32_t set_cond); | |
98 uint32_t adc(code_info *code, uint32_t dst, uint32_t src1, uint32_t src2, uint32_t set_cond); | |
99 uint32_t adci(code_info *code, uint32_t dst, uint32_t src1, uint32_t immed, uint32_t set_cond); | |
100 uint32_t adc_cc(code_info *code, uint32_t dst, uint32_t src1, uint32_t src2, uint32_t cc, uint32_t set_cond); | |
101 uint32_t adci_cc(code_info *code, uint32_t dst, uint32_t src1, uint32_t immed, uint32_t cc, uint32_t set_cond); | |
102 uint32_t sbc(code_info *code, uint32_t dst, uint32_t src1, uint32_t src2, uint32_t set_cond); | |
103 uint32_t sbci(code_info *code, uint32_t dst, uint32_t src1, uint32_t immed, uint32_t set_cond); | |
104 uint32_t sbc_cc(code_info *code, uint32_t dst, uint32_t src1, uint32_t src2, uint32_t cc, uint32_t set_cond); | |
105 uint32_t sbci_cc(code_info *code, uint32_t dst, uint32_t src1, uint32_t immed, uint32_t cc, uint32_t set_cond); | |
106 uint32_t rsc(code_info *code, uint32_t dst, uint32_t src1, uint32_t src2, uint32_t set_cond); | |
107 uint32_t rsci(code_info *code, uint32_t dst, uint32_t src1, uint32_t immed, uint32_t set_cond); | |
108 uint32_t rsc_cc(code_info *code, uint32_t dst, uint32_t src1, uint32_t src2, uint32_t cc, uint32_t set_cond); | |
109 uint32_t rsci_cc(code_info *code, uint32_t dst, uint32_t src1, uint32_t immed, uint32_t cc, uint32_t set_cond); | |
110 uint32_t tst(code_info *code, uint32_t src1, uint32_t src2); | |
111 uint32_t tsti(code_info *code, uint32_t src1, uint32_t immed); | |
112 uint32_t tst_cc(code_info *code, uint32_t src1, uint32_t src2, uint32_t cc); | |
113 uint32_t tsti_cc(code_info *code, uint32_t src1, uint32_t immed, uint32_t cc); | |
114 uint32_t teq(code_info *code, uint32_t src1, uint32_t src2); | |
115 uint32_t teqi(code_info *code, uint32_t src1, uint32_t immed); | |
116 uint32_t teq_cc(code_info *code, uint32_t src1, uint32_t src2, uint32_t cc); | |
117 uint32_t teqi_cc(code_info *code, uint32_t src1, uint32_t immed, uint32_t cc); | |
118 uint32_t cmp(code_info *code, uint32_t src1, uint32_t src2); | |
119 uint32_t cmpi(code_info *code, uint32_t src1, uint32_t immed); | |
120 uint32_t cmp_cc(code_info *code, uint32_t src1, uint32_t src2, uint32_t cc); | |
121 uint32_t cmpi_cc(code_info *code, uint32_t src1, uint32_t immed, uint32_t cc); | |
122 uint32_t cmn(code_info *code, uint32_t src1, uint32_t src2); | |
123 uint32_t cmni(code_info *code, uint32_t src1, uint32_t immed); | |
124 uint32_t cmn_cc(code_info *code, uint32_t src1, uint32_t src2, uint32_t cc); | |
125 uint32_t cmni_cc(code_info *code, uint32_t src1, uint32_t immed, uint32_t cc); | |
126 uint32_t orr(code_info *code, uint32_t dst, uint32_t src1, uint32_t src2, uint32_t set_cond); | |
127 uint32_t orri(code_info *code, uint32_t dst, uint32_t src1, uint32_t immed, uint32_t set_cond); | |
128 uint32_t orr_cc(code_info *code, uint32_t dst, uint32_t src1, uint32_t src2, uint32_t cc, uint32_t set_cond); | |
129 uint32_t orri_cc(code_info *code, uint32_t dst, uint32_t src1, uint32_t immed, uint32_t cc, uint32_t set_cond); | |
130 uint32_t mov(code_info *code, uint32_t dst, uint32_t src2, uint32_t set_cond); | |
131 uint32_t movi(code_info *code, uint32_t dst, uint32_t immed, uint32_t set_cond); | |
132 uint32_t mov_cc(code_info *code, uint32_t dst, uint32_t src2, uint32_t cc, uint32_t set_cond); | |
133 uint32_t movi_cc(code_info *code, uint32_t dst, uint32_t immed, uint32_t cc, uint32_t set_cond); | |
134 uint32_t bic(code_info *code, uint32_t dst, uint32_t src1, uint32_t src2, uint32_t set_cond); | |
135 uint32_t bici(code_info *code, uint32_t dst, uint32_t src1, uint32_t immed, uint32_t set_cond); | |
136 uint32_t bic_cc(code_info *code, uint32_t dst, uint32_t src1, uint32_t src2, uint32_t cc, uint32_t set_cond); | |
137 uint32_t bici_cc(code_info *code, uint32_t dst, uint32_t src1, uint32_t immed, uint32_t cc, uint32_t set_cond); | |
138 uint32_t mvn(code_info *code, uint32_t dst, uint32_t src2, uint32_t set_cond); | |
139 uint32_t mvni(code_info *code, uint32_t dst, uint32_t immed, uint32_t set_cond); | |
140 uint32_t mvn_cc(code_info *code, uint32_t dst, uint32_t src2, uint32_t cc, uint32_t set_cond); | |
141 uint32_t mvni_cc(code_info *code, uint32_t dst, uint32_t immed, uint32_t cc, uint32_t set_cond); | |
142 | |
143 uint32_t b(code_info *code, uint32_t *dst); | |
144 uint32_t b_cc(code_info *code, uint32_t *dst, uint32_t cc); | |
145 uint32_t bl(code_info *code, uint32_t *dst); | |
146 uint32_t bl_cc(code_info *code, uint32_t *dst, uint32_t cc); | |
147 uint32_t bx(code_info *code, uint32_t dst); | |
148 uint32_t bx_cc(code_info *code, uint32_t dst, uint32_t cc); | |
149 | |
150 uint32_t push(code_info *code, uint32_t reg); | |
151 uint32_t push_cc(code_info *code, uint32_t reg, uint32_t cc); | |
152 uint32_t pushm(code_info *code, uint32_t reglist); | |
153 uint32_t pushm_cc(code_info *code, uint32_t reglist, uint32_t cc); | |
154 uint32_t pop(code_info *code, uint32_t reg); | |
155 uint32_t pop_cc(code_info *code, uint32_t reg, uint32_t cc); | |
156 uint32_t popm(code_info *code, uint32_t reglist); | |
157 uint32_t popm_cc(code_info *code, uint32_t reglist, uint32_t cc); | |
158 | |
159 #endif //GEN_ARM_H_ |