Revision e37e863f target-mips/translate.c

b/target-mips/translate.c
43 43

  
44 44
#include "gen-op.h"
45 45

  
46
/* MIPS opcodes */
47
#define EXT_SPECIAL  0x100
48
#define EXT_SPECIAL2 0x200
49
#define EXT_REGIMM   0x300
50
#define EXT_CP0      0x400
51
#define EXT_CP1      0x500
52
#define EXT_CP2      0x600
53
#define EXT_CP3      0x700
54

  
55
enum {
56
    /* indirect opcode tables */
57
    OPC_SPECIAL  = 0x00,
58
    OPC_BREGIMM  = 0x01,
59
    OPC_CP0      = 0x10,
60
    OPC_CP1      = 0x11,
61
    OPC_CP2      = 0x12,
62
    OPC_CP3      = 0x13,
63
    OPC_SPECIAL2 = 0x1C,
64
    /* arithmetic with immediate */
65
    OPC_ADDI     = 0x08,
66
    OPC_ADDIU    = 0x09,
67
    OPC_SLTI     = 0x0A,
68
    OPC_SLTIU    = 0x0B,
69
    OPC_ANDI     = 0x0C,
70
    OPC_ORI      = 0x0D,
71
    OPC_XORI     = 0x0E,
72
    OPC_LUI      = 0x0F,
73
    /* Jump and branches */
74
    OPC_J        = 0x02,
75
    OPC_JAL      = 0x03,
76
    OPC_BEQ      = 0x04,  /* Unconditional if rs = rt = 0 (B) */
77
    OPC_BEQL     = 0x14,
78
    OPC_BNE      = 0x05,
79
    OPC_BNEL     = 0x15,
80
    OPC_BLEZ     = 0x06,
81
    OPC_BLEZL    = 0x16,
82
    OPC_BGTZ     = 0x07,
83
    OPC_BGTZL    = 0x17,
84
    OPC_JALX     = 0x1D,  /* MIPS 16 only */
85
    /* Load and stores */
86
    OPC_LB       = 0x20,
87
    OPC_LH       = 0x21,
88
    OPC_LWL      = 0x22,
89
    OPC_LW       = 0x23,
90
    OPC_LBU      = 0x24,
91
    OPC_LHU      = 0x25,
92
    OPC_LWR      = 0x26,
93
    OPC_SB       = 0x28,
94
    OPC_SH       = 0x29,
95
    OPC_SWL      = 0x2A,
96
    OPC_SW       = 0x2B,
97
    OPC_SWR      = 0x2E,
98
    OPC_LL       = 0x30,
99
    OPC_SC       = 0x38,
100
    /* Floating point load/store */
101
    OPC_LWC1     = 0x31,
102
    OPC_LWC2     = 0x32,
103
    OPC_LDC1     = 0x35,
104
    OPC_LDC2     = 0x36,
105
    OPC_SWC1     = 0x39,
106
    OPC_SWC2     = 0x3A,
107
    OPC_SDC1     = 0x3D,
108
    OPC_SDC2     = 0x3E,
109
    /* Cache and prefetch */
110
    OPC_CACHE    = 0x2F,
111
    OPC_PREF     = 0x33,
112
};
113

  
114
/* MIPS special opcodes */
115
enum {
116
    /* Shifts */
117
    OPC_SLL      = 0x00 | EXT_SPECIAL,
118
    /* NOP is SLL r0, r0, 0   */
119
    /* SSNOP is SLL r0, r0, 1 */
120
    OPC_SRL      = 0x02 | EXT_SPECIAL,
121
    OPC_SRA      = 0x03 | EXT_SPECIAL,
122
    OPC_SLLV     = 0x04 | EXT_SPECIAL,
123
    OPC_SRLV     = 0x06 | EXT_SPECIAL,
124
    OPC_SRAV     = 0x07 | EXT_SPECIAL,
125
    /* Multiplication / division */
126
    OPC_MULT     = 0x18 | EXT_SPECIAL,
127
    OPC_MULTU    = 0x19 | EXT_SPECIAL,
128
    OPC_DIV      = 0x1A | EXT_SPECIAL,
129
    OPC_DIVU     = 0x1B | EXT_SPECIAL,
130
    /* 2 registers arithmetic / logic */
131
    OPC_ADD      = 0x20 | EXT_SPECIAL,
132
    OPC_ADDU     = 0x21 | EXT_SPECIAL,
133
    OPC_SUB      = 0x22 | EXT_SPECIAL,
134
    OPC_SUBU     = 0x23 | EXT_SPECIAL,
135
    OPC_AND      = 0x24 | EXT_SPECIAL,
136
    OPC_OR       = 0x25 | EXT_SPECIAL,
137
    OPC_XOR      = 0x26 | EXT_SPECIAL,
138
    OPC_NOR      = 0x27 | EXT_SPECIAL,
139
    OPC_SLT      = 0x2A | EXT_SPECIAL,
140
    OPC_SLTU     = 0x2B | EXT_SPECIAL,
141
    /* Jumps */
142
    OPC_JR       = 0x08 | EXT_SPECIAL,
143
    OPC_JALR     = 0x09 | EXT_SPECIAL,
144
    /* Traps */
145
    OPC_TGE      = 0x30 | EXT_SPECIAL,
146
    OPC_TGEU     = 0x31 | EXT_SPECIAL,
147
    OPC_TLT      = 0x32 | EXT_SPECIAL,
148
    OPC_TLTU     = 0x33 | EXT_SPECIAL,
149
    OPC_TEQ      = 0x34 | EXT_SPECIAL,
150
    OPC_TNE      = 0x36 | EXT_SPECIAL,
151
    /* HI / LO registers load & stores */
152
    OPC_MFHI     = 0x10 | EXT_SPECIAL,
153
    OPC_MTHI     = 0x11 | EXT_SPECIAL,
154
    OPC_MFLO     = 0x12 | EXT_SPECIAL,
155
    OPC_MTLO     = 0x13 | EXT_SPECIAL,
156
    /* Conditional moves */
157
    OPC_MOVZ     = 0x0A | EXT_SPECIAL,
158
    OPC_MOVN     = 0x0B | EXT_SPECIAL,
159

  
160
    OPC_MOVCI    = 0x01 | EXT_SPECIAL,
161

  
162
    /* Special */
163
    OPC_PMON     = 0x05 | EXT_SPECIAL,
164
    OPC_SYSCALL  = 0x0C | EXT_SPECIAL,
165
    OPC_BREAK    = 0x0D | EXT_SPECIAL,
166
    OPC_SYNC     = 0x0F | EXT_SPECIAL,
167
};
168

  
169
enum {
170
    /* Mutiply & xxx operations */
171
    OPC_MADD     = 0x00 | EXT_SPECIAL2,
172
    OPC_MADDU    = 0x01 | EXT_SPECIAL2,
173
    OPC_MUL      = 0x02 | EXT_SPECIAL2,
174
    OPC_MSUB     = 0x04 | EXT_SPECIAL2,
175
    OPC_MSUBU    = 0x05 | EXT_SPECIAL2,
176
    /* Misc */
177
    OPC_CLZ      = 0x20 | EXT_SPECIAL2,
178
    OPC_CLO      = 0x21 | EXT_SPECIAL2,
179
    /* Special */
180
    OPC_SDBBP    = 0x3F | EXT_SPECIAL2,
181
};
182

  
183
/* Branch REGIMM */
184
enum {
185
    OPC_BLTZ     = 0x00 | EXT_REGIMM,
186
    OPC_BLTZL    = 0x02 | EXT_REGIMM,
187
    OPC_BGEZ     = 0x01 | EXT_REGIMM,
188
    OPC_BGEZL    = 0x03 | EXT_REGIMM,
189
    OPC_BLTZAL   = 0x10 | EXT_REGIMM,
190
    OPC_BLTZALL  = 0x12 | EXT_REGIMM,
191
    OPC_BGEZAL   = 0x11 | EXT_REGIMM,
192
    OPC_BGEZALL  = 0x13 | EXT_REGIMM,
193
    OPC_TGEI     = 0x08 | EXT_REGIMM,
194
    OPC_TGEIU    = 0x09 | EXT_REGIMM,
195
    OPC_TLTI     = 0x0A | EXT_REGIMM,
196
    OPC_TLTIU    = 0x0B | EXT_REGIMM,
197
    OPC_TEQI     = 0x0C | EXT_REGIMM,
198
    OPC_TNEI     = 0x0E | EXT_REGIMM,
199
};
200

  
201
enum {
202
    /* Coprocessor 0 (MMU) */
203
    OPC_MFC0     = 0x00 | EXT_CP0,
204
    OPC_MTC0     = 0x04 | EXT_CP0,
205
    OPC_TLBR     = 0x01 | EXT_CP0,
206
    OPC_TLBWI    = 0x02 | EXT_CP0,
207
    OPC_TLBWR    = 0x06 | EXT_CP0,
208
    OPC_TLBP     = 0x08 | EXT_CP0,
209
    OPC_ERET     = 0x18 | EXT_CP0,
210
    OPC_DERET    = 0x1F | EXT_CP0,
211
    OPC_WAIT     = 0x20 | EXT_CP0,
212
};
213

  
46 214
const unsigned char *regnames[] =
47 215
    { "r0", "at", "v0", "v1", "a0", "a1", "a2", "a3",
48 216
      "t0", "t1", "t2", "t3", "t4", "t5", "t6", "t7",

Also available in: Unified diff