summaryrefslogtreecommitdiff
path: root/target/cris/crisv32-decode.h
blob: fa0a7f0d63ab52ef7071896c49b6ffcdff1d3bd6 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
/*
 *  CRIS insn decoding macros.
 *
 *  Copyright (c) 2007 AXIS Communications AB
 *  Written by Edgar E. Iglesias.
 *
 * This library is free software; you can redistribute it and/or
 * modify it under the terms of the GNU Lesser General Public
 * License as published by the Free Software Foundation; either
 * version 2.1 of the License, or (at your option) any later version.
 *
 * This library is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 * Lesser General Public License for more details.
 *
 * You should have received a copy of the GNU Lesser General Public
 * License along with this library; if not, see <http://www.gnu.org/licenses/>.
 */

#ifndef CRISV32_DECODE_H
#define CRISV32_DECODE_H

/* Convenient binary macros.  */
#define HEX__(n) 0x##n##LU
#define B8__(x) ((x&0x0000000FLU)?1:0) \
                 + ((x&0x000000F0LU)?2:0) \
                 + ((x&0x00000F00LU)?4:0) \
                 + ((x&0x0000F000LU)?8:0) \
                 + ((x&0x000F0000LU)?16:0) \
                 + ((x&0x00F00000LU)?32:0) \
                 + ((x&0x0F000000LU)?64:0) \
                 + ((x&0xF0000000LU)?128:0)
#define B8(d) ((unsigned char)B8__(HEX__(d)))

/* Quick imm.  */
#define DEC_BCCQ     {B8(00000000), B8(11110000)}
#define DEC_ADDOQ    {B8(00010000), B8(11110000)}
#define DEC_ADDQ     {B8(00100000), B8(11111100)}
#define DEC_MOVEQ    {B8(00100100), B8(11111100)}
#define DEC_SUBQ     {B8(00101000), B8(11111100)}
#define DEC_CMPQ     {B8(00101100), B8(11111100)}
#define DEC_ANDQ     {B8(00110000), B8(11111100)}
#define DEC_ORQ      {B8(00110100), B8(11111100)}
#define DEC_BTSTQ    {B8(00111000), B8(11111110)}
#define DEC_ASRQ     {B8(00111010), B8(11111110)}
#define DEC_LSLQ     {B8(00111100), B8(11111110)}
#define DEC_LSRQ     {B8(00111110), B8(11111110)}

/* Register.  */
#define DEC_MOVU_R   {B8(01000100), B8(11111110)}
#define DEC_MOVU_R   {B8(01000100), B8(11111110)}
#define DEC_MOVS_R   {B8(01000110), B8(11111110)}
#define DEC_MOVE_R   {B8(01100100), B8(11111100)}
#define DEC_MOVE_RP  {B8(01100011), B8(11111111)}
#define DEC_MOVE_PR  {B8(01100111), B8(11111111)}
#define DEC_DSTEP_R  {B8(01101111), B8(11111111)}
#define DEC_MOVE_RS  {B8(10110111), B8(11111111)}
#define DEC_MOVE_SR  {B8(11110111), B8(11111111)}
#define DEC_ADDU_R   {B8(01000000), B8(11111110)}
#define DEC_ADDS_R   {B8(01000010), B8(11111110)}
#define DEC_ADD_R    {B8(01100000), B8(11111100)}
#define DEC_ADDI_R   {B8(01010000), B8(11111100)}
#define DEC_MULS_R   {B8(11010000), B8(11111100)}
#define DEC_MULU_R   {B8(10010000), B8(11111100)}
#define DEC_ADDI_ACR {B8(01010100), B8(11111100)}
#define DEC_NEG_R    {B8(01011000), B8(11111100)}
#define DEC_BOUND_R  {B8(01011100), B8(11111100)}
#define DEC_SUBU_R   {B8(01001000), B8(11111110)}
#define DEC_SUBS_R   {B8(01001010), B8(11111110)}
#define DEC_SUB_R    {B8(01101000), B8(11111100)}
#define DEC_CMP_R    {B8(01101100), B8(11111100)}
#define DEC_AND_R    {B8(01110000), B8(11111100)}
#define DEC_ABS_R    {B8(01101011), B8(11111111)}
#define DEC_LZ_R     {B8(01110011), B8(11111111)}
#define DEC_MCP_R    {B8(01111111), B8(11111111)}
#define DEC_SWAP_R   {B8(01110111), B8(11111111)}
#define DEC_XOR_R    {B8(01111011), B8(11111111)}
#define DEC_LSL_R    {B8(01001100), B8(11111100)}
#define DEC_LSR_R    {B8(01111100), B8(11111100)}
#define DEC_ASR_R    {B8(01111000), B8(11111100)}
#define DEC_OR_R     {B8(01110100), B8(11111100)}
#define DEC_BTST_R   {B8(01001111), B8(11111111)}

