diff options
author | Michael Ellerman <michael@ellerman.id.au> | 2006-11-22 18:46:43 -0500 |
---|---|---|
committer | Paul Mackerras <paulus@samba.org> | 2006-12-04 04:40:29 -0500 |
commit | ae06e374c15c5d62e08c19c15f2c247a86e240d4 (patch) | |
tree | 0126919fb2edccaa6f8a50545a403bd5e9deab6b /arch | |
parent | 4c4c8723684b1b2cd0dfdf5e0685f35642bde253 (diff) |
[POWERPC] Import spu disassembly code into xmon
This patch imports and munges the spu disassembly code from binutils.
All files originated from version 1.1 in binutils cvs.
* spu.h, spu-insns.h and spu-opc.c are unchanged except for pathnames.
* spu-dis.c has been edited heavily:
* use printf instead of info->fprintf_func and similar.
* pass the instruction in rather than reading it.
* we have no equivalent to symbol_at_address_func, so we just assume
there is never a symbol at the address given.
Signed-off-by: Michael Ellerman <michael@ellerman.id.au>
Signed-off-by: Arnd Bergmann <arnd.bergmann@de.ibm.com>
Diffstat (limited to 'arch')
-rw-r--r-- | arch/powerpc/xmon/spu-dis.c | 249 | ||||
-rw-r--r-- | arch/powerpc/xmon/spu-insns.h | 410 | ||||
-rw-r--r-- | arch/powerpc/xmon/spu-opc.c | 44 | ||||
-rw-r--r-- | arch/powerpc/xmon/spu.h | 126 |
4 files changed, 829 insertions, 0 deletions
diff --git a/arch/powerpc/xmon/spu-dis.c b/arch/powerpc/xmon/spu-dis.c new file mode 100644 index 000000000000..75ac0815f1a4 --- /dev/null +++ b/arch/powerpc/xmon/spu-dis.c | |||
@@ -0,0 +1,249 @@ | |||
1 | /* Disassemble SPU instructions | ||
2 | |||
3 | Copyright 2006 Free Software Foundation, Inc. | ||
4 | |||
5 | This file is part of GDB, GAS, and the GNU binutils. | ||
6 | |||
7 | This program is free software; you can redistribute it and/or modify | ||
8 | it under the terms of the GNU General Public License as published by | ||
9 | the Free Software Foundation; either version 2 of the License, or | ||
10 | (at your option) any later version. | ||
11 | |||
12 | This program is distributed in the hope that it will be useful, | ||
13 | but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
14 | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | ||
15 | GNU General Public License for more details. | ||
16 | |||
17 | You should have received a copy of the GNU General Public License along | ||
18 | with this program; if not, write to the Free Software Foundation, Inc., | ||
19 | 51 Franklin Street - Fifth Floor, Boston, MA 02110-1301, USA. */ | ||
20 | |||
21 | #include <linux/string.h> | ||
22 | #include "nonstdio.h" | ||
23 | #include "ansidecl.h" | ||
24 | #include "spu.h" | ||
25 | |||
26 | extern void print_address (unsigned long memaddr); | ||
27 | |||
28 | /* This file provides a disassembler function which uses | ||
29 | the disassembler interface defined in dis-asm.h. */ | ||
30 | |||
31 | extern const struct spu_opcode spu_opcodes[]; | ||
32 | extern const int spu_num_opcodes; | ||
33 | |||
34 | #define SPU_DISASM_TBL_SIZE (1 << 11) | ||
35 | static const struct spu_opcode *spu_disassemble_table[SPU_DISASM_TBL_SIZE]; | ||
36 | |||
37 | static void | ||
38 | init_spu_disassemble (void) | ||
39 | { | ||
40 | int i; | ||
41 | |||
42 | /* If two instructions have the same opcode then we prefer the first | ||
43 | * one. In most cases it is just an alternate mnemonic. */ | ||
44 | for (i = 0; i < spu_num_opcodes; i++) | ||
45 | { | ||
46 | int o = spu_opcodes[i].opcode; | ||
47 | if (o >= SPU_DISASM_TBL_SIZE) | ||
48 | continue; /* abort (); */ | ||
49 | if (spu_disassemble_table[o] == 0) | ||
50 | spu_disassemble_table[o] = &spu_opcodes[i]; | ||
51 | } | ||
52 | } | ||
53 | |||
54 | /* Determine the instruction from the 10 least significant bits. */ | ||
55 | static const struct spu_opcode * | ||
56 | get_index_for_opcode (unsigned int insn) | ||
57 | { | ||
58 | const struct spu_opcode *index; | ||
59 | unsigned int opcode = insn >> (32-11); | ||
60 | |||
61 | /* Init the table. This assumes that element 0/opcode 0 (currently | ||
62 | * NOP) is always used */ | ||
63 | if (spu_disassemble_table[0] == 0) | ||
64 | init_spu_disassemble (); | ||
65 | |||
66 | if ((index = spu_disassemble_table[opcode & 0x780]) != 0 | ||
67 | && index->insn_type == RRR) | ||
68 | return index; | ||
69 | |||
70 | if ((index = spu_disassemble_table[opcode & 0x7f0]) != 0 | ||
71 | && (index->insn_type == RI18 || index->insn_type == LBT)) | ||
72 | return index; | ||
73 | |||
74 | if ((index = spu_disassemble_table[opcode & 0x7f8]) != 0 | ||
75 | && index->insn_type == RI10) | ||
76 | return index; | ||
77 | |||
78 | if ((index = spu_disassemble_table[opcode & 0x7fc]) != 0 | ||
79 | && (index->insn_type == RI16)) | ||
80 | return index; | ||
81 | |||
82 | if ((index = spu_disassemble_table[opcode & 0x7fe]) != 0 | ||
83 | && (index->insn_type == RI8)) | ||
84 | return index; | ||
85 | |||
86 | if ((index = spu_disassemble_table[opcode & 0x7ff]) != 0) | ||
87 | return index; | ||
88 | |||
89 | return 0; | ||
90 | } | ||
91 | |||
92 | /* Print a Spu instruction. */ | ||
93 | |||
94 | int | ||
95 | print_insn_spu (unsigned long insn, unsigned long memaddr) | ||
96 | { | ||
97 | int value; | ||
98 | int hex_value; | ||
99 | const struct spu_opcode *index; | ||
100 | enum spu_insns tag; | ||
101 | |||
102 | index = get_index_for_opcode (insn); | ||
103 | |||
104 | if (index == 0) | ||
105 | { | ||
106 | printf(".long 0x%x", insn); | ||
107 | } | ||
108 | else | ||
109 | { | ||
110 | int i; | ||
111 | int paren = 0; | ||
112 | tag = (enum spu_insns)(index - spu_opcodes); | ||
113 | printf("%s", index->mnemonic); | ||
114 | if (tag == M_BI || tag == M_BISL || tag == M_IRET || tag == M_BISLED | ||
115 | || tag == M_BIHNZ || tag == M_BIHZ || tag == M_BINZ || tag == M_BIZ | ||
116 | || tag == M_SYNC || tag == M_HBR) | ||
117 | { | ||
118 | int fb = (insn >> (32-18)) & 0x7f; | ||
119 | if (fb & 0x40) | ||
120 | printf(tag == M_SYNC ? "c" : "p"); | ||
121 | if (fb & 0x20) | ||
122 | printf("d"); | ||
123 | if (fb & 0x10) | ||
124 | printf("e"); | ||
125 | } | ||
126 | if (index->arg[0] != 0) | ||
127 | printf("\t"); | ||
128 | hex_value = 0; | ||
129 | for (i = 1; i <= index->arg[0]; i++) | ||
130 | { | ||
131 | int arg = index->arg[i]; | ||
132 | if (arg != A_P && !paren && i > 1) | ||
133 | printf(","); | ||
134 | |||
135 | switch (arg) | ||
136 | { | ||
137 | case A_T: | ||
138 | printf("$%d", | ||
139 | DECODE_INSN_RT (insn)); | ||
140 | break; | ||
141 | case A_A: | ||
142 | printf("$%d", | ||
143 | DECODE_INSN_RA (insn)); | ||
144 | break; | ||
145 | case A_B: | ||
146 | printf("$%d", | ||
147 | DECODE_INSN_RB (insn)); | ||
148 | break; | ||
149 | case A_C: | ||
150 | printf("$%d", | ||
151 | DECODE_INSN_RC (insn)); | ||
152 | break; | ||
153 | case A_S: | ||
154 | printf("$sp%d", | ||
155 | DECODE_INSN_RA (insn)); | ||
156 | break; | ||
157 | case A_H: | ||
158 | printf("$ch%d", | ||
159 | DECODE_INSN_RA (insn)); | ||
160 | break; | ||
161 | case A_P: | ||
162 | paren++; | ||
163 | printf("("); | ||
164 | break; | ||
165 | case A_U7A: | ||
166 | printf("%d", | ||
167 | 173 - DECODE_INSN_U8 (insn)); | ||
168 | break; | ||
169 | case A_U7B: | ||
170 | printf("%d", | ||
171 | 155 - DECODE_INSN_U8 (insn)); | ||
172 | break; | ||
173 | case A_S3: | ||
174 | case A_S6: | ||
175 | case A_S7: | ||
176 | case A_S7N: | ||
177 | case A_U3: | ||
178 | case A_U5: | ||
179 | case A_U6: | ||
180 | case A_U7: | ||
181 | hex_value = DECODE_INSN_I7 (insn); | ||
182 | printf("%d", hex_value); | ||
183 | break; | ||
184 | case A_S11: | ||
185 | print_address(memaddr + DECODE_INSN_I9a (insn) * 4); | ||
186 | break; | ||
187 | case A_S11I: | ||
188 | print_address(memaddr + DECODE_INSN_I9b (insn) * 4); | ||
189 | break; | ||
190 | case A_S10: | ||
191 | case A_S10B: | ||
192 | hex_value = DECODE_INSN_I10 (insn); | ||
193 | printf("%d", hex_value); | ||
194 | break; | ||
195 | case A_S14: | ||
196 | hex_value = DECODE_INSN_I10 (insn) * 16; | ||
197 | printf("%d", hex_value); | ||
198 | break; | ||
199 | case A_S16: | ||
200 | hex_value = DECODE_INSN_I16 (insn); | ||
201 | printf("%d", hex_value); | ||
202 | break; | ||
203 | case A_X16: | ||
204 | hex_value = DECODE_INSN_U16 (insn); | ||
205 | printf("%u", hex_value); | ||
206 | break; | ||
207 | case A_R18: | ||
208 | value = DECODE_INSN_I16 (insn) * 4; | ||
209 | if (value == 0) | ||
210 | printf("%d", value); | ||
211 | else | ||
212 | { | ||
213 | hex_value = memaddr + value; | ||
214 | print_address(hex_value & 0x3ffff); | ||
215 | } | ||
216 | break; | ||
217 | case A_S18: | ||
218 | value = DECODE_INSN_U16 (insn) * 4; | ||
219 | if (value == 0) | ||
220 | printf("%d", value); | ||
221 | else | ||
222 | print_address(value); | ||
223 | break; | ||
224 | case A_U18: | ||
225 | value = DECODE_INSN_U18 (insn); | ||
226 | if (value == 0 || 1) | ||
227 | { | ||
228 | hex_value = value; | ||
229 | printf("%u", value); | ||
230 | } | ||
231 | else | ||
232 | print_address(value); | ||
233 | break; | ||
234 | case A_U14: | ||
235 | hex_value = DECODE_INSN_U14 (insn); | ||
236 | printf("%u", hex_value); | ||
237 | break; | ||
238 | } | ||
239 | if (arg != A_P && paren) | ||
240 | { | ||
241 | printf(")"); | ||
242 | paren--; | ||
243 | } | ||
244 | } | ||
245 | if (hex_value > 16) | ||
246 | printf("\t# %x", hex_value); | ||
247 | } | ||
248 | return 4; | ||
249 | } | ||
diff --git a/arch/powerpc/xmon/spu-insns.h b/arch/powerpc/xmon/spu-insns.h new file mode 100644 index 000000000000..99dc452821ac --- /dev/null +++ b/arch/powerpc/xmon/spu-insns.h | |||
@@ -0,0 +1,410 @@ | |||
1 | /* SPU ELF support for BFD. | ||
2 | |||
3 | Copyright 2006 Free Software Foundation, Inc. | ||
4 | |||
5 | This file is part of BFD, the Binary File Descriptor library. | ||
6 | |||
7 | This program is free software; you can redistribute it and/or modify | ||
8 | it under the terms of the GNU General Public License as published by | ||
9 | the Free Software Foundation; either version 2 of the License, or | ||
10 | (at your option) any later version. | ||
11 | |||
12 | This program is distributed in the hope that it will be useful, | ||
13 | but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
14 | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | ||
15 | GNU General Public License for more details. | ||
16 | |||
17 | You should have received a copy of the GNU General Public License | ||
18 | along with this program; if not, write to the Free Software Foundation, | ||
19 | Inc., 51 Franklin Street - Fifth Floor, Boston, MA 02110-1301, USA. */ | ||
20 | |||
21 | /* SPU Opcode Table | ||
22 | |||
23 | -=-=-= FORMAT =-=-=- | ||
24 | |||
25 | +----+-------+-------+-------+-------+ +------------+-------+-------+-------+ | ||
26 | RRR | op | RC | RB | RA | RT | RI7 | op | I7 | RA | RT | | ||
27 | +----+-------+-------+-------+-------+ +------------+-------+-------+-------+ | ||
28 | 0 3 1 1 2 3 0 1 1 2 3 | ||
29 | 0 7 4 1 0 7 4 1 | ||
30 | |||
31 | +-----------+--------+-------+-------+ +---------+----------+-------+-------+ | ||
32 | RI8 | op | I8 | RA | RT | RI10 | op | I10 | RA | RT | | ||
33 | +-----------+--------+-------+-------+ +---------+----------+-------+-------+ | ||
34 | 0 9 1 2 3 0 7 1 2 3 | ||
35 | 7 4 1 7 4 1 | ||
36 | |||
37 | +----------+-----------------+-------+ +--------+-------------------+-------+ | ||
38 | RI16 | op | I16 | RT | RI18 | op | I18 | RT | | ||
39 | +----------+-----------------+-------+ +--------+-------------------+-------+ | ||
40 | 0 8 2 3 0 6 2 3 | ||
41 | 4 1 4 1 | ||
42 | |||
43 | +------------+-------+-------+-------+ +-------+--+-----------------+-------+ | ||
44 | RR | op | RB | RA | RT | LBT | op |RO| I16 | RO | | ||
45 | +------------+-------+-------+-------+ +-------+--+-----------------+-------+ | ||
46 | 0 1 1 2 3 0 6 8 2 3 | ||
47 | 0 7 4 1 4 1 | ||
48 | |||
49 | +------------+----+--+-------+-------+ | ||
50 | LBTI | op | // |RO| RA | RO | | ||
51 | +------------+----+--+-------+-------+ | ||
52 | 0 1 1 1 2 3 | ||
53 | 0 5 7 4 1 | ||
54 | |||
55 | -=-=-= OPCODE =-=-=- | ||
56 | |||
57 | OPCODE field specifies the most significant 11bit of the instruction. Some formats don't have 11bits for opcode field, and in this | ||
58 | case, bit field other than op are defined as 0s. For example, opcode of fma instruction which is RRR format is defined as 0x700, | ||
59 | since 0x700 -> 11'b11100000000, this means opcode is 4'b1110, and other 7bits are defined as 7'b0000000. | ||
60 | |||
61 | -=-=-= ASM_FORMAT =-=-=- | ||
62 | |||
63 | RRR category RI7 category | ||
64 | ASM_RRR mnemonic RC, RA, RB, RT ASM_RI4 mnemonic RT, RA, I4 | ||
65 | ASM_RI7 mnemonic RT, RA, I7 | ||
66 | |||
67 | RI8 category RI10 category | ||
68 | ASM_RUI8 mnemonic RT, RA, UI8 ASM_AI10 mnemonic RA, I10 | ||
69 | ASM_RI10 mnemonic RT, RA, R10 | ||
70 | ASM_RI10IDX mnemonic RT, I10(RA) | ||
71 | |||
72 | RI16 category RI18 category | ||
73 | ASM_I16W mnemonic I16W ASM_RI18 mnemonic RT, I18 | ||
74 | ASM_RI16 mnemonic RT, I16 | ||
75 | ASM_RI16W mnemonic RT, I16W | ||
76 | |||
77 | RR category LBT category | ||
78 | ASM_MFSPR mnemonic RT, SA ASM_LBT mnemonic brinst, brtarg | ||
79 | ASM_MTSPR mnemonic SA, RT | ||
80 | ASM_NOOP mnemonic LBTI category | ||
81 | ASM_RA mnemonic RA ASM_LBTI mnemonic brinst, RA | ||
82 | ASM_RAB mnemonic RA, RB | ||
83 | ASM_RDCH mnemonic RT, CA | ||
84 | ASM_RR mnemonic RT, RA, RB | ||
85 | ASM_RT mnemonic RT | ||
86 | ASM_RTA mnemonic RT, RA | ||
87 | ASM_WRCH mnemonic CA, RT | ||
88 | |||
89 | Note that RRR instructions have the names for RC and RT reversed from | ||
90 | what's in the ISA, in order to put RT in the same position it appears | ||
91 | for other formats. | ||
92 | |||
93 | -=-=-= DEPENDENCY =-=-=- | ||
94 | |||
95 | DEPENDENCY filed consists of 5 digits. This represents which register is used as source and which register is used as target. | ||
96 | The first(most significant) digit is always 0. Then it is followd by RC, RB, RA and RT digits. | ||
97 | If the digit is 0, this means the corresponding register is not used in the instruction. | ||
98 | If the digit is 1, this means the corresponding register is used as a source in the instruction. | ||
99 | If the digit is 2, this means the corresponding register is used as a target in the instruction. | ||
100 | If the digit is 3, this means the corresponding register is used as both source and target in the instruction. | ||
101 | For example, fms instruction has 00113 as the DEPENDENCY field. This means RC is not used in this operation, RB and RA are | ||
102 | used as sources and RT is the target. | ||
103 | |||
104 | -=-=-= PIPE =-=-=- | ||
105 | |||
106 | This field shows which execution pipe is used for the instruction | ||
107 | |||
108 | pipe0 execution pipelines: | ||
109 | FP6 SP floating pipeline | ||
110 | FP7 integer operations executed in SP floating pipeline | ||
111 | FPD DP floating pipeline | ||
112 | FX2 FXU pipeline | ||
113 | FX3 Rotate/Shift pipeline | ||
114 | FXB Byte pipeline | ||
115 | NOP No pipeline | ||
116 | |||
117 | pipe1 execution pipelines: | ||
118 | BR Branch pipeline | ||
119 | LNOP No pipeline | ||
120 | LS Load/Store pipeline | ||
121 | SHUF Shuffle pipeline | ||
122 | SPR SPR/CH pipeline | ||
123 | |||
124 | */ | ||
125 | |||
126 | #define _A0() {0} | ||
127 | #define _A1(a) {1,a} | ||
128 | #define _A2(a,b) {2,a,b} | ||
129 | #define _A3(a,b,c) {3,a,b,c} | ||
130 | #define _A4(a,b,c,d) {4,a,b,c,d} | ||
131 | |||
132 | /* TAG FORMAT OPCODE MNEMONIC ASM_FORMAT DEPENDENCY PIPE COMMENT */ | ||
133 | /* 0[RC][RB][RA][RT] */ | ||
134 | /* 1:src, 2:target */ | ||
135 | |||
136 | APUOP(M_BR, RI16, 0x190, "br", _A1(A_R18), 00000, BR) /* BRel IP<-IP+I16 */ | ||
137 | APUOP(M_BRSL, RI16, 0x198, "brsl", _A2(A_T,A_R18), 00002, BR) /* BRelSetLink RT,IP<-IP,IP+I16 */ | ||
138 | APUOP(M_BRA, RI16, 0x180, "bra", _A1(A_S18), 00000, BR) /* BRAbs IP<-I16 */ | ||
139 | APUOP(M_BRASL, RI16, 0x188, "brasl", _A2(A_T,A_S18), 00002, BR) /* BRAbsSetLink RT,IP<-IP,I16 */ | ||
140 | APUOP(M_FSMBI, RI16, 0x194, "fsmbi", _A2(A_T,A_X16), 00002, SHUF) /* FormSelMask%I RT<-fsm(I16) */ | ||
141 | APUOP(M_LQA, RI16, 0x184, "lqa", _A2(A_T,A_S18), 00002, LS) /* LoadQAbs RT<-M[I16] */ | ||
142 | APUOP(M_LQR, RI16, 0x19C, "lqr", _A2(A_T,A_R18), 00002, LS) /* LoadQRel RT<-M[IP+I16] */ | ||
143 | APUOP(M_STOP, RR, 0x000, "stop", _A0(), 00000, BR) /* STOP stop */ | ||
144 | APUOP(M_STOP2, RR, 0x000, "stop", _A1(A_U14), 00000, BR) /* STOP stop */ | ||
145 | APUOP(M_STOPD, RR, 0x140, "stopd", _A3(A_T,A_A,A_B), 00111, BR) /* STOPD stop (with register dependencies) */ | ||
146 | APUOP(M_LNOP, RR, 0x001, "lnop", _A0(), 00000, LNOP) /* LNOP no_operation */ | ||
147 | APUOP(M_SYNC, RR, 0x002, "sync", _A0(), 00000, BR) /* SYNC flush_pipe */ | ||
148 | APUOP(M_DSYNC, RR, 0x003, "dsync", _A0(), 00000, BR) /* DSYNC flush_store_queue */ | ||
149 | APUOP(M_MFSPR, RR, 0x00c, "mfspr", _A2(A_T,A_S), 00002, SPR) /* MFSPR RT<-SA */ | ||
150 | APUOP(M_RDCH, RR, 0x00d, "rdch", _A2(A_T,A_H), 00002, SPR) /* ReaDCHannel RT<-CA:data */ | ||
151 | APUOP(M_RCHCNT, RR, 0x00f, "rchcnt", _A2(A_T,A_H), 00002, SPR) /* ReaDCHanCouNT RT<-CA:count */ | ||
152 | APUOP(M_HBRA, LBT, 0x080, "hbra", _A2(A_S11,A_S18), 00000, LS) /* HBRA BTB[B9]<-M[I16] */ | ||
153 | APUOP(M_HBRR, LBT, 0x090, "hbrr", _A2(A_S11,A_R18), 00000, LS) /* HBRR BTB[B9]<-M[IP+I16] */ | ||
154 | APUOP(M_BRZ, RI16, 0x100, "brz", _A2(A_T,A_R18), 00001, BR) /* BRZ IP<-IP+I16_if(RT) */ | ||
155 | APUOP(M_BRNZ, RI16, 0x108, "brnz", _A2(A_T,A_R18), 00001, BR) /* BRNZ IP<-IP+I16_if(RT) */ | ||
156 | APUOP(M_BRHZ, RI16, 0x110, "brhz", _A2(A_T,A_R18), 00001, BR) /* BRHZ IP<-IP+I16_if(RT) */ | ||
157 | APUOP(M_BRHNZ, RI16, 0x118, "brhnz", _A2(A_T,A_R18), 00001, BR) /* BRHNZ IP<-IP+I16_if(RT) */ | ||
158 | APUOP(M_STQA, RI16, 0x104, "stqa", _A2(A_T,A_S18), 00001, LS) /* SToreQAbs M[I16]<-RT */ | ||
159 | APUOP(M_STQR, RI16, 0x11C, "stqr", _A2(A_T,A_R18), 00001, LS) /* SToreQRel M[IP+I16]<-RT */ | ||
160 | APUOP(M_MTSPR, RR, 0x10c, "mtspr", _A2(A_S,A_T), 00001, SPR) /* MTSPR SA<-RT */ | ||
161 | APUOP(M_WRCH, RR, 0x10d, "wrch", _A2(A_H,A_T), 00001, SPR) /* ChanWRite CA<-RT */ | ||
162 | APUOP(M_LQD, RI10, 0x1a0, "lqd", _A4(A_T,A_S14,A_P,A_A), 00012, LS) /* LoadQDisp RT<-M[Ra+I10] */ | ||
163 | APUOP(M_BI, RR, 0x1a8, "bi", _A1(A_A), 00010, BR) /* BI IP<-RA */ | ||
164 | APUOP(M_BISL, RR, 0x1a9, "bisl", _A2(A_T,A_A), 00012, BR) /* BISL RT,IP<-IP,RA */ | ||
165 | APUOP(M_IRET, RR, 0x1aa, "iret", _A1(A_A), 00010, BR) /* IRET IP<-SRR0 */ | ||
166 | APUOP(M_IRET2, RR, 0x1aa, "iret", _A0(), 00010, BR) /* IRET IP<-SRR0 */ | ||
167 | APUOP(M_BISLED, RR, 0x1ab, "bisled", _A2(A_T,A_A), 00012, BR) /* BISLED RT,IP<-IP,RA_if(ext) */ | ||
168 | APUOP(M_HBR, LBTI, 0x1ac, "hbr", _A2(A_S11I,A_A), 00010, LS) /* HBR BTB[B9]<-M[Ra] */ | ||
169 | APUOP(M_FREST, RR, 0x1b8, "frest", _A2(A_T,A_A), 00012, SHUF) /* FREST RT<-recip(RA) */ | ||
170 | APUOP(M_FRSQEST, RR, 0x1b9, "frsqest", _A2(A_T,A_A), 00012, SHUF) /* FRSQEST RT<-rsqrt(RA) */ | ||
171 | APUOP(M_FSM, RR, 0x1b4, "fsm", _A2(A_T,A_A), 00012, SHUF) /* FormSelMask% RT<-expand(Ra) */ | ||
172 | APUOP(M_FSMH, RR, 0x1b5, "fsmh", _A2(A_T,A_A), 00012, SHUF) /* FormSelMask% RT<-expand(Ra) */ | ||
173 | APUOP(M_FSMB, RR, 0x1b6, "fsmb", _A2(A_T,A_A), 00012, SHUF) /* FormSelMask% RT<-expand(Ra) */ | ||
174 | APUOP(M_GB, RR, 0x1b0, "gb", _A2(A_T,A_A), 00012, SHUF) /* GatherBits% RT<-gather(RA) */ | ||
175 | APUOP(M_GBH, RR, 0x1b1, "gbh", _A2(A_T,A_A), 00012, SHUF) /* GatherBits% RT<-gather(RA) */ | ||
176 | APUOP(M_GBB, RR, 0x1b2, "gbb", _A2(A_T,A_A), 00012, SHUF) /* GatherBits% RT<-gather(RA) */ | ||
177 | APUOP(M_CBD, RI7, 0x1f4, "cbd", _A4(A_T,A_U7,A_P,A_A), 00012, SHUF) /* genCtl%%insD RT<-sta(Ra+I4,siz) */ | ||
178 | APUOP(M_CHD, RI7, 0x1f5, "chd", _A4(A_T,A_U7,A_P,A_A), 00012, SHUF) /* genCtl%%insD RT<-sta(Ra+I4,siz) */ | ||
179 | APUOP(M_CWD, RI7, 0x1f6, "cwd", _A4(A_T,A_U7,A_P,A_A), 00012, SHUF) /* genCtl%%insD RT<-sta(Ra+I4,siz) */ | ||
180 | APUOP(M_CDD, RI7, 0x1f7, "cdd", _A4(A_T,A_U7,A_P,A_A), 00012, SHUF) /* genCtl%%insD RT<-sta(Ra+I4,siz) */ | ||
181 | APUOP(M_ROTQBII, RI7, 0x1f8, "rotqbii", _A3(A_T,A_A,A_U3), 00012, SHUF) /* ROTQBII RT<-RA<<<I7 */ | ||
182 | APUOP(M_ROTQBYI, RI7, 0x1fc, "rotqbyi", _A3(A_T,A_A,A_S7N), 00012, SHUF) /* ROTQBYI RT<-RA<<<(I7*8) */ | ||
183 | APUOP(M_ROTQMBII, RI7, 0x1f9, "rotqmbii", _A3(A_T,A_A,A_S3), 00012, SHUF) /* ROTQMBII RT<-RA<<I7 */ | ||
184 | APUOP(M_ROTQMBYI, RI7, 0x1fd, "rotqmbyi", _A3(A_T,A_A,A_S6), 00012, SHUF) /* ROTQMBYI RT<-RA<<I7 */ | ||
185 | APUOP(M_SHLQBII, RI7, 0x1fb, "shlqbii", _A3(A_T,A_A,A_U3), 00012, SHUF) /* SHLQBII RT<-RA<<I7 */ | ||
186 | APUOP(M_SHLQBYI, RI7, 0x1ff, "shlqbyi", _A3(A_T,A_A,A_U5), 00012, SHUF) /* SHLQBYI RT<-RA<<I7 */ | ||
187 | APUOP(M_STQD, RI10, 0x120, "stqd", _A4(A_T,A_S14,A_P,A_A), 00011, LS) /* SToreQDisp M[Ra+I10]<-RT */ | ||
188 | APUOP(M_BIHNZ, RR, 0x12b, "bihnz", _A2(A_T,A_A), 00011, BR) /* BIHNZ IP<-RA_if(RT) */ | ||
189 | APUOP(M_BIHZ, RR, 0x12a, "bihz", _A2(A_T,A_A), 00011, BR) /* BIHZ IP<-RA_if(RT) */ | ||
190 | APUOP(M_BINZ, RR, 0x129, "binz", _A2(A_T,A_A), 00011, BR) /* BINZ IP<-RA_if(RT) */ | ||
191 | APUOP(M_BIZ, RR, 0x128, "biz", _A2(A_T,A_A), 00011, BR) /* BIZ IP<-RA_if(RT) */ | ||
192 | APUOP(M_CBX, RR, 0x1d4, "cbx", _A3(A_T,A_A,A_B), 00112, SHUF) /* genCtl%%insX RT<-sta(Ra+Rb,siz) */ | ||
193 | APUOP(M_CHX, RR, 0x1d5, "chx", _A3(A_T,A_A,A_B), 00112, SHUF) /* genCtl%%insX RT<-sta(Ra+Rb,siz) */ | ||
194 | APUOP(M_CWX, RR, 0x1d6, "cwx", _A3(A_T,A_A,A_B), 00112, SHUF) /* genCtl%%insX RT<-sta(Ra+Rb,siz) */ | ||
195 | APUOP(M_CDX, RR, 0x1d7, "cdx", _A3(A_T,A_A,A_B), 00112, SHUF) /* genCtl%%insX RT<-sta(Ra+Rb,siz) */ | ||
196 | APUOP(M_LQX, RR, 0x1c4, "lqx", _A3(A_T,A_A,A_B), 00112, LS) /* LoadQindeX RT<-M[Ra+Rb] */ | ||
197 | APUOP(M_ROTQBI, RR, 0x1d8, "rotqbi", _A3(A_T,A_A,A_B), 00112, SHUF) /* ROTQBI RT<-RA<<<Rb */ | ||
198 | APUOP(M_ROTQMBI, RR, 0x1d9, "rotqmbi", _A3(A_T,A_A,A_B), 00112, SHUF) /* ROTQMBI RT<-RA<<Rb */ | ||
199 | APUOP(M_SHLQBI, RR, 0x1db, "shlqbi", _A3(A_T,A_A,A_B), 00112, SHUF) /* SHLQBI RT<-RA<<Rb */ | ||
200 | APUOP(M_ROTQBY, RR, 0x1dc, "rotqby", _A3(A_T,A_A,A_B), 00112, SHUF) /* ROTQBY RT<-RA<<<(Rb*8) */ | ||
201 | APUOP(M_ROTQMBY, RR, 0x1dd, "rotqmby", _A3(A_T,A_A,A_B), 00112, SHUF) /* ROTQMBY RT<-RA<<Rb */ | ||
202 | APUOP(M_SHLQBY, RR, 0x1df, "shlqby", _A3(A_T,A_A,A_B), 00112, SHUF) /* SHLQBY RT<-RA<<Rb */ | ||
203 | APUOP(M_ROTQBYBI, RR, 0x1cc, "rotqbybi", _A3(A_T,A_A,A_B), 00112, SHUF) /* ROTQBYBI RT<-RA<<Rb */ | ||
204 | APUOP(M_ROTQMBYBI, RR, 0x1cd, "rotqmbybi", _A3(A_T,A_A,A_B), 00112, SHUF) /* ROTQMBYBI RT<-RA<<Rb */ | ||
205 | APUOP(M_SHLQBYBI, RR, 0x1cf, "shlqbybi", _A3(A_T,A_A,A_B), 00112, SHUF) /* SHLQBYBI RT<-RA<<Rb */ | ||
206 | APUOP(M_STQX, RR, 0x144, "stqx", _A3(A_T,A_A,A_B), 00111, LS) /* SToreQindeX M[Ra+Rb]<-RT */ | ||
207 | APUOP(M_SHUFB, RRR, 0x580, "shufb", _A4(A_C,A_A,A_B,A_T), 02111, SHUF) /* SHUFfleBytes RC<-f(RA,RB,RT) */ | ||
208 | APUOP(M_IL, RI16, 0x204, "il", _A2(A_T,A_S16), 00002, FX2) /* ImmLoad RT<-sxt(I16) */ | ||
209 | APUOP(M_ILH, RI16, 0x20c, "ilh", _A2(A_T,A_X16), 00002, FX2) /* ImmLoadH RT<-I16 */ | ||
210 | APUOP(M_ILHU, RI16, 0x208, "ilhu", _A2(A_T,A_X16), 00002, FX2) /* ImmLoadHUpper RT<-I16<<16 */ | ||
211 | APUOP(M_ILA, RI18, 0x210, "ila", _A2(A_T,A_U18), 00002, FX2) /* ImmLoadAddr RT<-zxt(I18) */ | ||
212 | APUOP(M_NOP, RR, 0x201, "nop", _A1(A_T), 00000, NOP) /* XNOP no_operation */ | ||
213 | APUOP(M_NOP2, RR, 0x201, "nop", _A0(), 00000, NOP) /* XNOP no_operation */ | ||
214 | APUOP(M_IOHL, RI16, 0x304, "iohl", _A2(A_T,A_X16), 00003, FX2) /* AddImmeXt RT<-RT+sxt(I16) */ | ||
215 | APUOP(M_ANDBI, RI10, 0x0b0, "andbi", _A3(A_T,A_A,A_S10B), 00012, FX2) /* AND%I RT<-RA&I10 */ | ||
216 | APUOP(M_ANDHI, RI10, 0x0a8, "andhi", _A3(A_T,A_A,A_S10), 00012, FX2) /* AND%I RT<-RA&I10 */ | ||
217 | APUOP(M_ANDI, RI10, 0x0a0, "andi", _A3(A_T,A_A,A_S10), 00012, FX2) /* AND%I RT<-RA&I10 */ | ||
218 | APUOP(M_ORBI, RI10, 0x030, "orbi", _A3(A_T,A_A,A_S10B), 00012, FX2) /* OR%I RT<-RA|I10 */ | ||
219 | APUOP(M_ORHI, RI10, 0x028, "orhi", _A3(A_T,A_A,A_S10), 00012, FX2) /* OR%I RT<-RA|I10 */ | ||
220 | APUOP(M_ORI, RI10, 0x020, "ori", _A3(A_T,A_A,A_S10), 00012, FX2) /* OR%I RT<-RA|I10 */ | ||
221 | APUOP(M_ORX, RR, 0x1f0, "orx", _A2(A_T,A_A), 00012, BR) /* ORX RT<-RA.w0|RA.w1|RA.w2|RA.w3 */ | ||
222 | APUOP(M_XORBI, RI10, 0x230, "xorbi", _A3(A_T,A_A,A_S10B), 00012, FX2) /* XOR%I RT<-RA^I10 */ | ||
223 | APUOP(M_XORHI, RI10, 0x228, "xorhi", _A3(A_T,A_A,A_S10), 00012, FX2) /* XOR%I RT<-RA^I10 */ | ||
224 | APUOP(M_XORI, RI10, 0x220, "xori", _A3(A_T,A_A,A_S10), 00012, FX2) /* XOR%I RT<-RA^I10 */ | ||
225 | APUOP(M_AHI, RI10, 0x0e8, "ahi", _A3(A_T,A_A,A_S10), 00012, FX2) /* Add%Immed RT<-RA+I10 */ | ||
226 | APUOP(M_AI, RI10, 0x0e0, "ai", _A3(A_T,A_A,A_S10), 00012, FX2) /* Add%Immed RT<-RA+I10 */ | ||
227 | APUOP(M_SFHI, RI10, 0x068, "sfhi", _A3(A_T,A_A,A_S10), 00012, FX2) /* SubFrom%Imm RT<-I10-RA */ | ||
228 | APUOP(M_SFI, RI10, 0x060, "sfi", _A3(A_T,A_A,A_S10), 00012, FX2) /* SubFrom%Imm RT<-I10-RA */ | ||
229 | APUOP(M_CGTBI, RI10, 0x270, "cgtbi", _A3(A_T,A_A,A_S10B), 00012, FX2) /* CGT%I RT<-(RA>I10) */ | ||
230 | APUOP(M_CGTHI, RI10, 0x268, "cgthi", _A3(A_T,A_A,A_S10), 00012, FX2) /* CGT%I RT<-(RA>I10) */ | ||
231 | APUOP(M_CGTI, RI10, 0x260, "cgti", _A3(A_T,A_A,A_S10), 00012, FX2) /* CGT%I RT<-(RA>I10) */ | ||
232 | APUOP(M_CLGTBI, RI10, 0x2f0, "clgtbi", _A3(A_T,A_A,A_S10B), 00012, FX2) /* CLGT%I RT<-(RA>I10) */ | ||
233 | APUOP(M_CLGTHI, RI10, 0x2e8, "clgthi", _A3(A_T,A_A,A_S10), 00012, FX2) /* CLGT%I RT<-(RA>I10) */ | ||
234 | APUOP(M_CLGTI, RI10, 0x2e0, "clgti", _A3(A_T,A_A,A_S10), 00012, FX2) /* CLGT%I RT<-(RA>I10) */ | ||
235 | APUOP(M_CEQBI, RI10, 0x3f0, "ceqbi", _A3(A_T,A_A,A_S10B), 00012, FX2) /* CEQ%I RT<-(RA=I10) */ | ||
236 | APUOP(M_CEQHI, RI10, 0x3e8, "ceqhi", _A3(A_T,A_A,A_S10), 00012, FX2) /* CEQ%I RT<-(RA=I10) */ | ||
237 | APUOP(M_CEQI, RI10, 0x3e0, "ceqi", _A3(A_T,A_A,A_S10), 00012, FX2) /* CEQ%I RT<-(RA=I10) */ | ||
238 | APUOP(M_HGTI, RI10, 0x278, "hgti", _A3(A_T,A_A,A_S10), 00010, FX2) /* HaltGTI halt_if(RA>I10) */ | ||
239 | APUOP(M_HGTI2, RI10, 0x278, "hgti", _A2(A_A,A_S10), 00010, FX2) /* HaltGTI halt_if(RA>I10) */ | ||
240 | APUOP(M_HLGTI, RI10, 0x2f8, "hlgti", _A3(A_T,A_A,A_S10), 00010, FX2) /* HaltLGTI halt_if(RA>I10) */ | ||
241 | APUOP(M_HLGTI2, RI10, 0x2f8, "hlgti", _A2(A_A,A_S10), 00010, FX2) /* HaltLGTI halt_if(RA>I10) */ | ||
242 | APUOP(M_HEQI, RI10, 0x3f8, "heqi", _A3(A_T,A_A,A_S10), 00010, FX2) /* HaltEQImm halt_if(RA=I10) */ | ||
243 | APUOP(M_HEQI2, RI10, 0x3f8, "heqi", _A2(A_A,A_S10), 00010, FX2) /* HaltEQImm halt_if(RA=I10) */ | ||
244 | APUOP(M_MPYI, RI10, 0x3a0, "mpyi", _A3(A_T,A_A,A_S10), 00012, FP7) /* MPYI RT<-RA*I10 */ | ||
245 | APUOP(M_MPYUI, RI10, 0x3a8, "mpyui", _A3(A_T,A_A,A_S10), 00012, FP7) /* MPYUI RT<-RA*I10 */ | ||
246 | APUOP(M_CFLTS, RI8, 0x3b0, "cflts", _A3(A_T,A_A,A_U7A), 00012, FP7) /* CFLTS RT<-int(RA,I8) */ | ||
247 | APUOP(M_CFLTU, RI8, 0x3b2, "cfltu", _A3(A_T,A_A,A_U7A), 00012, FP7) /* CFLTU RT<-int(RA,I8) */ | ||
248 | APUOP(M_CSFLT, RI8, 0x3b4, "csflt", _A3(A_T,A_A,A_U7B), 00012, FP7) /* CSFLT RT<-flt(RA,I8) */ | ||
249 | APUOP(M_CUFLT, RI8, 0x3b6, "cuflt", _A3(A_T,A_A,A_U7B), 00012, FP7) /* CUFLT RT<-flt(RA,I8) */ | ||
250 | APUOP(M_FESD, RR, 0x3b8, "fesd", _A2(A_T,A_A), 00012, FPD) /* FESD RT<-double(RA) */ | ||
251 | APUOP(M_FRDS, RR, 0x3b9, "frds", _A2(A_T,A_A), 00012, FPD) /* FRDS RT<-single(RA) */ | ||
252 | APUOP(M_FSCRRD, RR, 0x398, "fscrrd", _A1(A_T), 00002, FPD) /* FSCRRD RT<-FP_status */ | ||
253 | APUOP(M_FSCRWR, RR, 0x3ba, "fscrwr", _A2(A_T,A_A), 00010, FP7) /* FSCRWR FP_status<-RA */ | ||
254 | APUOP(M_FSCRWR2, RR, 0x3ba, "fscrwr", _A1(A_A), 00010, FP7) /* FSCRWR FP_status<-RA */ | ||
255 | APUOP(M_CLZ, RR, 0x2a5, "clz", _A2(A_T,A_A), 00012, FX2) /* CLZ RT<-clz(RA) */ | ||
256 | APUOP(M_CNTB, RR, 0x2b4, "cntb", _A2(A_T,A_A), 00012, FXB) /* CNT RT<-pop(RA) */ | ||
257 | APUOP(M_XSBH, RR, 0x2b6, "xsbh", _A2(A_T,A_A), 00012, FX2) /* eXtSignBtoH RT<-sign_ext(RA) */ | ||
258 | APUOP(M_XSHW, RR, 0x2ae, "xshw", _A2(A_T,A_A), 00012, FX2) /* eXtSignHtoW RT<-sign_ext(RA) */ | ||
259 | APUOP(M_XSWD, RR, 0x2a6, "xswd", _A2(A_T,A_A), 00012, FX2) /* eXtSignWtoD RT<-sign_ext(RA) */ | ||
260 | APUOP(M_ROTI, RI7, 0x078, "roti", _A3(A_T,A_A,A_S7N), 00012, FX3) /* ROT%I RT<-RA<<<I7 */ | ||
261 | APUOP(M_ROTMI, RI7, 0x079, "rotmi", _A3(A_T,A_A,A_S7), 00012, FX3) /* ROT%MI RT<-RA<<I7 */ | ||
262 | APUOP(M_ROTMAI, RI7, 0x07a, "rotmai", _A3(A_T,A_A,A_S7), 00012, FX3) /* ROTMA%I RT<-RA<<I7 */ | ||
263 | APUOP(M_SHLI, RI7, 0x07b, "shli", _A3(A_T,A_A,A_U6), 00012, FX3) /* SHL%I RT<-RA<<I7 */ | ||
264 | APUOP(M_ROTHI, RI7, 0x07c, "rothi", _A3(A_T,A_A,A_S7N), 00012, FX3) /* ROT%I RT<-RA<<<I7 */ | ||
265 | APUOP(M_ROTHMI, RI7, 0x07d, "rothmi", _A3(A_T,A_A,A_S6), 00012, FX3) /* ROT%MI RT<-RA<<I7 */ | ||
266 | APUOP(M_ROTMAHI, RI7, 0x07e, "rotmahi", _A3(A_T,A_A,A_S6), 00012, FX3) /* ROTMA%I RT<-RA<<I7 */ | ||
267 | APUOP(M_SHLHI, RI7, 0x07f, "shlhi", _A3(A_T,A_A,A_U5), 00012, FX3) /* SHL%I RT<-RA<<I7 */ | ||
268 | APUOP(M_A, RR, 0x0c0, "a", _A3(A_T,A_A,A_B), 00112, FX2) /* Add% RT<-RA+RB */ | ||
269 | APUOP(M_AH, RR, 0x0c8, "ah", _A3(A_T,A_A,A_B), 00112, FX2) /* Add% RT<-RA+RB */ | ||
270 | APUOP(M_SF, RR, 0x040, "sf", _A3(A_T,A_A,A_B), 00112, FX2) /* SubFrom% RT<-RB-RA */ | ||
271 | APUOP(M_SFH, RR, 0x048, "sfh", _A3(A_T,A_A,A_B), 00112, FX2) /* SubFrom% RT<-RB-RA */ | ||
272 | APUOP(M_CGT, RR, 0x240, "cgt", _A3(A_T,A_A,A_B), 00112, FX2) /* CGT% RT<-(RA>RB) */ | ||
273 | APUOP(M_CGTB, RR, 0x250, "cgtb", _A3(A_T,A_A,A_B), 00112, FX2) /* CGT% RT<-(RA>RB) */ | ||
274 | APUOP(M_CGTH, RR, 0x248, "cgth", _A3(A_T,A_A,A_B), 00112, FX2) /* CGT% RT<-(RA>RB) */ | ||
275 | APUOP(M_CLGT, RR, 0x2c0, "clgt", _A3(A_T,A_A,A_B), 00112, FX2) /* CLGT% RT<-(RA>RB) */ | ||
276 | APUOP(M_CLGTB, RR, 0x2d0, "clgtb", _A3(A_T,A_A,A_B), 00112, FX2) /* CLGT% RT<-(RA>RB) */ | ||
277 | APUOP(M_CLGTH, RR, 0x2c8, "clgth", _A3(A_T,A_A,A_B), 00112, FX2) /* CLGT% RT<-(RA>RB) */ | ||
278 | APUOP(M_CEQ, RR, 0x3c0, "ceq", _A3(A_T,A_A,A_B), 00112, FX2) /* CEQ% RT<-(RA=RB) */ | ||
279 | APUOP(M_CEQB, RR, 0x3d0, "ceqb", _A3(A_T,A_A,A_B), 00112, FX2) /* CEQ% RT<-(RA=RB) */ | ||
280 | APUOP(M_CEQH, RR, 0x3c8, "ceqh", _A3(A_T,A_A,A_B), 00112, FX2) /* CEQ% RT<-(RA=RB) */ | ||
281 | APUOP(M_HGT, RR, 0x258, "hgt", _A3(A_T,A_A,A_B), 00110, FX2) /* HaltGT halt_if(RA>RB) */ | ||
282 | APUOP(M_HGT2, RR, 0x258, "hgt", _A2(A_A,A_B), 00110, FX2) /* HaltGT halt_if(RA>RB) */ | ||
283 | APUOP(M_HLGT, RR, 0x2d8, "hlgt", _A3(A_T,A_A,A_B), 00110, FX2) /* HaltLGT halt_if(RA>RB) */ | ||
284 | APUOP(M_HLGT2, RR, 0x2d8, "hlgt", _A2(A_A,A_B), 00110, FX2) /* HaltLGT halt_if(RA>RB) */ | ||
285 | APUOP(M_HEQ, RR, 0x3d8, "heq", _A3(A_T,A_A,A_B), 00110, FX2) /* HaltEQ halt_if(RA=RB) */ | ||
286 | APUOP(M_HEQ2, RR, 0x3d8, "heq", _A2(A_A,A_B), 00110, FX2) /* HaltEQ halt_if(RA=RB) */ | ||
287 | APUOP(M_FCEQ, RR, 0x3c2, "fceq", _A3(A_T,A_A,A_B), 00112, FX2) /* FCEQ RT<-(RA=RB) */ | ||
288 | APUOP(M_FCMEQ, RR, 0x3ca, "fcmeq", _A3(A_T,A_A,A_B), 00112, FX2) /* FCMEQ RT<-(|RA|=|RB|) */ | ||
289 | APUOP(M_FCGT, RR, 0x2c2, "fcgt", _A3(A_T,A_A,A_B), 00112, FX2) /* FCGT RT<-(RA<RB) */ | ||
290 | APUOP(M_FCMGT, RR, 0x2ca, "fcmgt", _A3(A_T,A_A,A_B), 00112, FX2) /* FCMGT RT<-(|RA|<|RB|) */ | ||
291 | APUOP(M_AND, RR, 0x0c1, "and", _A3(A_T,A_A,A_B), 00112, FX2) /* AND RT<-RA&RB */ | ||
292 | APUOP(M_NAND, RR, 0x0c9, "nand", _A3(A_T,A_A,A_B), 00112, FX2) /* NAND RT<-!(RA&RB) */ | ||
293 | APUOP(M_OR, RR, 0x041, "or", _A3(A_T,A_A,A_B), 00112, FX2) /* OR RT<-RA|RB */ | ||
294 | APUOP(M_NOR, RR, 0x049, "nor", _A3(A_T,A_A,A_B), 00112, FX2) /* NOR RT<-!(RA&RB) */ | ||
295 | APUOP(M_XOR, RR, 0x241, "xor", _A3(A_T,A_A,A_B), 00112, FX2) /* XOR RT<-RA^RB */ | ||
296 | APUOP(M_EQV, RR, 0x249, "eqv", _A3(A_T,A_A,A_B), 00112, FX2) /* EQuiValent RT<-!(RA^RB) */ | ||
297 | APUOP(M_ANDC, RR, 0x2c1, "andc", _A3(A_T,A_A,A_B), 00112, FX2) /* ANDComplement RT<-RA&!RB */ | ||
298 | APUOP(M_ORC, RR, 0x2c9, "orc", _A3(A_T,A_A,A_B), 00112, FX2) /* ORComplement RT<-RA|!RB */ | ||
299 | APUOP(M_ABSDB, RR, 0x053, "absdb", _A3(A_T,A_A,A_B), 00112, FXB) /* ABSoluteDiff RT<-|RA-RB| */ | ||
300 | APUOP(M_AVGB, RR, 0x0d3, "avgb", _A3(A_T,A_A,A_B), 00112, FXB) /* AVG% RT<-(RA+RB+1)/2 */ | ||
301 | APUOP(M_SUMB, RR, 0x253, "sumb", _A3(A_T,A_A,A_B), 00112, FXB) /* SUM% RT<-f(RA,RB) */ | ||
302 | APUOP(M_DFA, RR, 0x2cc, "dfa", _A3(A_T,A_A,A_B), 00112, FPD) /* DFAdd RT<-RA+RB */ | ||
303 | APUOP(M_DFM, RR, 0x2ce, "dfm", _A3(A_T,A_A,A_B), 00112, FPD) /* DFMul RT<-RA*RB */ | ||
304 | APUOP(M_DFS, RR, 0x2cd, "dfs", _A3(A_T,A_A,A_B), 00112, FPD) /* DFSub RT<-RA-RB */ | ||
305 | APUOP(M_FA, RR, 0x2c4, "fa", _A3(A_T,A_A,A_B), 00112, FP6) /* FAdd RT<-RA+RB */ | ||
306 | APUOP(M_FM, RR, 0x2c6, "fm", _A3(A_T,A_A,A_B), 00112, FP6) /* FMul RT<-RA*RB */ | ||
307 | APUOP(M_FS, RR, 0x2c5, "fs", _A3(A_T,A_A,A_B), 00112, FP6) /* FSub RT<-RA-RB */ | ||
308 | APUOP(M_MPY, RR, 0x3c4, "mpy", _A3(A_T,A_A,A_B), 00112, FP7) /* MPY RT<-RA*RB */ | ||
309 | APUOP(M_MPYH, RR, 0x3c5, "mpyh", _A3(A_T,A_A,A_B), 00112, FP7) /* MPYH RT<-(RAh*RB)<<16 */ | ||
310 | APUOP(M_MPYHH, RR, 0x3c6, "mpyhh", _A3(A_T,A_A,A_B), 00112, FP7) /* MPYHH RT<-RAh*RBh */ | ||
311 | APUOP(M_MPYHHU, RR, 0x3ce, "mpyhhu", _A3(A_T,A_A,A_B), 00112, FP7) /* MPYHHU RT<-RAh*RBh */ | ||
312 | APUOP(M_MPYS, RR, 0x3c7, "mpys", _A3(A_T,A_A,A_B), 00112, FP7) /* MPYS RT<-(RA*RB)>>16 */ | ||
313 | APUOP(M_MPYU, RR, 0x3cc, "mpyu", _A3(A_T,A_A,A_B), 00112, FP7) /* MPYU RT<-RA*RB */ | ||
314 | APUOP(M_FI, RR, 0x3d4, "fi", _A3(A_T,A_A,A_B), 00112, FP7) /* FInterpolate RT<-f(RA,RB) */ | ||
315 | APUOP(M_ROT, RR, 0x058, "rot", _A3(A_T,A_A,A_B), 00112, FX3) /* ROT% RT<-RA<<<RB */ | ||
316 | APUOP(M_ROTM, RR, 0x059, "rotm", _A3(A_T,A_A,A_B), 00112, FX3) /* ROT%M RT<-RA<<Rb */ | ||
317 | APUOP(M_ROTMA, RR, 0x05a, "rotma", _A3(A_T,A_A,A_B), 00112, FX3) /* ROTMA% RT<-RA<<Rb */ | ||
318 | APUOP(M_SHL, RR, 0x05b, "shl", _A3(A_T,A_A,A_B), 00112, FX3) /* SHL% RT<-RA<<Rb */ | ||
319 | APUOP(M_ROTH, RR, 0x05c, "roth", _A3(A_T,A_A,A_B), 00112, FX3) /* ROT% RT<-RA<<<RB */ | ||
320 | APUOP(M_ROTHM, RR, 0x05d, "rothm", _A3(A_T,A_A,A_B), 00112, FX3) /* ROT%M RT<-RA<<Rb */ | ||
321 | APUOP(M_ROTMAH, RR, 0x05e, "rotmah", _A3(A_T,A_A,A_B), 00112, FX3) /* ROTMA% RT<-RA<<Rb */ | ||
322 | APUOP(M_SHLH, RR, 0x05f, "shlh", _A3(A_T,A_A,A_B), 00112, FX3) /* SHL% RT<-RA<<Rb */ | ||
323 | APUOP(M_MPYHHA, RR, 0x346, "mpyhha", _A3(A_T,A_A,A_B), 00113, FP7) /* MPYHHA RT<-RAh*RBh+RT */ | ||
324 | APUOP(M_MPYHHAU, RR, 0x34e, "mpyhhau", _A3(A_T,A_A,A_B), 00113, FP7) /* MPYHHAU RT<-RAh*RBh+RT */ | ||
325 | APUOP(M_DFMA, RR, 0x35c, "dfma", _A3(A_T,A_A,A_B), 00113, FPD) /* DFMAdd RT<-RT+RA*RB */ | ||
326 | APUOP(M_DFMS, RR, 0x35d, "dfms", _A3(A_T,A_A,A_B), 00113, FPD) /* DFMSub RT<-RA*RB-RT */ | ||
327 | APUOP(M_DFNMS, RR, 0x35e, "dfnms", _A3(A_T,A_A,A_B), 00113, FPD) /* DFNMSub RT<-RT-RA*RB */ | ||
328 | APUOP(M_DFNMA, RR, 0x35f, "dfnma", _A3(A_T,A_A,A_B), 00113, FPD) /* DFNMAdd RT<-(-RT)-RA*RB */ | ||
329 | APUOP(M_FMA, RRR, 0x700, "fma", _A4(A_C,A_A,A_B,A_T), 02111, FP6) /* FMAdd RC<-RT+RA*RB */ | ||
330 | APUOP(M_FMS, RRR, 0x780, "fms", _A4(A_C,A_A,A_B,A_T), 02111, FP6) /* FMSub RC<-RA*RB-RT */ | ||
331 | APUOP(M_FNMS, RRR, 0x680, "fnms", _A4(A_C,A_A,A_B,A_T), 02111, FP6) /* FNMSub RC<-RT-RA*RB */ | ||
332 | APUOP(M_MPYA, RRR, 0x600, "mpya", _A4(A_C,A_A,A_B,A_T), 02111, FP7) /* MPYA RC<-RA*RB+RT */ | ||
333 | APUOP(M_SELB, RRR, 0x400, "selb", _A4(A_C,A_A,A_B,A_T), 02111, FX2) /* SELectBits RC<-RA&RT|RB&!RT */ | ||
334 | /* for system function call, this uses op-code of mtspr */ | ||
335 | APUOP(M_SYSCALL, RI7, 0x10c, "syscall", _A3(A_T,A_A,A_S7N), 00002, SPR) /* System Call */ | ||
336 | /* | ||
337 | pseudo instruction: | ||
338 | system call | ||
339 | value of I9 operation | ||
340 | 0 halt | ||
341 | 1 rt[0] = open(MEM[ra[0]], ra[1]) | ||
342 | 2 rt[0] = close(ra[0]) | ||
343 | 3 rt[0] = read(ra[0], MEM[ra[1]], ra[2]) | ||
344 | 4 rt[0] = write(ra[0], MEM[ra[1]], ra[2]) | ||
345 | 5 printf(MEM[ra[0]], ra[1], ra[2], ra[3]) | ||
346 | 42 rt[0] = clock() | ||
347 | 52 rt[0] = lseek(ra0, ra1, ra2) | ||
348 | |||
349 | */ | ||
350 | |||
351 | |||
352 | /* new multiprecision add/sub */ | ||
353 | APUOP(M_ADDX, RR, 0x340, "addx", _A3(A_T,A_A,A_B), 00113, FX2) /* Add_eXtended RT<-RA+RB+RT */ | ||
354 | APUOP(M_CG, RR, 0x0c2, "cg", _A3(A_T,A_A,A_B), 00112, FX2) /* CarryGenerate RT<-cout(RA+RB) */ | ||
355 | APUOP(M_CGX, RR, 0x342, "cgx", _A3(A_T,A_A,A_B), 00113, FX2) /* CarryGen_eXtd RT<-cout(RA+RB+RT) */ | ||
356 | APUOP(M_SFX, RR, 0x341, "sfx", _A3(A_T,A_A,A_B), 00113, FX2) /* Add_eXtended RT<-RA+RB+RT */ | ||
357 | APUOP(M_BG, RR, 0x042, "bg", _A3(A_T,A_A,A_B), 00112, FX2) /* CarryGenerate RT<-cout(RA+RB) */ | ||
358 | APUOP(M_BGX, RR, 0x343, "bgx", _A3(A_T,A_A,A_B), 00113, FX2) /* CarryGen_eXtd RT<-cout(RA+RB+RT) */ | ||
359 | |||
360 | /* | ||
361 | |||
362 | The following ops are a subset of above except with feature bits set. | ||
363 | Feature bits are bits 11-17 of the instruction: | ||
364 | |||
365 | 11 - C & P feature bit | ||
366 | 12 - disable interrupts | ||
367 | 13 - enable interrupts | ||
368 | |||
369 | */ | ||
370 | APUOPFB(M_BID, RR, 0x1a8, 0x20, "bid", _A1(A_A), 00010, BR) /* BI IP<-RA */ | ||
371 | APUOPFB(M_BIE, RR, 0x1a8, 0x10, "bie", _A1(A_A), 00010, BR) /* BI IP<-RA */ | ||
372 | APUOPFB(M_BISLD, RR, 0x1a9, 0x20, "bisld", _A2(A_T,A_A), 00012, BR) /* BISL RT,IP<-IP,RA */ | ||
373 | APUOPFB(M_BISLE, RR, 0x1a9, 0x10, "bisle", _A2(A_T,A_A), 00012, BR) /* BISL RT,IP<-IP,RA */ | ||
374 | APUOPFB(M_IRETD, RR, 0x1aa, 0x20, "iretd", _A1(A_A), 00010, BR) /* IRET IP<-SRR0 */ | ||
375 | APUOPFB(M_IRETD2, RR, 0x1aa, 0x20, "iretd", _A0(), 00010, BR) /* IRET IP<-SRR0 */ | ||
376 | APUOPFB(M_IRETE, RR, 0x1aa, 0x10, "irete", _A1(A_A), 00010, BR) /* IRET IP<-SRR0 */ | ||
377 | APUOPFB(M_IRETE2, RR, 0x1aa, 0x10, "irete", _A0(), 00010, BR) /* IRET IP<-SRR0 */ | ||
378 | APUOPFB(M_BISLEDD, RR, 0x1ab, 0x20, "bisledd", _A2(A_T,A_A), 00012, BR) /* BISLED RT,IP<-IP,RA_if(ext) */ | ||
379 | APUOPFB(M_BISLEDE, RR, 0x1ab, 0x10, "bislede", _A2(A_T,A_A), 00012, BR) /* BISLED RT,IP<-IP,RA_if(ext) */ | ||
380 | APUOPFB(M_BIHNZD, RR, 0x12b, 0x20, "bihnzd", _A2(A_T,A_A), 00011, BR) /* BIHNZ IP<-RA_if(RT) */ | ||
381 | APUOPFB(M_BIHNZE, RR, 0x12b, 0x10, "bihnze", _A2(A_T,A_A), 00011, BR) /* BIHNZ IP<-RA_if(RT) */ | ||
382 | APUOPFB(M_BIHZD, RR, 0x12a, 0x20, "bihzd", _A2(A_T,A_A), 00011, BR) /* BIHZ IP<-RA_if(RT) */ | ||
383 | APUOPFB(M_BIHZE, RR, 0x12a, 0x10, "bihze", _A2(A_T,A_A), 00011, BR) /* BIHZ IP<-RA_if(RT) */ | ||
384 | APUOPFB(M_BINZD, RR, 0x129, 0x20, "binzd", _A2(A_T,A_A), 00011, BR) /* BINZ IP<-RA_if(RT) */ | ||
385 | APUOPFB(M_BINZE, RR, 0x129, 0x10, "binze", _A2(A_T,A_A), 00011, BR) /* BINZ IP<-RA_if(RT) */ | ||
386 | APUOPFB(M_BIZD, RR, 0x128, 0x20, "bizd", _A2(A_T,A_A), 00011, BR) /* BIZ IP<-RA_if(RT) */ | ||
387 | APUOPFB(M_BIZE, RR, 0x128, 0x10, "bize", _A2(A_T,A_A), 00011, BR) /* BIZ IP<-RA_if(RT) */ | ||
388 | APUOPFB(M_SYNCC, RR, 0x002, 0x40, "syncc", _A0(), 00000, BR) /* SYNCC flush_pipe */ | ||
389 | APUOPFB(M_HBRP, LBTI, 0x1ac, 0x40, "hbrp", _A0(), 00010, LS) /* HBR BTB[B9]<-M[Ra] */ | ||
390 | |||
391 | /* Synonyms required by the AS manual. */ | ||
392 | APUOP(M_LR, RI10, 0x020, "lr", _A2(A_T,A_A), 00012, FX2) /* OR%I RT<-RA|I10 */ | ||
393 | APUOP(M_BIHT, RR, 0x12b, "biht", _A2(A_T,A_A), 00011, BR) /* BIHNZ IP<-RA_if(RT) */ | ||
394 | APUOP(M_BIHF, RR, 0x12a, "bihf", _A2(A_T,A_A), 00011, BR) /* BIHZ IP<-RA_if(RT) */ | ||
395 | APUOP(M_BIT, RR, 0x129, "bit", _A2(A_T,A_A), 00011, BR) /* BINZ IP<-RA_if(RT) */ | ||
396 | APUOP(M_BIF, RR, 0x128, "bif", _A2(A_T,A_A), 00011, BR) /* BIZ IP<-RA_if(RT) */ | ||
397 | APUOPFB(M_BIHTD, RR, 0x12b, 0x20, "bihtd", _A2(A_T,A_A), 00011, BR) /* BIHNF IP<-RA_if(RT) */ | ||
398 | APUOPFB(M_BIHTE, RR, 0x12b, 0x10, "bihte", _A2(A_T,A_A), 00011, BR) /* BIHNF IP<-RA_if(RT) */ | ||
399 | APUOPFB(M_BIHFD, RR, 0x12a, 0x20, "bihfd", _A2(A_T,A_A), 00011, BR) /* BIHZ IP<-RA_if(RT) */ | ||
400 | APUOPFB(M_BIHFE, RR, 0x12a, 0x10, "bihfe", _A2(A_T,A_A), 00011, BR) /* BIHZ IP<-RA_if(RT) */ | ||
401 | APUOPFB(M_BITD, RR, 0x129, 0x20, "bitd", _A2(A_T,A_A), 00011, BR) /* BINF IP<-RA_if(RT) */ | ||
402 | APUOPFB(M_BITE, RR, 0x129, 0x10, "bite", _A2(A_T,A_A), 00011, BR) /* BINF IP<-RA_if(RT) */ | ||
403 | APUOPFB(M_BIFD, RR, 0x128, 0x20, "bifd", _A2(A_T,A_A), 00011, BR) /* BIZ IP<-RA_if(RT) */ | ||
404 | APUOPFB(M_BIFE, RR, 0x128, 0x10, "bife", _A2(A_T,A_A), 00011, BR) /* BIZ IP<-RA_if(RT) */ | ||
405 | |||
406 | #undef _A0 | ||
407 | #undef _A1 | ||
408 | #undef _A2 | ||
409 | #undef _A3 | ||
410 | #undef _A4 | ||
diff --git a/arch/powerpc/xmon/spu-opc.c b/arch/powerpc/xmon/spu-opc.c new file mode 100644 index 000000000000..efffde9edc6e --- /dev/null +++ b/arch/powerpc/xmon/spu-opc.c | |||
@@ -0,0 +1,44 @@ | |||
1 | /* SPU opcode list | ||
2 | |||
3 | Copyright 2006 Free Software Foundation, Inc. | ||
4 | |||
5 | This file is part of GDB, GAS, and the GNU binutils. | ||
6 | |||
7 | This program is free software; you can redistribute it and/or modify | ||
8 | it under the terms of the GNU General Public License as published by | ||
9 | the Free Software Foundation; either version 2 of the License, or | ||
10 | (at your option) any later version. | ||
11 | |||
12 | This program is distributed in the hope that it will be useful, | ||
13 | but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
14 | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | ||
15 | GNU General Public License for more details. | ||
16 | |||
17 | You should have received a copy of the GNU General Public License along | ||
18 | with this program; if not, write to the Free Software Foundation, Inc., | ||
19 | 51 Franklin Street - Fifth Floor, Boston, MA 02110-1301, USA. */ | ||
20 | |||
21 | #include "spu.h" | ||
22 | |||
23 | /* This file holds the Spu opcode table */ | ||
24 | |||
25 | |||
26 | /* | ||
27 | Example contents of spu-insn.h | ||
28 | id_tag mode mode type opcode mnemonic asmtype dependency FPU L/S? branch? instruction | ||
29 | QUAD WORD (0,RC,RB,RA,RT) latency | ||
30 | APUOP(M_LQD, 1, 0, RI9, 0x1f8, "lqd", ASM_RI9IDX, 00012, FXU, 1, 0) Load Quadword d-form | ||
31 | */ | ||
32 | |||
33 | const struct spu_opcode spu_opcodes[] = { | ||
34 | #define APUOP(TAG,MACFORMAT,OPCODE,MNEMONIC,ASMFORMAT,DEP,PIPE) \ | ||
35 | { MACFORMAT, OPCODE, MNEMONIC, ASMFORMAT }, | ||
36 | #define APUOPFB(TAG,MACFORMAT,OPCODE,FB,MNEMONIC,ASMFORMAT,DEP,PIPE) \ | ||
37 | { MACFORMAT, OPCODE, MNEMONIC, ASMFORMAT }, | ||
38 | #include "spu-insns.h" | ||
39 | #undef APUOP | ||
40 | #undef APUOPFB | ||
41 | }; | ||
42 | |||
43 | const int spu_num_opcodes = | ||
44 | sizeof (spu_opcodes) / sizeof (spu_opcodes[0]); | ||
diff --git a/arch/powerpc/xmon/spu.h b/arch/powerpc/xmon/spu.h new file mode 100644 index 000000000000..c761fc8f35d8 --- /dev/null +++ b/arch/powerpc/xmon/spu.h | |||
@@ -0,0 +1,126 @@ | |||
1 | /* SPU ELF support for BFD. | ||
2 | |||
3 | Copyright 2006 Free Software Foundation, Inc. | ||
4 | |||
5 | This file is part of GDB, GAS, and the GNU binutils. | ||
6 | |||
7 | This program is free software; you can redistribute it and/or modify | ||
8 | it under the terms of the GNU General Public License as published by | ||
9 | the Free Software Foundation; either version 2 of the License, or | ||
10 | (at your option) any later version. | ||
11 | |||
12 | This program is distributed in the hope that it will be useful, | ||
13 | but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
14 | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | ||
15 | GNU General Public License for more details. | ||
16 | |||
17 | You should have received a copy of the GNU General Public License | ||
18 | along with this program; if not, write to the Free Software Foundation, | ||
19 | Inc., 51 Franklin Street - Fifth Floor, Boston, MA 02110-1301, USA. */ | ||
20 | |||
21 | |||
22 | /* These two enums are from rel_apu/common/spu_asm_format.h */ | ||
23 | /* definition of instruction format */ | ||
24 | typedef enum { | ||
25 | RRR, | ||
26 | RI18, | ||
27 | RI16, | ||
28 | RI10, | ||
29 | RI8, | ||
30 | RI7, | ||
31 | RR, | ||
32 | LBT, | ||
33 | LBTI, | ||
34 | IDATA, | ||
35 | UNKNOWN_IFORMAT | ||
36 | } spu_iformat; | ||
37 | |||
38 | /* These values describe assembly instruction arguments. They indicate | ||
39 | * how to encode, range checking and which relocation to use. */ | ||
40 | typedef enum { | ||
41 | A_T, /* register at pos 0 */ | ||
42 | A_A, /* register at pos 7 */ | ||
43 | A_B, /* register at pos 14 */ | ||
44 | A_C, /* register at pos 21 */ | ||
45 | A_S, /* special purpose register at pos 7 */ | ||
46 | A_H, /* channel register at pos 7 */ | ||
47 | A_P, /* parenthesis, this has to separate regs from immediates */ | ||
48 | A_S3, | ||
49 | A_S6, | ||
50 | A_S7N, | ||
51 | A_S7, | ||
52 | A_U7A, | ||
53 | A_U7B, | ||
54 | A_S10B, | ||
55 | A_S10, | ||
56 | A_S11, | ||
57 | A_S11I, | ||
58 | A_S14, | ||
59 | A_S16, | ||
60 | A_S18, | ||
61 | A_R18, | ||
62 | A_U3, | ||
63 | A_U5, | ||
64 | A_U6, | ||
65 | A_U7, | ||
66 | A_U14, | ||
67 | A_X16, | ||
68 | A_U18, | ||
69 | A_MAX | ||
70 | } spu_aformat; | ||
71 | |||
72 | enum spu_insns { | ||
73 | #define APUOP(TAG,MACFORMAT,OPCODE,MNEMONIC,ASMFORMAT,DEP,PIPE) \ | ||
74 | TAG, | ||
75 | #define APUOPFB(TAG,MACFORMAT,OPCODE,FB,MNEMONIC,ASMFORMAT,DEP,PIPE) \ | ||
76 | TAG, | ||
77 | #include "spu-insns.h" | ||
78 | #undef APUOP | ||
79 | #undef APUOPFB | ||
80 | M_SPU_MAX | ||
81 | }; | ||
82 | |||
83 | struct spu_opcode | ||
84 | { | ||
85 | spu_iformat insn_type; | ||
86 | unsigned int opcode; | ||
87 | char *mnemonic; | ||
88 | int arg[5]; | ||
89 | }; | ||
90 | |||
91 | #define SIGNED_EXTRACT(insn,size,pos) (((int)((insn) << (32-size-pos))) >> (32-size)) | ||
92 | #define UNSIGNED_EXTRACT(insn,size,pos) (((insn) >> pos) & ((1 << size)-1)) | ||
93 | |||
94 | #define DECODE_INSN_RT(insn) (insn & 0x7f) | ||
95 | #define DECODE_INSN_RA(insn) ((insn >> 7) & 0x7f) | ||
96 | #define DECODE_INSN_RB(insn) ((insn >> 14) & 0x7f) | ||
97 | #define DECODE_INSN_RC(insn) ((insn >> 21) & 0x7f) | ||
98 | |||
99 | #define DECODE_INSN_I10(insn) SIGNED_EXTRACT(insn,10,14) | ||
100 | #define DECODE_INSN_U10(insn) UNSIGNED_EXTRACT(insn,10,14) | ||
101 | |||
102 | /* For branching, immediate loads, hbr and lqa/stqa. */ | ||
103 | #define DECODE_INSN_I16(insn) SIGNED_EXTRACT(insn,16,7) | ||
104 | #define DECODE_INSN_U16(insn) UNSIGNED_EXTRACT(insn,16,7) | ||
105 | |||
106 | /* for stop */ | ||
107 | #define DECODE_INSN_U14(insn) UNSIGNED_EXTRACT(insn,14,0) | ||
108 | |||
109 | /* For ila */ | ||
110 | #define DECODE_INSN_I18(insn) SIGNED_EXTRACT(insn,18,7) | ||
111 | #define DECODE_INSN_U18(insn) UNSIGNED_EXTRACT(insn,18,7) | ||
112 | |||
113 | /* For rotate and shift and generate control mask */ | ||
114 | #define DECODE_INSN_I7(insn) SIGNED_EXTRACT(insn,7,14) | ||
115 | #define DECODE_INSN_U7(insn) UNSIGNED_EXTRACT(insn,7,14) | ||
116 | |||
117 | /* For float <-> int conversion */ | ||
118 | #define DECODE_INSN_I8(insn) SIGNED_EXTRACT(insn,8,14) | ||
119 | #define DECODE_INSN_U8(insn) UNSIGNED_EXTRACT(insn,8,14) | ||
120 | |||
121 | /* For hbr */ | ||
122 | #define DECODE_INSN_I9a(insn) ((SIGNED_EXTRACT(insn,2,23) << 7) | UNSIGNED_EXTRACT(insn,7,0)) | ||
123 | #define DECODE_INSN_I9b(insn) ((SIGNED_EXTRACT(insn,2,14) << 7) | UNSIGNED_EXTRACT(insn,7,0)) | ||
124 | #define DECODE_INSN_U9a(insn) ((UNSIGNED_EXTRACT(insn,2,23) << 7) | UNSIGNED_EXTRACT(insn,7,0)) | ||
125 | #define DECODE_INSN_U9b(insn) ((UNSIGNED_EXTRACT(insn,2,14) << 7) | UNSIGNED_EXTRACT(insn,7,0)) | ||
126 | |||