include/mgba/internal/arm/emitter-thumb.h (view raw)
1/* Copyright (c) 2013-2014 Jeffrey Pfau
2 *
3 * This Source Code Form is subject to the terms of the Mozilla Public
4 * License, v. 2.0. If a copy of the MPL was not distributed with this
5 * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
6#ifndef EMITTER_THUMB_H
7#define EMITTER_THUMB_H
8
9#include "emitter-inlines.h"
10
11#define DECLARE_INSTRUCTION_THUMB(EMITTER, NAME) \
12 EMITTER ## NAME
13
14#define DECLARE_INSTRUCTION_WITH_HIGH_THUMB(EMITTER, NAME) \
15 DECLARE_INSTRUCTION_THUMB(EMITTER, NAME ## 00), \
16 DECLARE_INSTRUCTION_THUMB(EMITTER, NAME ## 01), \
17 DECLARE_INSTRUCTION_THUMB(EMITTER, NAME ## 10), \
18 DECLARE_INSTRUCTION_THUMB(EMITTER, NAME ## 11)
19
20#define DECLARE_THUMB_EMITTER_BLOCK(EMITTER, V) \
21 /* 00X- */ DO_8(DO_4(DECLARE_INSTRUCTION_THUMB(EMITTER, LSL1))), \
22 /* 08X- */ DO_8(DO_4(DECLARE_INSTRUCTION_THUMB(EMITTER, LSR1))), \
23 /* 10X- */ DO_8(DO_4(DECLARE_INSTRUCTION_THUMB(EMITTER, ASR1))), \
24 /* 18X- */ DO_8(DECLARE_INSTRUCTION_THUMB(EMITTER, ADD3)), \
25 /* 1AX- */ DO_8(DECLARE_INSTRUCTION_THUMB(EMITTER, SUB3)), \
26 /* 1CX- */ DO_8(DECLARE_INSTRUCTION_THUMB(EMITTER, ADD1)), \
27 /* 1EX- */ DO_8(DECLARE_INSTRUCTION_THUMB(EMITTER, SUB1)), \
28 /* 20X- */ DO_8(DO_4(DECLARE_INSTRUCTION_THUMB(EMITTER, MOV1))), \
29 /* 28X- */ DO_8(DO_4(DECLARE_INSTRUCTION_THUMB(EMITTER, CMP1))), \
30 /* 30X- */ DO_8(DO_4(DECLARE_INSTRUCTION_THUMB(EMITTER, ADD2))), \
31 /* 38X- */ DO_8(DO_4(DECLARE_INSTRUCTION_THUMB(EMITTER, SUB2))), \
32 /* 400- */ DECLARE_INSTRUCTION_THUMB(EMITTER, AND), \
33 /* 404- */ DECLARE_INSTRUCTION_THUMB(EMITTER, EOR), \
34 /* 408- */ DECLARE_INSTRUCTION_THUMB(EMITTER, LSL2), \
35 /* 40C- */ DECLARE_INSTRUCTION_THUMB(EMITTER, LSR2), \
36 /* 410- */ DECLARE_INSTRUCTION_THUMB(EMITTER, ASR2), \
37 /* 414- */ DECLARE_INSTRUCTION_THUMB(EMITTER, ADC), \
38 /* 418- */ DECLARE_INSTRUCTION_THUMB(EMITTER, SBC), \
39 /* 41C- */ DECLARE_INSTRUCTION_THUMB(EMITTER, ROR), \
40 /* 420- */ DECLARE_INSTRUCTION_THUMB(EMITTER, TST), \
41 /* 424- */ DECLARE_INSTRUCTION_THUMB(EMITTER, NEG), \
42 /* 428- */ DECLARE_INSTRUCTION_THUMB(EMITTER, CMP2), \
43 /* 42C- */ DECLARE_INSTRUCTION_THUMB(EMITTER, CMN), \
44 /* 430- */ DECLARE_INSTRUCTION_THUMB(EMITTER, ORR), \
45 /* 434- */ DECLARE_INSTRUCTION_THUMB(EMITTER, MUL), \
46 /* 438- */ DECLARE_INSTRUCTION_THUMB(EMITTER, BIC), \
47 /* 43C- */ DECLARE_INSTRUCTION_THUMB(EMITTER, MVN), \
48 /* 44X- */ DECLARE_INSTRUCTION_WITH_HIGH_THUMB(EMITTER, ADD4), \
49 /* 45X- */ DECLARE_INSTRUCTION_WITH_HIGH_THUMB(EMITTER, CMP3), \
50 /* 46X- */ DECLARE_INSTRUCTION_WITH_HIGH_THUMB(EMITTER, MOV3), \
51 /* 470- */ DECLARE_INSTRUCTION_THUMB(EMITTER, BX), \
52 /* 474- */ DECLARE_INSTRUCTION_THUMB(EMITTER, BX), \
53 /* 478- */ MIN_V(DECLARE_INSTRUCTION_THUMB(EMITTER, BLX2), DECLARE_INSTRUCTION_THUMB(EMITTER, ILL), V >= 5), \
54 /* 47C- */ MIN_V(DECLARE_INSTRUCTION_THUMB(EMITTER, BLX2), DECLARE_INSTRUCTION_THUMB(EMITTER, ILL), V >= 5), \
55 /* 48X- */ DO_8(DO_4(DECLARE_INSTRUCTION_THUMB(EMITTER, LDR3))), \
56 /* 50X- */ DO_8(DECLARE_INSTRUCTION_THUMB(EMITTER, STR2)), \
57 /* 52X- */ DO_8(DECLARE_INSTRUCTION_THUMB(EMITTER, STRH2)), \
58 /* 54X- */ DO_8(DECLARE_INSTRUCTION_THUMB(EMITTER, STRB2)), \
59 /* 56X- */ DO_8(DECLARE_INSTRUCTION_THUMB(EMITTER, LDRSB)), \
60 /* 58X- */ DO_8(DECLARE_INSTRUCTION_THUMB(EMITTER, LDR2)), \
61 /* 5AX- */ DO_8(DECLARE_INSTRUCTION_THUMB(EMITTER, LDRH2)), \
62 /* 5CX- */ DO_8(DECLARE_INSTRUCTION_THUMB(EMITTER, LDRB2)), \
63 /* 5EX- */ DO_8(DECLARE_INSTRUCTION_THUMB(EMITTER, LDRSH)), \
64 /* 60X- */ DO_8(DO_4(DECLARE_INSTRUCTION_THUMB(EMITTER, STR1))), \
65 /* 68X- */ DO_8(DO_4(DECLARE_INSTRUCTION_THUMB(EMITTER, LDR1))), \
66 /* 70X- */ DO_8(DO_4(DECLARE_INSTRUCTION_THUMB(EMITTER, STRB1))), \
67 /* 78X- */ DO_8(DO_4(DECLARE_INSTRUCTION_THUMB(EMITTER, LDRB1))), \
68 /* 80X- */ DO_8(DO_4(DECLARE_INSTRUCTION_THUMB(EMITTER, STRH1))), \
69 /* 88X- */ DO_8(DO_4(DECLARE_INSTRUCTION_THUMB(EMITTER, LDRH1))), \
70 /* 90X- */ DO_8(DO_4(DECLARE_INSTRUCTION_THUMB(EMITTER, STR3))), \
71 /* 98X- */ DO_8(DO_4(DECLARE_INSTRUCTION_THUMB(EMITTER, LDR4))), \
72 /* A0X- */ DO_8(DO_4(DECLARE_INSTRUCTION_THUMB(EMITTER, ADD5))), \
73 /* A8X- */ DO_8(DO_4(DECLARE_INSTRUCTION_THUMB(EMITTER, ADD6))), \
74 /* B00- */ DECLARE_INSTRUCTION_THUMB(EMITTER, ADD7), \
75 /* B04- */ DECLARE_INSTRUCTION_THUMB(EMITTER, ADD7), \
76 /* B08- */ DECLARE_INSTRUCTION_THUMB(EMITTER, SUB4), \
77 /* B0C- */ DECLARE_INSTRUCTION_THUMB(EMITTER, SUB4), \
78 /* B1X- */ DO_4(DECLARE_INSTRUCTION_THUMB(EMITTER, ILL)), \
79 /* B2X- */ DO_4(DECLARE_INSTRUCTION_THUMB(EMITTER, ILL)), \
80 /* B3X- */ DO_4(DECLARE_INSTRUCTION_THUMB(EMITTER, ILL)), \
81 /* B4X- */ DO_4(DECLARE_INSTRUCTION_THUMB(EMITTER, PUSH)), \
82 /* B5X- */ DO_4(DECLARE_INSTRUCTION_THUMB(EMITTER, PUSHR)), \
83 /* B6X- */ DO_8(DECLARE_INSTRUCTION_THUMB(EMITTER, ILL)), \
84 /* B8X- */ DO_8(DECLARE_INSTRUCTION_THUMB(EMITTER, ILL)), \
85 /* BAX- */ DO_8(DECLARE_INSTRUCTION_THUMB(EMITTER, ILL)), \
86 /* BCX- */ DO_4(DECLARE_INSTRUCTION_THUMB(EMITTER, POP)), \
87 /* BDX- */ DO_4(MIN_V(DECLARE_INSTRUCTION_THUMB(EMITTER, POPR), DECLARE_INSTRUCTION_THUMB(EMITTER, POPRv4), V >= 5)), \
88 /* BEX- */ DO_4(DECLARE_INSTRUCTION_THUMB(EMITTER, BKPT)), \
89 /* BFX- */ DO_4(DECLARE_INSTRUCTION_THUMB(EMITTER, ILL)), \
90 /* C0X- */ DO_8(DO_4(DECLARE_INSTRUCTION_THUMB(EMITTER, STMIA))), \
91 /* C8X- */ DO_8(DO_4(DECLARE_INSTRUCTION_THUMB(EMITTER, LDMIA))), \
92 /* D0X- */ DO_4(DECLARE_INSTRUCTION_THUMB(EMITTER, BEQ)), \
93 /* D1X- */ DO_4(DECLARE_INSTRUCTION_THUMB(EMITTER, BNE)), \
94 /* D2X- */ DO_4(DECLARE_INSTRUCTION_THUMB(EMITTER, BCS)), \
95 /* D3X- */ DO_4(DECLARE_INSTRUCTION_THUMB(EMITTER, BCC)), \
96 /* D4X- */ DO_4(DECLARE_INSTRUCTION_THUMB(EMITTER, BMI)), \
97 /* D5X- */ DO_4(DECLARE_INSTRUCTION_THUMB(EMITTER, BPL)), \
98 /* D6X- */ DO_4(DECLARE_INSTRUCTION_THUMB(EMITTER, BVS)), \
99 /* D7X- */ DO_4(DECLARE_INSTRUCTION_THUMB(EMITTER, BVC)), \
100 /* D8X- */ DO_4(DECLARE_INSTRUCTION_THUMB(EMITTER, BHI)), \
101 /* D9X- */ DO_4(DECLARE_INSTRUCTION_THUMB(EMITTER, BLS)), \
102 /* DAX- */ DO_4(DECLARE_INSTRUCTION_THUMB(EMITTER, BGE)), \
103 /* DBX- */ DO_4(DECLARE_INSTRUCTION_THUMB(EMITTER, BLT)), \
104 /* DCX- */ DO_4(DECLARE_INSTRUCTION_THUMB(EMITTER, BGT)), \
105 /* DDX- */ DO_4(DECLARE_INSTRUCTION_THUMB(EMITTER, BLE)), \
106 /* DEX- */ DO_4(DECLARE_INSTRUCTION_THUMB(EMITTER, ILL)), \
107 /* DFX- */ DO_4(DECLARE_INSTRUCTION_THUMB(EMITTER, SWI)), \
108 /* E0X- */ DO_8(DO_4(DECLARE_INSTRUCTION_THUMB(EMITTER, B))), \
109 /* E8X- */ DO_8(DO_4(MIN_V(DECLARE_INSTRUCTION_THUMB(EMITTER, BLX1), DECLARE_INSTRUCTION_THUMB(EMITTER, ILL), V >= 5))), \
110 /* F0X- */ DO_8(DO_4(DECLARE_INSTRUCTION_THUMB(EMITTER, BL1))), \
111 /* F8X- */ DO_8(DO_4(DECLARE_INSTRUCTION_THUMB(EMITTER, BL2))) \
112
113#endif