/* Fixed.  */
#define DEC_SETF     {B8(01011011), B8(11111111)}
#define DEC_CLEARF   {B8(01011111), B8(11111111)}

/* Memory.  */
#define DEC_ADDU_M   {B8(10000000), B8(10111110)}
#define DEC_ADDS_M   {B8(10000010), B8(10111110)}
#define DEC_MOVU_M   {B8(10000100), B8(10111110)}
#define DEC_MOVS_M   {B8(10000110), B8(10111110)}
#define DEC_SUBU_M   {B8(10001000), B8(10111110)}
#define DEC_SUBS_M   {B8(10001010), B8(10111110)}
#define DEC_CMPU_M   {B8(10001100), B8(10111110)}
#define DEC_CMPS_M   {B8(10001110), B8(10111110)}
#define DEC_ADDO_M   {B8(10010100), B8(10111100)}
#define DEC_BOUND_M  {B8(10011100), B8(10111100)}
#define DEC_ADD_M    {B8(10100000), B8(10111100)}
#define DEC_MOVE_MR  {B8(10100100), B8(10111100)}
#define DEC_SUB_M    {B8(10101000), B8(10111100)}
#define DEC_CMP_M    {B8(10101100), B8(10111100)}
#define DEC_AND_M    {B8(10110000), B8(10111100)}
#define DEC_OR_M     {B8(10110100), B8(10111100)}
#define DEC_TEST_M   {B8(10111000), B8(10111100)}
#define DEC_MOVE_RM  {B8(10111100), B8(10111100)}

#define DEC_ADDC_R   {B8(01010111), B8(11111111)}
#define DEC_ADDC_MR  {B8(10011010), B8(10111111)}
#define DEC_LAPCQ    {B8(10010111), B8(11111111)}
#define DEC_LAPC_IM  {B8(11010111), B8(11111111)}

#define DEC_MOVE_MP  {B8(10100011), B8(10111111)}
#define DEC_MOVE_PM  {B8(10100111), B8(10111111)}

#define DEC_SCC_R    {B8(01010011), B8(11111111)}
#define DEC_RFE_ETC  {B8(10010011), B8(11111111)}
#define DEC_JUMP_P   {B8(10011111), B8(11111111)}
#define DEC_BCC_IM   {B8(11011111), B8(11111111)}
#define DEC_JAS_R    {B8(10011011), B8(11111111)}
#define DEC_JASC_R   {B8(10110011), B8(11111111)}
#define DEC_JAS_IM   {B8(11011011), B8(11111111)}
#define DEC_JASC_IM  {B8(11110011), B8(11111111)}
#define DEC_BAS_IM   {B8(11101011), B8(11111111)}
#define DEC_BASC_IM  {B8(11101111), B8(11111111)}
#define DEC_MOVEM_MR {B8(10111011), B8(10111111)}
#define DEC_MOVEM_RM {B8(10111111), B8(10111111)}

#define DEC_FTAG_FIDX_D_M {B8(10101011), B8(11111111)}
#define DEC_FTAG_FIDX_I_M {B8(11010011), B8(11111111)}

#endif