all repos — mgba @ c62d913e233e7ea3bb23a3f52fcb7b481f2faed5

mGBA Game Boy Advance Emulator

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