Linux Kernel
3.7.1
Main Page
Related Pages
Modules
Namespaces
Data Structures
Files
File List
Globals
All
Data Structures
Namespaces
Files
Functions
Variables
Typedefs
Enumerations
Enumerator
Macros
Groups
Pages
arch
tile
include
asm
tile-desc_64.h
Go to the documentation of this file.
1
/* TILE-Gx opcode information.
2
*
3
* Copyright 2011 Tilera Corporation. All Rights Reserved.
4
*
5
* This program is free software; you can redistribute it and/or
6
* modify it under the terms of the GNU General Public License
7
* as published by the Free Software Foundation, version 2.
8
*
9
* This program is distributed in the hope that it will be useful, but
10
* WITHOUT ANY WARRANTY; without even the implied warranty of
11
* MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE, GOOD TITLE or
12
* NON INFRINGEMENT. See the GNU General Public License for
13
* more details.
14
*
15
*
16
*
17
*
18
*
19
*/
20
21
#ifndef opcode_tile_h
22
#define opcode_tile_h
23
24
#include <
arch/opcode.h
>
25
26
27
enum
28
{
29
TILEGX_MAX_OPERANDS
= 4
/* bfexts */
30
};
31
32
typedef
enum
33
{
34
TILEGX_OPC_BPT
,
35
TILEGX_OPC_INFO
,
36
TILEGX_OPC_INFOL
,
37
TILEGX_OPC_MOVE
,
38
TILEGX_OPC_MOVEI
,
39
TILEGX_OPC_MOVELI
,
40
TILEGX_OPC_PREFETCH
,
41
TILEGX_OPC_PREFETCH_ADD_L1
,
42
TILEGX_OPC_PREFETCH_ADD_L1_FAULT
,
43
TILEGX_OPC_PREFETCH_ADD_L2
,
44
TILEGX_OPC_PREFETCH_ADD_L2_FAULT
,
45
TILEGX_OPC_PREFETCH_ADD_L3
,
46
TILEGX_OPC_PREFETCH_ADD_L3_FAULT
,
47
TILEGX_OPC_PREFETCH_L1
,
48
TILEGX_OPC_PREFETCH_L1_FAULT
,
49
TILEGX_OPC_PREFETCH_L2
,
50
TILEGX_OPC_PREFETCH_L2_FAULT
,
51
TILEGX_OPC_PREFETCH_L3
,
52
TILEGX_OPC_PREFETCH_L3_FAULT
,
53
TILEGX_OPC_RAISE
,
54
TILEGX_OPC_ADD
,
55
TILEGX_OPC_ADDI
,
56
TILEGX_OPC_ADDLI
,
57
TILEGX_OPC_ADDX
,
58
TILEGX_OPC_ADDXI
,
59
TILEGX_OPC_ADDXLI
,
60
TILEGX_OPC_ADDXSC
,
61
TILEGX_OPC_AND
,
62
TILEGX_OPC_ANDI
,
63
TILEGX_OPC_BEQZ
,
64
TILEGX_OPC_BEQZT
,
65
TILEGX_OPC_BFEXTS
,
66
TILEGX_OPC_BFEXTU
,
67
TILEGX_OPC_BFINS
,
68
TILEGX_OPC_BGEZ
,
69
TILEGX_OPC_BGEZT
,
70
TILEGX_OPC_BGTZ
,
71
TILEGX_OPC_BGTZT
,
72
TILEGX_OPC_BLBC
,
73
TILEGX_OPC_BLBCT
,
74
TILEGX_OPC_BLBS
,
75
TILEGX_OPC_BLBST
,
76
TILEGX_OPC_BLEZ
,
77
TILEGX_OPC_BLEZT
,
78
TILEGX_OPC_BLTZ
,
79
TILEGX_OPC_BLTZT
,
80
TILEGX_OPC_BNEZ
,
81
TILEGX_OPC_BNEZT
,
82
TILEGX_OPC_CLZ
,
83
TILEGX_OPC_CMOVEQZ
,
84
TILEGX_OPC_CMOVNEZ
,
85
TILEGX_OPC_CMPEQ
,
86
TILEGX_OPC_CMPEQI
,
87
TILEGX_OPC_CMPEXCH
,
88
TILEGX_OPC_CMPEXCH4
,
89
TILEGX_OPC_CMPLES
,
90
TILEGX_OPC_CMPLEU
,
91
TILEGX_OPC_CMPLTS
,
92
TILEGX_OPC_CMPLTSI
,
93
TILEGX_OPC_CMPLTU
,
94
TILEGX_OPC_CMPLTUI
,
95
TILEGX_OPC_CMPNE
,
96
TILEGX_OPC_CMUL
,
97
TILEGX_OPC_CMULA
,
98
TILEGX_OPC_CMULAF
,
99
TILEGX_OPC_CMULF
,
100
TILEGX_OPC_CMULFR
,
101
TILEGX_OPC_CMULH
,
102
TILEGX_OPC_CMULHR
,
103
TILEGX_OPC_CRC32_32
,
104
TILEGX_OPC_CRC32_8
,
105
TILEGX_OPC_CTZ
,
106
TILEGX_OPC_DBLALIGN
,
107
TILEGX_OPC_DBLALIGN2
,
108
TILEGX_OPC_DBLALIGN4
,
109
TILEGX_OPC_DBLALIGN6
,
110
TILEGX_OPC_DRAIN
,
111
TILEGX_OPC_DTLBPR
,
112
TILEGX_OPC_EXCH
,
113
TILEGX_OPC_EXCH4
,
114
TILEGX_OPC_FDOUBLE_ADD_FLAGS
,
115
TILEGX_OPC_FDOUBLE_ADDSUB
,
116
TILEGX_OPC_FDOUBLE_MUL_FLAGS
,
117
TILEGX_OPC_FDOUBLE_PACK1
,
118
TILEGX_OPC_FDOUBLE_PACK2
,
119
TILEGX_OPC_FDOUBLE_SUB_FLAGS
,
120
TILEGX_OPC_FDOUBLE_UNPACK_MAX
,
121
TILEGX_OPC_FDOUBLE_UNPACK_MIN
,
122
TILEGX_OPC_FETCHADD
,
123
TILEGX_OPC_FETCHADD4
,
124
TILEGX_OPC_FETCHADDGEZ
,
125
TILEGX_OPC_FETCHADDGEZ4
,
126
TILEGX_OPC_FETCHAND
,
127
TILEGX_OPC_FETCHAND4
,
128
TILEGX_OPC_FETCHOR
,
129
TILEGX_OPC_FETCHOR4
,
130
TILEGX_OPC_FINV
,
131
TILEGX_OPC_FLUSH
,
132
TILEGX_OPC_FLUSHWB
,
133
TILEGX_OPC_FNOP
,
134
TILEGX_OPC_FSINGLE_ADD1
,
135
TILEGX_OPC_FSINGLE_ADDSUB2
,
136
TILEGX_OPC_FSINGLE_MUL1
,
137
TILEGX_OPC_FSINGLE_MUL2
,
138
TILEGX_OPC_FSINGLE_PACK1
,
139
TILEGX_OPC_FSINGLE_PACK2
,
140
TILEGX_OPC_FSINGLE_SUB1
,
141
TILEGX_OPC_ICOH
,
142
TILEGX_OPC_ILL
,
143
TILEGX_OPC_INV
,
144
TILEGX_OPC_IRET
,
145
TILEGX_OPC_J
,
146
TILEGX_OPC_JAL
,
147
TILEGX_OPC_JALR
,
148
TILEGX_OPC_JALRP
,
149
TILEGX_OPC_JR
,
150
TILEGX_OPC_JRP
,
151
TILEGX_OPC_LD
,
152
TILEGX_OPC_LD1S
,
153
TILEGX_OPC_LD1S_ADD
,
154
TILEGX_OPC_LD1U
,
155
TILEGX_OPC_LD1U_ADD
,
156
TILEGX_OPC_LD2S
,
157
TILEGX_OPC_LD2S_ADD
,
158
TILEGX_OPC_LD2U
,
159
TILEGX_OPC_LD2U_ADD
,
160
TILEGX_OPC_LD4S
,
161
TILEGX_OPC_LD4S_ADD
,
162
TILEGX_OPC_LD4U
,
163
TILEGX_OPC_LD4U_ADD
,
164
TILEGX_OPC_LD_ADD
,
165
TILEGX_OPC_LDNA
,
166
TILEGX_OPC_LDNA_ADD
,
167
TILEGX_OPC_LDNT
,
168
TILEGX_OPC_LDNT1S
,
169
TILEGX_OPC_LDNT1S_ADD
,
170
TILEGX_OPC_LDNT1U
,
171
TILEGX_OPC_LDNT1U_ADD
,
172
TILEGX_OPC_LDNT2S
,
173
TILEGX_OPC_LDNT2S_ADD
,
174
TILEGX_OPC_LDNT2U
,
175
TILEGX_OPC_LDNT2U_ADD
,
176
TILEGX_OPC_LDNT4S
,
177
TILEGX_OPC_LDNT4S_ADD
,
178
TILEGX_OPC_LDNT4U
,
179
TILEGX_OPC_LDNT4U_ADD
,
180
TILEGX_OPC_LDNT_ADD
,
181
TILEGX_OPC_LNK
,
182
TILEGX_OPC_MF
,
183
TILEGX_OPC_MFSPR
,
184
TILEGX_OPC_MM
,
185
TILEGX_OPC_MNZ
,
186
TILEGX_OPC_MTSPR
,
187
TILEGX_OPC_MUL_HS_HS
,
188
TILEGX_OPC_MUL_HS_HU
,
189
TILEGX_OPC_MUL_HS_LS
,
190
TILEGX_OPC_MUL_HS_LU
,
191
TILEGX_OPC_MUL_HU_HU
,
192
TILEGX_OPC_MUL_HU_LS
,
193
TILEGX_OPC_MUL_HU_LU
,
194
TILEGX_OPC_MUL_LS_LS
,
195
TILEGX_OPC_MUL_LS_LU
,
196
TILEGX_OPC_MUL_LU_LU
,
197
TILEGX_OPC_MULA_HS_HS
,
198
TILEGX_OPC_MULA_HS_HU
,
199
TILEGX_OPC_MULA_HS_LS
,
200
TILEGX_OPC_MULA_HS_LU
,
201
TILEGX_OPC_MULA_HU_HU
,
202
TILEGX_OPC_MULA_HU_LS
,
203
TILEGX_OPC_MULA_HU_LU
,
204
TILEGX_OPC_MULA_LS_LS
,
205
TILEGX_OPC_MULA_LS_LU
,
206
TILEGX_OPC_MULA_LU_LU
,
207
TILEGX_OPC_MULAX
,
208
TILEGX_OPC_MULX
,
209
TILEGX_OPC_MZ
,
210
TILEGX_OPC_NAP
,
211
TILEGX_OPC_NOP
,
212
TILEGX_OPC_NOR
,
213
TILEGX_OPC_OR
,
214
TILEGX_OPC_ORI
,
215
TILEGX_OPC_PCNT
,
216
TILEGX_OPC_REVBITS
,
217
TILEGX_OPC_REVBYTES
,
218
TILEGX_OPC_ROTL
,
219
TILEGX_OPC_ROTLI
,
220
TILEGX_OPC_SHL
,
221
TILEGX_OPC_SHL16INSLI
,
222
TILEGX_OPC_SHL1ADD
,
223
TILEGX_OPC_SHL1ADDX
,
224
TILEGX_OPC_SHL2ADD
,
225
TILEGX_OPC_SHL2ADDX
,
226
TILEGX_OPC_SHL3ADD
,
227
TILEGX_OPC_SHL3ADDX
,
228
TILEGX_OPC_SHLI
,
229
TILEGX_OPC_SHLX
,
230
TILEGX_OPC_SHLXI
,
231
TILEGX_OPC_SHRS
,
232
TILEGX_OPC_SHRSI
,
233
TILEGX_OPC_SHRU
,
234
TILEGX_OPC_SHRUI
,
235
TILEGX_OPC_SHRUX
,
236
TILEGX_OPC_SHRUXI
,
237
TILEGX_OPC_SHUFFLEBYTES
,
238
TILEGX_OPC_ST
,
239
TILEGX_OPC_ST1
,
240
TILEGX_OPC_ST1_ADD
,
241
TILEGX_OPC_ST2
,
242
TILEGX_OPC_ST2_ADD
,
243
TILEGX_OPC_ST4
,
244
TILEGX_OPC_ST4_ADD
,
245
TILEGX_OPC_ST_ADD
,
246
TILEGX_OPC_STNT
,
247
TILEGX_OPC_STNT1
,
248
TILEGX_OPC_STNT1_ADD
,
249
TILEGX_OPC_STNT2
,
250
TILEGX_OPC_STNT2_ADD
,
251
TILEGX_OPC_STNT4
,
252
TILEGX_OPC_STNT4_ADD
,
253
TILEGX_OPC_STNT_ADD
,
254
TILEGX_OPC_SUB
,
255
TILEGX_OPC_SUBX
,
256
TILEGX_OPC_SUBXSC
,
257
TILEGX_OPC_SWINT0
,
258
TILEGX_OPC_SWINT1
,
259
TILEGX_OPC_SWINT2
,
260
TILEGX_OPC_SWINT3
,
261
TILEGX_OPC_TBLIDXB0
,
262
TILEGX_OPC_TBLIDXB1
,
263
TILEGX_OPC_TBLIDXB2
,
264
TILEGX_OPC_TBLIDXB3
,
265
TILEGX_OPC_V1ADD
,
266
TILEGX_OPC_V1ADDI
,
267
TILEGX_OPC_V1ADDUC
,
268
TILEGX_OPC_V1ADIFFU
,
269
TILEGX_OPC_V1AVGU
,
270
TILEGX_OPC_V1CMPEQ
,
271
TILEGX_OPC_V1CMPEQI
,
272
TILEGX_OPC_V1CMPLES
,
273
TILEGX_OPC_V1CMPLEU
,
274
TILEGX_OPC_V1CMPLTS
,
275
TILEGX_OPC_V1CMPLTSI
,
276
TILEGX_OPC_V1CMPLTU
,
277
TILEGX_OPC_V1CMPLTUI
,
278
TILEGX_OPC_V1CMPNE
,
279
TILEGX_OPC_V1DDOTPU
,
280
TILEGX_OPC_V1DDOTPUA
,
281
TILEGX_OPC_V1DDOTPUS
,
282
TILEGX_OPC_V1DDOTPUSA
,
283
TILEGX_OPC_V1DOTP
,
284
TILEGX_OPC_V1DOTPA
,
285
TILEGX_OPC_V1DOTPU
,
286
TILEGX_OPC_V1DOTPUA
,
287
TILEGX_OPC_V1DOTPUS
,
288
TILEGX_OPC_V1DOTPUSA
,
289
TILEGX_OPC_V1INT_H
,
290
TILEGX_OPC_V1INT_L
,
291
TILEGX_OPC_V1MAXU
,
292
TILEGX_OPC_V1MAXUI
,
293
TILEGX_OPC_V1MINU
,
294
TILEGX_OPC_V1MINUI
,
295
TILEGX_OPC_V1MNZ
,
296
TILEGX_OPC_V1MULTU
,
297
TILEGX_OPC_V1MULU
,
298
TILEGX_OPC_V1MULUS
,
299
TILEGX_OPC_V1MZ
,
300
TILEGX_OPC_V1SADAU
,
301
TILEGX_OPC_V1SADU
,
302
TILEGX_OPC_V1SHL
,
303
TILEGX_OPC_V1SHLI
,
304
TILEGX_OPC_V1SHRS
,
305
TILEGX_OPC_V1SHRSI
,
306
TILEGX_OPC_V1SHRU
,
307
TILEGX_OPC_V1SHRUI
,
308
TILEGX_OPC_V1SUB
,
309
TILEGX_OPC_V1SUBUC
,
310
TILEGX_OPC_V2ADD
,
311
TILEGX_OPC_V2ADDI
,
312
TILEGX_OPC_V2ADDSC
,
313
TILEGX_OPC_V2ADIFFS
,
314
TILEGX_OPC_V2AVGS
,
315
TILEGX_OPC_V2CMPEQ
,
316
TILEGX_OPC_V2CMPEQI
,
317
TILEGX_OPC_V2CMPLES
,
318
TILEGX_OPC_V2CMPLEU
,
319
TILEGX_OPC_V2CMPLTS
,
320
TILEGX_OPC_V2CMPLTSI
,
321
TILEGX_OPC_V2CMPLTU
,
322
TILEGX_OPC_V2CMPLTUI
,
323
TILEGX_OPC_V2CMPNE
,
324
TILEGX_OPC_V2DOTP
,
325
TILEGX_OPC_V2DOTPA
,
326
TILEGX_OPC_V2INT_H
,
327
TILEGX_OPC_V2INT_L
,
328
TILEGX_OPC_V2MAXS
,
329
TILEGX_OPC_V2MAXSI
,
330
TILEGX_OPC_V2MINS
,
331
TILEGX_OPC_V2MINSI
,
332
TILEGX_OPC_V2MNZ
,
333
TILEGX_OPC_V2MULFSC
,
334
TILEGX_OPC_V2MULS
,
335
TILEGX_OPC_V2MULTS
,
336
TILEGX_OPC_V2MZ
,
337
TILEGX_OPC_V2PACKH
,
338
TILEGX_OPC_V2PACKL
,
339
TILEGX_OPC_V2PACKUC
,
340
TILEGX_OPC_V2SADAS
,
341
TILEGX_OPC_V2SADAU
,
342
TILEGX_OPC_V2SADS
,
343
TILEGX_OPC_V2SADU
,
344
TILEGX_OPC_V2SHL
,
345
TILEGX_OPC_V2SHLI
,
346
TILEGX_OPC_V2SHLSC
,
347
TILEGX_OPC_V2SHRS
,
348
TILEGX_OPC_V2SHRSI
,
349
TILEGX_OPC_V2SHRU
,
350
TILEGX_OPC_V2SHRUI
,
351
TILEGX_OPC_V2SUB
,
352
TILEGX_OPC_V2SUBSC
,
353
TILEGX_OPC_V4ADD
,
354
TILEGX_OPC_V4ADDSC
,
355
TILEGX_OPC_V4INT_H
,
356
TILEGX_OPC_V4INT_L
,
357
TILEGX_OPC_V4PACKSC
,
358
TILEGX_OPC_V4SHL
,
359
TILEGX_OPC_V4SHLSC
,
360
TILEGX_OPC_V4SHRS
,
361
TILEGX_OPC_V4SHRU
,
362
TILEGX_OPC_V4SUB
,
363
TILEGX_OPC_V4SUBSC
,
364
TILEGX_OPC_WH64
,
365
TILEGX_OPC_XOR
,
366
TILEGX_OPC_XORI
,
367
TILEGX_OPC_NONE
368
}
tilegx_mnemonic
;
369
370
371
372
typedef
enum
373
{
374
TILEGX_PIPELINE_X0
,
375
TILEGX_PIPELINE_X1
,
376
TILEGX_PIPELINE_Y0
,
377
TILEGX_PIPELINE_Y1
,
378
TILEGX_PIPELINE_Y2
,
379
}
tilegx_pipeline
;
380
381
#define tilegx_is_x_pipeline(p) ((int)(p) <= (int)TILEGX_PIPELINE_X1)
382
383
typedef
enum
384
{
385
TILEGX_OP_TYPE_REGISTER
,
386
TILEGX_OP_TYPE_IMMEDIATE
,
387
TILEGX_OP_TYPE_ADDRESS
,
388
TILEGX_OP_TYPE_SPR
389
}
tilegx_operand_type
;
390
391
struct
tilegx_operand
392
{
393
/* Is this operand a register, immediate or address? */
394
tilegx_operand_type
type
;
395
396
/* The default relocation type for this operand. */
397
signed
int
default_reloc
: 16;
398
399
/* How many bits is this value? (used for range checking) */
400
unsigned
int
num_bits
: 5;
401
402
/* Is the value signed? (used for range checking) */
403
unsigned
int
is_signed
: 1;
404
405
/* Is this operand a source register? */
406
unsigned
int
is_src_reg
: 1;
407
408
/* Is this operand written? (i.e. is it a destination register) */
409
unsigned
int
is_dest_reg
: 1;
410
411
/* Is this operand PC-relative? */
412
unsigned
int
is_pc_relative
: 1;
413
414
/* By how many bits do we right shift the value before inserting? */
415
unsigned
int
rightshift
: 2;
416
417
/* Return the bits for this operand to be ORed into an existing bundle. */
418
tilegx_bundle_bits
(*
insert
) (
int
op
);
419
420
/* Extract this operand and return it. */
421
unsigned
int
(*
extract
) (
tilegx_bundle_bits
bundle);
422
};
423
424
425
extern
const
struct
tilegx_operand
tilegx_operands
[];
426
427
/* One finite-state machine per pipe for rapid instruction decoding. */
428
extern
const
unsigned
short
*
const
429
tilegx_bundle_decoder_fsms
[
TILEGX_NUM_PIPELINE_ENCODINGS
];
430
431
432
struct
tilegx_opcode
433
{
434
/* The opcode mnemonic, e.g. "add" */
435
const
char
*
name
;
436
437
/* The enum value for this mnemonic. */
438
tilegx_mnemonic
mnemonic
;
439
440
/* A bit mask of which of the five pipes this instruction
441
is compatible with:
442
X0 0x01
443
X1 0x02
444
Y0 0x04
445
Y1 0x08
446
Y2 0x10 */
447
unsigned
char
pipes
;
448
449
/* How many operands are there? */
450
unsigned
char
num_operands
;
451
452
/* Which register does this write implicitly, or TREG_ZERO if none? */
453
unsigned
char
implicitly_written_register
;
454
455
/* Can this be bundled with other instructions (almost always true). */
456
unsigned
char
can_bundle
;
457
458
/* The description of the operands. Each of these is an
459
* index into the tilegx_operands[] table. */
460
unsigned
char
operands
[
TILEGX_NUM_PIPELINE_ENCODINGS
][
TILEGX_MAX_OPERANDS
];
461
462
};
463
464
extern
const
struct
tilegx_opcode
tilegx_opcodes
[];
465
466
/* Used for non-textual disassembly into structs. */
467
struct
tilegx_decoded_instruction
468
{
469
const
struct
tilegx_opcode
*
opcode
;
470
const
struct
tilegx_operand
*
operands
[
TILEGX_MAX_OPERANDS
];
471
long
long
operand_values
[
TILEGX_MAX_OPERANDS
];
472
};
473
474
475
/* Disassemble a bundle into a struct for machine processing. */
476
extern
int
parse_insn_tilegx
(
tilegx_bundle_bits
bits
,
477
unsigned
long
long
pc
,
478
struct
tilegx_decoded_instruction
479
decoded[
TILEGX_MAX_INSTRUCTIONS_PER_BUNDLE
]);
480
481
482
483
#endif
/* opcode_tilegx_h */
Generated on Thu Jan 10 2013 13:18:57 for Linux Kernel by
1.8.2