main
gen_arm.h
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#include "gen.h"
11
12#define SET_COND 0x100000u
13#define NO_COND 0u
14
15#define CC_FIELD_SHIFT 28
16
17#define CC_EQ 0x0u
18#define CC_NE (0x1u << CC_FIELD_SHIFT)
19#define CC_CS (0x2u << CC_FIELD_SHIFT)
20#define CC_CC (0x3u << CC_FIELD_SHIFT)
21#define CC_MI (0x4u << CC_FIELD_SHIFT)
22#define CC_PL (0x5u << CC_FIELD_SHIFT)
23#define CC_VS (0x6u << CC_FIELD_SHIFT)
24#define CC_VC (0x7u << CC_FIELD_SHIFT)
25#define CC_HI (0x8u << CC_FIELD_SHIFT)
26#define CC_LS (0x9u << CC_FIELD_SHIFT)
27#define CC_GE (0xAu << CC_FIELD_SHIFT)
28#define CC_LT (0xBu << CC_FIELD_SHIFT)
29#define CC_GT (0xCu << CC_FIELD_SHIFT)
30#define CC_LE (0xDu << CC_FIELD_SHIFT)
31#define CC_AL (0xEu << CC_FIELD_SHIFT)
32
33#define INVALID_IMMED 0xFFFFFFFFu
34#define CODE_OK 0u
35
36enum {
37 r0,
38 r1,
39 r2,
40 r3,
41 r4,
42 r5,
43 r6,
44 r7,
45 r8,
46 r9,
47 r10,
48 r11,
49 r12,
50 sp,
51 lr,
52 pc
53};
54
55#define R0 0x1
56#define R1 0x2
57#define R2 0x4
58#define R3 0x8
59#define R4 0x10
60#define R5 0x20
61#define R6 0x40
62#define R7 0x80
63#define R8 0x100
64#define R9 0x200
65#define R10 0x400
66#define R11 0x800
67#define R12 0x1000
68#define SP 0x2000
69#define LR 0x4000
70#define PC 0x8000
71
72uint32_t and(code_info *code, uint32_t dst, uint32_t src1, uint32_t src2, uint32_t set_cond);
73uint32_t andi(code_info *code, uint32_t dst, uint32_t src1, uint32_t immed, uint32_t set_cond);
74uint32_t and_cc(code_info *code, uint32_t dst, uint32_t src1, uint32_t src2, uint32_t cc, uint32_t set_cond);
75uint32_t andi_cc(code_info *code, uint32_t dst, uint32_t src1, uint32_t immed, uint32_t cc, uint32_t set_cond);
76uint32_t eor(code_info *code, uint32_t dst, uint32_t src1, uint32_t src2, uint32_t set_cond);
77uint32_t eori(code_info *code, uint32_t dst, uint32_t src1, uint32_t immed, uint32_t set_cond);
78uint32_t eor_cc(code_info *code, uint32_t dst, uint32_t src1, uint32_t src2, uint32_t cc, uint32_t set_cond);
79uint32_t eori_cc(code_info *code, uint32_t dst, uint32_t src1, uint32_t immed, uint32_t cc, uint32_t set_cond);
80uint32_t sub(code_info *code, uint32_t dst, uint32_t src1, uint32_t src2, uint32_t set_cond);
81uint32_t subi(code_info *code, uint32_t dst, uint32_t src1, uint32_t immed, uint32_t set_cond);
82uint32_t sub_cc(code_info *code, uint32_t dst, uint32_t src1, uint32_t src2, uint32_t cc, uint32_t set_cond);
83uint32_t subi_cc(code_info *code, uint32_t dst, uint32_t src1, uint32_t immed, uint32_t cc, uint32_t set_cond);
84uint32_t rsb(code_info *code, uint32_t dst, uint32_t src1, uint32_t src2, uint32_t set_cond);
85uint32_t rsbi(code_info *code, uint32_t dst, uint32_t src1, uint32_t immed, uint32_t set_cond);
86uint32_t rsb_cc(code_info *code, uint32_t dst, uint32_t src1, uint32_t src2, uint32_t cc, uint32_t set_cond);
87uint32_t rsbi_cc(code_info *code, uint32_t dst, uint32_t src1, uint32_t immed, uint32_t cc, uint32_t set_cond);
88uint32_t add(code_info *code, uint32_t dst, uint32_t src1, uint32_t src2, uint32_t set_cond);
89uint32_t addi(code_info *code, uint32_t dst, uint32_t src1, uint32_t immed, uint32_t set_cond);
90uint32_t add_cc(code_info *code, uint32_t dst, uint32_t src1, uint32_t src2, uint32_t cc, uint32_t set_cond);
91uint32_t addi_cc(code_info *code, uint32_t dst, uint32_t src1, uint32_t immed, uint32_t cc, uint32_t set_cond);
92uint32_t adc(code_info *code, uint32_t dst, uint32_t src1, uint32_t src2, uint32_t set_cond);
93uint32_t adci(code_info *code, uint32_t dst, uint32_t src1, uint32_t immed, uint32_t set_cond);
94uint32_t adc_cc(code_info *code, uint32_t dst, uint32_t src1, uint32_t src2, uint32_t cc, uint32_t set_cond);
95uint32_t adci_cc(code_info *code, uint32_t dst, uint32_t src1, uint32_t immed, uint32_t cc, uint32_t set_cond);
96uint32_t sbc(code_info *code, uint32_t dst, uint32_t src1, uint32_t src2, uint32_t set_cond);
97uint32_t sbci(code_info *code, uint32_t dst, uint32_t src1, uint32_t immed, uint32_t set_cond);
98uint32_t sbc_cc(code_info *code, uint32_t dst, uint32_t src1, uint32_t src2, uint32_t cc, uint32_t set_cond);
99uint32_t sbci_cc(code_info *code, uint32_t dst, uint32_t src1, uint32_t immed, uint32_t cc, uint32_t set_cond);
100uint32_t rsc(code_info *code, uint32_t dst, uint32_t src1, uint32_t src2, uint32_t set_cond);
101uint32_t rsci(code_info *code, uint32_t dst, uint32_t src1, uint32_t immed, uint32_t set_cond);
102uint32_t rsc_cc(code_info *code, uint32_t dst, uint32_t src1, uint32_t src2, uint32_t cc, uint32_t set_cond);
103uint32_t rsci_cc(code_info *code, uint32_t dst, uint32_t src1, uint32_t immed, uint32_t cc, uint32_t set_cond);
104uint32_t tst(code_info *code, uint32_t src1, uint32_t src2);
105uint32_t tsti(code_info *code, uint32_t src1, uint32_t immed);
106uint32_t tst_cc(code_info *code, uint32_t src1, uint32_t src2, uint32_t cc);
107uint32_t tsti_cc(code_info *code, uint32_t src1, uint32_t immed, uint32_t cc);
108uint32_t teq(code_info *code, uint32_t src1, uint32_t src2);
109uint32_t teqi(code_info *code, uint32_t src1, uint32_t immed);
110uint32_t teq_cc(code_info *code, uint32_t src1, uint32_t src2, uint32_t cc);
111uint32_t teqi_cc(code_info *code, uint32_t src1, uint32_t immed, uint32_t cc);
112uint32_t cmp(code_info *code, uint32_t src1, uint32_t src2);
113uint32_t cmpi(code_info *code, uint32_t src1, uint32_t immed);
114uint32_t cmp_cc(code_info *code, uint32_t src1, uint32_t src2, uint32_t cc);
115uint32_t cmpi_cc(code_info *code, uint32_t src1, uint32_t immed, uint32_t cc);
116uint32_t cmn(code_info *code, uint32_t src1, uint32_t src2);
117uint32_t cmni(code_info *code, uint32_t src1, uint32_t immed);
118uint32_t cmn_cc(code_info *code, uint32_t src1, uint32_t src2, uint32_t cc);
119uint32_t cmni_cc(code_info *code, uint32_t src1, uint32_t immed, uint32_t cc);
120uint32_t orr(code_info *code, uint32_t dst, uint32_t src1, uint32_t src2, uint32_t set_cond);
121uint32_t orri(code_info *code, uint32_t dst, uint32_t src1, uint32_t immed, uint32_t set_cond);
122uint32_t orr_cc(code_info *code, uint32_t dst, uint32_t src1, uint32_t src2, uint32_t cc, uint32_t set_cond);
123uint32_t orri_cc(code_info *code, uint32_t dst, uint32_t src1, uint32_t immed, uint32_t cc, uint32_t set_cond);
124uint32_t mov(code_info *code, uint32_t dst, uint32_t src2, uint32_t set_cond);
125uint32_t movi(code_info *code, uint32_t dst, uint32_t immed, uint32_t set_cond);
126uint32_t mov_cc(code_info *code, uint32_t dst, uint32_t src2, uint32_t cc, uint32_t set_cond);
127uint32_t movi_cc(code_info *code, uint32_t dst, uint32_t immed, uint32_t cc, uint32_t set_cond);
128uint32_t bic(code_info *code, uint32_t dst, uint32_t src1, uint32_t src2, uint32_t set_cond);
129uint32_t bici(code_info *code, uint32_t dst, uint32_t src1, uint32_t immed, uint32_t set_cond);
130uint32_t bic_cc(code_info *code, uint32_t dst, uint32_t src1, uint32_t src2, uint32_t cc, uint32_t set_cond);
131uint32_t bici_cc(code_info *code, uint32_t dst, uint32_t src1, uint32_t immed, uint32_t cc, uint32_t set_cond);
132uint32_t mvn(code_info *code, uint32_t dst, uint32_t src2, uint32_t set_cond);
133uint32_t mvni(code_info *code, uint32_t dst, uint32_t immed, uint32_t set_cond);
134uint32_t mvn_cc(code_info *code, uint32_t dst, uint32_t src2, uint32_t cc, uint32_t set_cond);
135uint32_t mvni_cc(code_info *code, uint32_t dst, uint32_t immed, uint32_t cc, uint32_t set_cond);
136
137uint32_t b(code_info *code, uint32_t *dst);
138uint32_t b_cc(code_info *code, uint32_t *dst, uint32_t cc);
139uint32_t bl(code_info *code, uint32_t *dst);
140uint32_t bl_cc(code_info *code, uint32_t *dst, uint32_t cc);
141uint32_t bx(code_info *code, uint32_t dst);
142uint32_t bx_cc(code_info *code, uint32_t dst, uint32_t cc);
143
144uint32_t push(code_info *code, uint32_t reg);
145uint32_t push_cc(code_info *code, uint32_t reg, uint32_t cc);
146uint32_t pushm(code_info *code, uint32_t reglist);
147uint32_t pushm_cc(code_info *code, uint32_t reglist, uint32_t cc);
148uint32_t pop(code_info *code, uint32_t reg);
149uint32_t pop_cc(code_info *code, uint32_t reg, uint32_t cc);
150uint32_t popm(code_info *code, uint32_t reglist);
151uint32_t popm_cc(code_info *code, uint32_t reglist, uint32_t cc);
152uint32_t ldr_cc(code_info *code, uint32_t dst, uint32_t base, int32_t offset, uint32_t cc);
153uint32_t ldr(code_info *code, uint32_t rst, uint32_t base, int32_t offset);
154uint32_t str_cc(code_info *code, uint32_t src, uint32_t base, int32_t offset, uint32_t cc);
155uint32_t str(code_info *code, uint32_t src, uint32_t base, int32_t offset);
156
157#endif //GEN_ARM_H_