/* Copyright (c) 2013-2014 Jeffrey Pfau * * This Source Code Form is subject to the terms of the Mozilla Public * License, v. 2.0. If a copy of the MPL was not distributed with this * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ #ifndef EMITTER_THUMB_H #define EMITTER_THUMB_H #include "emitter-inlines.h" #define DECLARE_INSTRUCTION_THUMB(EMITTER, NAME) \ EMITTER ## NAME #define DECLARE_INSTRUCTION_WITH_HIGH_THUMB(EMITTER, NAME) \ DECLARE_INSTRUCTION_THUMB(EMITTER, NAME ## 00), \ DECLARE_INSTRUCTION_THUMB(EMITTER, NAME ## 01), \ DECLARE_INSTRUCTION_THUMB(EMITTER, NAME ## 10), \ DECLARE_INSTRUCTION_THUMB(EMITTER, NAME ## 11) #define DECLARE_THUMB_EMITTER_BLOCK(EMITTER, V) \ /* 00X- */ DO_8(DO_4(DECLARE_INSTRUCTION_THUMB(EMITTER, LSL1))), \ /* 08X- */ DO_8(DO_4(DECLARE_INSTRUCTION_THUMB(EMITTER, LSR1))), \ /* 10X- */ DO_8(DO_4(DECLARE_INSTRUCTION_THUMB(EMITTER, ASR1))), \ /* 18X- */ DO_8(DECLARE_INSTRUCTION_THUMB(EMITTER, ADD3)), \ /* 1AX- */ DO_8(DECLARE_INSTRUCTION_THUMB(EMITTER, SUB3)), \ /* 1CX- */ DO_8(DECLARE_INSTRUCTION_THUMB(EMITTER, ADD1)), \ /* 1EX- */ DO_8(DECLARE_INSTRUCTION_THUMB(EMITTER, SUB1)), \ /* 20X- */ DO_8(DO_4(DECLARE_INSTRUCTION_THUMB(EMITTER, MOV1))), \ /* 28X- */ DO_8(DO_4(DECLARE_INSTRUCTION_THUMB(EMITTER, CMP1))), \ /* 30X- */ DO_8(DO_4(DECLARE_INSTRUCTION_THUMB(EMITTER, ADD2))), \ /* 38X- */ DO_8(DO_4(DECLARE_INSTRUCTION_THUMB(EMITTER, SUB2))), \ /* 400- */ DECLARE_INSTRUCTION_THUMB(EMITTER, AND), \ /* 404- */ DECLARE_INSTRUCTION_THUMB(EMITTER, EOR), \ /* 408- */ DECLARE_INSTRUCTION_THUMB(EMITTER, LSL2), \ /* 40C- */ DECLARE_INSTRUCTION_THUMB(EMITTER, LSR2), \ /* 410- */ DECLARE_INSTRUCTION_THUMB(EMITTER, ASR2), \ /* 414- */ DECLARE_INSTRUCTION_THUMB(EMITTER, ADC), \ /* 418- */ DECLARE_INSTRUCTION_THUMB(EMITTER, SBC), \ /* 41C- */ DECLARE_INSTRUCTION_THUMB(EMITTER, ROR), \ /* 420- */ DECLARE_INSTRUCTION_THUMB(EMITTER, TST), \ /* 424- */ DECLARE_INSTRUCTION_THUMB(EMITTER, NEG), \ /* 428- */ DECLARE_INSTRUCTION_THUMB(EMITTER, CMP2), \ /* 42C- */ DECLARE_INSTRUCTION_THUMB(EMITTER, CMN), \ /* 430- */ DECLARE_INSTRUCTION_THUMB(EMITTER, ORR), \ /* 434- */ DECLARE_INSTRUCTION_THUMB(EMITTER, MUL), \ /* 438- */ DECLARE_INSTRUCTION_THUMB(EMITTER, BIC), \ /* 43C- */ DECLARE_INSTRUCTION_THUMB(EMITTER, MVN), \ /* 44X- */ DECLARE_INSTRUCTION_WITH_HIGH_THUMB(EMITTER, ADD4), \ /* 45X- */ DECLARE_INSTRUCTION_WITH_HIGH_THUMB(EMITTER, CMP3), \ /* 46X- */ DECLARE_INSTRUCTION_WITH_HIGH_THUMB(EMITTER, MOV3), \ /* 470- */ DECLARE_INSTRUCTION_THUMB(EMITTER, BX), \ /* 474- */ DECLARE_INSTRUCTION_THUMB(EMITTER, BX), \ /* 478- */ MIN_V(DECLARE_INSTRUCTION_THUMB(EMITTER, BLX2), DECLARE_INSTRUCTION_THUMB(EMITTER, ILL), V >= 5), \ /* 47C- */ MIN_V(DECLARE_INSTRUCTION_THUMB(EMITTER, BLX2), DECLARE_INSTRUCTION_THUMB(EMITTER, ILL), V >= 5), \ /* 48X- */ DO_8(DO_4(DECLARE_INSTRUCTION_THUMB(EMITTER, LDR3))), \ /* 50X- */ DO_8(DECLARE_INSTRUCTION_THUMB(EMITTER, STR2)), \ /* 52X- */ DO_8(DECLARE_INSTRUCTION_THUMB(EMITTER, STRH2)), \ /* 54X- */ DO_8(DECLARE_INSTRUCTION_THUMB(EMITTER, STRB2)), \ /* 56X- */ DO_8(DECLARE_INSTRUCTION_THUMB(EMITTER, LDRSB)), \ /* 58X- */ DO_8(DECLARE_INSTRUCTION_THUMB(EMITTER, LDR2)), \ /* 5AX- */ DO_8(DECLARE_INSTRUCTION_THUMB(EMITTER, LDRH2)), \ /* 5CX- */ DO_8(DECLARE_INSTRUCTION_THUMB(EMITTER, LDRB2)), \ /* 5EX- */ DO_8(DECLARE_INSTRUCTION_THUMB(EMITTER, LDRSH)), \ /* 60X- */ DO_8(DO_4(DECLARE_INSTRUCTION_THUMB(EMITTER, STR1))), \ /* 68X- */ DO_8(DO_4(DECLARE_INSTRUCTION_THUMB(EMITTER, LDR1))), \ /* 70X- */ DO_8(DO_4(DECLARE_INSTRUCTION_THUMB(EMITTER, STRB1))), \ /* 78X- */ DO_8(DO_4(DECLARE_INSTRUCTION_THUMB(EMITTER, LDRB1))), \ /* 80X- */ DO_8(DO_4(DECLARE_INSTRUCTION_THUMB(EMITTER, STRH1))), \ /* 88X- */ DO_8(DO_4(DECLARE_INSTRUCTION_THUMB(EMITTER, LDRH1))), \ /* 90X- */ DO_8(DO_4(DECLARE_INSTRUCTION_THUMB(EMITTER, STR3))), \ /* 98X- */ DO_8(DO_4(DECLARE_INSTRUCTION_THUMB(EMITTER, LDR4))), \ /* A0X- */ DO_8(DO_4(DECLARE_INSTRUCTION_THUMB(EMITTER, ADD5))), \ /* A8X- */ DO_8(DO_4(DECLARE_INSTRUCTION_THUMB(EMITTER, ADD6))), \ /* B00- */ DECLARE_INSTRUCTION_THUMB(EMITTER, ADD7), \ /* B04- */ DECLARE_INSTRUCTION_THUMB(EMITTER, ADD7), \ /* B08- */ DECLARE_INSTRUCTION_THUMB(EMITTER, SUB4), \ /* B0C- */ DECLARE_INSTRUCTION_THUMB(EMITTER, SUB4), \ /* B1X- */ DO_4(DECLARE_INSTRUCTION_THUMB(EMITTER, ILL)), \ /* B2X- */ DO_4(DECLARE_INSTRUCTION_THUMB(EMITTER, ILL)), \ /* B3X- */ DO_4(DECLARE_INSTRUCTION_THUMB(EMITTER, ILL)), \ /* B4X- */ DO_4(DECLARE_INSTRUCTION_THUMB(EMITTER, PUSH)), \ /* B5X- */ DO_4(DECLARE_INSTRUCTION_THUMB(EMITTER, PUSHR)), \ /* B6X- */ DO_8(DECLARE_INSTRUCTION_THUMB(EMITTER, ILL)), \ /* B8X- */ DO_8(DECLARE_INSTRUCTION_THUMB(EMITTER, ILL)), \ /* BAX- */ DO_8(DECLARE_INSTRUCTION_THUMB(EMITTER, ILL)), \ /* BCX- */ DO_4(DECLARE_INSTRUCTION_THUMB(EMITTER, POP)), \ /* BDX- */ DO_4(MIN_V(DECLARE_INSTRUCTION_THUMB(EMITTER, POPR), DECLARE_INSTRUCTION_THUMB(EMITTER, POPRv4), V >= 5)), \ /* BEX- */ DO_4(DECLARE_INSTRUCTION_THUMB(EMITTER, BKPT)), \ /* BFX- */ DO_4(DECLARE_INSTRUCTION_THUMB(EMITTER, ILL)), \ /* C0X- */ DO_8(DO_4(DECLARE_INSTRUCTION_THUMB(EMITTER, STMIA))), \ /* C8X- */ DO_8(DO_4(DECLARE_INSTRUCTION_THUMB(EMITTER, LDMIA))), \ /* D0X- */ DO_4(DECLARE_INSTRUCTION_THUMB(EMITTER, BEQ)), \ /* D1X- */ DO_4(DECLARE_INSTRUCTION_THUMB(EMITTER, BNE)), \ /* D2X- */ DO_4(DECLARE_INSTRUCTION_THUMB(EMITTER, BCS)), \ /* D3X- */ DO_4(DECLARE_INSTRUCTION_THUMB(EMITTER, BCC)), \ /* D4X- */ DO_4(DECLARE_INSTRUCTION_THUMB(EMITTER, BMI)), \ /* D5X- */ DO_4(DECLARE_INSTRUCTION_THUMB(EMITTER, BPL)), \ /* D6X- */ DO_4(DECLARE_INSTRUCTION_THUMB(EMITTER, BVS)), \ /* D7X- */ DO_4(DECLARE_INSTRUCTION_THUMB(EMITTER, BVC)), \ /* D8X- */ DO_4(DECLARE_INSTRUCTION_THUMB(EMITTER, BHI)), \ /* D9X- */ DO_4(DECLARE_INSTRUCTION_THUMB(EMITTER, BLS)), \ /* DAX- */ DO_4(DECLARE_INSTRUCTION_THUMB(EMITTER, BGE)), \ /* DBX- */ DO_4(DECLARE_INSTRUCTION_THUMB(EMITTER, BLT)), \ /* DCX- */ DO_4(DECLARE_INSTRUCTION_THUMB(EMITTER, BGT)), \ /* DDX- */ DO_4(DECLARE_INSTRUCTION_THUMB(EMITTER, BLE)), \ /* DEX- */ DO_4(DECLARE_INSTRUCTION_THUMB(EMITTER, ILL)), \ /* DFX- */ DO_4(DECLARE_INSTRUCTION_THUMB(EMITTER, SWI)), \ /* E0X- */ DO_8(DO_4(DECLARE_INSTRUCTION_THUMB(EMITTER, B))), \ /* E8X- */ DO_8(DO_4(MIN_V(DECLARE_INSTRUCTION_THUMB(EMITTER, BLX1), DECLARE_INSTRUCTION_THUMB(EMITTER, ILL), V >= 5))), \ /* F0X- */ DO_8(DO_4(DECLARE_INSTRUCTION_THUMB(EMITTER, BL1))), \ /* F8X- */ DO_8(DO_4(DECLARE_INSTRUCTION_THUMB(EMITTER, BL2))) \ #endif