]> git.ipfire.org Git - thirdparty/binutils-gdb.git/blame - gas/testsuite/gas/mn10300/am33-2.c
Update year range in copyright notice of binutils files
[thirdparty/binutils-gdb.git] / gas / testsuite / gas / mn10300 / am33-2.c
CommitLineData
250d07de 1/* Copyright (C) 2000-2021 Free Software Foundation, Inc.
ec2655a6
NC
2 Contributed by Alexandre Oliva <aoliva@redhat.com>
3
4 This file is free software; you can redistribute it and/or modify it
5 under the terms of the GNU General Public License as published by
6 the Free Software Foundation; either version 3 of the License, or
7 (at your option) any later version.
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. See the GNU
12 General Public License for more details.
13
14 You should have received a copy of the GNU General Public License
15 along with this program; if not, write to the Free Software
16 Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston,
17 MA 02110-1301, USA. */
e1f834a3
AO
18
19/* Generator of tests for insns introduced in AM33 2.0. */
20
21#define INSN_REPEAT 11
22
23/* See the following file for usage and documentation. */
24#include "../all/test-gen.c"
25
26/* These are the AM33 registers. */
27const char *am33_regs[] = {
28 /* These are the canonical names, i.e., those printed by the
29 * disassembler. */
30 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
31 "a0", "a1", "a2", "a3", "d0", "d1", "d2", "d3",
32 /* These are aliases that the assembler should also recognize. */
33 "e0", "e1", "e2", "e3", "e4", "e5", "e6", "e7",
34 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15"
35};
36
37/* Signed constants of the given sizes. */
38#define d8(shift) signed_constant( 8, shift, 1)
39#define d16(shift) signed_constant(16, shift, 1)
40#define d24(shift) signed_constant(24, shift, 1)
41#define d32(shift) signed_constant(32, shift, 1)
42#define u8(shift) unsigned_constant( 8, shift, 1)
43#define u24(shift) unsigned_constant(24, shift, 1)
44#define a16(shift) absolute_address(16, shift, 1)
45
46/* Emit an AM33 register shifted by these many words. */
47#define amreg(shift) reg_r (am33_regs, shift, 15, mk_get_bits (5u))
48#define spreg literal ("sp")
49#define fcreg literal ("fpcr")
50
51/* Emit an AM33-2 FP single-precision register, with the 4 least
52 * significant bits shifted by shiftlow and the most significant bit
53 * shifted by shifthigh. */
54int
55freg (func_arg *arg, insn_data *data)
56#define freg(shiftlow, shifthigh) { freg, { i1: shiftlow, i2: shifthigh } }
57{
58 unsigned val = get_bits (5u);
59
60 data->as_in = data->dis_out = (char*)malloc (3 + ulen (val, 10));
61 sprintf (data->as_in, "fs%u", val);
62 data->bits = val;
63 data->bits = ((data->bits & 15) << arg->i1) | ((data->bits >> 4) << arg->i2);
64
65 return 0;
66}
67
68/* Emit an AM33-2 FP single-precision register in the ``accumulator''
69 * range, with the 2 least significant bits shifted by shiftlow and
70 * the most significant bit shifted by shifthigh. */
71int
72areg (func_arg *arg, insn_data *data)
73#define areg(shiftlow, shifthigh) { areg, { i1: shiftlow, i2: shifthigh } }
74{
75 unsigned val = get_bits (3u);
76
77 data->as_in = data->dis_out = (char*)malloc (4);
78 sprintf (data->as_in, "fs%u", val);
79 data->bits = val;
80 data->bits = ((data->bits & 3) << arg->i1) | ((data->bits >> 2) << arg->i2);
81
82 return 0;
83}
84
85/* Emit an AM33-2 FP double-precision register, with the 4 least
86 * significant bits shifted by shiftlow and the most significant bit
87 * shifted by shifthigh. */
88int
89dreg (func_arg *arg, insn_data *data)
90#define dreg(shiftlow, shifthigh) { dreg, { i1: shiftlow, i2: shifthigh } }
91{
92 unsigned val = 2 * get_bits (4u);
93
94 data->as_in = data->dis_out = (char*)malloc (3 + ulen (val, 10));
95 sprintf (data->as_in, "fd%u", val);
96 data->bits = val;
97 data->bits = ((data->bits & 15) << arg->i1) | ((data->bits >> 4) << arg->i2);
98
99 return 0;
100}
101
102/* Emit a signed 8-bit PC-relative offset from the current insn to the
103 * last emitted label. */
104int
105d8pcoff (func_arg *arg, insn_data *data)
106#define d8pcoff(shift) { d8pcoff, { p1: shift } }
107{
108 int diff = insn_size - arg->i1/8 - 1;
109 int displacement = current_offset - last_label_offset;
110 char *current_address = malloc (strlen (last_label_name) + 4
111 + ulen (displacement, 16) + 1);
112
113 /* Make sure we're not too far from the target. */
114 if (displacement > 128)
115 abort ();
116
117 data->as_in = strdup (last_label_name);
118
119 /* Calculate the address that will be printed by the disassembler as
120 the target of the jump. Since it won't take relocations into
121 account, it will be the insn's own address. */
122 if (current_offset == last_label_offset)
123 strcpy (current_address, last_label_name);
124 else
125 sprintf (current_address, "%s\\+0x%x", last_label_name, displacement);
126
127 /* Compute the complete label, including the relocation message
128 printed as an additional message. The relocation will point us
129 to the intended target label plus an offset equal to the offset
130 of the displacement within the current insn. We do not account
131 for the case in which this displacement is zero, since it doesn't
132 come up on this platform. */
133 data->dis_out = malloc (8 + 2 + strlen (current_address) + 2
134 + 3 + ulen (current_offset + diff, 16) + 19
135 + strlen (last_label_name) + 4
136 + ulen (diff, 16) + 1);
137 sprintf (data->dis_out, "0*%x <%s>\n"
138 "\t\t\t%x: R_MN10300_PCREL8\t%s\\+0x%x",
139 current_offset, current_address,
140 current_offset + diff, last_label_name, diff);
141
142 free (current_address);
143
144 return 0;
145}
146
147/* Emit a signed 8-bit PC-relative offset from the current insn to the
148 * current section. */
149int
150d8pcsec (func_arg *arg, insn_data *data)
151#define d8pcsec(shift) { d8pcsec, { p1: shift } }
152{
153 int diff = insn_size - arg->i1/8 - 1;
154 int displacement = current_offset - last_label_offset;
155 char *current_address = malloc (strlen (last_label_name) + 4
156 + ulen (displacement, 16) + 1);
157
158 /* Make sure we're not too far from the target. */
159 if (displacement > 128)
160 abort ();
161
162 data->as_in = strdup (last_label_name);
163
164 /* Calculate the address that will be printed by the disassembler as
165 the target of the jump. Since it won't take relocations into
166 account, it will be the insn's own address. */
167
168 if (current_offset == last_label_offset)
169 strcpy (current_address, last_label_name);
170 else
171 sprintf (current_address, "%s\\+0x%x", last_label_name, displacement);
172
173
174 /* Compute the complete label, including the relocation message
175 printed as an additional message. The relocation will point us
176 to the intended target label plus an offset equal to the offset
177 of the displacement within the current insn. We do not account
178 for the case in which this displacement is zero, since it doesn't
179 come up on this platform. */
180 data->dis_out = malloc (8 + 2 + strlen (current_address) + 2
181 + 3 + ulen (current_offset + diff, 16) + 33);
182 sprintf (data->dis_out, "0*%x <%s>\n"
183 "\t\t\t%x: R_MN10300_PCREL8\tcondjmp\\+0x2",
184 current_offset, current_address,
185 current_offset + diff);
186
187 free (current_address);
188
189 return 0;
190}
191
192/* Convenience wrapper to define_insn. */
193#define def_am_insn(insname, variant, size, word, funcs...) \
194 define_insn(insname ## _ ## variant, \
195 insn_size_bits (insname, size, \
196 ((unsigned long long)word) << 8*(size-2)), \
197 tab, \
198 ## funcs)
199#define am_insn(insname, variant) insn (insname ## _ ## variant)
200
201#define def_bit_insn(insname, word) \
202 def_am_insn (insname, i8a16, 5, word, \
203 u8(0), comma, lparen, a16 (8), rparen, tick_random);
204#define bit_insn(insname) insn (insname ## _ ## i8a16)
205
206/* Data cache pre-fetch insns. */
207def_am_insn (dcpf, r, 3, 0xf9a6, lparen, amreg (4), rparen);
208def_am_insn (dcpf, sp, 3, 0xf9a7, lparen, spreg, rparen);
209def_am_insn (dcpf, rr, 4, 0xfba6,
210 lparen, amreg(12), comma, amreg (8), rparen, tick_random);
211def_am_insn (dcpf, d8r, 4, 0xfba7,
212 lparen, d8 (0), comma, amreg (12), rparen, tick_random);
213def_am_insn (dcpf, d24r, 6, 0xfda7,
214 lparen, d24(0), comma, amreg (28), rparen, tick_random);
215def_am_insn (dcpf, d32r, 7, 0xfe46,
216 lparen, d32(0), comma, amreg (36), rparen, tick_random);
217
218/* Define the group of data cache pre-fetch insns. */
219func *dcpf_insns[] = {
220 am_insn (dcpf, r),
221 am_insn (dcpf, sp),
222 am_insn (dcpf, rr),
223 am_insn (dcpf, d8r),
224 am_insn (dcpf, d24r),
225 am_insn (dcpf, d32r),
226 0
227};
228
229/* Bit operations. */
230def_bit_insn (bset, 0xfe80);
231def_bit_insn (bclr, 0xfe81);
232def_bit_insn (btst, 0xfe82);
233
234/* Define the group of bit insns. */
235func *bit_insns[] = {
236 bit_insn (bset),
237 bit_insn (bclr),
238 bit_insn (btst),
239 0
240};
241
242/* Define the single-precision FP move insns. */
243def_am_insn (fmov, irfs, 3, 0xf920,
244 lparen, amreg (4), rparen, comma,
245 freg (0, 8), tick_random);
246def_am_insn (fmov, rpfs, 3, 0xf922,
247 lparen, amreg (4), plus, rparen, comma,
248 freg (0, 8), tick_random);
249def_am_insn (fmov, spfs, 3, 0xf924,
250 lparen, spreg, rparen, comma, freg (0, 8));
251def_am_insn (fmov, vrfs, 3, 0xf926,
252 amreg (4), comma, freg (0, 8), tick_random);
253def_am_insn (fmov, fsir, 3, 0xf930,
254 freg (4, 9), comma, lparen, amreg (0), rparen, tick_random);
255def_am_insn (fmov, fsrp, 3, 0xf931,
256 freg (4, 9), comma, lparen, amreg (0), plus, rparen, tick_random);
257def_am_insn (fmov, fssp, 3, 0xf934,
258 freg (4, 9), comma, lparen, spreg, rparen);
259def_am_insn (fmov, fsvr, 3, 0xf935,
260 freg (4, 9), comma, amreg (0), tick_random);
261def_am_insn (fmov, fsfs, 3, 0xf940,
262 freg (4, 9), comma, freg (0, 8), tick_random);
263def_am_insn (fmov, d8rfs, 4, 0xfb20,
264 lparen, d8 (0), comma, amreg (12), rparen, comma,
265 freg (8, 16));
266def_am_insn (fmov, rpi8fs, 4, 0xfb22,
267 lparen, amreg (12), plus, comma, d8 (0), rparen, comma,
268 freg (8, 16));
269def_am_insn (fmov, d8spfs, 4, 0xfb24,
270 lparen, u8 (0), comma, spreg, rparen, comma, freg (8, 16),
271 tick_random);
272def_am_insn (fmov, irrfs, 4, 0xfb27,
273 lparen, amreg (12), comma, amreg (8), rparen, comma,
274 freg (4, 1));
275def_am_insn (fmov, fsd8r, 4, 0xfb30,
276 freg (12, 17), comma, lparen, d8 (0), comma, amreg (8), rparen);
277def_am_insn (fmov, fsrpi8, 4, 0xfb31,
278 freg (12, 17), comma,
279 lparen, amreg (8), plus, comma, d8 (0), rparen);
280def_am_insn (fmov, fsd8sp, 4, 0xfb34,
281 freg (12, 17), comma,
282 lparen, u8 (0), comma, spreg, rparen, tick_random);
283def_am_insn (fmov, fsirr, 4, 0xfb37,
284 freg (4, 1), comma,
285 lparen, amreg (12), comma, amreg (8), rparen);
286def_am_insn (fmov, d24rfs, 6, 0xfd20,
287 lparen, d24 (0), comma, amreg (28), rparen, comma, freg (24, 32));
288def_am_insn (fmov, rpi24fs, 6, 0xfd22,
289 lparen, amreg (28), plus, comma, d24 (0), rparen, comma,
290 freg (24, 32));
291def_am_insn (fmov, d24spfs, 6, 0xfd24,
292 lparen, u24 (0), comma, spreg, rparen, comma,
293 freg (24, 32), tick_random);
294def_am_insn (fmov, fsd24r, 6, 0xfd30,
295 freg (28, 33), comma, lparen, d24 (0), comma, amreg (24), rparen);
296def_am_insn (fmov, fsrpi24, 6, 0xfd31,
297 freg (28, 33), comma,
298 lparen, amreg (24), plus, comma, d24 (0), rparen);
299def_am_insn (fmov, fsd24sp, 6, 0xfd34,
300 freg (28, 33), comma,
301 lparen, u24 (0), comma, spreg, rparen, tick_random);
302def_am_insn (fmov, d32rfs, 7, 0xfe20,
303 lparen, d32 (0), comma, amreg (36), rparen, comma, freg (32, 40));
304def_am_insn (fmov, rpi32fs, 7, 0xfe22,
305 lparen, amreg (36), plus, comma, d32 (0), rparen, comma,
306 freg (32, 40));
307def_am_insn (fmov, d32spfs, 7, 0xfe24,
308 lparen, d32 (0), comma, spreg, rparen, comma,
309 freg (32, 40), tick_random);
310def_am_insn (fmov, i32fs, 7, 0xfe26,
311 d32 (0), comma, freg (32, 40), tick_random);
312def_am_insn (fmov, fsd32r, 7, 0xfe30,
313 freg (36, 41), comma, lparen, d32 (0), comma, amreg (32), rparen);
314def_am_insn (fmov, fsrpi32, 7, 0xfe31,
315 freg (36, 41), comma,
316 lparen, amreg (32), plus, comma, d32 (0), rparen);
317def_am_insn (fmov, fsd32sp, 7, 0xfe34,
318 freg (36, 41), comma,
319 lparen, d32 (0), comma, spreg, rparen, tick_random);
320
321/* Define the group of single-precision FP move insns. */
322func *fmovs_insns[] = {
323 am_insn (fmov, irfs),
324 am_insn (fmov, rpfs),
325 am_insn (fmov, spfs),
326 am_insn (fmov, vrfs),
327 am_insn (fmov, fsir),
328 am_insn (fmov, fsrp),
329 am_insn (fmov, fssp),
330 am_insn (fmov, fsvr),
331 am_insn (fmov, fsfs),
332 am_insn (fmov, d8rfs),
333 am_insn (fmov, rpi8fs),
334 am_insn (fmov, d8spfs),
335 am_insn (fmov, irrfs),
336 am_insn (fmov, fsd8r),
337 am_insn (fmov, fsrpi8),
338 am_insn (fmov, fsd8sp),
339 am_insn (fmov, fsirr),
340 am_insn (fmov, d24rfs),
341 am_insn (fmov, rpi24fs),
342 am_insn (fmov, d24spfs),
343 am_insn (fmov, fsd24r),
344 am_insn (fmov, fsrpi24),
345 am_insn (fmov, fsd24sp),
346 am_insn (fmov, d32rfs),
347 am_insn (fmov, rpi32fs),
348 am_insn (fmov, d32spfs),
349 am_insn (fmov, i32fs),
350 am_insn (fmov, fsd32r),
351 am_insn (fmov, fsrpi32),
352 am_insn (fmov, fsd32sp),
353 0
354};
355
356/* Define the double-precision FP move insns. */
357def_am_insn (fmov, irfd, 3, 0xf9a0,
358 lparen, amreg (4), rparen, comma, dreg (0, 8), tick_random);
359def_am_insn (fmov, rpfd, 3, 0xf9a2,
360 lparen, amreg (4), plus, rparen, comma, dreg (0, 8), tick_random);
361def_am_insn (fmov, spfd, 3, 0xf9a4,
362 lparen, spreg, rparen, comma, dreg (0, 8));
363def_am_insn (fmov, fdir, 3, 0xf9b0,
364 dreg (4, 9), comma, lparen, amreg (0), rparen, tick_random);
365def_am_insn (fmov, fdrp, 3, 0xf9b1,
366 dreg (4, 9), comma, lparen, amreg (0), plus, rparen, tick_random);
367def_am_insn (fmov, fdsp, 3, 0xf9b4,
368 dreg (4, 9), comma, lparen, spreg, rparen);
369def_am_insn (fmov, fdfd, 3, 0xf9c0,
370 dreg (4, 9), comma, dreg (0, 8), tick_random);
371def_am_insn (fmov, irrfd, 4, 0xfb47,
372 lparen, amreg (12), comma, amreg (8), rparen, comma, dreg (4, 1));
373def_am_insn (fmov, fdirr, 4, 0xfb57,
374 dreg (4, 1), comma, lparen, amreg (12), comma, amreg (8), rparen);
375def_am_insn (fmov, d8rfd, 4, 0xfba0,
376 lparen, d8 (0), comma, amreg (12), rparen, comma, dreg (8, 16));
377def_am_insn (fmov, rpi8fd, 4, 0xfba2,
378 lparen, amreg (12), plus, comma, d8 (0), rparen, comma,
379 dreg (8, 16));
380def_am_insn (fmov, d8spfd, 4, 0xfba4,
381 lparen, u8 (0), comma, spreg, rparen, comma,
382 dreg (8, 16), tick_random);
383def_am_insn (fmov, fdd8r, 4, 0xfbb0,
384 dreg (12, 17), comma, lparen, d8 (0), comma, amreg (8), rparen);
385def_am_insn (fmov, fdrpi8, 4, 0xfbb1,
386 dreg (12, 17), comma,
387 lparen, amreg (8), plus, comma, d8 (0), rparen);
388def_am_insn (fmov, fdi8sp, 4, 0xfbb4,
389 dreg (12, 17), comma,
390 lparen, u8 (0), comma, spreg, rparen, tick_random);
391def_am_insn (fmov, d24rfd, 6, 0xfda0,
392 lparen, d24 (0), comma, amreg (28), rparen, comma, dreg (24, 32));
393def_am_insn (fmov, rpi24fd, 6, 0xfda2,
394 lparen, amreg (28), plus, comma, d24 (0), rparen, comma,
395 dreg (24, 32));
396def_am_insn (fmov, d24spfd, 6, 0xfda4,
397 lparen, u24 (0), comma, spreg, rparen, comma,
398 dreg (24, 32), tick_random);
399def_am_insn (fmov, fdd24r, 6, 0xfdb0,
400 dreg (28, 33), comma,
401 lparen, d24 (0), comma, amreg (24), rparen);
402def_am_insn (fmov, fdrpi24, 6, 0xfdb1,
403 dreg (28, 33), comma,
404 lparen, amreg (24), plus, comma, d24 (0), rparen);
405def_am_insn (fmov, fdd24sp, 6, 0xfdb4,
406 dreg (28, 33), comma,
407 lparen, u24 (0), comma, spreg, rparen, tick_random);
408def_am_insn (fmov, d32rfd, 7, 0xfe40,
409 lparen, d32 (0), comma, amreg (36), rparen, comma, dreg (32, 40));
410def_am_insn (fmov, rpi32fd, 7, 0xfe42,
411 lparen, amreg (36), plus, comma, d32 (0), rparen, comma,
412 dreg (32, 40));
413def_am_insn (fmov, d32spfd, 7, 0xfe44,
414 lparen, d32 (0), comma, spreg, rparen, comma,
415 dreg (32, 40), tick_random);
416def_am_insn (fmov, fdd32r, 7, 0xfe50,
417 dreg (36, 41), comma,
418 lparen, d32 (0), comma, amreg (32), rparen);
419def_am_insn (fmov, fdrpi32, 7, 0xfe51,
420 dreg (36, 41), comma,
421 lparen, amreg (32), plus, comma, d32 (0), rparen);
422def_am_insn (fmov, fdd32sp, 7, 0xfe54,
423 dreg (36, 41), comma,
424 lparen, d32 (0), comma, spreg, rparen, tick_random);
425
426/* Define the group of double-precision FP move insns. */
427func *fmovd_insns[] = {
428 am_insn (fmov, irfd),
429 am_insn (fmov, rpfd),
430 am_insn (fmov, spfd),
431 am_insn (fmov, fdir),
432 am_insn (fmov, fdrp),
433 am_insn (fmov, fdsp),
434 am_insn (fmov, fdfd),
435 am_insn (fmov, irrfd),
436 am_insn (fmov, fdirr),
437 am_insn (fmov, d8rfd),
438 am_insn (fmov, rpi8fd),
439 am_insn (fmov, d8spfd),
440 am_insn (fmov, fdd8r),
441 am_insn (fmov, fdrpi8),
442 am_insn (fmov, fdi8sp),
443 am_insn (fmov, d24rfd),
444 am_insn (fmov, rpi24fd),
445 am_insn (fmov, d24spfd),
446 am_insn (fmov, fdd24r),
447 am_insn (fmov, fdrpi24),
448 am_insn (fmov, fdd24sp),
449 am_insn (fmov, d32rfd),
450 am_insn (fmov, rpi32fd),
451 am_insn (fmov, d32spfd),
452 am_insn (fmov, fdd32r),
453 am_insn (fmov, fdrpi32),
454 am_insn (fmov, fdd32sp),
455 0
456};
457
458/* Define fmov FPCR insns. */
459def_am_insn (fmov, vrfc, 3, 0xf9b5,
460 amreg (4), comma, fcreg);
461def_am_insn (fmov, fcvr, 3, 0xf9b7,
462 fcreg, comma, amreg (0));
463def_am_insn (fmov, i32fc, 6, 0xfdb5,
464 d32 (0), comma, fcreg);
465
466/* Define the group of FPCR move insns. */
467func *fmovc_insns[] = {
468 am_insn (fmov, vrfc),
469 am_insn (fmov, fcvr),
470 am_insn (fmov, i32fc),
471 0
472};
473
474/* Define single-precision floating-point arithmetic insns. */
475def_am_insn (fabs, fs, 3, 0xf944, freg (0, 8));
476def_am_insn (fabs, fsfs, 4, 0xfb44,
477 freg (12, 3), comma, freg (4, 1), tick_random);
478def_am_insn (fneg, fs, 3, 0xf946, freg (0, 8));
479def_am_insn (fneg, fsfs, 4, 0xfb46,
480 freg (12, 3), comma, freg (4, 1), tick_random);
481def_am_insn (frsqrt, fs, 3, 0xf950, freg (0, 8));
482def_am_insn (frsqrt, fsfs, 4, 0xfb50,
483 freg (12, 3), comma, freg (4, 1), tick_random);
484def_am_insn (fsqrt, fs, 3, 0xf952, freg (0, 8));
485def_am_insn (fsqrt, fsfs, 4, 0xfb54,
486 freg (12, 3), comma, freg (4, 1), tick_random);
487def_am_insn (fcmp, fsfs, 3, 0xf954,
488 freg (4, 9), comma, freg (0, 8), tick_random);
489def_am_insn (fcmp, i32fs, 7, 0xfe35,
490 d32 (0), comma, freg (36, 41), tick_random);
491def_am_insn (fadd, fsfs, 3, 0xf960,
492 freg (4, 9), comma, freg (0, 8), tick_random);
493def_am_insn (fadd, fsfsfs, 4, 0xfb60,
494 freg (12, 3), comma, freg (8, 2), comma, freg (4, 1));
495def_am_insn (fadd, i32fsfs, 7, 0xfe60,
496 d32 (0), comma, freg (36, 41), comma, freg (32, 40));
497def_am_insn (fsub, fsfs, 3, 0xf964,
498 freg (4, 9), comma, freg (0, 8), tick_random);
499def_am_insn (fsub, fsfsfs, 4, 0xfb64,
500 freg (12, 3), comma, freg (8, 2), comma, freg (4, 1));
501def_am_insn (fsub, i32fsfs, 7, 0xfe64,
502 d32 (0), comma, freg (36, 41), comma, freg (32, 40));
503def_am_insn (fmul, fsfs, 3, 0xf970,
504 freg (4, 9), comma, freg (0, 8), tick_random);
505def_am_insn (fmul, fsfsfs, 4, 0xfb70,
506 freg (12, 3), comma, freg (8, 2), comma, freg (4, 1));
507def_am_insn (fmul, i32fsfs, 7, 0xfe70,
508 d32 (0), comma, freg (36, 41), comma, freg (32, 40));
509def_am_insn (fdiv, fsfs, 3, 0xf974,
510 freg (4, 9), comma, freg (0, 8), tick_random);
511def_am_insn (fdiv, fsfsfs, 4, 0xfb74,
512 freg (12, 3), comma, freg (8, 2), comma, freg (4, 1));
513def_am_insn (fdiv, i32fsfs, 7, 0xfe74,
514 d32 (0), comma, freg (36, 41), comma, freg (32, 40));
515
516/* Define the group of single-precision floating-point arithmetic insns. */
517func *sfparith_insns[] = {
518 am_insn (fabs, fs),
519 am_insn (fabs, fsfs),
520 am_insn (fneg, fs),
521 am_insn (fneg, fsfs),
522 am_insn (frsqrt, fs),
523 am_insn (frsqrt, fsfs),
524 am_insn (fsqrt, fs),
525 am_insn (fsqrt, fsfs),
526 am_insn (fcmp, fsfs),
527 am_insn (fcmp, i32fs),
528 am_insn (fadd, fsfs),
529 am_insn (fadd, fsfsfs),
530 am_insn (fadd, i32fsfs),
531 am_insn (fsub, fsfs),
532 am_insn (fsub, fsfsfs),
533 am_insn (fsub, i32fsfs),
534 am_insn (fmul, fsfs),
535 am_insn (fmul, fsfsfs),
536 am_insn (fmul, i32fsfs),
537 am_insn (fdiv, fsfs),
538 am_insn (fdiv, fsfsfs),
539 am_insn (fdiv, i32fsfs),
540 0
541};
542
543/* Define floating-point accumulator arithmetic insns. */
544def_am_insn (fmadd, , 4, 0xfb80,
545 freg (12, 3), comma, freg (8, 2), comma,
546 freg (4, 1), comma, areg (16, 0), tick_random);
547def_am_insn (fmsub, , 4, 0xfb84,
548 freg (12, 3), comma, freg (8, 2), comma,
549 freg (4, 1), comma, areg (16, 0), tick_random);
550def_am_insn (fnmadd, , 4, 0xfb90,
551 freg (12, 3), comma, freg (8, 2), comma,
552 freg (4, 1), comma, areg (16, 0), tick_random);
553def_am_insn (fnmsub, , 4, 0xfb94,
554 freg (12, 3), comma, freg (8, 2), comma,
555 freg (4, 1), comma, areg (16, 0), tick_random);
556
557/* Define the group of floating-point accumulator arithmetic insns. */
558func *fpacc_insns[] = {
559 am_insn (fmadd, ),
560 am_insn (fmsub, ),
561 am_insn (fnmadd, ),
562 am_insn (fnmsub, ),
563 0
564};
565
566/* Define double-precision floating-point arithmetic insns. */
567def_am_insn (fabs, fd, 3, 0xf9c4, dreg (0, 8));
568def_am_insn (fabs, fdfd, 4, 0xfbc4,
569 dreg (12, 3), comma, dreg (4, 1), tick_random);
570def_am_insn (fneg, fd, 3, 0xf9c6, dreg (0, 8));
571def_am_insn (fneg, fdfd, 4, 0xfbc6,
572 dreg (12, 3), comma, dreg (4, 1), tick_random);
573def_am_insn (frsqrt, fd, 3, 0xf9d0, dreg (0, 8));
574def_am_insn (frsqrt, fdfd, 4, 0xfbd0,
575 dreg (12, 3), comma, dreg (4, 1), tick_random);
576def_am_insn (fsqrt, fd, 3, 0xf9d2, dreg (0, 8));
577def_am_insn (fsqrt, fdfd, 4, 0xfbd4,
578 dreg (12, 3), comma, dreg (4, 1), tick_random);
579def_am_insn (fcmp, fdfd, 3, 0xf9d4,
580 dreg (4, 9), comma, dreg (0, 8), tick_random);
581def_am_insn (fadd, fdfd, 3, 0xf9e0,
582 dreg (4, 9), comma, dreg (0, 8), tick_random);
583def_am_insn (fadd, fdfdfd, 4, 0xfbe0,
584 dreg (12, 3), comma, dreg (8, 2), comma, dreg (4, 1));
585def_am_insn (fsub, fdfd, 3, 0xf9e4,
586 dreg (4, 9), comma, dreg (0, 8), tick_random);
587def_am_insn (fsub, fdfdfd, 4, 0xfbe4,
588 dreg (12, 3), comma, dreg (8, 2), comma, dreg (4, 1));
589def_am_insn (fmul, fdfd, 3, 0xf9f0,
590 dreg (4, 9), comma, dreg (0, 8), tick_random);
591def_am_insn (fmul, fdfdfd, 4, 0xfbf0,
592 dreg (12, 3), comma, dreg (8, 2), comma, dreg (4, 1));
593def_am_insn (fdiv, fdfd, 3, 0xf9f4,
594 dreg (4, 9), comma, dreg (0, 8), tick_random);
595def_am_insn (fdiv, fdfdfd, 4, 0xfbf4,
596 dreg (12, 3), comma, dreg (8, 2), comma, dreg (4, 1));
597
598/* Define the group of double-precision floating-point arithmetic insns. */
599func *dfparith_insns[] = {
600 am_insn (fabs, fd),
601 am_insn (fabs, fdfd),
602 am_insn (fneg, fd),
603 am_insn (fneg, fdfd),
604 am_insn (frsqrt, fd),
605 am_insn (frsqrt, fdfd),
606 am_insn (fsqrt, fd),
607 am_insn (fsqrt, fdfd),
608 am_insn (fcmp, fdfd),
609 am_insn (fadd, fdfd),
610 am_insn (fadd, fdfdfd),
611 am_insn (fsub, fdfd),
612 am_insn (fsub, fdfdfd),
613 am_insn (fmul, fdfd),
614 am_insn (fmul, fdfdfd),
615 am_insn (fdiv, fdfd),
616 am_insn (fdiv, fdfdfd),
617 0
618};
619
620/* Define floating-point conversion insns. */
621def_am_insn (ftoi, fsfs, 4, 0xfb40,
622 freg (12, 3), comma, freg (4, 1), tick_random);
623def_am_insn (itof, fsfs, 4, 0xfb42,
624 freg (12, 3), comma, freg (4, 1), tick_random);
625def_am_insn (ftod, fsfd, 4, 0xfb52,
626 freg (12, 3), comma, dreg (4, 1), tick_random);
627def_am_insn (dtof, fdfs, 4, 0xfb56,
628 dreg (12, 3), comma, freg (4, 1), tick_random);
629
630/* Define the group of floating-point conversion insns. */
631func *fpconv_insns[] = {
632 am_insn (ftoi, fsfs),
633 am_insn (itof, fsfs),
634 am_insn (ftod, fsfd),
635 am_insn (dtof, fdfs),
636 0
637};
638
639/* Define conditional jump insns. */
640def_am_insn (fbeq, , 3, 0xf8d0, d8pcsec (0));
641def_am_insn (fbne, , 3, 0xf8d1, d8pcsec (0));
642def_am_insn (fbgt, , 3, 0xf8d2, d8pcsec (0));
643def_am_insn (fbge, , 3, 0xf8d3, d8pcsec (0));
644def_am_insn (fblt, , 3, 0xf8d4, d8pcsec (0));
645def_am_insn (fble, , 3, 0xf8d5, d8pcsec (0));
646def_am_insn (fbuo, , 3, 0xf8d6, d8pcsec (0));
647def_am_insn (fblg, , 3, 0xf8d7, d8pcsec (0));
648def_am_insn (fbleg,, 3, 0xf8d8, d8pcsec (0));
649def_am_insn (fbug, , 3, 0xf8d9, d8pcsec (0));
650def_am_insn (fbuge,, 3, 0xf8da, d8pcsec (0));
651def_am_insn (fbul, , 3, 0xf8db, d8pcsec (0));
652def_am_insn (fbule,, 3, 0xf8dc, d8pcsec (0));
653def_am_insn (fbue, , 3, 0xf8dd, d8pcsec (0));
654def_am_insn (fleq, , 2, 0xf0d0, nothing);
655def_am_insn (flne, , 2, 0xf0d1, nothing);
656def_am_insn (flgt, , 2, 0xf0d2, nothing);
657def_am_insn (flge, , 2, 0xf0d3, nothing);
658def_am_insn (fllt, , 2, 0xf0d4, nothing);
659def_am_insn (flle, , 2, 0xf0d5, nothing);
660def_am_insn (fluo, , 2, 0xf0d6, nothing);
661def_am_insn (fllg, , 2, 0xf0d7, nothing);
662def_am_insn (flleg,, 2, 0xf0d8, nothing);
663def_am_insn (flug, , 2, 0xf0d9, nothing);
664def_am_insn (fluge,, 2, 0xf0da, nothing);
665def_am_insn (flul, , 2, 0xf0db, nothing);
666def_am_insn (flule,, 2, 0xf0dc, nothing);
667def_am_insn (flue, , 2, 0xf0dd, nothing);
668
669/* Define the group of conditional jump insns. */
670func *condjmp_insns[] = {
671 am_insn (fbeq, ),
672 am_insn (fbne, ),
673 am_insn (fbgt, ),
674 am_insn (fbge, ),
675 am_insn (fblt, ),
676 am_insn (fble, ),
677 am_insn (fbuo, ),
678 am_insn (fblg, ),
679 am_insn (fbleg, ),
680 am_insn (fbug, ),
681 am_insn (fbuge, ),
682 am_insn (fbul, ),
683 am_insn (fbule, ),
684 am_insn (fbue, ),
685 am_insn (fleq, ),
686 am_insn (flne, ),
687 am_insn (flgt, ),
688 am_insn (flge, ),
689 am_insn (fllt, ),
690 am_insn (flle, ),
691 am_insn (fluo, ),
692 am_insn (fllg, ),
693 am_insn (flleg, ),
694 am_insn (flug, ),
695 am_insn (fluge, ),
696 am_insn (flul, ),
697 am_insn (flule, ),
698 am_insn (flue, ),
699 0
700};
701
702/* Define the set of all groups. */
703group_t
704groups[] = {
705 { "dcpf", dcpf_insns },
706 { "bit", bit_insns },
707 { "fmovs", fmovs_insns },
708 { "fmovd", fmovd_insns },
709 { "fmovc", fmovc_insns },
710 { "sfparith", sfparith_insns },
711 { "fpacc", fpacc_insns },
712 { "dfparith", dfparith_insns },
713 { "fpconv", fpconv_insns },
714 { "condjmp", condjmp_insns },
715 { 0 }
716};
717
718int
719main(int argc, char *argv[])
720{
721 FILE *as_in = stdout, *dis_out = stderr;
722
723 /* Check whether we're filtering insns. */
724 if (argc > 1)
725 skip_list = argv + 1;
726
727 /* Output assembler header. */
728 fputs ("\t.text\n"
729 "\t.am33_2\n",
730 as_in);
731 /* Output comments for the testsuite-driver and the initial
732 * disassembler output. */
733 fputs ("#objdump: -dr --prefix-address --show-raw-insn\n"
734 "#name: AM33/2.0\n"
735 "\n"
736 ".*: +file format.*elf32-mn10300.*\n"
737 "\n"
738 "Disassembly of section .text:\n",
739 dis_out);
740
741 /* Now emit all (selected) insns. */
742 output_groups (groups, as_in, dis_out);
743
744 exit (0);
745}