* gas/config/tc-arm.c (do_vfp_reg2_from_sp2): Rename from
do_vfp_sp_reg2. (do_vfp_sp2_from_reg2): New function. (insns): Use them. (do_vfp_dp_from_reg2): Check return values properly. * opcodes/arm-opc.h (arm_opcodes): Move generic mcrr after known specific opcodes. * gas/testsuite/gas/arm/vfp2.s, gas/arm/vfp2.d: New test. * gas/testsuite/gas/arm/arm.exp: Add them.
This commit is contained in:
parent
041ab88cf0
commit
e45d06306f
|
@ -1,3 +1,10 @@
|
||||||
|
2004-01-09 Paul Brook <paul@codesourcery.com>
|
||||||
|
|
||||||
|
* config/tc-arm.c (do_vfp_reg2_from_sp2): Rename from do_vfp_sp_reg2.
|
||||||
|
(do_vfp_sp2_from_reg2): New function.
|
||||||
|
(insns): Use them.
|
||||||
|
(do_vfp_dp_from_reg2): Check return values properly.
|
||||||
|
|
||||||
2004-01-08 Ian Lance Taylor <ian@wasabisystems.com>
|
2004-01-08 Ian Lance Taylor <ian@wasabisystems.com>
|
||||||
|
|
||||||
* config/tc-mips.c (warn_nops): Remove static variable.
|
* config/tc-mips.c (warn_nops): Remove static variable.
|
||||||
|
|
|
@ -929,7 +929,8 @@ static void do_vfp_sp_dyadic PARAMS ((char *));
|
||||||
static void do_vfp_dp_dyadic PARAMS ((char *));
|
static void do_vfp_dp_dyadic PARAMS ((char *));
|
||||||
static void do_vfp_reg_from_sp PARAMS ((char *));
|
static void do_vfp_reg_from_sp PARAMS ((char *));
|
||||||
static void do_vfp_sp_from_reg PARAMS ((char *));
|
static void do_vfp_sp_from_reg PARAMS ((char *));
|
||||||
static void do_vfp_sp_reg2 PARAMS ((char *));
|
static void do_vfp_reg2_from_sp2 PARAMS ((char *));
|
||||||
|
static void do_vfp_sp2_from_reg2 PARAMS ((char *));
|
||||||
static void do_vfp_reg_from_dp PARAMS ((char *));
|
static void do_vfp_reg_from_dp PARAMS ((char *));
|
||||||
static void do_vfp_reg2_from_dp PARAMS ((char *));
|
static void do_vfp_reg2_from_dp PARAMS ((char *));
|
||||||
static void do_vfp_dp_from_reg PARAMS ((char *));
|
static void do_vfp_dp_from_reg PARAMS ((char *));
|
||||||
|
@ -1976,8 +1977,8 @@ static const struct asm_opcode insns[] =
|
||||||
{"fcmpezd", 0xeeb50bc0, 7, FPU_VFP_EXT_V1, do_vfp_dp_compare_z},
|
{"fcmpezd", 0xeeb50bc0, 7, FPU_VFP_EXT_V1, do_vfp_dp_compare_z},
|
||||||
|
|
||||||
/* VFP V2. */
|
/* VFP V2. */
|
||||||
{"fmsrr", 0xec400a10, 5, FPU_VFP_EXT_V2, do_vfp_sp_reg2},
|
{"fmsrr", 0xec400a10, 5, FPU_VFP_EXT_V2, do_vfp_sp2_from_reg2},
|
||||||
{"fmrrs", 0xec500a10, 5, FPU_VFP_EXT_V2, do_vfp_sp_reg2},
|
{"fmrrs", 0xec500a10, 5, FPU_VFP_EXT_V2, do_vfp_reg2_from_sp2},
|
||||||
{"fmdrr", 0xec400b10, 5, FPU_VFP_EXT_V2, do_vfp_dp_from_reg2},
|
{"fmdrr", 0xec400b10, 5, FPU_VFP_EXT_V2, do_vfp_dp_from_reg2},
|
||||||
{"fmrrd", 0xec500b10, 5, FPU_VFP_EXT_V2, do_vfp_reg2_from_dp},
|
{"fmrrd", 0xec500b10, 5, FPU_VFP_EXT_V2, do_vfp_reg2_from_dp},
|
||||||
|
|
||||||
|
@ -8954,15 +8955,13 @@ do_vfp_reg_from_sp (str)
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
do_vfp_sp_reg2 (str)
|
do_vfp_reg2_from_sp2 (str)
|
||||||
char *str;
|
char *str;
|
||||||
{
|
{
|
||||||
skip_whitespace (str);
|
skip_whitespace (str);
|
||||||
|
|
||||||
if (reg_required_here (&str, 12) == FAIL)
|
if (reg_required_here (&str, 12) == FAIL
|
||||||
return;
|
|| skip_past_comma (&str) == FAIL
|
||||||
|
|
||||||
if (skip_past_comma (&str) == FAIL
|
|
||||||
|| reg_required_here (&str, 16) == FAIL
|
|| reg_required_here (&str, 16) == FAIL
|
||||||
|| skip_past_comma (&str) == FAIL)
|
|| skip_past_comma (&str) == FAIL)
|
||||||
{
|
{
|
||||||
|
@ -9001,6 +9000,32 @@ do_vfp_sp_from_reg (str)
|
||||||
end_of_line (str);
|
end_of_line (str);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
do_vfp_sp2_from_reg2 (str)
|
||||||
|
char *str;
|
||||||
|
{
|
||||||
|
skip_whitespace (str);
|
||||||
|
|
||||||
|
/* We require exactly two consecutive SP registers. */
|
||||||
|
if (vfp_sp_reg_list (&str, VFP_REG_Sm) != 2)
|
||||||
|
{
|
||||||
|
if (! inst.error)
|
||||||
|
inst.error = _("only two consecutive VFP SP registers allowed here");
|
||||||
|
}
|
||||||
|
|
||||||
|
if (skip_past_comma (&str) == FAIL
|
||||||
|
|| reg_required_here (&str, 12) == FAIL
|
||||||
|
|| skip_past_comma (&str) == FAIL
|
||||||
|
|| reg_required_here (&str, 16) == FAIL)
|
||||||
|
{
|
||||||
|
if (! inst.error)
|
||||||
|
inst.error = BAD_ARGS;
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
end_of_line (str);
|
||||||
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
do_vfp_reg_from_dp (str)
|
do_vfp_reg_from_dp (str)
|
||||||
char *str;
|
char *str;
|
||||||
|
@ -9075,7 +9100,7 @@ do_vfp_dp_from_reg2 (str)
|
||||||
if (skip_past_comma (&str) == FAIL
|
if (skip_past_comma (&str) == FAIL
|
||||||
|| reg_required_here (&str, 12) == FAIL
|
|| reg_required_here (&str, 12) == FAIL
|
||||||
|| skip_past_comma (&str) == FAIL
|
|| skip_past_comma (&str) == FAIL
|
||||||
|| reg_required_here (&str, 16))
|
|| reg_required_here (&str, 16) == FAIL)
|
||||||
{
|
{
|
||||||
if (! inst.error)
|
if (! inst.error)
|
||||||
inst.error = BAD_ARGS;
|
inst.error = BAD_ARGS;
|
||||||
|
|
|
@ -1,3 +1,8 @@
|
||||||
|
2004-01-09 Paul Brook <paul@codesourcery.com>
|
||||||
|
|
||||||
|
* gas/arm/vfp2.s, gas/arm/vfp2.d: New test.
|
||||||
|
* gas/arm/arm.exp: Add them.
|
||||||
|
|
||||||
2004-01-08 Ian Lance Taylor <ian@wasabisystems.com>
|
2004-01-08 Ian Lance Taylor <ian@wasabisystems.com>
|
||||||
|
|
||||||
* gas/mips/ldstla-n64.d: Pass -64 to assembler, not -n64.
|
* gas/mips/ldstla-n64.d: Pass -64 to assembler, not -n64.
|
||||||
|
|
|
@ -61,6 +61,8 @@ if {[istarget *arm*-*-*] || [istarget "xscale-*-*"]} then {
|
||||||
|
|
||||||
run_dump_test "vfp1"
|
run_dump_test "vfp1"
|
||||||
|
|
||||||
|
run_dump_test "vfp2"
|
||||||
|
|
||||||
run_errors_test "vfp-bad" "-mfpu=vfp" "VFP errors"
|
run_errors_test "vfp-bad" "-mfpu=vfp" "VFP errors"
|
||||||
|
|
||||||
run_dump_test "xscale"
|
run_dump_test "xscale"
|
||||||
|
|
|
@ -0,0 +1,17 @@
|
||||||
|
#objdump: -dr --prefix-addresses --show-raw-insn
|
||||||
|
#name: VFP Additional instructions
|
||||||
|
#as: -mfpu=vfp
|
||||||
|
|
||||||
|
# Test the ARM VFP Double Precision instructions
|
||||||
|
|
||||||
|
.*: +file format .*arm.*
|
||||||
|
|
||||||
|
Disassembly of section .text:
|
||||||
|
0+000 <[^>]*> ec4a5b10 fmdrr d0, r5, sl
|
||||||
|
0+004 <[^>]*> ec5a5b10 fmrrd r5, sl, d0
|
||||||
|
0+008 <[^>]*> ec4a5a37 fmsrr r5, sl, {s15, s16}
|
||||||
|
0+00c <[^>]*> ec5a5a37 fmrrs r5, sl, {s15, s16}
|
||||||
|
0+010 <[^>]*> ec45ab1f fmdrr d15, sl, r5
|
||||||
|
0+014 <[^>]*> ec55ab1f fmrrd sl, r5, d15
|
||||||
|
0+018 <[^>]*> ec45aa38 fmsrr sl, r5, {s17, s18}
|
||||||
|
0+01c <[^>]*> ec55aa38 fmrrs sl, r5, {s17, s18}
|
|
@ -0,0 +1,18 @@
|
||||||
|
@ VFP2 Additional instructions
|
||||||
|
.text
|
||||||
|
.global F
|
||||||
|
F:
|
||||||
|
@ First we test the basic syntax and bit patterns of the opcodes.
|
||||||
|
@ Use a combination of r5, r10, s15, s17, d0 and d15 to exercise
|
||||||
|
@ the full register bitpatterns
|
||||||
|
|
||||||
|
fmdrr d0, r5, r10
|
||||||
|
fmrrd r5, r10, d0
|
||||||
|
fmsrr {s15, s16}, r5, r10
|
||||||
|
fmrrs r5, r10, {s15, s16}
|
||||||
|
|
||||||
|
fmdrr d15, r10, r5
|
||||||
|
fmrrd r10, r5, d15
|
||||||
|
fmsrr {s17, s18}, r10, r5
|
||||||
|
fmrrs r10, r5, {s17, s18}
|
||||||
|
|
|
@ -1,3 +1,8 @@
|
||||||
|
2004-01-09 Paul Brook <paul@codesourcery.com>
|
||||||
|
|
||||||
|
* arm-opc.h (arm_opcodes): Move generic mcrr after known
|
||||||
|
specific opcodes.
|
||||||
|
|
||||||
2004-01-07 Daniel Jacobowitz <drow@mvista.com>
|
2004-01-07 Daniel Jacobowitz <drow@mvista.com>
|
||||||
|
|
||||||
* Makefile.am (libopcodes_la_DEPENDENCIES)
|
* Makefile.am (libopcodes_la_DEPENDENCIES)
|
||||||
|
|
|
@ -328,9 +328,6 @@ static const struct arm_opcode arm_opcodes[] =
|
||||||
{0x01200050, 0x0ff00ff0, "qsub%c\t%12-15r, %0-3r, %16-19r"},
|
{0x01200050, 0x0ff00ff0, "qsub%c\t%12-15r, %0-3r, %16-19r"},
|
||||||
{0x01600050, 0x0ff00ff0, "qdsub%c\t%12-15r, %0-3r, %16-19r"},
|
{0x01600050, 0x0ff00ff0, "qdsub%c\t%12-15r, %0-3r, %16-19r"},
|
||||||
|
|
||||||
{0x0c400000, 0x0ff00000, "mcrr%c\t%8-11d, %4-7d, %12-15r, %16-19r, cr%0-3d"},
|
|
||||||
{0x0c500000, 0x0ff00000, "mrrc%c\t%8-11d, %4-7d, %12-15r, %16-19r, cr%0-3d"},
|
|
||||||
|
|
||||||
/* ARM Instructions. */
|
/* ARM Instructions. */
|
||||||
{0x00000090, 0x0e100090, "str%c%6's%5?hb\t%12-15r, %s"},
|
{0x00000090, 0x0e100090, "str%c%6's%5?hb\t%12-15r, %s"},
|
||||||
{0x00100090, 0x0e100090, "ldr%c%6's%5?hb\t%12-15r, %s"},
|
{0x00100090, 0x0e100090, "ldr%c%6's%5?hb\t%12-15r, %s"},
|
||||||
|
@ -569,6 +566,8 @@ static const struct arm_opcode arm_opcodes[] =
|
||||||
{0x0e300600, 0x0ff00f00, "cfmsuba32%c\tmvax%5-7d, mvax%12-15d, mvfx%16-19d, mvfx%0-3d"},
|
{0x0e300600, 0x0ff00f00, "cfmsuba32%c\tmvax%5-7d, mvax%12-15d, mvfx%16-19d, mvfx%0-3d"},
|
||||||
|
|
||||||
/* Generic coprocessor instructions */
|
/* Generic coprocessor instructions */
|
||||||
|
{0x0c400000, 0x0ff00000, "mcrr%c\t%8-11d, %4-7d, %12-15r, %16-19r, cr%0-3d"},
|
||||||
|
{0x0c500000, 0x0ff00000, "mrrc%c\t%8-11d, %4-7d, %12-15r, %16-19r, cr%0-3d"},
|
||||||
{0x0e000000, 0x0f000010, "cdp%c\t%8-11d, %20-23d, cr%12-15d, cr%16-19d, cr%0-3d, {%5-7d}"},
|
{0x0e000000, 0x0f000010, "cdp%c\t%8-11d, %20-23d, cr%12-15d, cr%16-19d, cr%0-3d, {%5-7d}"},
|
||||||
{0x0e100010, 0x0f100010, "mrc%c\t%8-11d, %21-23d, %12-15r, cr%16-19d, cr%0-3d, {%5-7d}"},
|
{0x0e100010, 0x0f100010, "mrc%c\t%8-11d, %21-23d, %12-15r, cr%16-19d, cr%0-3d, {%5-7d}"},
|
||||||
{0x0e000010, 0x0f100010, "mcr%c\t%8-11d, %21-23d, %12-15r, cr%16-19d, cr%0-3d, {%5-7d}"},
|
{0x0e000010, 0x0f100010, "mcr%c\t%8-11d, %21-23d, %12-15r, cr%16-19d, cr%0-3d, {%5-7d}"},
|
||||||
|
|
Loading…
Reference in New Issue