This is the mail archive of the binutils@sources.redhat.com mailing list for the binutils project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

patch: gas support for morpho ms1 cpu


Hi folks.

Here is the gas part of things.

Tested on ppc64-linux with "make all-gas && make check-gas".

Question, is the following code needed in ms1_fix_adjustable:?

  /* We need the symbol name for the VTABLE entries.  */
  if (   fixP->fx_r_type == BFD_RELOC_VTABLE_INHERIT
      || fixP->fx_r_type == BFD_RELOC_VTABLE_ENTRY)
    return 0;

...someone had pointed out the VTABLE code wasn't needed for recent 
toolchains, but I wasn't sure wether this applied to the gas/ part of
things.

OK?

	* config/tc-ms1.c: New.
	* config/tc-ms1.h: New.
	* testsuite/gas/ms1/allinsn.d: New.
	* testsuite/gas/ms1/allinsn.s: New.
	* testsuite/gas/ms1/badinsn.s: New.
	* testsuite/gas/ms1/badinsn1.s: New.
	* testsuite/gas/ms1/badoffsethigh.s: New.
	* testsuite/gas/ms1/badoffsetlow.s: New.
	* testsuite/gas/ms1/badorder.s: New.
	* testsuite/gas/ms1/badreg.s: New.
	* testsuite/gas/ms1/badsignedimmhigh.s: New.
	* testsuite/gas/ms1/badsignedimmlow.s: New.
	* testsuite/gas/ms1/badsyntax.s: New.
	* testsuite/gas/ms1/badsyntax1.s: New.
	* testsuite/gas/ms1/badunsignedimmhigh.s: New.
	* testsuite/gas/ms1/badunsignedimmlow.s: New.
	* testsuite/gas/ms1/errors.exp: New.
	* testsuite/gas/ms1/ldst.s: New.
	* testsuite/gas/ms1/misc.d: New.
	* testsuite/gas/ms1/misc.s: New.
	* testsuite/gas/ms1/ms1-16-003.d: New.
	* testsuite/gas/ms1/ms1-16-003.s: New.
	* testsuite/gas/ms1/ms1.exp: New.
	* testsuite/gas/ms1/msys.d: New.
	* testsuite/gas/ms1/msys.s: New.
	* testsuite/gas/ms1/relocs.d: New.
	* testsuite/gas/ms1/relocs.exp: New.
	* testsuite/gas/ms1/relocs1.s: New.
	* testsuite/gas/ms1/relocs2.s: New.

