/* Copyright (C) 2000, 2002, 2005, 2007 Free Software Foundation
|
/* Copyright (C) 2000, 2002, 2005, 2007 Free Software Foundation
|
Contributed by Alexandre Oliva <aoliva@redhat.com>
|
Contributed by Alexandre Oliva <aoliva@redhat.com>
|
|
|
This file is free software; you can redistribute it and/or modify it
|
This file is free software; you can redistribute it and/or modify it
|
under the terms of the GNU General Public License as published by
|
under the terms of the GNU General Public License as published by
|
the Free Software Foundation; either version 3 of the License, or
|
the Free Software Foundation; either version 3 of the License, or
|
(at your option) any later version.
|
(at your option) any later version.
|
|
|
This program is distributed in the hope that it will be useful, but
|
This program is distributed in the hope that it will be useful, but
|
WITHOUT ANY WARRANTY; without even the implied warranty of
|
WITHOUT ANY WARRANTY; without even the implied warranty of
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
General Public License for more details.
|
General Public License for more details.
|
|
|
You should have received a copy of the GNU General Public License
|
You should have received a copy of the GNU General Public License
|
along with this program; if not, write to the Free Software
|
along with this program; if not, write to the Free Software
|
Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston,
|
Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston,
|
MA 02110-1301, USA. */
|
MA 02110-1301, USA. */
|
|
|
/* Generator of tests for insns introduced in AM33 2.0. */
|
/* Generator of tests for insns introduced in AM33 2.0. */
|
|
|
#define INSN_REPEAT 11
|
#define INSN_REPEAT 11
|
|
|
/* See the following file for usage and documentation. */
|
/* See the following file for usage and documentation. */
|
#include "../all/test-gen.c"
|
#include "../all/test-gen.c"
|
|
|
/* These are the AM33 registers. */
|
/* These are the AM33 registers. */
|
const char *am33_regs[] = {
|
const char *am33_regs[] = {
|
/* These are the canonical names, i.e., those printed by the
|
/* These are the canonical names, i.e., those printed by the
|
* disassembler. */
|
* disassembler. */
|
"r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
|
"r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
|
"a0", "a1", "a2", "a3", "d0", "d1", "d2", "d3",
|
"a0", "a1", "a2", "a3", "d0", "d1", "d2", "d3",
|
/* These are aliases that the assembler should also recognize. */
|
/* These are aliases that the assembler should also recognize. */
|
"e0", "e1", "e2", "e3", "e4", "e5", "e6", "e7",
|
"e0", "e1", "e2", "e3", "e4", "e5", "e6", "e7",
|
"r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15"
|
"r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15"
|
};
|
};
|
|
|
/* Signed constants of the given sizes. */
|
/* Signed constants of the given sizes. */
|
#define d8(shift) signed_constant( 8, shift, 1)
|
#define d8(shift) signed_constant( 8, shift, 1)
|
#define d16(shift) signed_constant(16, shift, 1)
|
#define d16(shift) signed_constant(16, shift, 1)
|
#define d24(shift) signed_constant(24, shift, 1)
|
#define d24(shift) signed_constant(24, shift, 1)
|
#define d32(shift) signed_constant(32, shift, 1)
|
#define d32(shift) signed_constant(32, shift, 1)
|
#define u8(shift) unsigned_constant( 8, shift, 1)
|
#define u8(shift) unsigned_constant( 8, shift, 1)
|
#define u24(shift) unsigned_constant(24, shift, 1)
|
#define u24(shift) unsigned_constant(24, shift, 1)
|
#define a16(shift) absolute_address(16, shift, 1)
|
#define a16(shift) absolute_address(16, shift, 1)
|
|
|
/* Emit an AM33 register shifted by these many words. */
|
/* Emit an AM33 register shifted by these many words. */
|
#define amreg(shift) reg_r (am33_regs, shift, 15, mk_get_bits (5u))
|
#define amreg(shift) reg_r (am33_regs, shift, 15, mk_get_bits (5u))
|
#define spreg literal ("sp")
|
#define spreg literal ("sp")
|
#define fcreg literal ("fpcr")
|
#define fcreg literal ("fpcr")
|
|
|
/* Emit an AM33-2 FP single-precision register, with the 4 least
|
/* Emit an AM33-2 FP single-precision register, with the 4 least
|
* significant bits shifted by shiftlow and the most significant bit
|
* significant bits shifted by shiftlow and the most significant bit
|
* shifted by shifthigh. */
|
* shifted by shifthigh. */
|
int
|
int
|
freg (func_arg *arg, insn_data *data)
|
freg (func_arg *arg, insn_data *data)
|
#define freg(shiftlow, shifthigh) { freg, { i1: shiftlow, i2: shifthigh } }
|
#define freg(shiftlow, shifthigh) { freg, { i1: shiftlow, i2: shifthigh } }
|
{
|
{
|
unsigned val = get_bits (5u);
|
unsigned val = get_bits (5u);
|
|
|
data->as_in = data->dis_out = (char*)malloc (3 + ulen (val, 10));
|
data->as_in = data->dis_out = (char*)malloc (3 + ulen (val, 10));
|
sprintf (data->as_in, "fs%u", val);
|
sprintf (data->as_in, "fs%u", val);
|
data->bits = val;
|
data->bits = val;
|
data->bits = ((data->bits & 15) << arg->i1) | ((data->bits >> 4) << arg->i2);
|
data->bits = ((data->bits & 15) << arg->i1) | ((data->bits >> 4) << arg->i2);
|
|
|
return 0;
|
return 0;
|
}
|
}
|
|
|
/* Emit an AM33-2 FP single-precision register in the ``accumulator''
|
/* Emit an AM33-2 FP single-precision register in the ``accumulator''
|
* range, with the 2 least significant bits shifted by shiftlow and
|
* range, with the 2 least significant bits shifted by shiftlow and
|
* the most significant bit shifted by shifthigh. */
|
* the most significant bit shifted by shifthigh. */
|
int
|
int
|
areg (func_arg *arg, insn_data *data)
|
areg (func_arg *arg, insn_data *data)
|
#define areg(shiftlow, shifthigh) { areg, { i1: shiftlow, i2: shifthigh } }
|
#define areg(shiftlow, shifthigh) { areg, { i1: shiftlow, i2: shifthigh } }
|
{
|
{
|
unsigned val = get_bits (3u);
|
unsigned val = get_bits (3u);
|
|
|
data->as_in = data->dis_out = (char*)malloc (4);
|
data->as_in = data->dis_out = (char*)malloc (4);
|
sprintf (data->as_in, "fs%u", val);
|
sprintf (data->as_in, "fs%u", val);
|
data->bits = val;
|
data->bits = val;
|
data->bits = ((data->bits & 3) << arg->i1) | ((data->bits >> 2) << arg->i2);
|
data->bits = ((data->bits & 3) << arg->i1) | ((data->bits >> 2) << arg->i2);
|
|
|
return 0;
|
return 0;
|
}
|
}
|
|
|
/* Emit an AM33-2 FP double-precision register, with the 4 least
|
/* Emit an AM33-2 FP double-precision register, with the 4 least
|
* significant bits shifted by shiftlow and the most significant bit
|
* significant bits shifted by shiftlow and the most significant bit
|
* shifted by shifthigh. */
|
* shifted by shifthigh. */
|
int
|
int
|
dreg (func_arg *arg, insn_data *data)
|
dreg (func_arg *arg, insn_data *data)
|
#define dreg(shiftlow, shifthigh) { dreg, { i1: shiftlow, i2: shifthigh } }
|
#define dreg(shiftlow, shifthigh) { dreg, { i1: shiftlow, i2: shifthigh } }
|
{
|
{
|
unsigned val = 2 * get_bits (4u);
|
unsigned val = 2 * get_bits (4u);
|
|
|
data->as_in = data->dis_out = (char*)malloc (3 + ulen (val, 10));
|
data->as_in = data->dis_out = (char*)malloc (3 + ulen (val, 10));
|
sprintf (data->as_in, "fd%u", val);
|
sprintf (data->as_in, "fd%u", val);
|
data->bits = val;
|
data->bits = val;
|
data->bits = ((data->bits & 15) << arg->i1) | ((data->bits >> 4) << arg->i2);
|
data->bits = ((data->bits & 15) << arg->i1) | ((data->bits >> 4) << arg->i2);
|
|
|
return 0;
|
return 0;
|
}
|
}
|
|
|
/* Emit a signed 8-bit PC-relative offset from the current insn to the
|
/* Emit a signed 8-bit PC-relative offset from the current insn to the
|
* last emitted label. */
|
* last emitted label. */
|
int
|
int
|
d8pcoff (func_arg *arg, insn_data *data)
|
d8pcoff (func_arg *arg, insn_data *data)
|
#define d8pcoff(shift) { d8pcoff, { p1: shift } }
|
#define d8pcoff(shift) { d8pcoff, { p1: shift } }
|
{
|
{
|
int diff = insn_size - arg->i1/8 - 1;
|
int diff = insn_size - arg->i1/8 - 1;
|
int displacement = current_offset - last_label_offset;
|
int displacement = current_offset - last_label_offset;
|
char *current_address = malloc (strlen (last_label_name) + 4
|
char *current_address = malloc (strlen (last_label_name) + 4
|
+ ulen (displacement, 16) + 1);
|
+ ulen (displacement, 16) + 1);
|
|
|
/* Make sure we're not too far from the target. */
|
/* Make sure we're not too far from the target. */
|
if (displacement > 128)
|
if (displacement > 128)
|
abort ();
|
abort ();
|
|
|
data->as_in = strdup (last_label_name);
|
data->as_in = strdup (last_label_name);
|
|
|
/* Calculate the address that will be printed by the disassembler as
|
/* Calculate the address that will be printed by the disassembler as
|
the target of the jump. Since it won't take relocations into
|
the target of the jump. Since it won't take relocations into
|
account, it will be the insn's own address. */
|
account, it will be the insn's own address. */
|
if (current_offset == last_label_offset)
|
if (current_offset == last_label_offset)
|
strcpy (current_address, last_label_name);
|
strcpy (current_address, last_label_name);
|
else
|
else
|
sprintf (current_address, "%s\\+0x%x", last_label_name, displacement);
|
sprintf (current_address, "%s\\+0x%x", last_label_name, displacement);
|
|
|
/* Compute the complete label, including the relocation message
|
/* Compute the complete label, including the relocation message
|
printed as an additional message. The relocation will point us
|
printed as an additional message. The relocation will point us
|
to the intended target label plus an offset equal to the offset
|
to the intended target label plus an offset equal to the offset
|
of the displacement within the current insn. We do not account
|
of the displacement within the current insn. We do not account
|
for the case in which this displacement is zero, since it doesn't
|
for the case in which this displacement is zero, since it doesn't
|
come up on this platform. */
|
come up on this platform. */
|
data->dis_out = malloc (8 + 2 + strlen (current_address) + 2
|
data->dis_out = malloc (8 + 2 + strlen (current_address) + 2
|
+ 3 + ulen (current_offset + diff, 16) + 19
|
+ 3 + ulen (current_offset + diff, 16) + 19
|
+ strlen (last_label_name) + 4
|
+ strlen (last_label_name) + 4
|
+ ulen (diff, 16) + 1);
|
+ ulen (diff, 16) + 1);
|
sprintf (data->dis_out, "0*%x <%s>\n"
|
sprintf (data->dis_out, "0*%x <%s>\n"
|
"\t\t\t%x: R_MN10300_PCREL8\t%s\\+0x%x",
|
"\t\t\t%x: R_MN10300_PCREL8\t%s\\+0x%x",
|
current_offset, current_address,
|
current_offset, current_address,
|
current_offset + diff, last_label_name, diff);
|
current_offset + diff, last_label_name, diff);
|
|
|
free (current_address);
|
free (current_address);
|
|
|
return 0;
|
return 0;
|
}
|
}
|
|
|
/* Emit a signed 8-bit PC-relative offset from the current insn to the
|
/* Emit a signed 8-bit PC-relative offset from the current insn to the
|
* current section. */
|
* current section. */
|
int
|
int
|
d8pcsec (func_arg *arg, insn_data *data)
|
d8pcsec (func_arg *arg, insn_data *data)
|
#define d8pcsec(shift) { d8pcsec, { p1: shift } }
|
#define d8pcsec(shift) { d8pcsec, { p1: shift } }
|
{
|
{
|
int diff = insn_size - arg->i1/8 - 1;
|
int diff = insn_size - arg->i1/8 - 1;
|
int displacement = current_offset - last_label_offset;
|
int displacement = current_offset - last_label_offset;
|
char *current_address = malloc (strlen (last_label_name) + 4
|
char *current_address = malloc (strlen (last_label_name) + 4
|
+ ulen (displacement, 16) + 1);
|
+ ulen (displacement, 16) + 1);
|
|
|
/* Make sure we're not too far from the target. */
|
/* Make sure we're not too far from the target. */
|
if (displacement > 128)
|
if (displacement > 128)
|
abort ();
|
abort ();
|
|
|
data->as_in = strdup (last_label_name);
|
data->as_in = strdup (last_label_name);
|
|
|
/* Calculate the address that will be printed by the disassembler as
|
/* Calculate the address that will be printed by the disassembler as
|
the target of the jump. Since it won't take relocations into
|
the target of the jump. Since it won't take relocations into
|
account, it will be the insn's own address. */
|
account, it will be the insn's own address. */
|
|
|
if (current_offset == last_label_offset)
|
if (current_offset == last_label_offset)
|
strcpy (current_address, last_label_name);
|
strcpy (current_address, last_label_name);
|
else
|
else
|
sprintf (current_address, "%s\\+0x%x", last_label_name, displacement);
|
sprintf (current_address, "%s\\+0x%x", last_label_name, displacement);
|
|
|
|
|
/* Compute the complete label, including the relocation message
|
/* Compute the complete label, including the relocation message
|
printed as an additional message. The relocation will point us
|
printed as an additional message. The relocation will point us
|
to the intended target label plus an offset equal to the offset
|
to the intended target label plus an offset equal to the offset
|
of the displacement within the current insn. We do not account
|
of the displacement within the current insn. We do not account
|
for the case in which this displacement is zero, since it doesn't
|
for the case in which this displacement is zero, since it doesn't
|
come up on this platform. */
|
come up on this platform. */
|
data->dis_out = malloc (8 + 2 + strlen (current_address) + 2
|
data->dis_out = malloc (8 + 2 + strlen (current_address) + 2
|
+ 3 + ulen (current_offset + diff, 16) + 33);
|
+ 3 + ulen (current_offset + diff, 16) + 33);
|
sprintf (data->dis_out, "0*%x <%s>\n"
|
sprintf (data->dis_out, "0*%x <%s>\n"
|
"\t\t\t%x: R_MN10300_PCREL8\tcondjmp\\+0x2",
|
"\t\t\t%x: R_MN10300_PCREL8\tcondjmp\\+0x2",
|
current_offset, current_address,
|
current_offset, current_address,
|
current_offset + diff);
|
current_offset + diff);
|
|
|
free (current_address);
|
free (current_address);
|
|
|
return 0;
|
return 0;
|
}
|
}
|
|
|
/* Convenience wrapper to define_insn. */
|
/* Convenience wrapper to define_insn. */
|
#define def_am_insn(insname, variant, size, word, funcs...) \
|
#define def_am_insn(insname, variant, size, word, funcs...) \
|
define_insn(insname ## _ ## variant, \
|
define_insn(insname ## _ ## variant, \
|
insn_size_bits (insname, size, \
|
insn_size_bits (insname, size, \
|
((unsigned long long)word) << 8*(size-2)), \
|
((unsigned long long)word) << 8*(size-2)), \
|
tab, \
|
tab, \
|
## funcs)
|
## funcs)
|
#define am_insn(insname, variant) insn (insname ## _ ## variant)
|
#define am_insn(insname, variant) insn (insname ## _ ## variant)
|
|
|
#define def_bit_insn(insname, word) \
|
#define def_bit_insn(insname, word) \
|
def_am_insn (insname, i8a16, 5, word, \
|
def_am_insn (insname, i8a16, 5, word, \
|
u8(0), comma, lparen, a16 (8), rparen, tick_random);
|
u8(0), comma, lparen, a16 (8), rparen, tick_random);
|
#define bit_insn(insname) insn (insname ## _ ## i8a16)
|
#define bit_insn(insname) insn (insname ## _ ## i8a16)
|
|
|
/* Data cache pre-fetch insns. */
|
/* Data cache pre-fetch insns. */
|
def_am_insn (dcpf, r, 3, 0xf9a6, lparen, amreg (4), rparen);
|
def_am_insn (dcpf, r, 3, 0xf9a6, lparen, amreg (4), rparen);
|
def_am_insn (dcpf, sp, 3, 0xf9a7, lparen, spreg, rparen);
|
def_am_insn (dcpf, sp, 3, 0xf9a7, lparen, spreg, rparen);
|
def_am_insn (dcpf, rr, 4, 0xfba6,
|
def_am_insn (dcpf, rr, 4, 0xfba6,
|
lparen, amreg(12), comma, amreg (8), rparen, tick_random);
|
lparen, amreg(12), comma, amreg (8), rparen, tick_random);
|
def_am_insn (dcpf, d8r, 4, 0xfba7,
|
def_am_insn (dcpf, d8r, 4, 0xfba7,
|
lparen, d8 (0), comma, amreg (12), rparen, tick_random);
|
lparen, d8 (0), comma, amreg (12), rparen, tick_random);
|
def_am_insn (dcpf, d24r, 6, 0xfda7,
|
def_am_insn (dcpf, d24r, 6, 0xfda7,
|
lparen, d24(0), comma, amreg (28), rparen, tick_random);
|
lparen, d24(0), comma, amreg (28), rparen, tick_random);
|
def_am_insn (dcpf, d32r, 7, 0xfe46,
|
def_am_insn (dcpf, d32r, 7, 0xfe46,
|
lparen, d32(0), comma, amreg (36), rparen, tick_random);
|
lparen, d32(0), comma, amreg (36), rparen, tick_random);
|
|
|
/* Define the group of data cache pre-fetch insns. */
|
/* Define the group of data cache pre-fetch insns. */
|
func *dcpf_insns[] = {
|
func *dcpf_insns[] = {
|
am_insn (dcpf, r),
|
am_insn (dcpf, r),
|
am_insn (dcpf, sp),
|
am_insn (dcpf, sp),
|
am_insn (dcpf, rr),
|
am_insn (dcpf, rr),
|
am_insn (dcpf, d8r),
|
am_insn (dcpf, d8r),
|
am_insn (dcpf, d24r),
|
am_insn (dcpf, d24r),
|
am_insn (dcpf, d32r),
|
am_insn (dcpf, d32r),
|
0
|
0
|
};
|
};
|
|
|
/* Bit operations. */
|
/* Bit operations. */
|
def_bit_insn (bset, 0xfe80);
|
def_bit_insn (bset, 0xfe80);
|
def_bit_insn (bclr, 0xfe81);
|
def_bit_insn (bclr, 0xfe81);
|
def_bit_insn (btst, 0xfe82);
|
def_bit_insn (btst, 0xfe82);
|
|
|
/* Define the group of bit insns. */
|
/* Define the group of bit insns. */
|
func *bit_insns[] = {
|
func *bit_insns[] = {
|
bit_insn (bset),
|
bit_insn (bset),
|
bit_insn (bclr),
|
bit_insn (bclr),
|
bit_insn (btst),
|
bit_insn (btst),
|
0
|
0
|
};
|
};
|
|
|
/* Define the single-precision FP move insns. */
|
/* Define the single-precision FP move insns. */
|
def_am_insn (fmov, irfs, 3, 0xf920,
|
def_am_insn (fmov, irfs, 3, 0xf920,
|
lparen, amreg (4), rparen, comma,
|
lparen, amreg (4), rparen, comma,
|
freg (0, 8), tick_random);
|
freg (0, 8), tick_random);
|
def_am_insn (fmov, rpfs, 3, 0xf922,
|
def_am_insn (fmov, rpfs, 3, 0xf922,
|
lparen, amreg (4), plus, rparen, comma,
|
lparen, amreg (4), plus, rparen, comma,
|
freg (0, 8), tick_random);
|
freg (0, 8), tick_random);
|
def_am_insn (fmov, spfs, 3, 0xf924,
|
def_am_insn (fmov, spfs, 3, 0xf924,
|
lparen, spreg, rparen, comma, freg (0, 8));
|
lparen, spreg, rparen, comma, freg (0, 8));
|
def_am_insn (fmov, vrfs, 3, 0xf926,
|
def_am_insn (fmov, vrfs, 3, 0xf926,
|
amreg (4), comma, freg (0, 8), tick_random);
|
amreg (4), comma, freg (0, 8), tick_random);
|
def_am_insn (fmov, fsir, 3, 0xf930,
|
def_am_insn (fmov, fsir, 3, 0xf930,
|
freg (4, 9), comma, lparen, amreg (0), rparen, tick_random);
|
freg (4, 9), comma, lparen, amreg (0), rparen, tick_random);
|
def_am_insn (fmov, fsrp, 3, 0xf931,
|
def_am_insn (fmov, fsrp, 3, 0xf931,
|
freg (4, 9), comma, lparen, amreg (0), plus, rparen, tick_random);
|
freg (4, 9), comma, lparen, amreg (0), plus, rparen, tick_random);
|
def_am_insn (fmov, fssp, 3, 0xf934,
|
def_am_insn (fmov, fssp, 3, 0xf934,
|
freg (4, 9), comma, lparen, spreg, rparen);
|
freg (4, 9), comma, lparen, spreg, rparen);
|
def_am_insn (fmov, fsvr, 3, 0xf935,
|
def_am_insn (fmov, fsvr, 3, 0xf935,
|
freg (4, 9), comma, amreg (0), tick_random);
|
freg (4, 9), comma, amreg (0), tick_random);
|
def_am_insn (fmov, fsfs, 3, 0xf940,
|
def_am_insn (fmov, fsfs, 3, 0xf940,
|
freg (4, 9), comma, freg (0, 8), tick_random);
|
freg (4, 9), comma, freg (0, 8), tick_random);
|
def_am_insn (fmov, d8rfs, 4, 0xfb20,
|
def_am_insn (fmov, d8rfs, 4, 0xfb20,
|
lparen, d8 (0), comma, amreg (12), rparen, comma,
|
lparen, d8 (0), comma, amreg (12), rparen, comma,
|
freg (8, 16));
|
freg (8, 16));
|
def_am_insn (fmov, rpi8fs, 4, 0xfb22,
|
def_am_insn (fmov, rpi8fs, 4, 0xfb22,
|
lparen, amreg (12), plus, comma, d8 (0), rparen, comma,
|
lparen, amreg (12), plus, comma, d8 (0), rparen, comma,
|
freg (8, 16));
|
freg (8, 16));
|
def_am_insn (fmov, d8spfs, 4, 0xfb24,
|
def_am_insn (fmov, d8spfs, 4, 0xfb24,
|
lparen, u8 (0), comma, spreg, rparen, comma, freg (8, 16),
|
lparen, u8 (0), comma, spreg, rparen, comma, freg (8, 16),
|
tick_random);
|
tick_random);
|
def_am_insn (fmov, irrfs, 4, 0xfb27,
|
def_am_insn (fmov, irrfs, 4, 0xfb27,
|
lparen, amreg (12), comma, amreg (8), rparen, comma,
|
lparen, amreg (12), comma, amreg (8), rparen, comma,
|
freg (4, 1));
|
freg (4, 1));
|
def_am_insn (fmov, fsd8r, 4, 0xfb30,
|
def_am_insn (fmov, fsd8r, 4, 0xfb30,
|
freg (12, 17), comma, lparen, d8 (0), comma, amreg (8), rparen);
|
freg (12, 17), comma, lparen, d8 (0), comma, amreg (8), rparen);
|
def_am_insn (fmov, fsrpi8, 4, 0xfb31,
|
def_am_insn (fmov, fsrpi8, 4, 0xfb31,
|
freg (12, 17), comma,
|
freg (12, 17), comma,
|
lparen, amreg (8), plus, comma, d8 (0), rparen);
|
lparen, amreg (8), plus, comma, d8 (0), rparen);
|
def_am_insn (fmov, fsd8sp, 4, 0xfb34,
|
def_am_insn (fmov, fsd8sp, 4, 0xfb34,
|
freg (12, 17), comma,
|
freg (12, 17), comma,
|
lparen, u8 (0), comma, spreg, rparen, tick_random);
|
lparen, u8 (0), comma, spreg, rparen, tick_random);
|
def_am_insn (fmov, fsirr, 4, 0xfb37,
|
def_am_insn (fmov, fsirr, 4, 0xfb37,
|
freg (4, 1), comma,
|
freg (4, 1), comma,
|
lparen, amreg (12), comma, amreg (8), rparen);
|
lparen, amreg (12), comma, amreg (8), rparen);
|
def_am_insn (fmov, d24rfs, 6, 0xfd20,
|
def_am_insn (fmov, d24rfs, 6, 0xfd20,
|
lparen, d24 (0), comma, amreg (28), rparen, comma, freg (24, 32));
|
lparen, d24 (0), comma, amreg (28), rparen, comma, freg (24, 32));
|
def_am_insn (fmov, rpi24fs, 6, 0xfd22,
|
def_am_insn (fmov, rpi24fs, 6, 0xfd22,
|
lparen, amreg (28), plus, comma, d24 (0), rparen, comma,
|
lparen, amreg (28), plus, comma, d24 (0), rparen, comma,
|
freg (24, 32));
|
freg (24, 32));
|
def_am_insn (fmov, d24spfs, 6, 0xfd24,
|
def_am_insn (fmov, d24spfs, 6, 0xfd24,
|
lparen, u24 (0), comma, spreg, rparen, comma,
|
lparen, u24 (0), comma, spreg, rparen, comma,
|
freg (24, 32), tick_random);
|
freg (24, 32), tick_random);
|
def_am_insn (fmov, fsd24r, 6, 0xfd30,
|
def_am_insn (fmov, fsd24r, 6, 0xfd30,
|
freg (28, 33), comma, lparen, d24 (0), comma, amreg (24), rparen);
|
freg (28, 33), comma, lparen, d24 (0), comma, amreg (24), rparen);
|
def_am_insn (fmov, fsrpi24, 6, 0xfd31,
|
def_am_insn (fmov, fsrpi24, 6, 0xfd31,
|
freg (28, 33), comma,
|
freg (28, 33), comma,
|
lparen, amreg (24), plus, comma, d24 (0), rparen);
|
lparen, amreg (24), plus, comma, d24 (0), rparen);
|
def_am_insn (fmov, fsd24sp, 6, 0xfd34,
|
def_am_insn (fmov, fsd24sp, 6, 0xfd34,
|
freg (28, 33), comma,
|
freg (28, 33), comma,
|
lparen, u24 (0), comma, spreg, rparen, tick_random);
|
lparen, u24 (0), comma, spreg, rparen, tick_random);
|
def_am_insn (fmov, d32rfs, 7, 0xfe20,
|
def_am_insn (fmov, d32rfs, 7, 0xfe20,
|
lparen, d32 (0), comma, amreg (36), rparen, comma, freg (32, 40));
|
lparen, d32 (0), comma, amreg (36), rparen, comma, freg (32, 40));
|
def_am_insn (fmov, rpi32fs, 7, 0xfe22,
|
def_am_insn (fmov, rpi32fs, 7, 0xfe22,
|
lparen, amreg (36), plus, comma, d32 (0), rparen, comma,
|
lparen, amreg (36), plus, comma, d32 (0), rparen, comma,
|
freg (32, 40));
|
freg (32, 40));
|
def_am_insn (fmov, d32spfs, 7, 0xfe24,
|
def_am_insn (fmov, d32spfs, 7, 0xfe24,
|
lparen, d32 (0), comma, spreg, rparen, comma,
|
lparen, d32 (0), comma, spreg, rparen, comma,
|
freg (32, 40), tick_random);
|
freg (32, 40), tick_random);
|
def_am_insn (fmov, i32fs, 7, 0xfe26,
|
def_am_insn (fmov, i32fs, 7, 0xfe26,
|
d32 (0), comma, freg (32, 40), tick_random);
|
d32 (0), comma, freg (32, 40), tick_random);
|
def_am_insn (fmov, fsd32r, 7, 0xfe30,
|
def_am_insn (fmov, fsd32r, 7, 0xfe30,
|
freg (36, 41), comma, lparen, d32 (0), comma, amreg (32), rparen);
|
freg (36, 41), comma, lparen, d32 (0), comma, amreg (32), rparen);
|
def_am_insn (fmov, fsrpi32, 7, 0xfe31,
|
def_am_insn (fmov, fsrpi32, 7, 0xfe31,
|
freg (36, 41), comma,
|
freg (36, 41), comma,
|
lparen, amreg (32), plus, comma, d32 (0), rparen);
|
lparen, amreg (32), plus, comma, d32 (0), rparen);
|
def_am_insn (fmov, fsd32sp, 7, 0xfe34,
|
def_am_insn (fmov, fsd32sp, 7, 0xfe34,
|
freg (36, 41), comma,
|
freg (36, 41), comma,
|
lparen, d32 (0), comma, spreg, rparen, tick_random);
|
lparen, d32 (0), comma, spreg, rparen, tick_random);
|
|
|
/* Define the group of single-precision FP move insns. */
|
/* Define the group of single-precision FP move insns. */
|
func *fmovs_insns[] = {
|
func *fmovs_insns[] = {
|
am_insn (fmov, irfs),
|
am_insn (fmov, irfs),
|
am_insn (fmov, rpfs),
|
am_insn (fmov, rpfs),
|
am_insn (fmov, spfs),
|
am_insn (fmov, spfs),
|
am_insn (fmov, vrfs),
|
am_insn (fmov, vrfs),
|
am_insn (fmov, fsir),
|
am_insn (fmov, fsir),
|
am_insn (fmov, fsrp),
|
am_insn (fmov, fsrp),
|
am_insn (fmov, fssp),
|
am_insn (fmov, fssp),
|
am_insn (fmov, fsvr),
|
am_insn (fmov, fsvr),
|
am_insn (fmov, fsfs),
|
am_insn (fmov, fsfs),
|
am_insn (fmov, d8rfs),
|
am_insn (fmov, d8rfs),
|
am_insn (fmov, rpi8fs),
|
am_insn (fmov, rpi8fs),
|
am_insn (fmov, d8spfs),
|
am_insn (fmov, d8spfs),
|
am_insn (fmov, irrfs),
|
am_insn (fmov, irrfs),
|
am_insn (fmov, fsd8r),
|
am_insn (fmov, fsd8r),
|
am_insn (fmov, fsrpi8),
|
am_insn (fmov, fsrpi8),
|
am_insn (fmov, fsd8sp),
|
am_insn (fmov, fsd8sp),
|
am_insn (fmov, fsirr),
|
am_insn (fmov, fsirr),
|
am_insn (fmov, d24rfs),
|
am_insn (fmov, d24rfs),
|
am_insn (fmov, rpi24fs),
|
am_insn (fmov, rpi24fs),
|
am_insn (fmov, d24spfs),
|
am_insn (fmov, d24spfs),
|
am_insn (fmov, fsd24r),
|
am_insn (fmov, fsd24r),
|
am_insn (fmov, fsrpi24),
|
am_insn (fmov, fsrpi24),
|
am_insn (fmov, fsd24sp),
|
am_insn (fmov, fsd24sp),
|
am_insn (fmov, d32rfs),
|
am_insn (fmov, d32rfs),
|
am_insn (fmov, rpi32fs),
|
am_insn (fmov, rpi32fs),
|
am_insn (fmov, d32spfs),
|
am_insn (fmov, d32spfs),
|
am_insn (fmov, i32fs),
|
am_insn (fmov, i32fs),
|
am_insn (fmov, fsd32r),
|
am_insn (fmov, fsd32r),
|
am_insn (fmov, fsrpi32),
|
am_insn (fmov, fsrpi32),
|
am_insn (fmov, fsd32sp),
|
am_insn (fmov, fsd32sp),
|
0
|
0
|
};
|
};
|
|
|
/* Define the double-precision FP move insns. */
|
/* Define the double-precision FP move insns. */
|
def_am_insn (fmov, irfd, 3, 0xf9a0,
|
def_am_insn (fmov, irfd, 3, 0xf9a0,
|
lparen, amreg (4), rparen, comma, dreg (0, 8), tick_random);
|
lparen, amreg (4), rparen, comma, dreg (0, 8), tick_random);
|
def_am_insn (fmov, rpfd, 3, 0xf9a2,
|
def_am_insn (fmov, rpfd, 3, 0xf9a2,
|
lparen, amreg (4), plus, rparen, comma, dreg (0, 8), tick_random);
|
lparen, amreg (4), plus, rparen, comma, dreg (0, 8), tick_random);
|
def_am_insn (fmov, spfd, 3, 0xf9a4,
|
def_am_insn (fmov, spfd, 3, 0xf9a4,
|
lparen, spreg, rparen, comma, dreg (0, 8));
|
lparen, spreg, rparen, comma, dreg (0, 8));
|
def_am_insn (fmov, fdir, 3, 0xf9b0,
|
def_am_insn (fmov, fdir, 3, 0xf9b0,
|
dreg (4, 9), comma, lparen, amreg (0), rparen, tick_random);
|
dreg (4, 9), comma, lparen, amreg (0), rparen, tick_random);
|
def_am_insn (fmov, fdrp, 3, 0xf9b1,
|
def_am_insn (fmov, fdrp, 3, 0xf9b1,
|
dreg (4, 9), comma, lparen, amreg (0), plus, rparen, tick_random);
|
dreg (4, 9), comma, lparen, amreg (0), plus, rparen, tick_random);
|
def_am_insn (fmov, fdsp, 3, 0xf9b4,
|
def_am_insn (fmov, fdsp, 3, 0xf9b4,
|
dreg (4, 9), comma, lparen, spreg, rparen);
|
dreg (4, 9), comma, lparen, spreg, rparen);
|
def_am_insn (fmov, fdfd, 3, 0xf9c0,
|
def_am_insn (fmov, fdfd, 3, 0xf9c0,
|
dreg (4, 9), comma, dreg (0, 8), tick_random);
|
dreg (4, 9), comma, dreg (0, 8), tick_random);
|
def_am_insn (fmov, irrfd, 4, 0xfb47,
|
def_am_insn (fmov, irrfd, 4, 0xfb47,
|
lparen, amreg (12), comma, amreg (8), rparen, comma, dreg (4, 1));
|
lparen, amreg (12), comma, amreg (8), rparen, comma, dreg (4, 1));
|
def_am_insn (fmov, fdirr, 4, 0xfb57,
|
def_am_insn (fmov, fdirr, 4, 0xfb57,
|
dreg (4, 1), comma, lparen, amreg (12), comma, amreg (8), rparen);
|
dreg (4, 1), comma, lparen, amreg (12), comma, amreg (8), rparen);
|
def_am_insn (fmov, d8rfd, 4, 0xfba0,
|
def_am_insn (fmov, d8rfd, 4, 0xfba0,
|
lparen, d8 (0), comma, amreg (12), rparen, comma, dreg (8, 16));
|
lparen, d8 (0), comma, amreg (12), rparen, comma, dreg (8, 16));
|
def_am_insn (fmov, rpi8fd, 4, 0xfba2,
|
def_am_insn (fmov, rpi8fd, 4, 0xfba2,
|
lparen, amreg (12), plus, comma, d8 (0), rparen, comma,
|
lparen, amreg (12), plus, comma, d8 (0), rparen, comma,
|
dreg (8, 16));
|
dreg (8, 16));
|
def_am_insn (fmov, d8spfd, 4, 0xfba4,
|
def_am_insn (fmov, d8spfd, 4, 0xfba4,
|
lparen, u8 (0), comma, spreg, rparen, comma,
|
lparen, u8 (0), comma, spreg, rparen, comma,
|
dreg (8, 16), tick_random);
|
dreg (8, 16), tick_random);
|
def_am_insn (fmov, fdd8r, 4, 0xfbb0,
|
def_am_insn (fmov, fdd8r, 4, 0xfbb0,
|
dreg (12, 17), comma, lparen, d8 (0), comma, amreg (8), rparen);
|
dreg (12, 17), comma, lparen, d8 (0), comma, amreg (8), rparen);
|
def_am_insn (fmov, fdrpi8, 4, 0xfbb1,
|
def_am_insn (fmov, fdrpi8, 4, 0xfbb1,
|
dreg (12, 17), comma,
|
dreg (12, 17), comma,
|
lparen, amreg (8), plus, comma, d8 (0), rparen);
|
lparen, amreg (8), plus, comma, d8 (0), rparen);
|
def_am_insn (fmov, fdi8sp, 4, 0xfbb4,
|
def_am_insn (fmov, fdi8sp, 4, 0xfbb4,
|
dreg (12, 17), comma,
|
dreg (12, 17), comma,
|
lparen, u8 (0), comma, spreg, rparen, tick_random);
|
lparen, u8 (0), comma, spreg, rparen, tick_random);
|
def_am_insn (fmov, d24rfd, 6, 0xfda0,
|
def_am_insn (fmov, d24rfd, 6, 0xfda0,
|
lparen, d24 (0), comma, amreg (28), rparen, comma, dreg (24, 32));
|
lparen, d24 (0), comma, amreg (28), rparen, comma, dreg (24, 32));
|
def_am_insn (fmov, rpi24fd, 6, 0xfda2,
|
def_am_insn (fmov, rpi24fd, 6, 0xfda2,
|
lparen, amreg (28), plus, comma, d24 (0), rparen, comma,
|
lparen, amreg (28), plus, comma, d24 (0), rparen, comma,
|
dreg (24, 32));
|
dreg (24, 32));
|
def_am_insn (fmov, d24spfd, 6, 0xfda4,
|
def_am_insn (fmov, d24spfd, 6, 0xfda4,
|
lparen, u24 (0), comma, spreg, rparen, comma,
|
lparen, u24 (0), comma, spreg, rparen, comma,
|
dreg (24, 32), tick_random);
|
dreg (24, 32), tick_random);
|
def_am_insn (fmov, fdd24r, 6, 0xfdb0,
|
def_am_insn (fmov, fdd24r, 6, 0xfdb0,
|
dreg (28, 33), comma,
|
dreg (28, 33), comma,
|
lparen, d24 (0), comma, amreg (24), rparen);
|
lparen, d24 (0), comma, amreg (24), rparen);
|
def_am_insn (fmov, fdrpi24, 6, 0xfdb1,
|
def_am_insn (fmov, fdrpi24, 6, 0xfdb1,
|
dreg (28, 33), comma,
|
dreg (28, 33), comma,
|
lparen, amreg (24), plus, comma, d24 (0), rparen);
|
lparen, amreg (24), plus, comma, d24 (0), rparen);
|
def_am_insn (fmov, fdd24sp, 6, 0xfdb4,
|
def_am_insn (fmov, fdd24sp, 6, 0xfdb4,
|
dreg (28, 33), comma,
|
dreg (28, 33), comma,
|
lparen, u24 (0), comma, spreg, rparen, tick_random);
|
lparen, u24 (0), comma, spreg, rparen, tick_random);
|
def_am_insn (fmov, d32rfd, 7, 0xfe40,
|
def_am_insn (fmov, d32rfd, 7, 0xfe40,
|
lparen, d32 (0), comma, amreg (36), rparen, comma, dreg (32, 40));
|
lparen, d32 (0), comma, amreg (36), rparen, comma, dreg (32, 40));
|
def_am_insn (fmov, rpi32fd, 7, 0xfe42,
|
def_am_insn (fmov, rpi32fd, 7, 0xfe42,
|
lparen, amreg (36), plus, comma, d32 (0), rparen, comma,
|
lparen, amreg (36), plus, comma, d32 (0), rparen, comma,
|
dreg (32, 40));
|
dreg (32, 40));
|
def_am_insn (fmov, d32spfd, 7, 0xfe44,
|
def_am_insn (fmov, d32spfd, 7, 0xfe44,
|
lparen, d32 (0), comma, spreg, rparen, comma,
|
lparen, d32 (0), comma, spreg, rparen, comma,
|
dreg (32, 40), tick_random);
|
dreg (32, 40), tick_random);
|
def_am_insn (fmov, fdd32r, 7, 0xfe50,
|
def_am_insn (fmov, fdd32r, 7, 0xfe50,
|
dreg (36, 41), comma,
|
dreg (36, 41), comma,
|
lparen, d32 (0), comma, amreg (32), rparen);
|
lparen, d32 (0), comma, amreg (32), rparen);
|
def_am_insn (fmov, fdrpi32, 7, 0xfe51,
|
def_am_insn (fmov, fdrpi32, 7, 0xfe51,
|
dreg (36, 41), comma,
|
dreg (36, 41), comma,
|
lparen, amreg (32), plus, comma, d32 (0), rparen);
|
lparen, amreg (32), plus, comma, d32 (0), rparen);
|
def_am_insn (fmov, fdd32sp, 7, 0xfe54,
|
def_am_insn (fmov, fdd32sp, 7, 0xfe54,
|
dreg (36, 41), comma,
|
dreg (36, 41), comma,
|
lparen, d32 (0), comma, spreg, rparen, tick_random);
|
lparen, d32 (0), comma, spreg, rparen, tick_random);
|
|
|
/* Define the group of double-precision FP move insns. */
|
/* Define the group of double-precision FP move insns. */
|
func *fmovd_insns[] = {
|
func *fmovd_insns[] = {
|
am_insn (fmov, irfd),
|
am_insn (fmov, irfd),
|
am_insn (fmov, rpfd),
|
am_insn (fmov, rpfd),
|
am_insn (fmov, spfd),
|
am_insn (fmov, spfd),
|
am_insn (fmov, fdir),
|
am_insn (fmov, fdir),
|
am_insn (fmov, fdrp),
|
am_insn (fmov, fdrp),
|
am_insn (fmov, fdsp),
|
am_insn (fmov, fdsp),
|
am_insn (fmov, fdfd),
|
am_insn (fmov, fdfd),
|
am_insn (fmov, irrfd),
|
am_insn (fmov, irrfd),
|
am_insn (fmov, fdirr),
|
am_insn (fmov, fdirr),
|
am_insn (fmov, d8rfd),
|
am_insn (fmov, d8rfd),
|
am_insn (fmov, rpi8fd),
|
am_insn (fmov, rpi8fd),
|
am_insn (fmov, d8spfd),
|
am_insn (fmov, d8spfd),
|
am_insn (fmov, fdd8r),
|
am_insn (fmov, fdd8r),
|
am_insn (fmov, fdrpi8),
|
am_insn (fmov, fdrpi8),
|
am_insn (fmov, fdi8sp),
|
am_insn (fmov, fdi8sp),
|
am_insn (fmov, d24rfd),
|
am_insn (fmov, d24rfd),
|
am_insn (fmov, rpi24fd),
|
am_insn (fmov, rpi24fd),
|
am_insn (fmov, d24spfd),
|
am_insn (fmov, d24spfd),
|
am_insn (fmov, fdd24r),
|
am_insn (fmov, fdd24r),
|
am_insn (fmov, fdrpi24),
|
am_insn (fmov, fdrpi24),
|
am_insn (fmov, fdd24sp),
|
am_insn (fmov, fdd24sp),
|
am_insn (fmov, d32rfd),
|
am_insn (fmov, d32rfd),
|
am_insn (fmov, rpi32fd),
|
am_insn (fmov, rpi32fd),
|
am_insn (fmov, d32spfd),
|
am_insn (fmov, d32spfd),
|
am_insn (fmov, fdd32r),
|
am_insn (fmov, fdd32r),
|
am_insn (fmov, fdrpi32),
|
am_insn (fmov, fdrpi32),
|
am_insn (fmov, fdd32sp),
|
am_insn (fmov, fdd32sp),
|
0
|
0
|
};
|
};
|
|
|
/* Define fmov FPCR insns. */
|
/* Define fmov FPCR insns. */
|
def_am_insn (fmov, vrfc, 3, 0xf9b5,
|
def_am_insn (fmov, vrfc, 3, 0xf9b5,
|
amreg (4), comma, fcreg);
|
amreg (4), comma, fcreg);
|
def_am_insn (fmov, fcvr, 3, 0xf9b7,
|
def_am_insn (fmov, fcvr, 3, 0xf9b7,
|
fcreg, comma, amreg (0));
|
fcreg, comma, amreg (0));
|
def_am_insn (fmov, i32fc, 6, 0xfdb5,
|
def_am_insn (fmov, i32fc, 6, 0xfdb5,
|
d32 (0), comma, fcreg);
|
d32 (0), comma, fcreg);
|
|
|
/* Define the group of FPCR move insns. */
|
/* Define the group of FPCR move insns. */
|
func *fmovc_insns[] = {
|
func *fmovc_insns[] = {
|
am_insn (fmov, vrfc),
|
am_insn (fmov, vrfc),
|
am_insn (fmov, fcvr),
|
am_insn (fmov, fcvr),
|
am_insn (fmov, i32fc),
|
am_insn (fmov, i32fc),
|
0
|
0
|
};
|
};
|
|
|
/* Define single-precision floating-point arithmetic insns. */
|
/* Define single-precision floating-point arithmetic insns. */
|
def_am_insn (fabs, fs, 3, 0xf944, freg (0, 8));
|
def_am_insn (fabs, fs, 3, 0xf944, freg (0, 8));
|
def_am_insn (fabs, fsfs, 4, 0xfb44,
|
def_am_insn (fabs, fsfs, 4, 0xfb44,
|
freg (12, 3), comma, freg (4, 1), tick_random);
|
freg (12, 3), comma, freg (4, 1), tick_random);
|
def_am_insn (fneg, fs, 3, 0xf946, freg (0, 8));
|
def_am_insn (fneg, fs, 3, 0xf946, freg (0, 8));
|
def_am_insn (fneg, fsfs, 4, 0xfb46,
|
def_am_insn (fneg, fsfs, 4, 0xfb46,
|
freg (12, 3), comma, freg (4, 1), tick_random);
|
freg (12, 3), comma, freg (4, 1), tick_random);
|
def_am_insn (frsqrt, fs, 3, 0xf950, freg (0, 8));
|
def_am_insn (frsqrt, fs, 3, 0xf950, freg (0, 8));
|
def_am_insn (frsqrt, fsfs, 4, 0xfb50,
|
def_am_insn (frsqrt, fsfs, 4, 0xfb50,
|
freg (12, 3), comma, freg (4, 1), tick_random);
|
freg (12, 3), comma, freg (4, 1), tick_random);
|
def_am_insn (fsqrt, fs, 3, 0xf952, freg (0, 8));
|
def_am_insn (fsqrt, fs, 3, 0xf952, freg (0, 8));
|
def_am_insn (fsqrt, fsfs, 4, 0xfb54,
|
def_am_insn (fsqrt, fsfs, 4, 0xfb54,
|
freg (12, 3), comma, freg (4, 1), tick_random);
|
freg (12, 3), comma, freg (4, 1), tick_random);
|
def_am_insn (fcmp, fsfs, 3, 0xf954,
|
def_am_insn (fcmp, fsfs, 3, 0xf954,
|
freg (4, 9), comma, freg (0, 8), tick_random);
|
freg (4, 9), comma, freg (0, 8), tick_random);
|
def_am_insn (fcmp, i32fs, 7, 0xfe35,
|
def_am_insn (fcmp, i32fs, 7, 0xfe35,
|
d32 (0), comma, freg (36, 41), tick_random);
|
d32 (0), comma, freg (36, 41), tick_random);
|
def_am_insn (fadd, fsfs, 3, 0xf960,
|
def_am_insn (fadd, fsfs, 3, 0xf960,
|
freg (4, 9), comma, freg (0, 8), tick_random);
|
freg (4, 9), comma, freg (0, 8), tick_random);
|
def_am_insn (fadd, fsfsfs, 4, 0xfb60,
|
def_am_insn (fadd, fsfsfs, 4, 0xfb60,
|
freg (12, 3), comma, freg (8, 2), comma, freg (4, 1));
|
freg (12, 3), comma, freg (8, 2), comma, freg (4, 1));
|
def_am_insn (fadd, i32fsfs, 7, 0xfe60,
|
def_am_insn (fadd, i32fsfs, 7, 0xfe60,
|
d32 (0), comma, freg (36, 41), comma, freg (32, 40));
|
d32 (0), comma, freg (36, 41), comma, freg (32, 40));
|
def_am_insn (fsub, fsfs, 3, 0xf964,
|
def_am_insn (fsub, fsfs, 3, 0xf964,
|
freg (4, 9), comma, freg (0, 8), tick_random);
|
freg (4, 9), comma, freg (0, 8), tick_random);
|
def_am_insn (fsub, fsfsfs, 4, 0xfb64,
|
def_am_insn (fsub, fsfsfs, 4, 0xfb64,
|
freg (12, 3), comma, freg (8, 2), comma, freg (4, 1));
|
freg (12, 3), comma, freg (8, 2), comma, freg (4, 1));
|
def_am_insn (fsub, i32fsfs, 7, 0xfe64,
|
def_am_insn (fsub, i32fsfs, 7, 0xfe64,
|
d32 (0), comma, freg (36, 41), comma, freg (32, 40));
|
d32 (0), comma, freg (36, 41), comma, freg (32, 40));
|
def_am_insn (fmul, fsfs, 3, 0xf970,
|
def_am_insn (fmul, fsfs, 3, 0xf970,
|
freg (4, 9), comma, freg (0, 8), tick_random);
|
freg (4, 9), comma, freg (0, 8), tick_random);
|
def_am_insn (fmul, fsfsfs, 4, 0xfb70,
|
def_am_insn (fmul, fsfsfs, 4, 0xfb70,
|
freg (12, 3), comma, freg (8, 2), comma, freg (4, 1));
|
freg (12, 3), comma, freg (8, 2), comma, freg (4, 1));
|
def_am_insn (fmul, i32fsfs, 7, 0xfe70,
|
def_am_insn (fmul, i32fsfs, 7, 0xfe70,
|
d32 (0), comma, freg (36, 41), comma, freg (32, 40));
|
d32 (0), comma, freg (36, 41), comma, freg (32, 40));
|
def_am_insn (fdiv, fsfs, 3, 0xf974,
|
def_am_insn (fdiv, fsfs, 3, 0xf974,
|
freg (4, 9), comma, freg (0, 8), tick_random);
|
freg (4, 9), comma, freg (0, 8), tick_random);
|
def_am_insn (fdiv, fsfsfs, 4, 0xfb74,
|
def_am_insn (fdiv, fsfsfs, 4, 0xfb74,
|
freg (12, 3), comma, freg (8, 2), comma, freg (4, 1));
|
freg (12, 3), comma, freg (8, 2), comma, freg (4, 1));
|
def_am_insn (fdiv, i32fsfs, 7, 0xfe74,
|
def_am_insn (fdiv, i32fsfs, 7, 0xfe74,
|
d32 (0), comma, freg (36, 41), comma, freg (32, 40));
|
d32 (0), comma, freg (36, 41), comma, freg (32, 40));
|
|
|
/* Define the group of single-precision floating-point arithmetic insns. */
|
/* Define the group of single-precision floating-point arithmetic insns. */
|
func *sfparith_insns[] = {
|
func *sfparith_insns[] = {
|
am_insn (fabs, fs),
|
am_insn (fabs, fs),
|
am_insn (fabs, fsfs),
|
am_insn (fabs, fsfs),
|
am_insn (fneg, fs),
|
am_insn (fneg, fs),
|
am_insn (fneg, fsfs),
|
am_insn (fneg, fsfs),
|
am_insn (frsqrt, fs),
|
am_insn (frsqrt, fs),
|
am_insn (frsqrt, fsfs),
|
am_insn (frsqrt, fsfs),
|
am_insn (fsqrt, fs),
|
am_insn (fsqrt, fs),
|
am_insn (fsqrt, fsfs),
|
am_insn (fsqrt, fsfs),
|
am_insn (fcmp, fsfs),
|
am_insn (fcmp, fsfs),
|
am_insn (fcmp, i32fs),
|
am_insn (fcmp, i32fs),
|
am_insn (fadd, fsfs),
|
am_insn (fadd, fsfs),
|
am_insn (fadd, fsfsfs),
|
am_insn (fadd, fsfsfs),
|
am_insn (fadd, i32fsfs),
|
am_insn (fadd, i32fsfs),
|
am_insn (fsub, fsfs),
|
am_insn (fsub, fsfs),
|
am_insn (fsub, fsfsfs),
|
am_insn (fsub, fsfsfs),
|
am_insn (fsub, i32fsfs),
|
am_insn (fsub, i32fsfs),
|
am_insn (fmul, fsfs),
|
am_insn (fmul, fsfs),
|
am_insn (fmul, fsfsfs),
|
am_insn (fmul, fsfsfs),
|
am_insn (fmul, i32fsfs),
|
am_insn (fmul, i32fsfs),
|
am_insn (fdiv, fsfs),
|
am_insn (fdiv, fsfs),
|
am_insn (fdiv, fsfsfs),
|
am_insn (fdiv, fsfsfs),
|
am_insn (fdiv, i32fsfs),
|
am_insn (fdiv, i32fsfs),
|
0
|
0
|
};
|
};
|
|
|
/* Define floating-point accumulator arithmetic insns. */
|
/* Define floating-point accumulator arithmetic insns. */
|
def_am_insn (fmadd, , 4, 0xfb80,
|
def_am_insn (fmadd, , 4, 0xfb80,
|
freg (12, 3), comma, freg (8, 2), comma,
|
freg (12, 3), comma, freg (8, 2), comma,
|
freg (4, 1), comma, areg (16, 0), tick_random);
|
freg (4, 1), comma, areg (16, 0), tick_random);
|
def_am_insn (fmsub, , 4, 0xfb84,
|
def_am_insn (fmsub, , 4, 0xfb84,
|
freg (12, 3), comma, freg (8, 2), comma,
|
freg (12, 3), comma, freg (8, 2), comma,
|
freg (4, 1), comma, areg (16, 0), tick_random);
|
freg (4, 1), comma, areg (16, 0), tick_random);
|
def_am_insn (fnmadd, , 4, 0xfb90,
|
def_am_insn (fnmadd, , 4, 0xfb90,
|
freg (12, 3), comma, freg (8, 2), comma,
|
freg (12, 3), comma, freg (8, 2), comma,
|
freg (4, 1), comma, areg (16, 0), tick_random);
|
freg (4, 1), comma, areg (16, 0), tick_random);
|
def_am_insn (fnmsub, , 4, 0xfb94,
|
def_am_insn (fnmsub, , 4, 0xfb94,
|
freg (12, 3), comma, freg (8, 2), comma,
|
freg (12, 3), comma, freg (8, 2), comma,
|
freg (4, 1), comma, areg (16, 0), tick_random);
|
freg (4, 1), comma, areg (16, 0), tick_random);
|
|
|
/* Define the group of floating-point accumulator arithmetic insns. */
|
/* Define the group of floating-point accumulator arithmetic insns. */
|
func *fpacc_insns[] = {
|
func *fpacc_insns[] = {
|
am_insn (fmadd, ),
|
am_insn (fmadd, ),
|
am_insn (fmsub, ),
|
am_insn (fmsub, ),
|
am_insn (fnmadd, ),
|
am_insn (fnmadd, ),
|
am_insn (fnmsub, ),
|
am_insn (fnmsub, ),
|
0
|
0
|
};
|
};
|
|
|
/* Define double-precision floating-point arithmetic insns. */
|
/* Define double-precision floating-point arithmetic insns. */
|
def_am_insn (fabs, fd, 3, 0xf9c4, dreg (0, 8));
|
def_am_insn (fabs, fd, 3, 0xf9c4, dreg (0, 8));
|
def_am_insn (fabs, fdfd, 4, 0xfbc4,
|
def_am_insn (fabs, fdfd, 4, 0xfbc4,
|
dreg (12, 3), comma, dreg (4, 1), tick_random);
|
dreg (12, 3), comma, dreg (4, 1), tick_random);
|
def_am_insn (fneg, fd, 3, 0xf9c6, dreg (0, 8));
|
def_am_insn (fneg, fd, 3, 0xf9c6, dreg (0, 8));
|
def_am_insn (fneg, fdfd, 4, 0xfbc6,
|
def_am_insn (fneg, fdfd, 4, 0xfbc6,
|
dreg (12, 3), comma, dreg (4, 1), tick_random);
|
dreg (12, 3), comma, dreg (4, 1), tick_random);
|
def_am_insn (frsqrt, fd, 3, 0xf9d0, dreg (0, 8));
|
def_am_insn (frsqrt, fd, 3, 0xf9d0, dreg (0, 8));
|
def_am_insn (frsqrt, fdfd, 4, 0xfbd0,
|
def_am_insn (frsqrt, fdfd, 4, 0xfbd0,
|
dreg (12, 3), comma, dreg (4, 1), tick_random);
|
dreg (12, 3), comma, dreg (4, 1), tick_random);
|
def_am_insn (fsqrt, fd, 3, 0xf9d2, dreg (0, 8));
|
def_am_insn (fsqrt, fd, 3, 0xf9d2, dreg (0, 8));
|
def_am_insn (fsqrt, fdfd, 4, 0xfbd4,
|
def_am_insn (fsqrt, fdfd, 4, 0xfbd4,
|
dreg (12, 3), comma, dreg (4, 1), tick_random);
|
dreg (12, 3), comma, dreg (4, 1), tick_random);
|
def_am_insn (fcmp, fdfd, 3, 0xf9d4,
|
def_am_insn (fcmp, fdfd, 3, 0xf9d4,
|
dreg (4, 9), comma, dreg (0, 8), tick_random);
|
dreg (4, 9), comma, dreg (0, 8), tick_random);
|
def_am_insn (fadd, fdfd, 3, 0xf9e0,
|
def_am_insn (fadd, fdfd, 3, 0xf9e0,
|
dreg (4, 9), comma, dreg (0, 8), tick_random);
|
dreg (4, 9), comma, dreg (0, 8), tick_random);
|
def_am_insn (fadd, fdfdfd, 4, 0xfbe0,
|
def_am_insn (fadd, fdfdfd, 4, 0xfbe0,
|
dreg (12, 3), comma, dreg (8, 2), comma, dreg (4, 1));
|
dreg (12, 3), comma, dreg (8, 2), comma, dreg (4, 1));
|
def_am_insn (fsub, fdfd, 3, 0xf9e4,
|
def_am_insn (fsub, fdfd, 3, 0xf9e4,
|
dreg (4, 9), comma, dreg (0, 8), tick_random);
|
dreg (4, 9), comma, dreg (0, 8), tick_random);
|
def_am_insn (fsub, fdfdfd, 4, 0xfbe4,
|
def_am_insn (fsub, fdfdfd, 4, 0xfbe4,
|
dreg (12, 3), comma, dreg (8, 2), comma, dreg (4, 1));
|
dreg (12, 3), comma, dreg (8, 2), comma, dreg (4, 1));
|
def_am_insn (fmul, fdfd, 3, 0xf9f0,
|
def_am_insn (fmul, fdfd, 3, 0xf9f0,
|
dreg (4, 9), comma, dreg (0, 8), tick_random);
|
dreg (4, 9), comma, dreg (0, 8), tick_random);
|
def_am_insn (fmul, fdfdfd, 4, 0xfbf0,
|
def_am_insn (fmul, fdfdfd, 4, 0xfbf0,
|
dreg (12, 3), comma, dreg (8, 2), comma, dreg (4, 1));
|
dreg (12, 3), comma, dreg (8, 2), comma, dreg (4, 1));
|
def_am_insn (fdiv, fdfd, 3, 0xf9f4,
|
def_am_insn (fdiv, fdfd, 3, 0xf9f4,
|
dreg (4, 9), comma, dreg (0, 8), tick_random);
|
dreg (4, 9), comma, dreg (0, 8), tick_random);
|
def_am_insn (fdiv, fdfdfd, 4, 0xfbf4,
|
def_am_insn (fdiv, fdfdfd, 4, 0xfbf4,
|
dreg (12, 3), comma, dreg (8, 2), comma, dreg (4, 1));
|
dreg (12, 3), comma, dreg (8, 2), comma, dreg (4, 1));
|
|
|
/* Define the group of double-precision floating-point arithmetic insns. */
|
/* Define the group of double-precision floating-point arithmetic insns. */
|
func *dfparith_insns[] = {
|
func *dfparith_insns[] = {
|
am_insn (fabs, fd),
|
am_insn (fabs, fd),
|
am_insn (fabs, fdfd),
|
am_insn (fabs, fdfd),
|
am_insn (fneg, fd),
|
am_insn (fneg, fd),
|
am_insn (fneg, fdfd),
|
am_insn (fneg, fdfd),
|
am_insn (frsqrt, fd),
|
am_insn (frsqrt, fd),
|
am_insn (frsqrt, fdfd),
|
am_insn (frsqrt, fdfd),
|
am_insn (fsqrt, fd),
|
am_insn (fsqrt, fd),
|
am_insn (fsqrt, fdfd),
|
am_insn (fsqrt, fdfd),
|
am_insn (fcmp, fdfd),
|
am_insn (fcmp, fdfd),
|
am_insn (fadd, fdfd),
|
am_insn (fadd, fdfd),
|
am_insn (fadd, fdfdfd),
|
am_insn (fadd, fdfdfd),
|
am_insn (fsub, fdfd),
|
am_insn (fsub, fdfd),
|
am_insn (fsub, fdfdfd),
|
am_insn (fsub, fdfdfd),
|
am_insn (fmul, fdfd),
|
am_insn (fmul, fdfd),
|
am_insn (fmul, fdfdfd),
|
am_insn (fmul, fdfdfd),
|
am_insn (fdiv, fdfd),
|
am_insn (fdiv, fdfd),
|
am_insn (fdiv, fdfdfd),
|
am_insn (fdiv, fdfdfd),
|
0
|
0
|
};
|
};
|
|
|
/* Define floating-point conversion insns. */
|
/* Define floating-point conversion insns. */
|
def_am_insn (ftoi, fsfs, 4, 0xfb40,
|
def_am_insn (ftoi, fsfs, 4, 0xfb40,
|
freg (12, 3), comma, freg (4, 1), tick_random);
|
freg (12, 3), comma, freg (4, 1), tick_random);
|
def_am_insn (itof, fsfs, 4, 0xfb42,
|
def_am_insn (itof, fsfs, 4, 0xfb42,
|
freg (12, 3), comma, freg (4, 1), tick_random);
|
freg (12, 3), comma, freg (4, 1), tick_random);
|
def_am_insn (ftod, fsfd, 4, 0xfb52,
|
def_am_insn (ftod, fsfd, 4, 0xfb52,
|
freg (12, 3), comma, dreg (4, 1), tick_random);
|
freg (12, 3), comma, dreg (4, 1), tick_random);
|
def_am_insn (dtof, fdfs, 4, 0xfb56,
|
def_am_insn (dtof, fdfs, 4, 0xfb56,
|
dreg (12, 3), comma, freg (4, 1), tick_random);
|
dreg (12, 3), comma, freg (4, 1), tick_random);
|
|
|
/* Define the group of floating-point conversion insns. */
|
/* Define the group of floating-point conversion insns. */
|
func *fpconv_insns[] = {
|
func *fpconv_insns[] = {
|
am_insn (ftoi, fsfs),
|
am_insn (ftoi, fsfs),
|
am_insn (itof, fsfs),
|
am_insn (itof, fsfs),
|
am_insn (ftod, fsfd),
|
am_insn (ftod, fsfd),
|
am_insn (dtof, fdfs),
|
am_insn (dtof, fdfs),
|
0
|
0
|
};
|
};
|
|
|
/* Define conditional jump insns. */
|
/* Define conditional jump insns. */
|
def_am_insn (fbeq, , 3, 0xf8d0, d8pcsec (0));
|
def_am_insn (fbeq, , 3, 0xf8d0, d8pcsec (0));
|
def_am_insn (fbne, , 3, 0xf8d1, d8pcsec (0));
|
def_am_insn (fbne, , 3, 0xf8d1, d8pcsec (0));
|
def_am_insn (fbgt, , 3, 0xf8d2, d8pcsec (0));
|
def_am_insn (fbgt, , 3, 0xf8d2, d8pcsec (0));
|
def_am_insn (fbge, , 3, 0xf8d3, d8pcsec (0));
|
def_am_insn (fbge, , 3, 0xf8d3, d8pcsec (0));
|
def_am_insn (fblt, , 3, 0xf8d4, d8pcsec (0));
|
def_am_insn (fblt, , 3, 0xf8d4, d8pcsec (0));
|
def_am_insn (fble, , 3, 0xf8d5, d8pcsec (0));
|
def_am_insn (fble, , 3, 0xf8d5, d8pcsec (0));
|
def_am_insn (fbuo, , 3, 0xf8d6, d8pcsec (0));
|
def_am_insn (fbuo, , 3, 0xf8d6, d8pcsec (0));
|
def_am_insn (fblg, , 3, 0xf8d7, d8pcsec (0));
|
def_am_insn (fblg, , 3, 0xf8d7, d8pcsec (0));
|
def_am_insn (fbleg,, 3, 0xf8d8, d8pcsec (0));
|
def_am_insn (fbleg,, 3, 0xf8d8, d8pcsec (0));
|
def_am_insn (fbug, , 3, 0xf8d9, d8pcsec (0));
|
def_am_insn (fbug, , 3, 0xf8d9, d8pcsec (0));
|
def_am_insn (fbuge,, 3, 0xf8da, d8pcsec (0));
|
def_am_insn (fbuge,, 3, 0xf8da, d8pcsec (0));
|
def_am_insn (fbul, , 3, 0xf8db, d8pcsec (0));
|
def_am_insn (fbul, , 3, 0xf8db, d8pcsec (0));
|
def_am_insn (fbule,, 3, 0xf8dc, d8pcsec (0));
|
def_am_insn (fbule,, 3, 0xf8dc, d8pcsec (0));
|
def_am_insn (fbue, , 3, 0xf8dd, d8pcsec (0));
|
def_am_insn (fbue, , 3, 0xf8dd, d8pcsec (0));
|
def_am_insn (fleq, , 2, 0xf0d0, nothing);
|
def_am_insn (fleq, , 2, 0xf0d0, nothing);
|
def_am_insn (flne, , 2, 0xf0d1, nothing);
|
def_am_insn (flne, , 2, 0xf0d1, nothing);
|
def_am_insn (flgt, , 2, 0xf0d2, nothing);
|
def_am_insn (flgt, , 2, 0xf0d2, nothing);
|
def_am_insn (flge, , 2, 0xf0d3, nothing);
|
def_am_insn (flge, , 2, 0xf0d3, nothing);
|
def_am_insn (fllt, , 2, 0xf0d4, nothing);
|
def_am_insn (fllt, , 2, 0xf0d4, nothing);
|
def_am_insn (flle, , 2, 0xf0d5, nothing);
|
def_am_insn (flle, , 2, 0xf0d5, nothing);
|
def_am_insn (fluo, , 2, 0xf0d6, nothing);
|
def_am_insn (fluo, , 2, 0xf0d6, nothing);
|
def_am_insn (fllg, , 2, 0xf0d7, nothing);
|
def_am_insn (fllg, , 2, 0xf0d7, nothing);
|
def_am_insn (flleg,, 2, 0xf0d8, nothing);
|
def_am_insn (flleg,, 2, 0xf0d8, nothing);
|
def_am_insn (flug, , 2, 0xf0d9, nothing);
|
def_am_insn (flug, , 2, 0xf0d9, nothing);
|
def_am_insn (fluge,, 2, 0xf0da, nothing);
|
def_am_insn (fluge,, 2, 0xf0da, nothing);
|
def_am_insn (flul, , 2, 0xf0db, nothing);
|
def_am_insn (flul, , 2, 0xf0db, nothing);
|
def_am_insn (flule,, 2, 0xf0dc, nothing);
|
def_am_insn (flule,, 2, 0xf0dc, nothing);
|
def_am_insn (flue, , 2, 0xf0dd, nothing);
|
def_am_insn (flue, , 2, 0xf0dd, nothing);
|
|
|
/* Define the group of conditional jump insns. */
|
/* Define the group of conditional jump insns. */
|
func *condjmp_insns[] = {
|
func *condjmp_insns[] = {
|
am_insn (fbeq, ),
|
am_insn (fbeq, ),
|
am_insn (fbne, ),
|
am_insn (fbne, ),
|
am_insn (fbgt, ),
|
am_insn (fbgt, ),
|
am_insn (fbge, ),
|
am_insn (fbge, ),
|
am_insn (fblt, ),
|
am_insn (fblt, ),
|
am_insn (fble, ),
|
am_insn (fble, ),
|
am_insn (fbuo, ),
|
am_insn (fbuo, ),
|
am_insn (fblg, ),
|
am_insn (fblg, ),
|
am_insn (fbleg, ),
|
am_insn (fbleg, ),
|
am_insn (fbug, ),
|
am_insn (fbug, ),
|
am_insn (fbuge, ),
|
am_insn (fbuge, ),
|
am_insn (fbul, ),
|
am_insn (fbul, ),
|
am_insn (fbule, ),
|
am_insn (fbule, ),
|
am_insn (fbue, ),
|
am_insn (fbue, ),
|
am_insn (fleq, ),
|
am_insn (fleq, ),
|
am_insn (flne, ),
|
am_insn (flne, ),
|
am_insn (flgt, ),
|
am_insn (flgt, ),
|
am_insn (flge, ),
|
am_insn (flge, ),
|
am_insn (fllt, ),
|
am_insn (fllt, ),
|
am_insn (flle, ),
|
am_insn (flle, ),
|
am_insn (fluo, ),
|
am_insn (fluo, ),
|
am_insn (fllg, ),
|
am_insn (fllg, ),
|
am_insn (flleg, ),
|
am_insn (flleg, ),
|
am_insn (flug, ),
|
am_insn (flug, ),
|
am_insn (fluge, ),
|
am_insn (fluge, ),
|
am_insn (flul, ),
|
am_insn (flul, ),
|
am_insn (flule, ),
|
am_insn (flule, ),
|
am_insn (flue, ),
|
am_insn (flue, ),
|
0
|
0
|
};
|
};
|
|
|
/* Define the set of all groups. */
|
/* Define the set of all groups. */
|
group_t
|
group_t
|
groups[] = {
|
groups[] = {
|
{ "dcpf", dcpf_insns },
|
{ "dcpf", dcpf_insns },
|
{ "bit", bit_insns },
|
{ "bit", bit_insns },
|
{ "fmovs", fmovs_insns },
|
{ "fmovs", fmovs_insns },
|
{ "fmovd", fmovd_insns },
|
{ "fmovd", fmovd_insns },
|
{ "fmovc", fmovc_insns },
|
{ "fmovc", fmovc_insns },
|
{ "sfparith", sfparith_insns },
|
{ "sfparith", sfparith_insns },
|
{ "fpacc", fpacc_insns },
|
{ "fpacc", fpacc_insns },
|
{ "dfparith", dfparith_insns },
|
{ "dfparith", dfparith_insns },
|
{ "fpconv", fpconv_insns },
|
{ "fpconv", fpconv_insns },
|
{ "condjmp", condjmp_insns },
|
{ "condjmp", condjmp_insns },
|
{ 0 }
|
{ 0 }
|
};
|
};
|
|
|
int
|
int
|
main(int argc, char *argv[])
|
main(int argc, char *argv[])
|
{
|
{
|
FILE *as_in = stdout, *dis_out = stderr;
|
FILE *as_in = stdout, *dis_out = stderr;
|
|
|
/* Check whether we're filtering insns. */
|
/* Check whether we're filtering insns. */
|
if (argc > 1)
|
if (argc > 1)
|
skip_list = argv + 1;
|
skip_list = argv + 1;
|
|
|
/* Output assembler header. */
|
/* Output assembler header. */
|
fputs ("\t.text\n"
|
fputs ("\t.text\n"
|
"\t.am33_2\n",
|
"\t.am33_2\n",
|
as_in);
|
as_in);
|
/* Output comments for the testsuite-driver and the initial
|
/* Output comments for the testsuite-driver and the initial
|
* disassembler output. */
|
* disassembler output. */
|
fputs ("#objdump: -dr --prefix-address --show-raw-insn\n"
|
fputs ("#objdump: -dr --prefix-address --show-raw-insn\n"
|
"#name: AM33/2.0\n"
|
"#name: AM33/2.0\n"
|
"\n"
|
"\n"
|
".*: +file format.*elf32-mn10300.*\n"
|
".*: +file format.*elf32-mn10300.*\n"
|
"\n"
|
"\n"
|
"Disassembly of section .text:\n",
|
"Disassembly of section .text:\n",
|
dis_out);
|
dis_out);
|
|
|
/* Now emit all (selected) insns. */
|
/* Now emit all (selected) insns. */
|
output_groups (groups, as_in, dis_out);
|
output_groups (groups, as_in, dis_out);
|
|
|
exit (0);
|
exit (0);
|
}
|
}
|
|
|