summaryrefslogtreecommitdiffstats
path: root/libpixelflinger/codeflinger/mips_opcode.h
blob: 45bb19ea101963e6d1e35f57663a26cfd2ab9f73 (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
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
/*  $NetBSD: mips_opcode.h,v 1.12 2005/12/11 12:18:09 christos Exp $    */

/*-
 * Copyright (c) 1992, 1993
 *  The Regents of the University of California.  All rights reserved.
 *
 * This code is derived from software contributed to Berkeley by
 * Ralph Campbell.
 *
 * Redistribution and use in source and binary forms, with or without
 * modification, are permitted provided that the following conditions
 * are met:
 * 1. Redistributions of source code must retain the above copyright
 *    notice, this list of conditions and the following disclaimer.
 * 2. Redistributions in binary form must reproduce the above copyright
 *    notice, this list of conditions and the following disclaimer in the
 *    documentation and/or other materials provided with the distribution.
 * 3. Neither the name of the University nor the names of its contributors
 *    may be used to endorse or promote products derived from this software
 *    without specific prior written permission.
 *
 * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
 * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
 * SUCH DAMAGE.
 *
 *  @(#)mips_opcode.h   8.1 (Berkeley) 6/10/93
 */

/*
 * Define the instruction formats and opcode values for the
 * MIPS instruction set.
 */

#include <endian.h>

/*
 * Define the instruction formats.
 */
typedef union {
    unsigned word;

#if BYTE_ORDER == LITTLE_ENDIAN
    struct {
        unsigned imm: 16;
        unsigned rt: 5;
        unsigned rs: 5;
        unsigned op: 6;
    } IType;

    struct {
        unsigned target: 26;
        unsigned op: 6;
    } JType;

    struct {
        unsigned func: 6;
        unsigned shamt: 5;
        unsigned rd: 5;
        unsigned rt: 5;
        unsigned rs: 5;
        unsigned op: 6;
    } RType;

    struct {
        unsigned func: 6;
        unsigned fd: 5;
        unsigned fs: 5;
        unsigned ft: 5;
        unsigned fmt: 4;
        unsigned : 1;       /* always '1' */
        unsigned op: 6;     /* always '0x11' */
    } FRType;
#endif
#if BYTE_ORDER == BIG_ENDIAN
    struct {
        unsigned op: 6;
        unsigned rs: 5;
        unsigned rt: 5;
        unsigned imm: 16;
    } IType;

    struct {
        unsigned op: 6;
        unsigned target: 26;
    } JType;

    struct {
        unsigned op: 6;
        unsigned rs: 5;
        unsigned rt: 5;
        unsigned rd: 5;
        unsigned shamt: 5;
        unsigned func: 6;
    } RType;

    struct {
        unsigned op: 6;     /* always '0x11' */
        unsigned : 1;       /* always '1' */
        unsigned fmt: 4;
        unsigned ft: 5;
        unsigned fs: 5;
        unsigned fd: 5;
        unsigned func: 6;
    } FRType;
#endif
} InstFmt;

/*
 * Values for the 'op' field.
 */
#define OP_SPECIAL  000
#define OP_BCOND    001
#define OP_J        002
#define OP_JAL      003
#define OP_BEQ      004
#define OP_BNE      005
#define OP_BLEZ     006
#define OP_BGTZ     007

#if __mips_isa_rev < 6
#define OP_ADDI     010
#else
#define OP_POP10    010
#endif

#define OP_ADDIU    011
#define OP_SLTI     012
#define OP_SLTIU    013
#define OP_ANDI     014
#define OP_ORI      015
#define OP_XORI     016

#if __mips_isa_rev < 6
#define OP_LUI      017
#else
#define OP_AUI      017
#endif

#define OP_COP0     020
#define OP_COP1     021
#define OP_COP2     022

#if __mips_isa_rev < 6
#define OP_COP3     023
#define OP_BEQL     024
#define OP_BNEL     025
#define OP_BLEZL    026
#define OP_BGTZL    027
#define OP_DADDI    030
#else
#define OP_POP26    026
#define OP_POP27    027
#define OP_POP30    030
#endif

#define OP_DADDIU   031

#if __mips_isa_rev < 6
#define OP_LDL      032
#define OP_LDR      033
#define OP_SPECIAL2 034
#else
#define OP_DAUI     035
#endif

#define OP_SPECIAL3 037

#define OP_LB       040
#define OP_LH       041

#if __mips_isa_rev < 6
#define OP_LWL      042
#endif

#define OP_LW       043
#define OP_LBU      044
#define OP_LHU      045
#define OP_LWR      046
#define OP_LHU      045

#if __mips_isa_rev < 6
#define OP_LWR      046
#endif

#define OP_LWU      047

#define OP_SB       050
#define OP_SH       051

#if __mips_isa_rev < 6
#define OP_SWL      052
#endif

#define OP_SW       053

#if __mips_isa_rev < 6
#define OP_SDL      054
#define OP_SDR      055
#define OP_SWR      056
#define OP_CACHE    057
#define OP_LL       060
#define OP_LWC0     OP_LL
#define OP_LWC1     061
#define OP_LWC2     062
#define OP_LWC3     063
#define OP_LLD      064
#else
#define OP_LWC1     061
#define OP_BC       062
#endif

#define OP_LDC1     065
#define OP_LD       067

#if __mips_isa_rev < 6
#define OP_SC       070
#define OP_SWC0     OP_SC
#endif

#define OP_SWC1     071

#if __mips_isa_rev < 6
#define OP_SWC2     072
#define OP_SWC3     073
#define OP_SCD      074
#else
#define OP_BALC     072
#endif

#define OP_SDC1     075
#define OP_SD       077

/*
 * Values for the 'func' field when 'op' == OP_SPECIAL.
 */
#define OP_SLL      000
#define OP_SRL      002
#define OP_SRA      003
#define OP_SLLV     004
#define OP_SRLV     006
#define OP_SRAV     007

#if __mips_isa_rev < 6
#define OP_JR       010
#endif

#define OP_JALR     011
#define OP_SYSCALL  014
#define OP_BREAK    015
#define OP_SYNC     017

#if __mips_isa_rev < 6
#define OP_MFHI     020
#define OP_MTHI     021
#define OP_MFLO     022
#define OP_MTLO     023
#else
#define OP_CLZ      020
#define OP_CLO      021
#define OP_DCLZ     022
#define OP_DCLO     023
#endif

#define OP_DSLLV    024
#define OP_DSRLV    026
#define OP_DSRAV    027

#if __mips_isa_rev < 6
#define OP_MULT     030
#define OP_MULTU    031
#define OP_DIV      032
#define OP_DIVU     033
#define OP_DMULT    034
#define OP_DMULTU   035
#define OP_DDIV     036
#define OP_DDIVU    037
#else
#define OP_SOP30    030
#define OP_SOP31    031
#define OP_SOP32    032
#define OP_SOP33    033
#define OP_SOP34    034
#define OP_SOP35    035
#define OP_SOP36    036
#define OP_SOP37    037
#endif

#define OP_ADD      040
#define OP_ADDU     041
#define OP_SUB      042
#define OP_SUBU     043
#define OP_AND      044
#define OP_OR       045
#define OP_XOR      046
#define OP_NOR      047

#define OP_SLT      052
#define OP_SLTU     053
#define OP_DADD     054
#define OP_DADDU    055
#define OP_DSUB     056
#define OP_DSUBU    057

#define OP_TGE      060
#define OP_TGEU     061
#define OP_TLT      062
#define OP_TLTU     063
#define OP_TEQ      064
#define OP_TNE      066

#define OP_DSLL     070
#define OP_DSRL     072
#define OP_DSRA     073
#define OP_DSLL32   074
#define OP_DSRL32   076
#define OP_DSRA32   077

#if __mips_isa_rev < 6
/*
 * Values for the 'func' field when 'op' == OP_SPECIAL2.
 * OP_SPECIAL2 opcodes are removed in mips32r6
 */
#define OP_MAD      000     /* QED */
#define OP_MADU     001     /* QED */
#define OP_MUL      002     /* QED */
#endif

/*
 * Values for the 'func' field when 'op' == OP_SPECIAL3.
 */
#define OP_EXT      000
#define OP_DEXTM    001
#define OP_DEXTU    002
#define OP_DEXT     003
#define OP_INS      004
#define OP_DINSM    005
#define OP_DINSU    006
#define OP_DINS     007
#define OP_BSHFL    040
#define OP_RDHWR    073

/*
 * Values for the 'shamt' field when OP_SPECIAL3 && func OP_BSHFL.
 */

#define OP_WSBH     002
#define OP_SEB      020
#define OP_SEH      030

#if __mips_isa_rev == 6
/*
 * Values for the 'shamt' field when OP_SOP30.
 */
#define OP_MUL      002
#define OP_MUH      003
#endif

/*
 * Values for the 'func' field when 'op' == OP_BCOND.
 */
#define OP_BLTZ     000
#define OP_BGEZ     001

#if __mips_isa_rev < 6
#define OP_BLTZL    002
#define OP_BGEZL    003
#define OP_TGEI     010
#define OP_TGEIU    011
#define OP_TLTI     012
#define OP_TLTIU    013
#define OP_TEQI     014
#define OP_TNEI     016
#define OP_BLTZAL   020
#define OP_BGEZAL   021
#define OP_BLTZALL  022
#define OP_BGEZALL  023
#else
#define OP_NAL      020
#define OP_BAL      021
#endif

/*
 * Values for the 'rs' field when 'op' == OP_COPz.
 */
#define OP_MF       000
#define OP_DMF      001
#define OP_MT       004
#define OP_DMT      005
#define OP_BCx      010
#define OP_BCy      014
#define OP_CF       002
#define OP_CT       006

/*
 * Values for the 'rt' field when 'op' == OP_COPz.
 */
#define COPz_BC_TF_MASK 0x01
#define COPz_BC_TRUE    0x01
#define COPz_BC_FALSE   0x00
#define COPz_BCL_TF_MASK    0x02
#define COPz_BCL_TRUE   0x02
#define COPz_BCL_FALSE  0x00