Index: config/tc-ms1.c
===================================================================
RCS file: config/tc-ms1.c
diff -N config/tc-ms1.c
*** /dev/null	1 Jan 1970 00:00:00 -0000
--- config/tc-ms1.c	21 Jun 2005 16:44:06 -0000
***************
*** 0 ****
--- 1,515 ----
+ /* tc-ms1.c -- Assembler for the Morpho Technologies ms-I.
+    Copyright (C) 2001, 2002, 2003, 2005 Free Software Foundation.
+ 
+    This file is part of GAS, the GNU Assembler.
+ 
+    GAS is free software; you can redistribute it and/or modify
+    it under the terms of the GNU General Public License as published by
+    the Free Software Foundation; either version 2, or (at your option)
+    any later version.
+ 
+    GAS is distributed in the hope that it will be useful,
+    but WITHOUT ANY WARRANTY; without even the implied warranty of
+    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+    GNU General Public License for more details.
+ 
+    You should have received a copy of the GNU General Public License
+    along with GAS; see the file COPYING.  If not, write to
+    the Free Software Foundation, 59 Temple Place - Suite 330,
+    Boston, MA 02111-1307, USA.  */
+ 
+ #include <stdio.h>
+ #include "as.h"
+ #include "dwarf2dbg.h"
+ #include "subsegs.h"     
+ #include "symcat.h"
+ #include "opcodes/ms1-desc.h"
+ #include "opcodes/ms1-opc.h"
+ #include "cgen.h"
+ #include "elf/common.h"
+ #include "elf/ms1.h"
+ #include "libbfd.h"
+ 
+ /* Structure to hold all of the different components
+    describing an individual instruction.  */
+ typedef struct
+ {
+   const CGEN_INSN *	insn;
+   const CGEN_INSN *	orig_insn;
+   CGEN_FIELDS		fields;
+ #if CGEN_INT_INSN_P
+   CGEN_INSN_INT         buffer [1];
+ #define INSN_VALUE(buf) (*(buf))
+ #else
+   unsigned char         buffer [CGEN_MAX_INSN_SIZE];
+ #define INSN_VALUE(buf) (buf)
+ #endif
+   char *		addr;
+   fragS *		frag;
+   int                   num_fixups;
+   fixS *                fixups [GAS_CGEN_MAX_FIXUPS];
+   int                   indices [MAX_OPERAND_INSTANCES];
+ }
+ ms1_insn;
+ 
+ 
+ const char comment_chars[]        = ";";
+ const char line_comment_chars[]   = "#";
+ const char line_separator_chars[] = ""; 
+ const char EXP_CHARS[]            = "eE";
+ const char FLT_CHARS[]            = "dD";
+ 
+ /* The target specific pseudo-ops which we support.  */
+ const pseudo_typeS md_pseudo_table[] =
+ {
+     { "word",   cons,                   4 }, 
+     { "file",	(void (*) PARAMS ((int))) dwarf2_directive_file, 0 },
+     { "loc",	dwarf2_directive_loc,	0 },
+     { NULL, 	NULL,			0 }
+ };
+ 
+ 
+ 
+ static int no_scheduling_restrictions = 0;
+ 
+ struct option md_longopts[] = 
+ {
+ #define OPTION_NO_SCHED_REST	(OPTION_MD_BASE)
+   { "nosched",	   no_argument, NULL, OPTION_NO_SCHED_REST },
+ #define OPTION_MARCH		(OPTION_MD_BASE + 1)
+   { "march", required_argument, NULL, OPTION_MARCH},
+   { NULL,	   no_argument, NULL, 0 },
+ };
+ size_t md_longopts_size = sizeof (md_longopts);
+ 
+ const char * md_shortopts = "";
+ 
+ /* Mach selected from command line.  */
+ static int ms1_mach = bfd_mach_ms1;
+ static unsigned ms1_mach_bitmask = 0;
+ 
+ /* Flags to set in the elf header */
+ static flagword ms1_flags = EF_MS1_CPU_MRISC;
+ 
+ /* The architecture to use.  */
+ enum ms1_architectures
+   {
+     ms1_64_001,
+     ms1_16_002,
+     ms1_16_003
+   };
+ 
+ /* MS1 architecture we are using for this output file.  */
+ static enum ms1_architectures ms1_arch = ms1_64_001;
+ 
+ int
+ md_parse_option (int c ATTRIBUTE_UNUSED, char * arg)
+ {
+   switch (c)
+     {
+     case OPTION_MARCH:
+       if (strcasecmp (arg, "MS1-64-001") == 0)
+  	{
+  	  ms1_flags = (ms1_flags & ~EF_MS1_CPU_MASK) | EF_MS1_CPU_MRISC;
+  	  ms1_mach = bfd_mach_ms1;
+  	  ms1_mach_bitmask = 1 << MACH_MS1;
+  	  ms1_arch = ms1_64_001;
+  	}
+       else if (strcasecmp (arg, "MS1-16-002") == 0)
+  	{
+  	  ms1_flags = (ms1_flags & ~EF_MS1_CPU_MASK) | EF_MS1_CPU_MRISC;
+  	  ms1_mach = bfd_mach_ms1;
+  	  ms1_mach_bitmask = 1 << MACH_MS1;
+  	  ms1_arch = ms1_16_002;
+  	}
+       else if (strcasecmp (arg, "MS1-16-003") == 0)
+  	{
+  	  ms1_flags = (ms1_flags & ~EF_MS1_CPU_MASK) | EF_MS1_CPU_MRISC2;
+  	  ms1_mach = bfd_mach_mrisc2;
+  	  ms1_mach_bitmask = 1 << MACH_MS1_003;
+  	  ms1_arch = ms1_16_003;
+  	}
+     case OPTION_NO_SCHED_REST:
+       no_scheduling_restrictions = 1;
+       break;
+     default:
+       return 0;
+     }
+ 
+   return 1;
+ }
+ 
+ 
+ void
+ md_show_usage (FILE * stream)
+ {
+   fprintf (stream, _("MS1 specific command line options:\n"));
+   fprintf (stream, _("  -march=ms1-64-001         allow ms1-64-001 instructions (default) \n"));
+   fprintf (stream, _("  -march=ms1-16-002         allow ms1-16-002 instructions \n"));
+   fprintf (stream, _("  -march=ms1-16-003         allow ms1-16-003 instructions \n"));
+   fprintf (stream, _("  -nosched                  disable scheduling restrictions \n"));
+ }
+ 
+ 
+ void
+ md_begin ()
+ {
+   /* Initialize the `cgen' interface.  */
+   
+   /* Set the machine number and endian.  */
+   gas_cgen_cpu_desc = ms1_cgen_cpu_open (CGEN_CPU_OPEN_MACHS, ms1_mach_bitmask,
+ 					   CGEN_CPU_OPEN_ENDIAN,
+ 					   CGEN_ENDIAN_BIG,
+ 					   CGEN_CPU_OPEN_END);
+   ms1_cgen_init_asm (gas_cgen_cpu_desc);
+ 
+   /* This is a callback from cgen to gas to parse operands.  */
+   cgen_set_parse_operand_fn (gas_cgen_cpu_desc, gas_cgen_parse_operand);
+ 
+   /* Set the ELF flags if desired. */
+   if (ms1_flags)
+     bfd_set_private_flags (stdoutput, ms1_flags);
+ 
+   /* Set the machine type.  */
+   bfd_default_set_arch_mach (stdoutput, bfd_arch_ms1, ms1_mach);
+ }
+ 
+ void
+ md_assemble (char * str)
+ {
+   static long delayed_load_register = 0;
+   static int last_insn_had_delay_slot = 0;
+   static int last_insn_in_noncond_delay_slot = 0;
+   static int last_insn_has_load_delay = 0;
+   static int last_insn_was_memory_access = 0;
+   static int last_insn_was_io_insn = 0;
+   static int last_insn_was_arithmetic_or_logic = 0;
+   static int last_insn_was_branch_insn = 0;
+   static int last_insn_was_conditional_branch_insn = 0;
+ 
+   ms1_insn insn;
+   char * errmsg;
+ 
+   /* Initialize GAS's cgen interface for a new instruction.  */
+   gas_cgen_init_parse ();
+ 
+   insn.insn = ms1_cgen_assemble_insn
+       (gas_cgen_cpu_desc, str, & insn.fields, insn.buffer, & errmsg);
+ 
+   if (!insn.insn)
+     {
+       as_bad ("%s", errmsg);
+       return;
+     }
+ 
+   /* Doesn't really matter what we pass for RELAX_P here.  */
+   gas_cgen_finish_insn (insn.insn, insn.buffer,
+ 			CGEN_FIELDS_BITSIZE (& insn.fields), 1, NULL);
+ 
+ 
+   /* Handle Scheduling Restrictions.  */
+   if (!no_scheduling_restrictions)
+     {
+       /* Detect consecutive Memory Accesses.  */
+       if (last_insn_was_memory_access &&
+ 	  CGEN_INSN_ATTR_VALUE (insn.insn, CGEN_INSN_MEMORY_ACCESS) &&
+ 	  ms1_mach == ms1_64_001)
+ 	as_warn (_("instruction %s may not follow another memory access instruction."),
+ 		 CGEN_INSN_NAME (insn.insn));
+ 
+       /* Detect consecutive I/O Instructions.  */
+       else if (last_insn_was_io_insn &&
+ 	       CGEN_INSN_ATTR_VALUE (insn.insn, CGEN_INSN_IO_INSN))
+ 	as_warn (_("instruction %s may not follow another I/O instruction."),
+ 		 CGEN_INSN_NAME (insn.insn));
+ 
+       /* Detect consecutive branch instructions.  */
+       else if (last_insn_was_branch_insn &&
+ 	       CGEN_INSN_ATTR_VALUE (insn.insn, CGEN_INSN_BR_INSN))
+ 	as_warn (_("%s may not occupy the delay slot of another branch insn."),
+ 		 CGEN_INSN_NAME (insn.insn));
+ 
+       /* Detect data dependencies on delayed loads: memory and input insns.  */
+       if (last_insn_has_load_delay && delayed_load_register)
+ 	{
+ 	  if (CGEN_INSN_ATTR_VALUE (insn.insn, CGEN_INSN_USES_FRSR1) &&
+ 	      insn.fields.f_sr1 == delayed_load_register)
+ 	    as_warn (_("operand references R%ld of previous load."),
+ 		     insn.fields.f_sr1);
+ 
+ 	  if (CGEN_INSN_ATTR_VALUE (insn.insn, CGEN_INSN_USES_FRSR2) &&
+ 	      insn.fields.f_sr2 == delayed_load_register)
+ 	    as_warn (_("operand references R%ld of previous load."),
+ 		     insn.fields.f_sr2);
+ 	}
+ 
+       /* Detect data dependency between conditional branch instruction
+          and an immediately preceding arithmetic or logical instruction.  */
+       if (last_insn_was_arithmetic_or_logic && 
+ 	  ! last_insn_in_noncond_delay_slot &&
+ 	  (delayed_load_register != 0) &&
+ 	  CGEN_INSN_ATTR_VALUE (insn.insn, CGEN_INSN_BR_INSN) &&
+ 	  ms1_arch == ms1_64_001)
+ 	{
+ 	  if (CGEN_INSN_ATTR_VALUE (insn.insn, CGEN_INSN_USES_FRSR1) &&
+ 	      insn.fields.f_sr1 == delayed_load_register)
+ 	    as_warn (_("conditional branch or jal insn's operand references R%ld of previous arithmetic or logic insn."),
+ 		     insn.fields.f_sr1);
+ 
+ 	  if (CGEN_INSN_ATTR_VALUE (insn.insn, CGEN_INSN_USES_FRSR2) &&
+ 	      insn.fields.f_sr2 == delayed_load_register)
+ 	    as_warn (_("conditional branch or jal insn's operand references R%ld of previous arithmetic or logic insn."),
+ 		     insn.fields.f_sr2);
+ 	}
+     }
+ 
+   /* Keep track of details of this insn for processing next insn.  */
+   last_insn_in_noncond_delay_slot = last_insn_was_branch_insn &&
+     ! last_insn_was_conditional_branch_insn;
+ 
+   last_insn_had_delay_slot =
+     CGEN_INSN_ATTR_VALUE (insn.insn, CGEN_INSN_DELAY_SLOT);
+ 
+   last_insn_has_load_delay =
+     CGEN_INSN_ATTR_VALUE (insn.insn, CGEN_INSN_LOAD_DELAY);
+ 
+   last_insn_was_memory_access =
+     CGEN_INSN_ATTR_VALUE (insn.insn, CGEN_INSN_MEMORY_ACCESS);
+ 
+   last_insn_was_io_insn =
+     CGEN_INSN_ATTR_VALUE (insn.insn, CGEN_INSN_IO_INSN);
+ 
+   last_insn_was_arithmetic_or_logic =
+     CGEN_INSN_ATTR_VALUE (insn.insn, CGEN_INSN_AL_INSN);
+ 
+   last_insn_was_branch_insn =
+     CGEN_INSN_ATTR_VALUE (insn.insn, CGEN_INSN_BR_INSN);
+   
+   last_insn_was_conditional_branch_insn =
+   CGEN_INSN_ATTR_VALUE (insn.insn, CGEN_INSN_BR_INSN) &&
+   CGEN_INSN_ATTR_VALUE (insn.insn, CGEN_INSN_USES_FRSR2);
+   
+   if (CGEN_INSN_ATTR_VALUE (insn.insn, CGEN_INSN_USES_FRDR))
+      delayed_load_register = insn.fields.f_dr; 
+   else if (CGEN_INSN_ATTR_VALUE (insn.insn, CGEN_INSN_USES_FRDRRR))
+      delayed_load_register = insn.fields.f_drrr; 
+   else  /* Insns has no destination register.  */
+      delayed_load_register = 0; 
+ 
+   /* Generate dwarf2 line numbers.  */
+   dwarf2_emit_insn (4); 
+ }
+ 
+ valueT
+ md_section_align (segT segment, valueT size)
+ {
+   int align = bfd_get_section_alignment (stdoutput, segment);
+ 
+   return ((size + (1 << align) - 1) & (-1 << align));
+ }
+ 
+ symbolS *
+ md_undefined_symbol (char * name ATTRIBUTE_UNUSED)
+ {
+     return 0;
+ }
+ 
+ int
+ md_estimate_size_before_relax (fragS * fragP ATTRIBUTE_UNUSED,
+ 			       segT    segment ATTRIBUTE_UNUSED)
+ {
+   as_fatal (_("md_estimate_size_before_relax\n"));
+   return 1;
+ } 
+ 
+ /* *fragP has been relaxed to its final size, and now needs to have
+    the bytes inside it modified to conform to the new size.
+ 
+    Called after relaxation is finished.
+    fragP->fr_type == rs_machine_dependent.
+    fragP->fr_subtype is the subtype of what the address relaxed to.  */
+ 
+ void
+ md_convert_frag (bfd   * abfd  ATTRIBUTE_UNUSED,
+ 		 segT    sec   ATTRIBUTE_UNUSED,
+ 		 fragS * fragP ATTRIBUTE_UNUSED)
+ {
+ }
+ 
+ 
+ /* Functions concerning relocs.  */
+ 
+ long
+ md_pcrel_from_section (fixS *fixP, segT sec)
+ {
+   if (fixP->fx_addsy != (symbolS *) NULL
+       && (! S_IS_DEFINED (fixP->fx_addsy)
+ 	  || S_GET_SEGMENT (fixP->fx_addsy) != sec))
+     /* The symbol is undefined (or is defined but not in this section).
+        Let the linker figure it out.  */
+     return 0;
+ 
+   /* Return the address of the opcode - cgen adjusts for opcode size
+      itself, to be consistent with the disassembler, which must do
+      so.  */
+   return fixP->fx_where + fixP->fx_frag->fr_address;
+ }
+ 
+ 
+ /* Return the bfd reloc type for OPERAND of INSN at fixup FIXP.
+    Returns BFD_RELOC_NONE if no reloc type can be found.
+    *FIXP may be modified if desired.  */
+ 
+ bfd_reloc_code_real_type
+ md_cgen_lookup_reloc (const CGEN_INSN *    insn     ATTRIBUTE_UNUSED,
+ 		      const CGEN_OPERAND * operand,
+ 		      fixS *               fixP     ATTRIBUTE_UNUSED)
+ {
+   bfd_reloc_code_real_type result;
+ 
+   result = BFD_RELOC_NONE;
+ 
+   switch (operand->type)
+     {
+     case MS1_OPERAND_IMM16O:
+       result = BFD_RELOC_16_PCREL;
+       fixP->fx_pcrel = 1;
+       /* fixP->fx_no_overflow = 1; */
+       break;
+     case MS1_OPERAND_IMM16:
+     case MS1_OPERAND_IMM16Z:
+       /* These may have been processed at parse time.  */
+       if (fixP->fx_cgen.opinfo != 0)
+         result = fixP->fx_cgen.opinfo;
+       fixP->fx_no_overflow = 1;
+       break;
+     default:
+       result = BFD_RELOC_NONE;
+       break;
+     }
+ 
+   return result;
+ }
+ 
+ /* Write a value out to the object file, using the appropriate endianness.  */
+ 
+ void
+ md_number_to_chars (char * buf, valueT val, int n)
+ {
+   number_to_chars_bigendian (buf, val, n);
+ }
+ 
+ /* Turn a string in input_line_pointer into a floating point constant of type
+    type, and store the appropriate bytes in *litP.  The number of LITTLENUMS
+    emitted is stored in *sizeP .  An error message is returned, or NULL on OK.  */
+ 
+ /* Equal to MAX_PRECISION in atof-ieee.c.  */
+ #define MAX_LITTLENUMS 6
+ 
+ char *
+ md_atof (type, litP, sizeP)
+      char   type;
+      char * litP;
+      int *  sizeP;
+ {
+   int              prec;
+   LITTLENUM_TYPE   words [MAX_LITTLENUMS];
+   LITTLENUM_TYPE * wordP;
+   char *           t;
+ 
+   switch (type)
+     {
+     case 'f':
+     case 'F':
+     case 's':
+     case 'S':
+       prec = 2;
+       break;
+ 
+     case 'd':
+     case 'D':
+     case 'r':
+     case 'R':
+       prec = 4;
+       break;
+ 
+    /* FIXME: Some targets allow other format chars for bigger sizes here.  */
+ 
+     default:
+       * sizeP = 0;
+       return _("Bad call to md_atof()");
+     }
+ 
+   t = atof_ieee (input_line_pointer, type, words);
+   if (t)
+     input_line_pointer = t;
+   * sizeP = prec * sizeof (LITTLENUM_TYPE);
+ 
+   /* This loops outputs the LITTLENUMs in REVERSE order;
+      in accord with the ms1 endianness.  */
+   for (wordP = words; prec--;)
+     {
+       md_number_to_chars (litP, (valueT) (*wordP++), sizeof (LITTLENUM_TYPE));
+       litP += sizeof (LITTLENUM_TYPE);
+     }
+      
+   return 0;
+ }
+ 
+ /* See whether we need to force a relocation into the output file.  */
+ 
+ int
+ ms1_force_relocation (fixS * fixp)
+ {
+   switch (fixp->fx_r_type)
+     {
+     case BFD_RELOC_VTABLE_INHERIT: 
+     case BFD_RELOC_VTABLE_ENTRY: 
+       return 1;
+ 
+     default:
+       return 0;
+     }
+ }
+ 
+ void
+ ms1_apply_fix (fixS *fixP, valueT *valueP, segT seg)
+ {
+   if ((fixP->fx_pcrel != 0) && (fixP->fx_r_type == BFD_RELOC_32))
+     fixP->fx_r_type = BFD_RELOC_32_PCREL;
+ 
+   gas_cgen_md_apply_fix (fixP, valueP, seg);
+ }
+ 
+ bfd_boolean
+ ms1_fix_adjustable (fixS * fixP)
+ {
+   bfd_reloc_code_real_type reloc_type;
+ 
+   if ((int) fixP->fx_r_type >= (int) BFD_RELOC_UNUSED)
+     {
+       const CGEN_INSN *insn = NULL;
+       int opindex = (int) fixP->fx_r_type - (int) BFD_RELOC_UNUSED;
+       const CGEN_OPERAND *operand = cgen_operand_lookup_by_num(gas_cgen_cpu_desc, opindex);
+       reloc_type = md_cgen_lookup_reloc (insn, operand, fixP);
+     }
+   else
+     reloc_type = fixP->fx_r_type;
+ 
+   if (fixP->fx_addsy == NULL)
+     return TRUE;
+   
+   /* Prevent all adjustments to global symbols.  */
+   if (S_IS_EXTERNAL (fixP->fx_addsy))
+     return FALSE;
+   
+   if (S_IS_WEAK (fixP->fx_addsy))
+     return FALSE;
+   
+   /* We need the symbol name for the VTABLE entries.  */
+   if (   fixP->fx_r_type == BFD_RELOC_VTABLE_INHERIT
+       || fixP->fx_r_type == BFD_RELOC_VTABLE_ENTRY)
+     return 0;
+ 
+   return 1;
+ }
Index: config/tc-ms1.h
===================================================================
RCS file: config/tc-ms1.h
diff -N config/tc-ms1.h
*** /dev/null	1 Jan 1970 00:00:00 -0000
--- config/tc-ms1.h	21 Jun 2005 16:44:06 -0000
***************
*** 0 ****
--- 1,75 ----
+ /* tc-ms1.h -- Header file for tc-ms1.c.
+    Copyright (C) 2001, 2002, 2005 Free Software Foundation, Inc.
+ 
+    This file is part of GAS, the GNU Assembler.
+ 
+    GAS is free software; you can redistribute it and/or modify
+    it under the terms of the GNU General Public License as published by
+    the Free Software Foundation; either version 2, or (at your option)
+    any later version.
+ 
+    GAS is distributed in the hope that it will be useful,
+    but WITHOUT ANY WARRANTY; without even the implied warranty of
+    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+    GNU General Public License for more details.
+ 
+    You should have received a copy of the GNU General Public License
+    along with GAS; see the file COPYING.  If not, write to
+    the Free Software Foundation, 59 Temple Place - Suite 330,
+    Boston, MA 02111-1307, USA. */
+ 
+ #define TC_MS1
+ 
+ #ifndef BFD_ASSEMBLER
+ /* Leading space so will compile with cc.  */
+  #error MS1 support requires BFD_ASSEMBLER
+ #endif
+ 
+ #define LISTING_HEADER "MS1 GAS "
+ 
+ /* The target BFD architecture.  */
+ #define TARGET_ARCH bfd_arch_ms1
+ 
+ #define TARGET_FORMAT "elf32-ms1"
+ 
+ #define TARGET_BYTES_BIG_ENDIAN 1
+ 
+ /* Permit temporary numeric labels.  */
+ #define LOCAL_LABELS_FB 1
+ 
+ /* .-foo gets turned into PC relative relocs.  */
+ #define DIFF_EXPR_OK
+ 
+ /* We don't need to handle .word strangely.  */
+ #define WORKING_DOT_WORD
+ 
+ /* All ms1 instructions are multiples of 32 bits.  */
+ #define DWARF2_LINE_MIN_INSN_LENGTH 4
+ 
+ #define LITERAL_PREFIXDOLLAR_HEX
+ #define LITERAL_PREFIXPERCENT_BIN
+ 
+ #define md_apply_fix ms1_apply_fix
+ extern void ms1_apply_fix PARAMS ((struct fix *, valueT *, segT)); 
+ 
+ /* Call md_pcrel_from_section(), not md_pcrel_from().  */
+ #define MD_PCREL_FROM_SECTION(FIXP, SEC) md_pcrel_from_section (FIXP, SEC)
+ extern long md_pcrel_from_section PARAMS ((struct fix *, segT));
+ 
+ #define obj_fix_adjustable(fixP) iq2000_fix_adjustable (fixP)
+ extern bfd_boolean ms1_fix_adjustable PARAMS ((struct fix *));
+ 
+ /* Values passed to md_apply_fix don't include the symbol value.  */
+ #define MD_APPLY_SYM_VALUE(FIX) 0
+ 
+ #define tc_gen_reloc gas_cgen_tc_gen_reloc
+ 
+ #define md_operand(x) gas_cgen_md_operand (x)
+ extern void gas_cgen_md_operand PARAMS ((expressionS *));
+ 
+ #define TC_FORCE_RELOCATION(fixp) ms1_force_relocation (fixp)
+ extern int ms1_force_relocation PARAMS ((struct fix *));
+ 
+ #define tc_fix_adjustable(fixP) ms1_fix_adjustable (fixP)
+ extern bfd_boolean ms1_fix_adjustable PARAMS ((struct fix *));
+ 
Index: testsuite/gas/ms1/allinsn.d
===================================================================
RCS file: testsuite/gas/ms1/allinsn.d
diff -N testsuite/gas/ms1/allinsn.d
*** /dev/null	1 Jan 1970 00:00:00 -0000
--- testsuite/gas/ms1/allinsn.d	21 Jun 2005 16:44:06 -0000
***************
*** 0 ****
--- 1,130 ----
+ #as: -nosched
+ #objdump: -dr
+ #name: allinsn
+ 
+ .*: +file format .*
+ 
+ Disassembly of section .text:
+ 
+ 00000000 <add>:
+    0:	00 00 00 00 	add R0,R0,R0
+ 
+ 00000004 <addu>:
+    4:	02 00 00 00 	addu R0,R0,R0
+ 
+ 00000008 <addi>:
+    8:	01 00 00 00 	addi R0,R0,#\$0
+ 
+ 0000000c <addui>:
+    c:	03 00 00 00 	addui R0,R0,#\$0
+ 
+ 00000010 <sub>:
+   10:	04 00 00 00 	sub R0,R0,R0
+ 
+ 00000014 <subu>:
+   14:	06 00 00 00 	subu R0,R0,R0
+ 
+ 00000018 <subi>:
+   18:	05 00 00 00 	subi R0,R0,#\$0
+ 
+ 0000001c <subui>:
+   1c:	07 00 00 00 	subui R0,R0,#\$0
+ 
+ 00000020 <and>:
+   20:	10 00 00 00 	and R0,R0,R0
+ 
+ 00000024 <andi>:
+   24:	11 00 00 00 	andi R0,R0,#\$0
+ 
+ 00000028 <or>:
+   28:	12 01 00 00 	or R0,R0,R1
+ 
+ 0000002c <ori>:
+   2c:	13 00 00 00 	ori R0,R0,#\$0
+ 
+ 00000030 <xor>:
+   30:	14 00 00 00 	xor R0,R0,R0
+ 
+ 00000034 <xori>:
+   34:	15 00 00 00 	xori R0,R0,#\$0
+ 
+ 00000038 <nand>:
+   38:	16 00 00 00 	nand R0,R0,R0
+ 
+ 0000003c <nandi>:
+   3c:	17 00 00 00 	nandi R0,R0,#\$0
+ 
+ 00000040 <nor>:
+   40:	18 00 00 00 	nor R0,R0,R0
+ 
+ 00000044 <nori>:
+   44:	19 00 00 00 	nori R0,R0,#\$0
+ 
+ 00000048 <xnor>:
+   48:	1a 00 00 00 	xnor R0,R0,R0
+ 
+ 0000004c <xnori>:
+   4c:	1b 00 00 00 	xnori R0,R0,#\$0
+ 
+ 00000050 <ldui>:
+   50:	1d 00 00 00 	ldui R0,#\$0
+ 
+ 00000054 <lsl>:
+   54:	20 00 00 00 	lsl R0,R0,R0
+ 
+ 00000058 <lsli>:
+   58:	21 00 00 00 	lsli R0,R0,#\$0
+ 
+ 0000005c <lsr>:
+   5c:	22 00 00 00 	lsr R0,R0,R0
+ 
+ 00000060 <lsri>:
+   60:	23 00 00 00 	lsri R0,R0,#\$0
+ 
+ 00000064 <asr>:
+   64:	24 00 00 00 	asr R0,R0,R0
+ 
+ 00000068 <asri>:
+   68:	25 00 00 00 	asri R0,R0,#\$0
+ 
+ 0000006c <brlt>:
+   6c:	31 00 00 00 	brlt R0,R0,\$0
+ 
+ 00000070 <brle>:
+   70:	33 00 00 00 	brle R0,R0,\$0
+ 
+ 00000074 <breq>:
+   74:	35 00 00 00 	breq R0,R0,\$0
+ 
+ 00000078 <jmp>:
+   78:	37 00 00 00 	jmp \$0
+ 
+ 0000007c <jal>:
+   7c:	38 00 00 00 	jal R0,R0
+ 
+ 00000080 <ei>:
+   80:	60 00 00 00 	ei
+ 
+ 00000084 <di>:
+   84:	62 00 00 00 	di
+ 
+ 00000088 <reti>:
+   88:	66 00 00 00 	reti R0
+ 
+ 0000008c <ldw>:
+   8c:	41 00 00 00 	ldw R0,R0,#\$0
+ 
+ 00000090 <stw>:
+   90:	43 00 00 00 	stw R0,R0,#\$0
+ 
+ 00000094 <si>:
+   94:	64 00 00 00 	si R0
+ 
+ 00000098 <brne>:
+   98:	3b 00 00 00 	brne R0,R0,\$0
+ 
+ 0000009c <break>:
+   9c:	68 00 00 00 	break
+ 
+ 000000a0 <nop>:
+   a0:	12 00 00 00 	nop
Index: testsuite/gas/ms1/allinsn.s
===================================================================
RCS file: testsuite/gas/ms1/allinsn.s
diff -N testsuite/gas/ms1/allinsn.s
*** /dev/null	1 Jan 1970 00:00:00 -0000
--- testsuite/gas/ms1/allinsn.s	21 Jun 2005 16:44:07 -0000
***************
*** 0 ****
--- 1,166 ----
+  .data
+ foodata: .word 42
+  .text
+ footext:
+ 	.text
+ 	.global add
+ add:
+ 	add  R0,R0,R0
+ 	.text
+ 	.global addu
+ addu:
+ 	addu R0,R0,R0
+ 	.text
+ 	.global addi
+ addi:
+ 	addi R0,R0,#0
+ 	.text
+ 	.global addui
+ addui:
+ 	addui R0,R0,#0
+ 	.text
+ 	.global sub
+ sub:
+ 	sub R0,R0,R0
+ 	.text
+ 	.global subu
+ subu:
+ 	subu R0,R0,R0
+ 	.text
+ 	.global subi
+ subi:
+ 	subi R0,R0,#0
+ 	.text
+ 	.global subui
+ subui:
+ 	subui R0,R0,#0
+ 	.text
+ 	.global and
+ and:
+ 	and R0,R0,R0
+ 	.text
+ 	.global andi
+ andi:
+ 	andi R0,R0,#0
+ 	.text
+ 	.global or
+ or:
+ 	or R0,R0,R1
+ 	.text
+ 	.global ori
+ ori:
+ 	ori R0,R0,#0
+ 	.text
+ 	.global xor
+ xor:
+ 	xor R0,R0,R0
+ 	.text
+ 	.global xori
+ xori:
+ 	xori R0,R0,#0
+ 	.text
+ 	.global nand
+ nand:
+ 	nand R0,R0,R0
+ 	.text
+ 	.global nandi
+ nandi:
+ 	nandi R0,R0,#0
+ 	.text
+ 	.global nor
+ nor:
+ 	nor R0,R0,R0
+ 	.text
+ 	.global nori
+ nori:
+ 	nori R0,R0,#0
+ 	.text
+ 	.global xnor
+ xnor:
+ 	xnor R0,R0,R0
+ 	.text
+ 	.global xnori
+ xnori:
+ 	xnori R0,R0,#0
+ 	.text
+ 	.global ldui
+ ldui:
+ 	ldui R0,#0
+ 	.text
+ 	.global lsl
+ lsl:
+ 	lsl R0,R0,R0
+ 	.text
+ 	.global lsli
+ lsli:
+ 	lsli R0,R0,#0
+ 	.text
+ 	.global lsr
+ lsr:
+ 	lsr R0,R0,R0
+ 	.text
+ 	.global lsri
+ lsri:
+ 	lsri R0,R0,#0
+ 	.text
+ 	.global asr
+ asr:
+ 	asr R0,R0,R0
+ 	.text
+ 	.global asri
+ asri:
+ 	asri R0,R0,#0
+ 	.text
+ 	.global brlt
+ brlt:
+ 	brlt R0,R0,0
+ 	.text
+ 	.global brle
+ brle:
+ 	brle R0,R0,0
+ 	.text
+ 	.global breq
+ breq:
+ 	breq R0,R0,0
+ 	.text
+ 	.global jmp
+ jmp:
+ 	jmp 0
+ 	.text
+ 	.global jal
+ jal:
+ 	jal R0,R0
+ 	.text
+ 	.global ei
+ ei:
+ 	ei
+ 	.text
+ 	.global di
+ di:
+ 	di
+ 	.text
+ 	.global reti
+ reti:
+ 	reti R0
+ 	.text
+ 	.global ldw
+ ldw:
+ 	ldw R0,R0,#0
+ 	.text
+ 	.global stw
+ stw:
+ 	stw R0,R0,#0
+ 	.text
+ 	.global si
+ si:
+ 	si R0
+ 	.global brne
+ brne:
+ 	brne R0,R0,0
+ 	.global break
+ break:
+ 	break
+ 	.text
+ 	.global nop
+ nop:
+ 	nop
Index: testsuite/gas/ms1/badinsn.s
===================================================================
RCS file: testsuite/gas/ms1/badinsn.s
diff -N testsuite/gas/ms1/badinsn.s
*** /dev/null	1 Jan 1970 00:00:00 -0000
--- testsuite/gas/ms1/badinsn.s	21 Jun 2005 16:44:07 -0000
***************
*** 0 ****
--- 1,3 ----
+ ; Bogus instruction mnemonic should generate an error.
+ 
+ addcrap R1,R2,R3
Index: testsuite/gas/ms1/badinsn1.s
===================================================================
RCS file: testsuite/gas/ms1/badinsn1.s
diff -N testsuite/gas/ms1/badinsn1.s
*** /dev/null	1 Jan 1970 00:00:00 -0000
--- testsuite/gas/ms1/badinsn1.s	21 Jun 2005 16:44:07 -0000
***************
*** 0 ****
--- 1,3 ----
+ ; Extra operand should generate and error message.
+ 
+ add R1,R2,R3,R4
Index: testsuite/gas/ms1/badoffsethigh.s
===================================================================
RCS file: testsuite/gas/ms1/badoffsethigh.s
diff -N testsuite/gas/ms1/badoffsethigh.s
*** /dev/null	1 Jan 1970 00:00:00 -0000
--- testsuite/gas/ms1/badoffsethigh.s	21 Jun 2005 16:44:07 -0000
***************
*** 0 ****
--- 1,4 ----
+ ; Offset greater than #32767 should cause an error since the offset is 
+ ; a signed quantity.
+ 
+ brlt R1,R2,$32768
Index: testsuite/gas/ms1/badoffsetlow.s
===================================================================
RCS file: testsuite/gas/ms1/badoffsetlow.s
diff -N testsuite/gas/ms1/badoffsetlow.s
*** /dev/null	1 Jan 1970 00:00:00 -0000
--- testsuite/gas/ms1/badoffsetlow.s	21 Jun 2005 16:44:07 -0000
***************
*** 0 ****
--- 1,6 ----
+ ; Offset less than #-32786 should cause an error since the offset is
+ ; a signed quantity.  Also tests expression parsing.
+ 
+ label1: add R1,R2,R3
+ label2:	add R4,R5,R6
+ 	brlt R7,R8, ((label1-label2)-32765) ; evaluates to -32769
Index: testsuite/gas/ms1/badorder.s
===================================================================
RCS file: testsuite/gas/ms1/badorder.s
diff -N testsuite/gas/ms1/badorder.s
*** /dev/null	1 Jan 1970 00:00:00 -0000
--- testsuite/gas/ms1/badorder.s	21 Jun 2005 16:44:07 -0000
***************
*** 0 ****
--- 1,3 ----
+ ; Good operands in the wrong order should generate an error.
+ 
+ addui R1, #32 R2
Index: testsuite/gas/ms1/badreg.s
===================================================================
RCS file: testsuite/gas/ms1/badreg.s
diff -N testsuite/gas/ms1/badreg.s
*** /dev/null	1 Jan 1970 00:00:00 -0000
--- testsuite/gas/ms1/badreg.s	21 Jun 2005 16:44:07 -0000
***************
*** 0 ****
--- 1,3 ----
+ ; Bad register name should generate an error.
+ 
+ add R16,R10,R9
Index: testsuite/gas/ms1/badsignedimmhigh.s
===================================================================
RCS file: testsuite/gas/ms1/badsignedimmhigh.s
diff -N testsuite/gas/ms1/badsignedimmhigh.s
*** /dev/null	1 Jan 1970 00:00:00 -0000
--- testsuite/gas/ms1/badsignedimmhigh.s	21 Jun 2005 16:44:07 -0000
***************
*** 0 ****
--- 1,3 ----
+ ; Offset greater than #32767 should cause an error.
+ 
+ addi R1,R2,#32768
Index: testsuite/gas/ms1/badsignedimmlow.s
===================================================================
RCS file: testsuite/gas/ms1/badsignedimmlow.s
diff -N testsuite/gas/ms1/badsignedimmlow.s
*** /dev/null	1 Jan 1970 00:00:00 -0000
--- testsuite/gas/ms1/badsignedimmlow.s	21 Jun 2005 16:44:07 -0000
***************
*** 0 ****
--- 1,3 ----
+ ; Immediate lower than #-32769 should cause an error.
+ 
+ addi R1,R2,#-32769
Index: testsuite/gas/ms1/badsyntax.s
===================================================================
RCS file: testsuite/gas/ms1/badsyntax.s
diff -N testsuite/gas/ms1/badsyntax.s
*** /dev/null	1 Jan 1970 00:00:00 -0000
--- testsuite/gas/ms1/badsyntax.s	21 Jun 2005 16:44:07 -0000
***************
*** 0 ****
--- 1,3 ----
+ ; Good mnemonic with wrong operands should generate an error.
+ 
+ add R1,R2,#0
Index: testsuite/gas/ms1/badsyntax1.s
===================================================================
RCS file: testsuite/gas/ms1/badsyntax1.s
diff -N testsuite/gas/ms1/badsyntax1.s
*** /dev/null	1 Jan 1970 00:00:00 -0000
--- testsuite/gas/ms1/badsyntax1.s	21 Jun 2005 16:44:07 -0000
***************
*** 0 ****
--- 1,3 ----
+ ; Good mnemonic with too few operands should generate an error.
+ 
+ add R1,R2
Index: testsuite/gas/ms1/badunsignedimmhigh.s
===================================================================
RCS file: testsuite/gas/ms1/badunsignedimmhigh.s
diff -N testsuite/gas/ms1/badunsignedimmhigh.s
*** /dev/null	1 Jan 1970 00:00:00 -0000
--- testsuite/gas/ms1/badunsignedimmhigh.s	21 Jun 2005 16:44:07 -0000
***************
*** 0 ****
--- 1,3 ----
+ ; Offset greater than #$FFFF should cause an error.
+ 
+ andi R1,R2,#$10000
Index: testsuite/gas/ms1/badunsignedimmlow.s
===================================================================
RCS file: testsuite/gas/ms1/badunsignedimmlow.s
diff -N testsuite/gas/ms1/badunsignedimmlow.s
*** /dev/null	1 Jan 1970 00:00:00 -0000
--- testsuite/gas/ms1/badunsignedimmlow.s	21 Jun 2005 16:44:07 -0000
***************
*** 0 ****
--- 1,3 ----
+ ; Offset less than #0 should cause an error.
+ 
+ andi R1,R2,#-1
Index: testsuite/gas/ms1/errors.exp
===================================================================
RCS file: testsuite/gas/ms1/errors.exp
diff -N testsuite/gas/ms1/errors.exp
*** /dev/null	1 Jan 1970 00:00:00 -0000
--- testsuite/gas/ms1/errors.exp	21 Jun 2005 16:44:07 -0000
***************
*** 0 ****
--- 1,79 ----
+ # Test for error messages when a bad register name, an out of range operand, or 
+ # invalid syntax is used.  Adapted from Ben Elliston's load-hazard testcase.
+ 
+ # Run GAS and check that it emits the desired error for the test case.
+ # Arguments:
+ #   file -- name of the test case to assemble.
+ #   testname -- a string describing the test.
+ #   warnpattern -- a regular expression, suitable for use by the Tcl
+ #     regexp command, to decide if the warning string was emitted by
+ #     the assembler to stderr.
+ 
+ proc mrisc1_error_test { file testname {warnpattern ""} } {
+     global comp_output
+ 
+     gas_run $file "" ">/dev/null"
+     verbose "output was $comp_output" 2
+ 
+     if {$warnpattern == ""} {
+ 	if {$comp_output == ""} { pass $testname } else { fail $testname }
+ 	return
+     }
+ 
+     if {[regexp "Error: $warnpattern" $comp_output]} {
+ 	pass $testname
+     } else {
+ 	fail $testname
+     }
+ }
+ 
+ if [istarget mrisc1*-*-*] {
+     foreach file [glob -nocomplain -- $srcdir/$subdir/bad*.s] {
+ 	set file [file tail $file]
+ 	switch -- $file {
+ 	    "badreg.s" {
+ 		set warnpattern "unrecognized keyword/register name *"
+ 	    }
+ 	    "badorder.s" {
+ 		set warnpattern "unrecognized form of instruction*"
+ 	    }
+ 	    "badsyntax.s" {
+ 		set warnpattern "unrecognized keyword/register name *"
+ 	    }
+ 	    "badsyntax1.s" {
+ 		set warnpattern "unrecognized form of instruction*"
+ 	    }
+ 	    "badoffsethigh.s" {
+ 		set warnpattern "Operand out of range. Must be between -32768 and 32767.*"
+ 	    }
+ 	    "badoffsetlow.s" {
+ 		set warnpattern "Operand out of range. Must be between -32768 and 32767.*"
+ 	    }
+ 	    "badunsignedimmhigh.s" {
+ 		set warnpattern "operand out of range (65536 not between 0 and 65535)*"
+ 	    }
+ 	    "badunsignedimmlow.s" {
+ 		set warnpattern "operand out of range (65536 not between 0 and 65535)*"
+ 	    }
+ 	    "badsignedimmhigh.s" {
+ 		set warnpattern "operand out of range.*"
+ 	    }
+ 	    "badsignedimmlow.s" {
+ 		set warnpattern "operand out of range.*"
+ 	    }
+ 	    "badinsn.s" {
+ 		set warnpattern "unrecognized instruction *"
+ 	    }
+ 	    "badinsn1.s" {
+ 		set warnpattern "junk at end of line *"
+ 	    }
+             default {
+                 error "no expected result specified for $file"
+                 return
+ 
+ 	    }
+ 	}
+ 	mrisc1_error_test $file "assembler emits error for $file" $warnpattern
+     }
+ 
+ }
Index: testsuite/gas/ms1/ldst.s
===================================================================
RCS file: testsuite/gas/ms1/ldst.s
diff -N testsuite/gas/ms1/ldst.s
*** /dev/null	1 Jan 1970 00:00:00 -0000
--- testsuite/gas/ms1/ldst.s	21 Jun 2005 16:44:07 -0000
***************
*** 0 ****
--- 1,28 ----
+ ; load/store tests
+ 
+ 	.data
+ 
+ ldw_data:
+ 	.word 0xbabeface
+ 
+ 	.text
+ 
+ ld_text:
+ 	ld	r4, r3
+ 	ld	r3, #8
+ 	ld	r5, #ld_text
+ 	ldh	r6, #ldh_text
+ 	ldh	r4, #4000
+ 	ldh	r5, #0x8000
+ 	ldh	r5, #-5
+ 	ldh	r5, #-0x8000
+ 	ldh	r0, #0xffff
+ ldh_text:
+ 	ldw	r9, #30233000
+ 	ldw	r3, #ldw_data
+ 	ldb	r3, @[r9+r2]
+ 	ldb	@[r9+r3], r5	; store
+ 	ldb	r3, @[r8+6]
+ 	ldb	@[r8+7], r3	; store
+ 	ldw	r9, @[r14+23]
+ 	ldw	@[r14+10], r9	; store
Index: testsuite/gas/ms1/misc.d
===================================================================
RCS file: testsuite/gas/ms1/misc.d
diff -N testsuite/gas/ms1/misc.d
*** /dev/null	1 Jan 1970 00:00:00 -0000
--- testsuite/gas/ms1/misc.d	21 Jun 2005 16:44:07 -0000
***************
*** 0 ****
--- 1,21 ----
+ #as:
+ #objdump: -dr
+ #name: misc
+ 
+ .*: +file format .*
+ 
+ Disassembly of section .text:
+ 
+ 00000000 <.text>:
+    0:	00 12 00 00 	add R0,R1,R2
+    4:	00 12 00 00 	add R0,R1,R2
+    8:	00 23 10 00 	add R1,R2,R3
+    c:	00 33 10 00 	add R1,R3,R3
+   10:	00 56 40 00 	add R4,R5,R6
+   14:	00 89 70 00 	add R7,R8,R9
+   18:	00 bc a0 00 	add R10,R11,R12
+   1c:	00 ef d0 00 	add R13,R14,R15
+   20:	03 dc 00 01 	addui R12,R13,#\$1
+   24:	03 fe 00 01 	addui R14,R15,#\$1
+   28:	03 10 00 00 	addui R0,R1,#\$0
+   2c:	03 10 ff ff 	addui R0,R1,#\$ffff
Index: testsuite/gas/ms1/misc.s
===================================================================
RCS file: testsuite/gas/ms1/misc.s
diff -N testsuite/gas/ms1/misc.s
*** /dev/null	1 Jan 1970 00:00:00 -0000
--- testsuite/gas/ms1/misc.s	21 Jun 2005 16:44:07 -0000
***************
*** 0 ****
--- 1,21 ----
+ ; Check that register names, both upper and lower case work and that
+ ; the spacing between the operands doesn't matter.
+ 
+ add R0,R1,R2
+ add r0,r1,r2
+ add R1,R2,r3
+ add R1, R3, r3
+ add R4,R5,R6
+ add R7,R8,R9
+ add R10,R11,R12
+ add R13,R14,R15
+ addui fp,sp,#1
+ addui ra,ira,#1
+ 
+ ; Check that the range of legal operand values is accepted.
+ 
+ addui R0,R1,#0
+ addui R0,R1,#$FFFF
+ 
+ 
+ 
Index: testsuite/gas/ms1/ms1-16-003.d
===================================================================
RCS file: testsuite/gas/ms1/ms1-16-003.d
diff -N testsuite/gas/ms1/ms1-16-003.d
*** /dev/null	1 Jan 1970 00:00:00 -0000
--- testsuite/gas/ms1/ms1-16-003.d	21 Jun 2005 16:44:07 -0000
***************
*** 0 ****
--- 1,33 ----
+ #as: -march=ms1-16-003
+ #objdump: -dr
+ #name: ms1-16-003
+ 
+ .*: +file format .*
+ 
+ Disassembly of section .text:
+ 
+ 00000000 <iflush>:
+    0:	6a 00 00 00 	iflush
+ 00000004 <mul>:
+    4:	08 00 00 00 	mul R0,R0,R0
+ 00000008 <muli>:
+    8:	09 00 00 00 	muli R0,R0,#\$0
+ 0000000c <dbnz>:
+    c:	3d 00 00 00 	dbnz R0,\$0
+ [ 	]*c: R_MS1_PC16	dbnz
+ 00000010 <fbcbincs>:
+   10:	f0 00 00 00 	fbcbincs #\$0,#\$0,#\$0,#\$0,#\$0,#\$0,#\$0,#\$0,#\$0,#\$0
+ 00000014 <mfbcbincs>:
+   14:	f4 00 00 00 	mfbcbincs R0,#\$0,#\$0,#\$0,#\$0,#\$0,#\$0,#\$0,#\$0
+ 00000018 <fbcbincrs>:
+   18:	f8 00 00 00 	fbcbincrs R0,#\$0,#\$0,#\$0,#\$0,#\$0,#\$0,#\$0,#\$0,#\$0
+ 0000001c <mfbcbincrs>:
+   1c:	fc 00 00 00 	mfbcbincrs R0,R0,#\$0,#\$0,#\$0,#\$0,#\$0,#\$0,#\$0
+ 00000020 <wfbinc>:
+   20:	e0 00 00 00 	wfbinc #\$0,#\$0,#\$0,#\$0,#\$0,#\$0,#\$0,#\$0,#\$0,#\$0
+ 00000024 <mwfbinc>:
+   24:	e4 00 00 00 	mwfbinc R0,#\$0,#\$0,#\$0,#\$0,#\$0,#\$0,#\$0,#\$0
+ 00000028 <wfbincr>:
+   28:	e8 00 00 00 	wfbincr R0,#\$0,#\$0,#\$0,#\$0,#\$0,#\$0,#\$0,#\$0,#\$0
+ 0000002c <mwfbincr>:
+   2c:	ec 00 00 00 	mwfbincr R0,R0,#\$0,#\$0,#\$0,#\$0,#\$0,#\$0,#\$0
Index: testsuite/gas/ms1/ms1-16-003.s
===================================================================
RCS file: testsuite/gas/ms1/ms1-16-003.s
diff -N testsuite/gas/ms1/ms1-16-003.s
*** /dev/null	1 Jan 1970 00:00:00 -0000
--- testsuite/gas/ms1/ms1-16-003.s	21 Jun 2005 16:44:07 -0000
***************
*** 0 ****
--- 1,54 ----
+ 	.text
+ 	.global iflush
+ iflush:
+ 	iflush
+ 
+ 	.global mul
+ mul:
+ 	mul R0, R0, R0
+ 	
+ 	.global muli
+ muli:
+ 	muli R0, R0, #0
+ 
+ 	.global dbnz
+ dbnz:
+ 	dbnz	r0, dbnz
+ 
+ 	.global fbcbincs
+ fbcbincs:
+ 	fbcbincs #0, #0, #0, #0, #0, #0, #0, #0, #0, #0
+ 
+ 	.global mfbcbincs
+ mfbcbincs:
+ 	mfbcbincs r0, #0, #0, #0, #0, #0, #0, #0, #0
+ 
+ 	
+ 	.global fbcbincrs
+ fbcbincrs:
+ 	fbcbincrs r0, #0, #0, #0, #0, #0, #0, #0, #0, #0
+ 
+ 	.global mfbcbincrs
+ mfbcbincrs:
+ 	mfbcbincrs r0, r0, #0, #0, #0, #0, #0, #0, #0
+ 	
+ 	
+ 	.global wfbinc
+ wfbinc:
+ # Documentation error.
+ #	wfbinc #0, r0, #0, #0, #0, #0, #0, #0, #0, #0
+ 	wfbinc #0, #0, #0, #0, #0, #0, #0, #0, #0, #0
+ 
+ 	.global mwfbinc
+ mwfbinc:
+ # Documentation error.
+ #	mwfbinc r0, #0, #0, r0, #0, #0, #0, #0, #0
+ 	mwfbinc r0, #0, #0, #0, #0, #0, #0, #0, #0
+ 
+ 	.global wfbincr
+ wfbincr:
+ 	wfbincr r0, #0, #0, #0, #0, #0, #0, #0, #0, #0
+ 
+ 	.global mwfbincr
+ mwfbincr:
+ 	mwfbincr r0, r0, #0, #0, #0, #0, #0, #0, #0
Index: testsuite/gas/ms1/ms1.exp
===================================================================
RCS file: testsuite/gas/ms1/ms1.exp
diff -N testsuite/gas/ms1/ms1.exp
*** /dev/null	1 Jan 1970 00:00:00 -0000
--- testsuite/gas/ms1/ms1.exp	21 Jun 2005 16:44:07 -0000
***************
*** 0 ****
--- 1,10 ----
+ # MRISC1 assembler testsuite.
+ 
+ if { [istarget mrisc1*-*-*] || [istarget ms1-*-*]} then {
+     #
+     run_dump_test "allinsn"
+     run_dump_test "misc"
+     run_dump_test "msys"
+     run_dump_test "ms1-16-003"
+     #
+ }
Index: testsuite/gas/ms1/msys.d
===================================================================
RCS file: testsuite/gas/ms1/msys.d
diff -N testsuite/gas/ms1/msys.d
*** /dev/null	1 Jan 1970 00:00:00 -0000
--- testsuite/gas/ms1/msys.d	21 Jun 2005 16:44:07 -0000
***************
*** 0 ****
--- 1,78 ----
+ #as: -nosched
+ #objdump: -dr
+ #name: msys 
+ 
+ .*: +file format .*
+ 
+ Disassembly of section .text:
+ 
+ 00000000 <.text>:
+    0:	80 00 00 00 	ldctxt R0,R0,#\$0,#\$0,#\$0
+    4:	84 00 00 00 	ldfb R0,R0,#\$0
+    8:	88 00 00 00 	stfb R0,R0,#\$0
+    c:	8c 00 00 00 	fbcb R0,#\$0,#\$0,#\$0,#\$0,#\$0,#\$0,#\$0,#\$0
+   10:	90 00 00 00 	mfbcb R0,#\$0,R0,#\$0,#\$0,#\$0,#\$0,#\$0
+   14:	94 00 00 00 	fbcci R0,#\$0,#\$0,#\$0,#\$0,#\$0,#\$0,#\$0
+   18:	98 00 00 00 	fbrci R0,#\$0,#\$0,#\$0,#\$0,#\$0,#\$0,#\$0
+   1c:	9c 00 00 00 	fbcri R0,#\$0,#\$0,#\$0,#\$0,#\$0,#\$0,#\$0
+   20:	a0 00 00 00 	fbrri R0,#\$0,#\$0,#\$0,#\$0,#\$0,#\$0,#\$0
+   24:	a4 00 00 00 	mfbcci R0,#\$0,R0,#\$0,#\$0,#\$0,#\$0
+   28:	a8 00 00 00 	mfbrci R0,#\$0,R0,#\$0,#\$0,#\$0,#\$0
+   2c:	ac 00 00 00 	mfbcri R0,#\$0,R0,#\$0,#\$0,#\$0,#\$0
+   30:	b0 00 00 00 	mfbrri R0,#\$0,R0,#\$0,#\$0,#\$0,#\$0
+   34:	b4 00 00 00 	fbcbdr R0,#\$0,R0,#\$0,#\$0,#\$0,#\$0,#\$0,#\$0,#\$0
+   38:	b8 00 00 00 	rcfbcb #\$0,#\$0,#\$0,#\$0,#\$0,#\$0,#\$0,#\$0,#\$0,#\$0
+   3c:	bc 00 00 00 	mrcfbcb R0,#\$0,#\$0,#\$0,#\$0,#\$0,#\$0,#\$0,#\$0
+   40:	c0 00 00 00 	cbcast #\$0,#\$0,#\$0
+   44:	c4 00 00 00 	dupcbcast #\$0,#\$0,#\$0,#\$0
+   48:	c8 00 00 00 	wfbi #\$0,#\$0,#\$0,#\$0,#\$0
+   4c:	cc 00 00 00 	wfb R0,R0,#\$0,#\$0,#\$0
+   50:	d0 00 00 00 	rcrisc R0,#\$0,R0,#\$0,#\$0,#\$0,#\$0,#\$0,#\$0
+   54:	d4 00 00 00 	fbcbinc R0,#\$0,#\$0,#\$0,#\$0,#\$0,#\$0,#\$0
+   58:	d8 00 00 00 	rcxmode R0,#\$0,#\$0,#\$0,#\$0,#\$0,#\$0,#\$0,#\$0
+   5c:	64 00 e0 00 	si R14
+   60:	b4 00 00 40 	fbcbdr R0,#\$0,R0,#\$0,#\$0,#\$0,#\$0,#\$0,#\$1,#\$0
+   64:	b4 00 00 00 	fbcbdr R0,#\$0,R0,#\$0,#\$0,#\$0,#\$0,#\$0,#\$0,#\$0
+   68:	b4 00 00 40 	fbcbdr R0,#\$0,R0,#\$0,#\$0,#\$0,#\$0,#\$0,#\$1,#\$0
+   6c:	b4 00 00 00 	fbcbdr R0,#\$0,R0,#\$0,#\$0,#\$0,#\$0,#\$0,#\$0,#\$0
+   70:	64 00 e0 00 	si R14
+   74:	b8 08 00 00 	rcfbcb #\$0,#\$0,#\$1,#\$0,#\$0,#\$0,#\$0,#\$0,#\$0,#\$0
+   78:	b8 00 00 00 	rcfbcb #\$0,#\$0,#\$0,#\$0,#\$0,#\$0,#\$0,#\$0,#\$0,#\$0
+   7c:	b8 08 00 00 	rcfbcb #\$0,#\$0,#\$1,#\$0,#\$0,#\$0,#\$0,#\$0,#\$0,#\$0
+   80:	b8 00 00 00 	rcfbcb #\$0,#\$0,#\$0,#\$0,#\$0,#\$0,#\$0,#\$0,#\$0,#\$0
+   84:	64 00 e0 00 	si R14
+   88:	bc 20 00 00 	mrcfbcb R0,#\$0,#\$2,#\$0,#\$0,#\$0,#\$0,#\$0,#\$0
+   8c:	bc 10 00 00 	mrcfbcb R0,#\$0,#\$1,#\$0,#\$0,#\$0,#\$0,#\$0,#\$0
+   90:	bc 00 00 00 	mrcfbcb R0,#\$0,#\$0,#\$0,#\$0,#\$0,#\$0,#\$0,#\$0
+   94:	bc 20 00 00 	mrcfbcb R0,#\$0,#\$2,#\$0,#\$0,#\$0,#\$0,#\$0,#\$0
+   98:	bc 10 00 00 	mrcfbcb R0,#\$0,#\$1,#\$0,#\$0,#\$0,#\$0,#\$0,#\$0
+   9c:	bc 00 00 00 	mrcfbcb R0,#\$0,#\$0,#\$0,#\$0,#\$0,#\$0,#\$0,#\$0
+   a0:	64 00 e0 00 	si R14
+   a4:	d8 80 00 00 	rcxmode R0,#\$0,#\$0,#\$1,#\$0,#\$0,#\$0,#\$0,#\$0
+   a8:	d8 00 00 00 	rcxmode R0,#\$0,#\$0,#\$0,#\$0,#\$0,#\$0,#\$0,#\$0
+   ac:	d8 80 00 00 	rcxmode R0,#\$0,#\$0,#\$1,#\$0,#\$0,#\$0,#\$0,#\$0
+   b0:	d8 00 00 00 	rcxmode R0,#\$0,#\$0,#\$0,#\$0,#\$0,#\$0,#\$0,#\$0
+   b4:	64 00 e0 00 	si R14
+   b8:	80 00 80 00 	ldctxt R0,R0,#\$1,#\$0,#\$0
+   bc:	80 00 00 00 	ldctxt R0,R0,#\$0,#\$0,#\$0
+   c0:	80 00 80 00 	ldctxt R0,R0,#\$1,#\$0,#\$0
+   c4:	80 00 00 00 	ldctxt R0,R0,#\$0,#\$0,#\$0
+   c8:	8c 00 08 00 	fbcb R0,#\$0,#\$0,#\$0,#\$1,#\$0,#\$0,#\$0,#\$0
+   cc:	8c 00 00 00 	fbcb R0,#\$0,#\$0,#\$0,#\$0,#\$0,#\$0,#\$0,#\$0
+   d0:	c0 00 00 40 	cbcast #\$0,#\$1,#\$0
+   d4:	c0 00 00 00 	cbcast #\$0,#\$0,#\$0
+   d8:	64 00 e0 00 	si R14
+   dc:	8c 00 04 00 	fbcb R0,#\$0,#\$0,#\$0,#\$0,#\$1,#\$0,#\$0,#\$0
+   e0:	8c 00 00 00 	fbcb R0,#\$0,#\$0,#\$0,#\$0,#\$0,#\$0,#\$0,#\$0
+   e4:	8c 00 04 00 	fbcb R0,#\$0,#\$0,#\$0,#\$0,#\$1,#\$0,#\$0,#\$0
+   e8:	8c 00 00 00 	fbcb R0,#\$0,#\$0,#\$0,#\$0,#\$0,#\$0,#\$0,#\$0
+   ec:	64 00 e0 00 	si R14
+   f0:	8f 00 00 00 	fbcb R0,#\$3,#\$0,#\$0,#\$0,#\$0,#\$0,#\$0,#\$0
+   f4:	8e 00 00 00 	fbcb R0,#\$2,#\$0,#\$0,#\$0,#\$0,#\$0,#\$0,#\$0
+   f8:	8d 00 00 00 	fbcb R0,#\$1,#\$0,#\$0,#\$0,#\$0,#\$0,#\$0,#\$0
+   fc:	8c 00 00 00 	fbcb R0,#\$0,#\$0,#\$0,#\$0,#\$0,#\$0,#\$0,#\$0
+  100:	8f 00 00 00 	fbcb R0,#\$3,#\$0,#\$0,#\$0,#\$0,#\$0,#\$0,#\$0
+  104:	8e 00 00 00 	fbcb R0,#\$2,#\$0,#\$0,#\$0,#\$0,#\$0,#\$0,#\$0
+  108:	8d 00 00 00 	fbcb R0,#\$1,#\$0,#\$0,#\$0,#\$0,#\$0,#\$0,#\$0
+  10c:	8c 00 00 00 	fbcb R0,#\$0,#\$0,#\$0,#\$0,#\$0,#\$0,#\$0,#\$0
+  110:	dc 00 00 00 	intlvr R0,#\$0,R0,#\$0,#\$0
Index: testsuite/gas/ms1/msys.s
===================================================================
RCS file: testsuite/gas/ms1/msys.s
diff -N testsuite/gas/ms1/msys.s
*** /dev/null	1 Jan 1970 00:00:00 -0000
--- testsuite/gas/ms1/msys.s	21 Jun 2005 16:44:07 -0000
***************
*** 0 ****
--- 1,95 ----
+ ;; This file is a set of tests for the MorphoySys instructions.
+ 
+ ; Make sure that each mnemonic gives the proper opcode.  Use R0 and #0
+ ; for all operands so that everything but the opcode will be 0 in the
+ ; assembled instructions.
+ 
+ 	ldctxt R0,R0,#0,#0,#0
+ 	ldfb R0,R0,#0
+ 	stfb R0, R0, #0
+ 	fbcb R0,#0,#0,#0,#0,#0,#0,#0,#0
+ 	mfbcb R0,#0,R0,#0,#0,#0,#0,#0
+ 	fbcci R0,#0,#0,#0,#0,#0,#0,#0
+ 	fbrci R0,#0,#0,#0,#0,#0,#0,#0
+ 	fbcri R0,#0,#0,#0,#0,#0,#0,#0
+ 	fbrri R0,#0,#0,#0,#0,#0,#0,#0
+ 	mfbcci R0,#0,R0,#0,#0,#0,#0
+ 	mfbrci R0,#0,R0,#0,#0,#0,#0
+ 	mfbcri R0,#0,R0,#0,#0,#0,#0
+ 	mfbrri R0,#0,R0,#0,#0,#0,#0
+ 	fbcbdr R0,#0,R0,#0,#0,#0,#0,#0,#0,#0
+ 	rcfbcb #0,#0,#0,#0,#0,#0,#0,#0,#0,#0
+ 	mrcfbcb R0,#0,#0,#0,#0,#0,#0,#0,#0
+ 	cbcast #0,#0,#0
+ 	dupcbcast #0,#0,#0,#0
+ 	wfbi #0,#0,#0,#0,#0
+ 	wfb R0,R0,#0,#0,#0
+ 	rcrisc R0,#0,R0,#0,#0,#0,#0,#0,#0
+ 	fbcbinc R0, #0, #0, #0, #0, #0, #0, #0
+ 	rcxmode R0, #0, #0, #0, #0, #0, #0, #0, #0
+ 
+ ; Check to make sure that the parse routines that allow predifined 
+ ; symbols (uppaer and lower case) to be used for some of the operands.
+ 
+ ; dup operand: dup, xx
+ 	si R14
+ 	fbcbdr R0,#0,R0,#0,#0,#0,#0,#0,#dup,#0  ; dup = 1
+ 	fbcbdr R0,#0,R0,#0,#0,#0,#0,#0,#xx,#0   ; xx = 0
+ 	fbcbdr R0,#0,R0,#0,#0,#0,#0,#0,#DUP,#0 
+ 	fbcbdr R0,#0,R0,#0,#0,#0,#0,#0,#XX,#0   
+ 
+ ; ball operand: all, one
+ 	si R14
+ 	rcfbcb #0,#0,#all,#0,#0,#0,#0,#0,#0,#0  ; all = 1
+ 	rcfbcb #0,#0,#one,#0,#0,#0,#0,#0,#0,#0  ; one = 0
+ 	rcfbcb #0,#0,#ALL,#0,#0,#0,#0,#0,#0,#0  
+ 	rcfbcb #0,#0,#ONE,#0,#0,#0,#0,#0,#0,#0  
+ 
+ ; type operand: odd, even, oe 
+ 	si R14
+ 	mrcfbcb R0,#0,#oe,#0,#0,#0,#0,#0,#0     ; oe = 2
+ 	mrcfbcb R0,#0,#even,#0,#0,#0,#0,#0,#0   ; even = 1
+ 	mrcfbcb R0,#0,#odd,#0,#0,#0,#0,#0,#0    ; odd = 0
+ 	mrcfbcb R0,#0,#OE,#0,#0,#0,#0,#0,#0    
+ 	mrcfbcb R0,#0,#EVEN,#0,#0,#0,#0,#0,#0   
+ 	mrcfbcb R0,#0,#ODD,#0,#0,#0,#0,#0,#0    
+ 
+ ; xmode operand: pm, xm
+ 	si R14
+ 	rcxmode R0, #0, #0, #pm, #0, #0, #0, #0, #0  ; pm = 1
+ 	rcxmode R0, #0, #0, #xm, #0, #0, #0, #0, #0  ; xm = 0
+ 	rcxmode R0, #0, #0, #PM, #0, #0, #0, #0, #0  
+ 	rcxmode R0, #0, #0, #XM, #0, #0, #0, #0, #0 
+ 
+ ; rc, rc1, rc2 operands: r,c
+ 	si R14
+         ldctxt R0,R0,#r,#0,#0            ; rc operand.  r = 1 
+         ldctxt R0,R0,#c,#0,#0            ; rc operand.  c = 0 
+         ldctxt R0,R0,#R,#0,#0            
+         ldctxt R0,R0,#C,#0,#0           
+       
+ 	fbcb R0,#0,#0,#0,#r,#0,#0,#0,#0  ; rc1 operand.  r = 1
+ 	fbcb R0,#0,#0,#0,#c,#0,#0,#0,#0  ; rc1 operand.  c = 0
+ 
+ 	cbcast #0,#r,#0                  ; rc2 operand.  r = 1
+ 	cbcast #0,#c,#0                  ; rc2 opearnd.  c = 0
+ 
+ ; cbrb operand: cb, rb
+ 	si R14
+ 	fbcb R0,#0,#0,#0,#0,#rb,#0,#0,#0  ; rb = 1
+ 	fbcb R0,#0,#0,#0,#0,#cb,#0,#0,#0  ; cb = 0
+ 	fbcb R0,#0,#0,#0,#0,#RB,#0,#0,#0 
+ 	fbcb R0,#0,#0,#0,#0,#CB,#0,#0,#0  
+ 
+ ; rbbc operand: rt, br1, br2, cs
+ 	si R14
+ 	fbcb R0,#cs,#0,#0,#0,#0,#0,#0,#0   ; cs = 3
+ 	fbcb R0,#br2,#0,#0,#0,#0,#0,#0,#0  ; br2 = 2
+ 	fbcb R0,#br1,#0,#0,#0,#0,#0,#0,#0  ; br1 = 1
+ 	fbcb R0,#rt,#0,#0,#0,#cb,#0,#0,#0  ; rt = 0
+ 	fbcb R0,#CS,#0,#0,#0,#0,#0,#0,#0  
+ 	fbcb R0,#BR2,#0,#0,#0,#0,#0,#0,#0  
+ 	fbcb R0,#BR1,#0,#0,#0,#0,#0,#0,#0  
+ 	fbcb R0,#RT,#0,#0,#0,#cb,#0,#0,#0  
+ 
+ 	intlvr R0, #0, R0, #0, #0
Index: testsuite/gas/ms1/relocs.d
===================================================================
RCS file: testsuite/gas/ms1/relocs.d
diff -N testsuite/gas/ms1/relocs.d
*** /dev/null	1 Jan 1970 00:00:00 -0000
--- testsuite/gas/ms1/relocs.d	21 Jun 2005 16:44:07 -0000
***************
*** 0 ****
--- 1,67 ----
+ 
+ relocs.x:     file format elf32-mrisc1
+ 
+ Contents of section .text:
+  2000 00131000 37000004 12000000 3700fff8  ....7.......7...
+  2010 03210000 03212215 03210001 03210000  .!...!"..!...!..
+  2020 0321ffff 0321eeee 03210005 03210006  .!...!...!...!..
+  2030 00675000                             .gP.            
+ Contents of section .data:
+  2134 0f000000 00000000 00000000 00000000  ................
+  2144 00000000 00000000 00000000 00000000  ................
+  2154 00000000 00000000 00000000 00000000  ................
+  2164 00000000 00000000 00000000 00000000  ................
+  2174 00000000 00000000 00000000 00000000  ................
+  2184 00000000 00000000 00000000 00000000  ................
+  2194 00000000 00000000 00000000 00000000  ................
+  21a4 00000000 00000000 00000000 00000000  ................
+  21b4 00000000 00000000 00000000 00000000  ................
+  21c4 00000000 00000000 00000000 00000000  ................
+  21d4 00000000 00000000 00000000 00000000  ................
+  21e4 00000000 00000000 00000000 00000000  ................
+  21f4 00000000 00000000 00000000 00000000  ................
+  2204 00000000 00000000 00000000 00000000  ................
+  2214 00020000 00000000 00000000 00000000  ................
+  2224 00000000 00000000 00000000 00000000  ................
+  2234 00000000 00000000 00000000 00000000  ................
+  2244 00000000 00000000 00000000 00000000  ................
+  2254 00000000 00000000 00000000 00000000  ................
+  2264 00000000 00000000 00000000 00000000  ................
+  2274 00000000 00000000 00000000 00000000  ................
+  2284 00000000 00000000 00000000 00000000  ................
+  2294 00000000 00000000 00000000 00000000  ................
+  22a4 00000000 00000000 00000000 00000000  ................
+  22b4 00000000 00000000 00000000 00000000  ................
+  22c4 00000000 00000000 00000000 00000000  ................
+  22d4 00000000 00000000 00000000 00000000  ................
+  22e4 00000000 00000000 00000000 00000000  ................
+  22f4 00000000 00000000 00000000 00000000  ................
+  2304 00000000 00000000 00000000 00000000  ................
+  2314 000003                               ...             
+ Contents of section .sbss:
+ Disassembly of section .text:
+ 
+ 00002000 <_start>:
+     2000:	00 13 10 00 	add R1,R1,R3
+ 
+ 00002004 <local>:
+     2004:	37 00 00 04 	jmp \$4
+ 
+ 00002008 <none>:
+     2008:	12 00 00 00 	or R0,R0,R0
+     200c:	37 00 ff f8 	jmp \$fffffff8
+     2010:	03 21 00 00 	addui R1,R2,#\$0
+     2014:	03 21 22 15 	addui R1,R2,#\$2215
+     2018:	03 21 00 01 	addui R1,R2,#\$1
+     201c:	03 21 00 00 	addui R1,R2,#\$0
+     2020:	03 21 ff ff 	addui R1,R2,#\$ffff
+     2024:	03 21 ee ee 	addui R1,R2,#\$eeee
+ 
+ 00002028 <dummy1>:
+     2028:	03 21 00 05 	addui R1,R2,#\$5
+ 
+ 0000202c <dummy2>:
+     202c:	03 21 00 06 	addui R1,R2,#\$6
+ 
+ 00002030 <i2>:
+     2030:	00 67 50 00 	add R5,R6,R7
Index: testsuite/gas/ms1/relocs.exp
===================================================================
RCS file: testsuite/gas/ms1/relocs.exp
diff -N testsuite/gas/ms1/relocs.exp
*** /dev/null	1 Jan 1970 00:00:00 -0000
--- testsuite/gas/ms1/relocs.exp	21 Jun 2005 16:44:07 -0000
***************
*** 0 ****
--- 1,35 ----
+ # Relocation test.
+ # This test is special because it exercises the linker's 
+ 
+ proc ld_test { objects ldflags dest test } {
+     set ld_output [target_link $objects $dest $ldflags]
+     if [string match "" $ld_output] then { pass $test } else { fail $test }
+ }
+ 
+ 
+ proc objdump_test { exec flags dest test } {
+     set objcopy [find_binutils_prog objdump]
+     verbose -log "$objcopy $flags $exec > $dest"
+     catch "exec $objcopy $flags $exec > $dest" objdump_output
+     if [string match "" $objdump_output] then { pass $test } else { fail $test }
+ }
+ 
+ proc regexp_test { file1 file2 test } {
+     if [regexp_diff $file1 $file2] then { fail $test } else { pass $test }
+ }
+ 
+ 
+ global srcdir subdir
+ if [istarget mrisc1*-*-* || istarget ms1-*] {
+     gas_test "relocs1.s" {-o relocs1.o} {} {assembling relocs1}
+ 
+     #    gas_test "relocs2.s" {-o relocs2.o} {} {assembling relocs2}
+     #    ld_test {relocs1.o relocs2.o} {} {relocs.x} {linking relocs.x}
+     #    objdump_test {relocs.x} {-ds} {relocs.dump} {disassembling relocs.x}
+     #    regexp_test {relocs.dump} "$srcdir/$subdir/relocs.d" {matching disassembly}
+ 
+     gas_test "relocs2.s" {-o relocs2.o} {} {assembling relocs2}
+     ld_test {relocs1.o relocs2.o} {} {relocs.x} {linking relocs.x}
+     objdump_test {relocs.x} {-ds} {relocs.dump} {disassembling relocs.x}
+     regexp_test {relocs.dump} "$srcdir/$subdir/relocs.d" {matching disassembly}
+ }
Index: testsuite/gas/ms1/relocs1.s
===================================================================
RCS file: testsuite/gas/ms1/relocs1.s
diff -N testsuite/gas/ms1/relocs1.s
*** /dev/null	1 Jan 1970 00:00:00 -0000
--- testsuite/gas/ms1/relocs1.s	21 Jun 2005 16:44:07 -0000
***************
*** 0 ****
--- 1,31 ----
+ ;; This test is meant to exercise every unusual reloc supported
+ ;; by the mrisc port.  (Ok, so there's only one so far.  :P)
+ 
+ 	.text
+ text:	
+ 	.global _start
+ _start:	
+ 	add R1,R1,R3
+ 
+ ; Make sure local fixups work.
+ local:
+         jmp (dummy2-dummy1)  
+ 
+ ; Test the PC16 reloc.
+ none:
+ 	 or R0,R0,R0 ;nop to conform to scheduling restrictions
+ 	 jmp local                
+ 	                      
+ ; Test the %hi16 and %lo16 relocs
+ addui R1,R2,#%hi16(d2)
+ addui R1,R2,#%lo16(d2) 	
+ addui R1,R2,#%hi16(65536)
+ addui R1,R2,#%lo16(65536)
+ addui R1,R2,#%hi16($FFFFEEEE)
+ addui R1,R2,#%lo16($FFFFEEEE)
+ 
+ dummy1: addui R1, R2, #5
+ dummy2: addui R1, R2, #6
+ 
+ 	.data
+ d1:	.byte $f
Index: testsuite/gas/ms1/relocs2.s
===================================================================
RCS file: testsuite/gas/ms1/relocs2.s
diff -N testsuite/gas/ms1/relocs2.s
*** /dev/null	1 Jan 1970 00:00:00 -0000
--- testsuite/gas/ms1/relocs2.s	21 Jun 2005 16:44:07 -0000
***************
*** 0 ****
--- 1,22 ----
+ 	.text
+ 	;; Put code near the top of the address space
+ text:
+ 	.global i2
+ i2:	
+ 	
+ 	add R5, R6, R7
+ 
+ 	.data
+ 	;; Note that the .org that follows is more or less equivalent
+ 	;; to a .space, since the amount specified will be treated like
+ 	;; padding to be added between the .data section in relocs1.s
+ 	;; and this one.
+ 	;; Note also that the two test variables (d2 & d3) are intentionally
+ 	;; roughly $100 apart, so that the FR9 relocation processing in
+ 	;; bfd/elf32-ip2k.c (ip2k_final_link_relocate) is tested a little more.
+ 	.org $e0
+ 	.global d2
+ d2:	.byte 2
+ 	.space $100
+ 	.global d3
+ d3:	.byte 3


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]