Check in ARCompact simulator.  A valid configuration is arc-elf.
This is not quite finished and has most likely a few files that are
obsolete & not used, but it's good enough to run gcc regression tests.
diff --git a/MANIFEST b/MANIFEST
new file mode 100644
index 0000000..1e876de
--- /dev/null
+++ b/MANIFEST
@@ -0,0 +1,249 @@
+By codito
+ added files:
+  gas/testsuite/gas/arc/general_a700.d
+  gas/testsuite/gas/arc/dsp1.d
+  gas/testsuite/gas/arc/general_a700.s
+  gas/testsuite/gas/arc/dsp1.s
+  gas/testsuite/gas/arc/ld_arc700.s
+  gas/testsuite/gas/arc/sub_s.d
+  gas/testsuite/gas/arc/lsl_s.d
+  gas/testsuite/gas/arc/gen_simd.d
+  gas/testsuite/gas/arc/sub_s.s
+  gas/testsuite/gas/arc/lsl_s.s
+  gas/testsuite/gas/arc/prefetch.d
+  gas/testsuite/gas/arc/gen_simd.s
+  gas/testsuite/gas/arc/reloctest.d
+  gas/testsuite/gas/arc/arc700.exp
+  gas/testsuite/gas/arc/dsp2.d
+  gas/testsuite/gas/arc/prefetch.s
+  gas/testsuite/gas/arc/reloctest.s
+  gas/testsuite/gas/arc/dsp2.s
+  gas/testsuite/gas/arc/mpy_a700.d
+  gas/testsuite/gas/arc/ex_arc700.s
+  gas/testsuite/gas/arc/mpy_a700.s
+  gas/config/extlib
+  gas/config/extlib/configure
+  gas/config/extlib/Makefile.in
+  gas/config/extlib/arcsimd.s
+  gas/config/extlib/configure.in
+  gas/config/extlib/arcextlib.s
+  include/elf/ChangeLog.codito
+  libgloss/arc/syscall.h (delivered as linux/include/asm-arcnommu/unistd.h)
+  ld/emultempl/arclinux.em
+  ld/configdoc.texi
+  ld/scripttempl/elfarc.sc
+  ld/scripttempl/arclinux.sc
+  ld/emulparams/arclinux.sh
+  md5.sum
+  opcodes/ChangeLog.codito
+  opcodes/arcompact-dis.c
+ changed files:
+  bfd/archures.c (merged)
+  bfd/bfd-in2.h (merged/regenerated)
+  bfd/config.bfd
+  bfd/configure.in
+  bfd/cpu-arc.c (merged)
+  bfd/elf32-arc.c
+  bfd/reloc.c
+  bfd/cpu-arc.c
+  Makefile.in
+  gas/configure.tgt (patch was originally in configure.in)
+  gas/doc/c-arc.texi
+  gas/doc/as.texinfo
+  gas/configure.in
+  gas/testsuite/gas/arc/swi.d
+  gas/testsuite/gas/arc/sbc.d
+  gas/testsuite/gas/arc/sleep.d
+  gas/testsuite/gas/arc/brk.d
+  gas/testsuite/gas/arc/swi.s
+  gas/testsuite/gas/arc/rrc.d
+  gas/testsuite/gas/arc/bic.d
+  gas/testsuite/gas/arc/extb.d
+  gas/testsuite/gas/arc/arc.exp
+  gas/testsuite/gas/arc/asl.d
+  gas/testsuite/gas/arc/asr.d
+  gas/testsuite/gas/arc/sexw.d
+  gas/testsuite/gas/arc/adc.d
+  gas/testsuite/gas/arc/lsr.d
+  gas/testsuite/gas/arc/mov.d
+  gas/testsuite/gas/arc/ror.d
+  gas/testsuite/gas/arc/and.d
+  gas/testsuite/gas/arc/xor.d
+  gas/testsuite/gas/arc/rlc.d
+  gas/testsuite/gas/arc/or.d
+  gas/testsuite/gas/arc/sexb.d
+  gas/testsuite/gas/arc/jl.d
+  gas/testsuite/gas/arc/extw.d
+  gas/testsuite/gas/arc/add.d
+  gas/testsuite/gas/arc/sub.d
+  gas/struc-symbol.h
+  gas/config/tc-arc.c
+  gas/config/tc-arc.h
+  gas/Makefile.am
+  include/dis-asm.h
+  include/elf/arc.h
+  include/elf/common.h (adapted)
+  include/opcode/arc.h
+  ld/configure.in
+  ld/emulparams/arcelf.sh
+  ld/configure.tgt
+  ld/Makefile.am
+  binutils/configure.in
+  binutils/testsuite/binutils-all/objdump.exp
+  binutils/readelf.c
+  opcodes/configure.in
+  opcodes/arc-dis.c
+  opcodes/arc-dis.h
+  opcodes/arc-opc.c
+  opcodes/Makefile.am
+  opcodes/arc-ext.c
+  opcodes/arc-ext.h
+  gdb/doc/Makefile.in
+  gdb/doc/gdb.texinfo
+  gdb/remote.c
+  gdb/testsuite/gdb.base/float.exp
+  gdb/testsuite/lib/gdbserver-support.exp
+  gdb/testsuite/gdb.asm/asm-source.exp
+  gdb/dwarf2read.c
+  gdb/dwarf2-frame.c
+  gdb/configure.tgt
+  gdb/version.in
+  gdb/gdbserver/Makefile.in
+  gdb/gdbserver/configure.srv
+  gdb/gdbserver/proc-service.c
+  gdb/gdbserver/remote-utils.c
+  gdb/Makefile.in
+
+By ARC employees:
+ added files:
+  cgen/cpu/ARCompact.cpu
+  cgen/cpu/arc.opc
+  cgen/cpu/arc.cpu
+  cpu/arc.opc
+  cpu/sh-sim.cpu
+  cpu/arc.cpu
+  cpu/ARCompact.cpu
+  gas/ChangeLog.ARC
+  gdb/config/arc/arc.mt
+  include/gdb/target-io/arc.h
+  ld/ChangeLog.ARC
+  opcodes/arc-opc.h
+  opcodes/arc-opinst.c
+  opcodes/arc-desc.c
+  opcodes/arc-desc.h
+  opcodes/arc-ibld.c
+  opcodes/arc-asm.c
+  sim/arc/ChangeLog
+  sim/arc/configure.ac
+  sim/arc/mloop5.in
+  sim/arc/mloop6.in
+  sim/arc/mloop7.in
+  sim/arc/arc-sim.h
+  sim/arc/Makefile.in
+  sim/arc/tconfig.in
+  sim/arc/sim-main.h
+  sim/arc/devices.c
+  sim/arc/sim-if.c
+  sim/arc/arc5.c
+  sim/arc/arc6.c
+  sim/arc/arc7.c
+  sim/arc/config.in
+  sim/arc/configure
+  sim/arc/arch.h
+  sim/arc/arch.c
+  sim/arc/decode5.h
+  sim/arc/decode6.h
+  sim/arc/decode7.h
+  sim/arc/decode5.c
+  sim/arc/decode6.c
+  sim/arc/decode7.c
+  sim/arc/sem5-switch.c
+  sim/arc/sem6-switch.c
+  sim/arc/sem7-switch.c
+  sim/arc/sem5.c
+  sim/arc/sem6.c
+  sim/arc/sem7.c
+  sim/arc/cpu5.h
+  sim/arc/cpu6.h
+  sim/arc/cpu7.h
+  sim/arc/cpuall.h
+  sim/arc/cpu5.c
+  sim/arc/cpu6.c
+  sim/arc/cpu7.c
+  sim/arc/model5.c
+  sim/arc/model6.c
+  sim/arc/model7.c
+  sim/arc/traps.c
+  sim/common/ChangeLog.ARC
+  newlib/ChangeLog.ARC
+  newlib/libc/sys/arc/sys/fcntl.h
+ replaced files:
+  opcodes/arc-dis.c
+  opcodes/arc-opc.c
+ changed files:
+  bfd/configure
+  bfd/elf32-arc.c
+  bfd/libbfd.h
+  bfd/bfd-in2.h
+  cgen/ChangeLog
+  cgen/read.scm
+  cgen/sim-cpu.scm
+  cgen/utils-sim.scm
+  cgen/cpu/ip2k.opc
+  cgen/cpu/sparc.opc
+  cgen/cpu/xc16x.opc
+  cgen/cpu/fr30.opc
+  cgen/cpu/mep.opc
+  cgen/cpu/m32r.opc
+  cgen/cpu/i960.opc
+  cgen/cpu/sh.opc
+  cgen/cpu/iq2000.opc
+  cgen/cpu/openrisc.opc
+  cgen/cpu/xstormy16.opc
+  cgen/opc-itab.scm
+  cpu/ChangeLog
+  gas/config/tc-arc.c
+  gas/config/tc-arc.h
+  gas/configure
+  gas/Makefile.in
+  gas/doc/c-arc.texi
+  gas/as.c
+  gas/symbols.c
+  gas/symbols.h
+  gdb/ChangeLog
+  gdb/configure.tgt
+  include/ChangeLog
+  include/dis-asm.h
+  include/gdb/callback.h
+  include/gdb/ChangeLog
+  include/opcode/arc.h
+  include/opcode/cgen.h
+  ld/ChangeLog
+  ld/scripttempl/arclinux.sc
+  ld/scripttempl/elfarc.sc
+  ld/emulparams/arclinux.sh
+  ld/Makefile.am
+  ld/Makefile.in
+  libgloss/ChangeLog
+  opcodes/arc-dis.h
+  opcodes/arc-dis.c
+  opcodes/arc-ext.h
+  opcodes/arc-ext.c
+  opcodes/arc-opc.c
+  opcodes/ChangeLog
+  opcodes/configure
+  opcodes/configure.in
+  opcodes/Makefile.am
+  opcodes/Makefile.in
+  opcodes/cgen-dis.c
+  sim/ChangeLog
+  sim/configure.ac
+  sim/configure
+  sim/common/callback.c
+  sim/common/cgen-trace.c
+  sim/common/ChangeLog
+  sim/common/gennltvals.sh
+  sim/common/gentvals.sh
+  sim/common/nltvals.def
+  sim/common/sim-utils.c
+  sim/common/syscall.c
diff --git a/gdb/ChangeLog.codito b/gdb/ChangeLog.codito
new file mode 100644
index 0000000..50bedf8
--- /dev/null
+++ b/gdb/ChangeLog.codito
@@ -0,0 +1,1198 @@
+2006-05-18  Kunal Parmar  <kunal.parmar@codito.com>
+
+	18th May 2006 Release
+	* version.in: Change to 6.3_codito_20060518, which is when it is
+	scheduled to be released.
+
+2006-05-11  Kunal Parmar  <kunal.parmar@codito.com>
+
+	* arc-tdep.c (a4_scan_prologue): Include function only for A4. 
+
+2006-04-28  Ashwin Pathmudi  <ashwin.pathmudi@codito.com>
+
+	* arc-tdep.c (arc_push_dummy_call): Correct handling
+	of struct return for the a4 core.  
+
+2006-04-26  Ashwin Pathmudi  <ashwin.pathmudi@codito.com>
+
+	* arc-tdep.c (a4_address_to_pointer): New. Converts address
+	to pointer for the a4 core.  
+	(a4_pointer_to_address): New.  Converts pointers to address
+	for the a4 core.  
+	(arc_gdbarch_init): Add the above 2 new functions to the 
+	gdbarch structure for the A4 core. 
+
+2006-03-29  Kunal Parmar  <kunal.parmar@codito.com>
+
+	* Makefile.in (arc-jtag-ops.o): Add arc-tdep.h to the list of
+	dependencies. 
+	* arc-jtag-ops.h: Include arc-tdep.h.
+	(IS_ARC700): New macro. Return 1 if processor connected is
+	ARC700. 
+	(IS_ARC600): New macro. Return 1 if processor connected is
+	ARC600. 
+	(IS_A5): New macro. Return 1 if processor connected is A5. 
+	(IS_A4): New macro. Return 1 if processor connected is A4. 
+	* arc-jtag-ops.c (ARCProcessor): New global variable. Contains the
+	processor type that has been connected.
+	(arc_get_architecture): New function. Return the processor type
+	that has been connected. Set ``ARCProcessor'' when run the
+	first time.
+	(arc_jtag_close): Unset ``ARCProcessor''.
+	(arc_jtag_open): Remove ifdefs and use above macros instead.
+	(arc_jtag_wait): Ditto.
+	* arc-jtag.c (arc_update_architecture): Use above macros.
+
+2006-03-13  Kunal Parmar  <kunal.parmar@codito.com>
+
+	* arc-tdep.c (arc_gdbarch_init): Characters are unsigned by
+	default. 
+
+2006-03-08  Kunal Parmar  <kunal.parmar@codito.com>
+
+	* arc-jtag-ops.c (arcjtag_retry_count): New variable. Defines the
+	number of times a JTAG operation is attempted before returning a
+	failure.	
+	(arc_jtag_read_core_reg): Use above variable.
+	(arc_jtag_write_core_reg): Ditto.
+	(arc_jtag_read_aux_reg): Ditto.
+	(arc_jtag_write_aux_reg): Ditto.
+	(read_mem): Ditto.
+	(write_mem): Ditto.
+	* arc-jtag.c (_initialize_arc_debug): Add command to set above
+	variable. 
+
+2006-03-03  Ashwin Pathmudi  <ashwin.pathmudi@codito.com>
+
+	* arc-tdep.c (arc_push_dummy_call): Add support for dummy
+	call for the A4 core.  
+	(arc_extract_return_value): Enable for A4 core.  
+	(arc_store_return_value): Likewise.  
+	(arc_return_value): Likewise.  
+	(arc_gdbarch_init): Set call_dummy_location to 
+	AT_ENTRY_POINT for A4 core.  
+
+	* arc-jtag-tdep.c (arc_jtag_register_reggroup_p): Adding the 
+	status register to save/restore group for the A4 core.  
+
+2006-03-03  Ashwin Pathmudi  <ashwin.pathmudi@codito.com>
+
+	* arc-tdep.c (printFrameInfo): Print more verbose messages.  
+	(printInsnState): Likewise.  
+	(a4_scan_prologue): New.  Function to scan the prologue and 
+	fill the unwind cache.  
+	(arc_skip_prologue): Call a4_scan_prologue for a A4 core.  
+	(arc_frame_unwind_cache): Likewise.  
+	(arc_dwarf2_frame_init_reg): Defined for A4 core.  
+	(arc_unwind_pc): Defined for A4 core.  
+	(arc_scan_prologue): Cosmetic change.  
+	(arc_frame_this_id): Likewise.  
+	(arc_frame_prev_register): Likewise.  
+	(arc_next_pc): Likewise.  
+	(arc_software_single_step): Likewise.  
+	(arc_extract_return_value): Likewise.  
+	(arc_store_return_value): Likewise.  
+	(arc_return_value): Likewise.  
+	(arc_sigtramp_frame_cache): Likewise.  
+	(arc_sigtramp_frame_this_id): Likewise.  
+	(arc_sigtramp_frame_prev_register): Likewise.
+	(arc_sigtramp_frame_cache): Likewise.  
+	(arc_sigtramp_frame_sniffer): Likewise.  
+	(arc_push_dummy_call): Likewise.  
+	(arc_gdbarch_init): Change definition of disassembler to
+	arc_get_disassembler for the A4 core.  
+
+	* arc-jtag.h (debug_arc_jtag_target_message): New.  Definition
+	moved here.  
+
+	* arc-jtag.c (arc_debug_open): Cosmetic change.  
+	(arc_get_hw_regnum_mapping): Setting boundary limit for
+	A4 core.  
+
+	* arc-jtag-tdep.c (A4_HALT_VALUE): New. Define Halt 
+	value in status register.  
+	(a4_jtag_write_pc): Correct handling of write pc.
+	(a4_jtag_read_pc): New.  Function to read pc for the 
+	a4 core.  
+	(arc_jtag_init): Modify tdep gdbarch structure to
+	include read_pc.
+
+2006-03-03  Ashwin Pathmudi  <ashwin.pathmudi@codito.com>
+
+	* arc-tdep.c (arc_scan_prologue): Disabling temporarily for
+	the A4 core.  
+	(arc_skip_prologue): Likewise.  
+	(arc_frame_unwind_cache): Likewise.  
+	(arc_frame_this_id): Likewise.  
+	(arc_frame_prev_register): Likewise.  
+	(arc_next_pc): Likewise.  
+	(arc_software_single_step): Likewise.  
+	(arc_dwarf2_frame_init_reg): Likewise.  
+	(arc_extract_return_value): Likewise.  
+	(arc_store_return_value): Likewise.  
+	(arc_return_value): Likewise.  
+	(arc_sigtramp_frame_cache): Likewise.  
+	(arc_sigtramp_frame_this_id): Likewise.  
+	(arc_sigtramp_frame_prev_register): Likewise.  
+	(arc_sigtramp_frame_sniffer): Likewise.  
+	(arc_push_dummy_call): Likewise.  
+	(arc_gdbarch_init): Modify gdbarch structure for A4. 
+	(arc_binutils_reg_to_regnum): Add A4 specific conversion of
+	register numbers.  
+
+	* arc-jtag.c (arc_debug_open): A4 specific status register
+	read.  
+	(arc_debug_resume): A4 specific change for status and 
+	debug auxillary registers.  
+	(arc_debug_insert_breakpoint): Add opcode for the A4 break
+	instruction.  
+	(arc_debug_remove_breakpoint): Write 4 bytes back for the 
+	A4.  
+	(arc_print_processor_variant_info): Adding A4 to the list
+	of processors.  
+
+	* arc-jtag-tdep.c (a4_jtag_breakpoint_size): New. Defines
+	the size of the breakpoint instruction for A4.  
+	(a4_jtag_breakpoint_insn): New.  Defines the opcode for 
+	the breakpoint instruction for A4.  
+	(arc_jtag_register_name): Exclude non A4 registers for
+	A4-gdb.  
+	(a4_jtag_write_pc): New.  Write value to the program
+	counter for A4.  
+	(arc_jtag_init): Modify the target dependent part of 
+	gdbarch struct for the A4 core.  
+
+	* arc-jtag-ops.c (A4_HALT_VALUE): New. Halt bit set in
+	the status auxillary (0x0) register.  
+	(ARC700_HALT_VALUE): New.  Halt bit set in status32
+	auxillary register.  
+	(arc_jtag_read_aux_reg): Add more verbose messages.  
+	(arc_jtag_write_aux_reg): Likewise.  
+	(arc_jtag_open): Read the status auxillary register
+	for the A4 core.  
+	(arc_jtag_wait): Likewise.  
+
+2006-03-02  Ashwin Pathmudi  <ashwin.pathmudi@codito.com>
+
+	* configure.tgt: Add A4-JTAG target.  
+	* config/arc/a4-jtag.mt: New. Makefile fragment for
+	new A4-JTAG target.  
+	* config/arc/tm-a4-jtag.h: New. Target specific header file 
+	for the A4-JTAG target.  
+
+	* arc-tdep.h: Add the A4 to the ARC processor version
+	information.  
+
+	* arc-tdep.c (arc_cannot_store_register): Exclude non A4 
+	registers for A4-gdb.  
+	(arc_next_pc): Likewise.  
+	(arc_register_reggroup_p): Likewise.  
+
+	* arc-regnums-defs.h: Exclude non-A4 registers for A4-gdb.  
+
+	* arc-jtag.c (arc_update_architecture): Identify the A4 core.  
+	(clear_status32_user_bit): Allow only A4 Registers.  
+	(restore_status32_user_bit): Likewise.  
+	(arc_debug_open): Not compiling for the A4 core yet.
+	(arc_debug_resume): Likewise.  
+	(arc_debug_wait): Excluding Arc600 specific part for A4 core.  
+	(arc_get_hw_regnum_mapping): Exclude non-A4 registers for
+	the A4 core.  
+	(arc_debug_fetch_regs): Likewise.  
+	(arc_debug_store_regs): Likewise.  
+	(init_arc_debug_ops): Modify target_ops for A4 core.  
+
+	* arc-jtag-tdep.c (arc_jtag_register_reggroup_p): Allow only A4 
+	Registers.  
+	(arc_jtag_print_registers_info): Likewise.  
+	(arc_jtag_init): Likewise.  
+
+2006-01-02  Ashwin Pathmudi  <ashwin.pathmudi@codito.com>
+
+        PR 1496
+	* dwarf2-frame.c (dwarf2_frame_state_copy_regs): Correct 
+	allocated size.  
+
+2005-12-17  Kunal Parmar  <kunal.parmar@codito.com>
+
+	* arc-jtag.c (arc_debug_wait): Reverting to version 1.40
+
+2005-12-16  Kunal Parmar  <kunal.parmar@codito.com>
+
+	* arc-jtag-ops.c (arc_jtag_open): Change the message printed when
+	processor is running.
+	* arc-jtag.c (arc_debug_wait): Dont assume the program to have
+	exited when SH bit is set.
+
+2005-11-08  Kunal Parmar  <kunal.parmar@codito.com>
+
+	8th November Release
+	* version.in: Change to 6.3_codito_20051108, which is when it is
+	going to be released.
+
+2005-09-28  Kunal Parmar  <kunal.parmar@codito.com>
+
+	Bug #1479
+	* arc-jtag-tdep.c (arc_jtag_register_reggroup_p): Remove IDENTITY
+	register from save/restore group.
+
+2005-09-27  Kunal Parmar  <kunal.parmar@codito.com>
+
+	Bug #1476
+	* arc-jtag.c (arc_debug_xfer_partial): Fix for Bug #1476 (gdb for
+	JTAG goes into infinite loop).
+
+2005-09-24  Kunal Parmar  <kunal.parmar@codito.com>
+
+	Bug #1475
+	* arc-jtag-ops.c (arc_jtag_read_chunk): Fix for Bug #1475 (printf
+	command in gdb for JTAG fails).
+
+2005-09-23  Kunal Parmar  <kunal.parmar@codito.com>
+
+	* arc-jtag.c (arc_debug_xfer_partial): The value being returned
+	was incorrect.
+
+2005-09-23  Kunal Parmar  <kunal.parmar@codito.com>
+
+	Bug #1286
+	* arc-jtag-ops.c: Fix for Bug #1286 (reading an invalid register
+	causes next operation to fail).
+	
+2005-09-23  Kunal Parmar  <kunal.parmar@codito.com>
+
+	Bug #1272
+	* arc-jtag.c (arc_debug_create_inferior): Check if an executable
+	file has been handed to us, print an error if none is specified.
+
+2005-07-14  Sameer Dhavale  <sameer.dhavale@codito.com>
+
+        Bug #1381
+	* arc-jtag-ops.c (arc_jtag_close): Close file descriptor opened
+	for communication with gpio driver.
+
+2005-07-06  Soam Vasani  <soam.vasani@codito.com>
+
+	Bug #1364
+	* arc-jtag.c (arc_debug_xfer_partial): Restore the User bit in
+	status32.  This fixes bug #1364 (userland debugging: kernel
+	panic).
+
+2005-06-28  Soam Vasani  <soam.vasani@codito.com>
+
+	* arc-jtag.c (arc_debug_detach): Resume the inferior.
+
+2005-06-28  Soam Vasani  <soam.vasani@codito.com>
+
+	* arc-jtag.c (arc_debug_xfer_partial): Clear STATUS32 user bit
+	when reading or writing memory (earlier, we only cleared it while
+	writing.)
+
+2005-06-25  Soam Vasani  <soam.vasani@codito.com>
+
+	* arc-linux-tdep.c (arc_linux_register_name): Change name of
+	stop_pc from "stop_pc" to "pc".
+	(arc_linux_print_registers_info): Remove "ret" and add stop_pc.
+
+2005-06-24  Soam Vasani  <soam.vasani@codito.com>
+
+	Bug #1325 (core file support)
+	* arc-linux-tdep.c (arcompact_linux_core_reg_offsets): New array.
+	offsets of registers in core file's register section, for
+	ARCompact.
+	(arcompact_linux_supply_gregset): New function.  Get registers
+	from core file's register section, for ARCompact.
+	(arc_linux_supply_gregset): New function.  Get registers from core
+	file register section.
+	(arc_linux_gregset): For the gdbarch function.
+	(arc_linux_regset_from_core_section): This is called through
+	gdbarch.
+	* config/arc/linux.mt (TDEPFILES): Add corelow.c to list.
+
+2005-06-21  Soam Vasani  <soam.vasani@codito.com>
+
+	* gdb/arc-jtag.c (arc_update_architecture): Check for A5, print a
+	warning but don't give an error.
+	* gdb/arc-tdep.h (ARCProcessorVersion): Add A5.
+
+2005-06-20  Soam Vasani  <soam.vasani@codito.com>
+
+	Bug #1311
+	* arc-jtag.c (arc_debug_wait): In ARC600, try to detect the case
+	of a breakpoint on the last instruction of a ZOL and warn the
+	user.
+	(arc_debug_read_core_register): New function.  Read a core
+	register and check for errors.
+
+2005-06-19  Soam Vasani  <soam.vasani@codito.com>
+
+	Bug #1305
+	* dwarf2read.c: Fix for bug #1305 (Failure with Metaware compiled
+	binaries)
+
+2005-05-21  Soam Vasani  <soam.vasani@codito.com>
+
+	23rd May Release
+	* version.in: Change to 6.3_codito_20050523, which is when it is
+	going to be released.
+
+2005-05-21  Soam Vasani  <soam.vasani@codito.com>
+
+	* arc-jtag.c (arc_debug_store_regs): Show regno argument in debug
+	message.
+
+2005-05-21  Soam Vasani  <soam.vasani@codito.com>
+
+	* Makefile.in (arc-tdep.o): Add observer.h to the list of
+	dependencies.
+
+2005-05-21  Soam Vasani  <soam.vasani@codito.com>
+
+	* arc-jtag-tdep.c (arc_jtag_register_reggroup_p): Remove extension
+	registers from _all_ reggroups, because they do not exist (as of
+	now).  Narrow down the list of registers in the save/restore group.
+
+2005-05-21  Sameer Dhavale  <sameer.dhavale@codito.com>
+
+        * arc-jtag-ops.c: Included more header files to remove build time
+	warnings
+	
+2005-05-21  Sameer Dhavale  <sameer.dhavale@codito.com>
+
+        PR arcgdb/1282
+	* arc-jtag.c: small changes to remove warnings during compilation.
+	* arc-jtag-ops.c(arc_debug_wait): Adding code to block and unblock
+	signals so that ctrl+c should work.
+
+2005-05-21  Soam Vasani  <soam.vasani@codito.com>
+
+	21st May 2005 Release.
+        * version.in: Bump version to 6.3_codito_20050521
+
+2005-05-21  Soam Vasani  <soam.vasani@codito.com>
+
+	Bug #1278
+	* arc-tdep.c (arc_set_main_name): New function.  Set main name to
+	_main if necessary.
+	(arc_gdbarch_init): Make arc_set_main_name an observer of
+	inferior_created.
+
+2005-05-16  Soam Vasani  <soam.vasani@codito.com>
+
+	Bug #1279
+	* remote.c (remote_open_1): Call observer_notify_inferior_created.
+	
+2005-05-16  Soam Vasani  <soam.vasani@codito.com>
+
+	15th May 2005 Release.
+        * version.in: Bump version to 6.3.50_cdt_gdb_20050515
+
+2005-05-15  Soam Vasani  <soam.vasani@codito.com>
+
+	* arc-jtag-tdep.c (arc_jtag_init): Rename the aux-read command to
+	arc-aux-read and aux-write to arc-aux-write.
+
+2005-05-15  Soam Vasani  <soam.vasani@codito.com>
+
+	* arc-jtag.c (arc_debug_wait): If the SH (self halt) bit is set,
+	assume that the program has exited, with exit code in R0.
+	* arc-jtag.h (ARC_DEBUG_REG_SH_BIT): Define.  Self halt bit in the
+	debug register.
+
+2005-05-15  Soam Vasani  <soam.vasani@codito.com>
+
+	* arc-jtag-ops.c (arc_jtag_open): Correct and conditionalise debug
+	printfs.
+
+2005-05-15  Soam Vasani  <soam.vasani@codito.com>
+
+	* arc-jtag.c (arc_debug_open): Call target_preopen,
+	reopen_exec_file and reread_symbols.
+
+2005-05-13  Soam Vasani  <soam.vasani@codito.com>
+
+	* arc-jtag-ops.c (arc_jtag_close): Conditionalize a debug printf.
+
+2005-05-13  Soam Vasani  <soam.vasani@codito.com>
+
+	* arc-jtag.h (ARC_TARGET_OBJECT_AUXREGS): Define.  For use in
+	target_xfer_partial.
+	(target_read_aux_reg, target_write_aux_reg): Change to use
+	target_xfer_partial.
+	* arc-jtag.c (arc_debug_xfer_partial): Support reading/writing of
+	auxillary registers, using ARC_TARGET_OBJECT_AUXREGS.
+	(init_arc_debug_ops): Stop using to_data (we'll use
+	target_xfer_partial for aux registers).
+	* arc-jtag-tdep.c (arc_jtag_aux_read_command): New command: read a
+	range of aux registers.
+	(arc_jtag_aux_write_command): New command: write an aux register.
+	(arc_jtag_init): Add the above commands.
+
+2005-05-13  Ramana Radhakrishnan  <ramana@codito.com>
+
+	* arc-jtag-ops.c(check_and_raise_error_if_jtag_closed):New function
+	for sanity checks. 
+	(arc_jtag_reset_board):Use above.
+	(arc_jtag_wait):Likewise.
+	(arc_jtag_read_chunk):Likewise.
+	(arc_jtag_read_core_reg):Likewise.
+	(arc_jtag_write_core_reg):Likewise.
+	(arc_jtag_read_aux_reg):Likewise.
+	(arc_jtag_write_aux_reg):Likewise.
+
+
+2005-05-13  Ramana Radhakrishnan  <ramana@codito.com>
+
+	* arc-jtag.c: Rename cmd arc_bcr_registers to arc-bcr-registers.
+	Rename arcjtag-debugstatemachine to arcjtag-debug-statemachine 
+
+2005-05-13  Ramana Radhakrishnan  <ramana@codito.com>
+
+	* arc-jtag-ops.h: Rename members to JTAG_OPENED and JTAG_CLOSED.
+	* arc-jtag-ops.c(arc_jtag_reset_board): Introduce
+	  sanity checks for checking target being opened. 
+	  (arc_jtag_open):set status to JTAG_OPENED.  
+
+2005-05-13  Ramana Radhakrishnan  <ramana.radhakrishnan@codito.com>
+
+	* arc-jtag-ops.h: Add new member for reset_board.
+	* arc-jtag-ops.c(arc_jtag_reset_board):New function.
+	(initialize_arc_jtag_ops):Initialize reset board. 
+	* arc-jtag.c: New command arc-reset-board
+
+2005-05-13  Sameer Dhavale <sameer.dhavale@codito.com>
+
+	* arc-jtag.c: Add corrections to code to remove build time
+	warnings.
+	
+2005-05-13  Soam Vasani  <soam.vasani@codito.com>
+
+	* arc-jtag.c (clear_status32_user_bit, restore_status32_user_bit):
+	New functions: clear/restore the user-mode bit in the status32
+	register.
+	(set_debug_user_bit): Set the UB bit in the debug register, so
+	that breakpoints work in user mode.
+	(arc_debug_open, arc_debug_resume): Call set_debug_user_bit.
+	(arc_debug_xfer_partial): When writing, go to kernel mode so that
+	we are not affected by privileges.
+	
+2005-05-12  Sameer Dhavale  <sameer.dhavale@codito.com>
+
+        PR arcgdb/1277
+	* arc-jtag-ops.c(gpio_write): Add function to write data to
+	parallel port.
+	(gpio_read): Add function to read from parallel port.
+	* gpio.h: New file. Add to support the interface with /dev/gpio.
+	
+2005-05-12  Ramana Radhakrishnan  <ramana.radhakrishnan@codito.com>
+
+	* dwarf2-frame.c(execute_cfa_program): Ignore the contents
+	for a MW_ARC_info cfa directive. 
+
+2005-05-12  Ramana Radhakrishnan  <ramana.radhakrishnan@codito.com>
+
+	* dwarf2-frame.c(decode_frame_entry_1):Ignore High C compilers
+	augmentation value in the frame entry. 
+
+2005-05-12  Sameer Dhavale <sameer.dhavale@codito.com>
+
+	* arc-jtag-ops.c(arc_jtag_write_aux_reg): Return value on
+	successful transaction.
+	* arc-jtag-ops.h: Change in prototype of function
+	jtag_memory_read().	
+
+2005-05-11  Sameer Dhavale  <sameer.dhavale@codito.com>
+
+	* arc-jtag-ops.c: Remove extra messages introduced by prev commit
+	and changing all printf() to printf_filtered().
+
+2005-05-10  Sameer Dhavale  <sameer.dhavale@codito.com>
+
+        PR arcgdb/1275 
+	* arc-jtag-ops.h(struct jtag_ops):Change protypes of functions
+	jtag_read_core_reg(), jtag_read_aux_reg(), jtag_write_core_reg(),
+	jtag_write_aux_reg() to handle errors gracefully.
+	* arc-jtag-ops.h(arc_jtag_read_core_reg): Change definition of
+	function to return the no of bytes read instead of returning
+	value.
+	(arc_jtag_write_core_reg): Change definition of function to return
+	the no of bytes actually written.
+	(arc_jtag_read_aux_reg):  Change definition of
+	function to return the no of bytes read instead of returning
+	value.
+	(arc_jtag_write_aux_reg): Change definition of function to return
+	the no of bytes actually written.
+	*arc-jtag.c: Change all calls to interface functions to accomodate
+	the changes made above and check and handle error gracefully with
+	error messages.
+
+2005-05-10  Ramana Radhakrishnan  <ramana@codito.com>
+
+	* arc-jtag.c(arc_update_architecture):Set up decr_pc_after_break
+	for ARC600 as 2 and 0 for ARC700.
+
+2005-05-10  Ramana Radhakrishnan  <ramana@codito.com>
+
+	* arc-jtag.h(is_arc700):New Function.
+	(is_arc600):New Function.
+	* arc-jtag.c(arc_jtag_resume):Single Step Mask 
+	is different for both ARC600 and ARC700. Use functions is_arc700
+	and is_arc600.
+
+2005-05-10  Ramana Radhakrishnan  <ramana@codito.com>
+	    Soam Vasani		  <soam.vasani@codito.com>
+
+	* arc-jtag.c(arc_debug_resume): Invalidate caches
+	for single stepping or even while resuming. 
+
+2005-05-10  Ramana Radhakrishnan  <ramana@codito.com>
+
+	* arc-jtag.c(arc_debug_open):Set STATUS32 to 1 
+	when opening JTAG .
+
+2005-05-10  Ramana Radhakrishnan  <ramana@codito.com>
+
+	* Makefile.in:Update dependency for arc-jtag-tdep.o
+	* ChangeLog.codito: Correct changelog entry. 
+
+2005-05-10  Ramana Radhakrishnan  <ramana.radhakrishnan@codito.com>
+
+	* arc-jtag-tdep.c: Update copyright notice.
+	* arc-tdep.h: Likewise.
+	
+2005-05-10  Ramana Radhakrishnan  <ramana.radhakrishnan@codito.com>
+
+	* Makefile.in:Update dependencies for ARC specific files.
+
+2005-05-10  Ramana Radhakrishnan  <ramana.radhakrishnan@codito.com>
+
+	*arc-jtag.h: (enum arc_hw_regnums): New enum. 
+	(arc-regnum-defs.h):Include.
+	(Define and undefine R_AUX and R_BCR)
+	* arc-regnum-defs.h: New file. 
+	* arc-jtag-ops.h(enum arc700_hw_regnum):Remove. 
+	* arc-jtag.c(R):Remove Macro.
+	(arc-regnum-defs.h):Include. 
+	(RAUX):New macro.
+	(RBCR):New macro. 
+	(arc_bcr_reg_info):Use above macros.
+	(arc_aux_reg_map):Likewise.
+	(struct arc_reg_info):Change type to arc_hw_regnum
+	(arc_update_architecture):Use ARC_HW_IDENTITY_REGNUM. 
+	(invalidateCaches):Use ARC_HW_ICACHE_IVIC
+	Use ARC_HW_DCACHE_IVIC to invalidate caches. 
+	(disableCaches):Use ARC_HW_ICACHE_CONTROL, 
+	ARC_HW_DCACHE_CONTROL to disable caches. 
+	(arc_debug_resume):Use ARC_HW_STATUS32_REGNUM. 
+	Use ARC_HW_DEBUG_REGNUM.
+	
+
+2005-05-10  Ramana Radhakrishnan  <ramana.radhakrishnan@codito.com>
+
+	* arc-jtag-tdep.c(struct arc_reg_info):New struct. 
+	(arc_jtag_register_name):Move BCR registers below all 
+	the Auxiliary registers. This is to take care of printing
+	Build Configuration Registers and Auxiliary registers in 
+	one chunk. 
+	Rename BCR Registers to their correct names. 
+	(arc_jtag_print_registers_info):Use the all parameter to print
+	bcr registers and all the known ARC700 auxiliary registers 
+	and Build Configuration Registers.
+	* arc-jtag.c:(arc_aux_reg_map):New regmap for Auxiliary registers. 
+	(arc_get_hw_regnum_mapping):Use this to create mapping 
+	between gdb regnums and hw regnums. 
+	(arc_debug_fetch_regs):Use above.
+	(arc_debug_store_regs):Use above. 
+	* arc-tdep.h:Add processor versions UNSUPPORTED and ARCompact. 
+	* config/arc/tm-embed.h:Restructure the AUX Registers
+	information to be above the BCRs.
+	
+
+2005-05-09  Ramana Radhakrishnan <ramana.radhakrishnan@codito.com>
+
+	* arc-jtag.c(arc_jtag_open):Remove call to invalidateCache. 
+	(arc_debug_load):Add code to zero out the bss section.
+
+2005-05-09  Ramana Radhakrishnan <ramana.radhakrishnan@codito.com>
+
+	* arc-jtag.c(struct arc_reg_info): Correct typo for arc_gdb_regnums.
+
+2005-05-09  Ramana Radhakrishnan <ramana.radhakrishnan@codito.com>
+
+	* arc-tdep.h (ARCProcessorVersion):New enum.
+	(ARCExtensionsSupportedInformation):New enum.
+	(ARCProcessorInformation):New structure to store ARC 
+	processor variant information.
+	(gdbarch_tdep):Add member of ARCProcessorInformation.
+	* arc-jtag-tdep.c (arc_debug_processor_information):Add new
+	variable. 
+	(arc_jtag_init):Initialize tdep->arc_processor_variant_info. 
+	* arc-linux-tdep.c (arc_linux_init_abi):Set ARC processor 
+	variant info to NULL.
+	* arc-jtag.c (arc_update_architecture):New function Update 
+	architecture information. 
+	(invalidateCaches):Invalidate Cache.
+	(disableCaches):Disable Cache.
+	(arc_debug_open):Call enable and invalidate caches and 
+	arc_update_architecture. 
+
+2005-05-06  Soam Vasani  <soam.vasani@codito.com>
+
+	* arc-jtag.c (arc_debug_wait): Set status waitkind and signal
+	value, so that our caller thinks we stopped due to a SIGTRAP.
+
+2005-05-05  Sameer Dhavale  <sameer.dhavale@codito.com>
+
+	PR arcgdb/1271 
+	* arc-jtag.c (arc_debug_resume): Add support for hardware single
+	instruction stepping. 
+
+2005-05-05  Ramana Radhakrishnan <ramana.radhakrishnan@codito.com>
+
+	* arc-jtag.h: Add copyright notice.
+
+2005-05-05  Soam Vasani  <soam.vasani@codito.com>
+
+	* arc-jtag.c (arc_debug_read_aux_register,
+	arc_debug_write_aux_register): New functions.
+	(arc_debug_aux_reg_functions): Struct containing pointers to
+	arc_debug_read/write_aux_register.
+	(init_arc_debug_ops): Set to_data to arc_debug_aux_reg_functions.
+	* arc-jtag.h (target_read_aux_reg, target_write_aux_reg): New
+	macros.
+
+2005-05-05  Ramana Radhakrishnan  <ramana.radhakrishnan@codito.com>
+
+	* arc-jtag-ops.c(AA3SSPinState):New enum for target comms
+	to AA3.
+	(arc_jtag_read_chunk):Change usage of rw_flag.
+	(arc_jtag_write_chunk):Change usage of rw_flag.
+	(read_mem):Change usage of rw_flag.
+	(write_mem):Change usage of rw_flag to use the new enum.
+	(arc_jtag_write_chunk):Formatting cleanups.
+	
+	
+
+2005-05-05  Ramana Radhakrishnan <ramana.radhakrishnan@codito.com>
+
+	* arc-jtag-ops.c:Cleanup. 
+	(port_perms_setup): Make static.
+	(tapc_set_tms): Likewise.
+	(tapc_set_tck): Likewise.
+	(tapc_set_tdi): Likewise.
+	(clockdelay): Likewise.
+	(tapc_pulse): Likewise.
+	(tapc_reset): Likewise.
+	(tapc_tms): Likewise.
+	(tapc_readbit): Likewise.
+	(tapc_shiftbit): Likewise.
+	(tapc_shiftnbits): Likewise.
+	(read_jtag_status_reg): Likewise.
+	(print_jtag_status_reg_val): Likewise.
+	(write_jtag_reg): Likewise.
+	(read_jtag_reg): Likewise.
+	(arc_jtag_read_core_reg): Likewise.
+	(arc_jtag_write_core_reg): Likewise.
+	(arc_jtag_read_aux_reg): Likewise.
+	(arc_jtag_write_aux_reg): Likewise.
+	(read_mem): Likewise.
+	(write_mem): Likewise.
+	(arc_jtag_write_chunk): Likewise.
+	(arc_jtag_read_chunk): Likewise.
+	(arc_jtag_open): Likewise.
+	(arc_jtag_close): Likewise.
+	(arc_jtag_wait): Likewise.
+	(tapc_shift4bits):Remove.
+		
+2005-05-05  Ramana Radhakrishnan <ramana.radhakrishnan@codito.com>
+
+	* arc-jtag-ops.c, arc-jtag-ops.h: Add copyright notice.
+
+2005-05-05  Ramana Radhakrishnan <ramana.radhakrishnan@codito.com>
+
+	* arc-jtag.c:debug_arc_jtag_target_messages New variable. 
+	(_initialize_arc_debug):Use above. Add a new boolean command, 
+	arcjtag-debug-target to print debug target messages.
+
+2005-05-05  Soam Vasani  <soam.vasani@codito.com>
+
+	* arc-jtag.c (arc_debug_open): Print message on success.
+
+2005-05-05  Sameer Dhavale  <sameer.dhavale@codito.com>
+
+        PR arcgdb/1270
+	* arc-jtag-ops.c (tapc_pulse): Remove cals to clock delay to
+	achieve download speed-up.
+	(arc_jtag_read_core_reg): Add a call to tapc_reset() before
+	reading any register.
+	(arc_jtag_write_core_reg): Add a call to tapc_reset() before
+	writing any register. 
+	(arc_jtag_read_aux_reg): Add transition to run-test-idle state in
+	the wait loop.
+	(arc_jtag_read_aux_reg): Add a call to tapc_reset() before reading
+	any aux register.
+	(arc_jtag_write_chunk): Add a fix to support the writes to memory
+	which are not integral multiples of four.
+	(arc_jtag_read_chunk): Add a fix to support the reads from memory
+	which are not integral multiples of four.
+	(_initialize_arc_jtag_ops): Add entries to initialize read/write
+	core registers.
+	* arc-jtag-tdep.c (arc_jtag_init): Add to initialize
+	tdep->sigtramp_p to NULL. This avoids the segmentation fault.
+	* arc-jtag.c (arc_debug_open): Disable Dcache and Icache.
+	(arc_debug_xfer_partial): Add fix for address alignment.
+	(arc_debug_insert_breakpoint): Modify to support ARC700 specific
+	breakpoint.
+	(arc_debug_remove_breakpoint): Modify to support ARC700 specific
+	breakpoint.
+	
+
+2005-05-04  Ramana Radhakrishnan  <ramana@codito.com>
+
+	* arc-jtag-ops.c: Correct ioperms error messages. 
+	Setup read_core_register correctly.
+
+2005-05-04  Ramana Radhakrishnan  <ramana.radhakrishnan@codito.com>
+
+	PR arcgdb/1267
+	* arc-jtag-ops.h: Add new enum arc_jtag_status for housekeeping. 
+	  (arc_jtag_ops):Add data member to this. 
+	* arc-jtag-ops.c: #define printf to printf_filtered when used 
+	in gdb. 
+	(port_perms_setup):Return error message in case of errors
+	(arc_jtag_close):Call tapc_reset only when the JTAG is not 
+	already closed. 
+	
+2005-05-03  Soam Vasani  <soam.vasani@codito.com>
+
+	PR arcgdb/1260
+	* arc-tdep.h (struct gdbarch_tdep): Add member lowest_pc, which is
+	initialized in the linux or jtag tdep files.  It's meant to stop
+	backtraces at the entry point (_start).
+	* arc-tdep.c (arc_frame_this_id): Don't set frame_id if 
+	func <= lowest_pc.
+	* arc-linux-tdep.c (arc_linux_init_abi): Init lowest_pc to 0x74.
+	* arc-jtag-tdep.c (arc_jtag_init): Init lowest_pc to 0.
+	
+2005-05-03  Soam Vasani  <soam.vasani@codito.com>
+
+	* arc-tdep.c (arc_software_single_step): We cannot single-step
+	single instruction zero overhead loops and branch-to-self's.  Step
+	over them and print a warning.
+
+2005-05-02  Sameer Dhavale <sameer.dhavale@codito.com>
+
+	PR arcgdb/1265
+	* arc-jtag-ops.h (arc700_hw_regnums): Add entries to map LP_START
+	and LP_END registers.
+	* arc-jtag.c (arc_debug_store_regs): Add register mapping from
+	gdbarch register numbers to hardware register numbers.
+	(arc_debug_fetch_regs): Add register mapping from
+	gdbarch register numbers to hardware register numbers.
+
+2005-04-29  Soam Vasani  <soam.vasani@codito.com>
+
+	* arc-tdep.c (arc_gdbarch_init): Move the call of
+	set_gdbarch_software_single_step to arc-linux-tdep.c.
+	* arc-linux-tdep.c (arc_linux_init_abi): Set gdbarch software
+	single step.
+
+2005-04-28  Soam Vasani  <soam.vasani@codito.com>
+
+	* config/arc/tm-embed.h (enum arc700_jtag_regnums): Fix mistakes
+	in numbering.
+
+2005-04-28  Soam Vasani  <soam.vasani@codito.com>
+
+	* arc-tdep.c (arc_scan_prologue): Pass stream and fprintf_func to
+	init_disassemble_info, to be used in case of a memory error.
+
+2005-04-28  Soam Vasani  <soam.vasani@codito.com>
+
+	* arc-tdep.c (arc_scan_prologue): Handle R27 along with other
+	callee-saved registers.
+
+2005-04-27  Soam Vasani  <soam.vasani@codito.com>
+
+	* arc-jtag.c (arc_debug_wait): Setup control-C signal handler.
+	(arc_debug_interrupt): New function; handler for SIGINT.
+	(arc_debug_interrupt_twice): New function; called when user does
+	control-C twice.
+
+2005-04-26  Soam Vasani <soam.vasani@codito.com>
+
+	* arc-tdep.c (arc_register_name): Moved to arc-linux-tdep.c and
+	arc-jtag-tdep.c.
+	(arc_register_reggroup_p): Save/restore reggroups contain all
+	writable registers.
+	* arc-tdep.h (arc700_api_regnums): Define ARC_ARGx_REGNUMs and
+	ARC_RETURNx_REGNUMs.
+	(arc700_regnums): Moved to tm-linux.h and tm-embed.h.
+	(gdbarch_tdep): Removed member register_name.
+	gdbarch_register_name is now in arc-linux-tdep.c and
+	arc-jtag-tdep.c.
+	* arc-linux-tdep.c (arc700_linux_regnums): Moved to
+	config/arc/tm-linux.h.
+	(arc_linux_register_name): Names for all the registers in linux.
+	Moved from arc-tdep.c.
+	* arc-jtag.h (arc700_jtag_regnums): Moved to
+	config/arc/tm-embed.h.
+	* arc-jtag-tdep.c (arc_jtag_register_name): Names for all the
+	registers.  Moved from arc-tdep.c.
+	(arc_jtag_pseudo_register_read, arc_jtag_pseudo_register_write):
+	Removed; no pseudo registers when using JTAG.
+	* config/arc/tm-embed.h (arc700_jtag_regnums): Define all the
+	basecase registers (core as well as aux).  Renamed the
+	ARC_*_PSEUDO_REGNUMs to ARC_*_REGNUMs; changed references
+	appropriately.
+	* config/arc/tm-linux.h (arc700_linux_regnums): Define all the
+	registers that linux/ptrace gives.
+
+2005-04-25  Sameer Dhavale  <sameer.dhavale@codito.com>
+
+	* arc-jtag-ops.h: Add
+	Previous commit did not actually add the file to cvs.  So adding it
+	via this commit. 
+
+2005-04-22  Soam Vasani <soam.vasani@codito.com>
+
+	* arc-linux-tdep.c (arc_linux_skip_solib_resolver): New function;
+	skip uClibc's runtime resolver.
+	* arc-linux-tdep.c (arc_linux_init_abi): Set gdbarch
+	fetch_link_map_offset and skip_solib_resolver.
+	* config/arc/linux.mt (TDEPFILES): Remove glibc-tdep, we don't
+	need it.
+
+2005-04-20  Sameer Dhavale  <sameer.dhavale@codito.com>
+
+	PR arcgdb/1242
+	* arc-jtag-ops.h: Add 
+	(jtag_ops): New structure defined.
+	* arc-jtag-ops.c: Add
+	(port_perms_setup): New function. Add to set desired permissions
+	for port access.
+	(tapc_set_tms): New function. Add for Setting value to TMS pin of JTAG
+	port.
+	(tapc_set_tck): New function. Add for setting or resetting TCK pin
+	of JTAG port.
+	(tapc_set_tdi): New function. Add for sending data into JTAG
+	module via TDI input pin.
+	(clockdelay): New function. Add to generate required pulse width.
+	(tapc_pulse): New function. Add to generate pulse over TCK.
+	(tapc_reset): New function. Add to reset the JTAG state machine
+	(tapc_tms): New function. Add to set or reset the TMS pin of JTAG
+	port.
+	(tapc_readbit): New function. Add to read a single bit from TDO
+	pin of JTAG port.
+	(tapc_shiftbit): New function. Add to shift in one bit through TDI
+	and simultaneously shift out bit through TDO.
+	(tapc_shiftnbits): New function. Add to shift n bits in either
+	LSB-first or MSB-first fashion.
+	(read_jtag_status_reg): New function. Add to read the status of
+	transaction being requested by JTAG module.
+	(write_jtag_reg): New function. Add to write to any internal
+	registers of JTAG module.
+	(read_jtag_reg): New function. Add to read from any internal
+	register of JTAG.
+	(read_core_reg): New function. Add to read from any core register
+	of ARC700 via JTAG.
+	(write_core_reg): New function. Add to write to any core register
+	of ARC700 via JTAG.
+	(arc_jtag_read_aux_reg): New function. Add to write to any auxillary
+	register of ARC700 via JTAG.
+	(arc_jtag_write_aux_reg): New function. Add to write to any
+	auxillary register of ARC700 via JTAG.
+	(read_mem): New function. Add to read 4 bytes from memory.
+	(write_mem): New function. Add to write 4 bytes at a specified
+	memory location.
+	(arc_jtag_write_chunk): New function. Add to write to a stream of
+	data starting from the specified memory location. This function
+	makes use of speacial feature supported by ARC-JTAG for streaming
+	data.
+	(arc_jtag_read_chunk): New function. Add to read a stream of
+	data starting from the specified memory location. This function
+	makes use of speacial feature supported by ARC-JTAG for streaming
+	data. 
+	(arc_jtag_open): New function. Add to provide target specific open
+	function for GDB backend. This function sets port permissions and
+	resets JTAG state machine.
+	(arc_jtag_close): New function. Add to provide target specific
+	close function to GDB backend.
+	(arc_jtag_wait): New function. Add to poll the status32 register
+	of ARC700 till the processor is halted.
+	(_initialize_arc_jtag_ops): New function. Add to initialize
+	function pointers for structure arc_jtag_ops.
+	* gdb/config/arc/embed.mt (TDEPFILES): Add entry for
+	arc-jtag-ops.o
+	
+2005-04-20  Sameer Dhavale  <sameer.dhavale@codito.com>
+
+	PR arcgdb/1241
+	* target.c (target_read_memory_partial): Correct the handling of
+	variable err depending on the value returned
+	target_xfer_partial().
+	(target_write_memory_partial): Correct the handling of
+	variable err depending on the value returned
+	target_xfer_partial(). 
+??? patch sites don't exist any more, need to check for regression.
+
+2005-04-19  Soam Vasani <soam.vasani@codito.com>
+
+	* arc-jtag.h (enum arc700_jtag_regnums): Add debug register.
+	* arc-jtag-tdep.c (arc_jtag_register_name): Ditto.
+
+2005-04-19  Soam Vasani <soam.vasani@codito.com>
+
+	* arc-jtag.h: New file, defines arc700_jtag_regnums.
+
+2005-04-19  Soam Vasani <soam.vasani@codito.com>
+
+	* arc-tdep.c (ARC_ILINK1_PSEUDO_REGNUM, ARC_ILINK2_PSEUDO_REGNUM,
+	ARC_ERET_PSEUDO_REGNUM, ARC_STATUSL1_PSEUDO_REGNUM,
+	ARC_STATUSL2_PSEUDO_REGNUM, ARC_ERSTATUS_PSEUDO_REGNUM): Move to
+	arc-tdep.h.
+	(arc_pseudo_register_read, arc_pseudo_register_write,
+	arc_print_registers_info): Move to arc-linux-tdep.c and
+	arc-jtag-tdep.c.
+	(arc_register_name): Registers are split into 3 classes: the
+	registers common to both linux and jtag; registers available only
+	in one of the two targets; and pseudo registers.  Common registers
+	and pseudo-registers have their names defined here; for other
+	registers, call tdep->register_name.
+	(arc_register_reggroup_p): Call tdep->register_reggroup_p, for the
+	target-specific registers.
+	(arc_sigtramp_frame_prev_register): Use
+	tdep->pc_regnum_in_sigcontext rather than ARC_RET_REGNUM directly.
+	(arc_gdbarch_init): Do not assume OSABI = Linux.  Instead, get the
+	OSABI from the new CONFIG_OSABI macro in tm-<target>.h file.
+	Move to arc-linux-tdep.c and arc-jtag-tdep.c: Set
+	gdbarch_num_regs, gdbarch_pc_regnum, gdbarch_pseudo_register_read,
+	gdbarch_pseudo_register_write, gdbarch_print_registers_info.
+	Call CONFIG_INIT_TDEP, which is a macro defined in tm-<target>.h.
+	
+	* arc-linux-tdep.c: (enum arc700_linux_regnums): Moved here from
+	arc-tdep.h, so that arc-tdep.c cannot see them.  Contains the
+	registers that linux makes up, but do not actually exist on the
+	processor.  Also, change ARC_RET_REGNUM such that it is after all
+	the common registers.
+	(arc_linux_register_name): Names of the arc700_linux_regnums.
+	(arc_linux_pseudo_register_read): Moved from arc-tdep.c.  Here
+	we'll use orig_r8 to get the pseudo-registers.
+	(arc_linux_pseudo_register_write): Moved from arc-tdep.c.
+	(arc_linux_print_registers_info): Moved from arc-tdep.c.  Register
+	sets are different for different targets.
+	(arc_linux_sc_reg_offset): ARC_RET_REGNUM was changed, so changed
+	this appropriately.
+	(arc_linux_init_abi): Set tdep->pc_regnum_in_sigcontext to
+	ARC_RET_REGNUM (see comment in arc-tdep.h).  Set
+	tdep->register_name to arc_linux_register_name.  
+	And moved from arc-tdep.c: Set gdbarch_num_regs,
+	gdbarch_pc_regnum, gdbarch_pseudo_register_read,
+	gdbarch_pseudo_register_write, gdbarch_print_registers_info.
+	(arc_linux_register_reggroup_p): Register groups for linux-only
+	registers.
+
+	* arc-jtag-tdep.c: New file.  Define the breakpoint intruction,
+	register_name, pseudo register read/write, register_reggroup_p,
+	and print_registers_info.
+
+	* arc-tdep.h (enum arc700_regnums): Remove linux-only regnums like
+	ARC_RET_REGNUMS.
+	(ARC_ILINK1_PSEUDO_REGNUM, ARC_ILINK2_PSEUDO_REGNUM,
+	ARC_ERET_PSEUDO_REGNUM, ARC_STATUSL1_PSEUDO_REGNUM,
+	ARC_STATUSL2_PSEUDO_REGNUM, ARC_ERSTATUS_PSEUDO_REGNUM): Moved
+	from arc-tdep.c.  Though the regnums are different across targets
+	for these registers, the macros are same because the regnums are
+	define in terms of NUM_REGS.
+	(struct gdbarch_tdep): New fields: pc_regnum_in_sigcontext,
+	register_reggroup_p.
+
+	* config/arc/embed.mt (TDEPFILES): Add arc-jtag-tdep.o to this
+	list.	
+
+	* config/arc/tm-embed.h (CONFIG_OSABI, CONFIG_INIT_TDEP): New macros.
+	* config/arc/tm-linux.h (CONFIG_OSABI, CONFIG_INIT_TDEP): Ditto.
+	
+	* gdbserver/linux-arc-low.c (arc_regmap): ARC_RET_REGNUM was
+	changed in GDB, change this appropriately.
+	* regformats/reg-arc.dat: Ditto.
+	
+2005-04-12  Ramana Radhakrishnan  <ramana.radhakrishnan@codito.com>
+
+	* arc-jtag.c: Add copyright, add comments to each of the 
+	functions explaining their role. 
+
+2005-04-08  Ramana Radhakrishnan  <ramana.radhakrishnan@codito.com>
+
+	* arc-tdep.c(arc_print_float_info): New function. 
+	  (gdbarch_init):Initialize gdbarch_print_float_info.
+
+2005-04-07  Ramana Radhakrishnan  <ramana.radhakrishnan@codito.com>
+
+	PR arcgdb/1198
+	* arc-tdep.c(arc_push_dummy_call):Correct handling for
+	structures.Move initial assignment of structure address
+	above initialization.
+	(arc_frame_align): Align frame to natural boundary.
+
+2005-04-06  Ramana Radhakrishnan  <ramana.radhakrishnan@codito.com>
+
+	PR arcgdb/1194 
+	* arc-tdep.c(arc_push_dummy_call):Correct limit check. The ARC has
+	8 parameter registers.
+	* arc-tdep.h(enum arc700_regnums):Add ARC_ARG7_REGNUM.
+
+2005-04-04  Sameer Dhavale <sameer.dhavale@codito.com>
+
+	PR arcgdb/1189
+	* arc-jtag.c(): Add
+	  (struct arc_jtag_ops): New structure. Add to support
+	arcjtag target operations.
+	  (arc_jtag_open): New function. Add for initializations.
+	  (arc_jtag_attach): New function. Add for attaching to already
+	  running targets.
+	  (arc_jtag_detach): New function. Add for detaching from a
+	  target.
+	  (arc_jtag_resume): New function. Make the inferior to resume
+	  execution.
+	  (arc_jtag_wait): New function.
+	  (arc_jtag_fetch_regs): New function. Put values in register
+	  cache.
+	  (arc_jtag_store_regs): New function.
+	  (arc_jtag_prepare_to_store): New function.
+	  (arc_jtag_xfer_memory): New function.
+	  (arc_jtag_files_info): New function.
+	  (arc_jtag_insert_breakpoint): New function.
+	  (arc_jtag_remove_breakpoint): New function.
+	  (arc_jtag_kill): New function.
+	  (arc_jtag_load): New function.
+	  (arc_jtag_create_inferior): New function.
+	  (arc_jtag_mourn_inferior): New function.
+	  (arc_jtag_thread_alive): New function.
+	  (arc_jtag_stop): New function.
+	  (init_arc_jtag_ops): New function. Initialize jtag_target_ops to
+	  values appropriate for arcjtag target.
+	  (_initialize_arc_jtag): New function. Add a new target to gdb.
+	* config/arc/embed.mt: Add change to include arc-jtag.o so that
+	new target should be automatically built with arc-elf32.
+	 
+2005-04-03  Ramana Radhakrishnan  <ramana.radhakrishnan@codito.com>
+
+	PR arcgdb/1185
+	* arc-tdep.c(arc_write_pc): Remove. 
+	  (arc_gdbarch_init): Remove initialization of write_pc.
+	* arc-linux-tdep.c(arc700_linux_write_pc): New function . Add
+	fix for orig_r8 hack.
+	 (arc_linux_init_abi): Set gdbarch_init to arc700_linux_write_pc.
+
+2005-04-03  Ramana Radhakrishnan  <ramana.radhakrishnan@codito.com>
+
+	PR arcgdb/1184
+	* arc-tdep.h(struct gdbarch_tdep): Add members breakpoint_insn
+	and breakpoint_size.
+	* arc-tdep.c(arc_breakpoint_from_pc): Return gdbarch_tdep value
+	for software bp instructions to be used. 
+	* arc-linux-tdep.c(arc_linux_init_abi): Initialize the tdep for 
+	arc700_linux_default_breakpoints. 
+	  arc700_linux_breakpoint_insn:New breakpoint insn for ARC700
+	  linux.
+	  arc700_linux_breakpoint_size:New breakpoint size for ARC700 
+	  linux.
+
+2005-04-03  Ramana Radhakrishnan  <ramana.radhakrishnan@codito.com>
+
+	* arc-tdep.c(arc_linux_write_pc):Correct comment for orig_r8.
+
+2005-04-02  Ramana Radhakrishnan  <ramana.radhakrishnan@codito.com>
+
+	* version.in: should have been 20050401.
+
+2005-04-01  Ramana Radhakrishnan  <ramana.radhakrishnan@codito.com>
+
+	* version.in: Bump up version for release.
+	
+2005-04-01  Ramana Radhakrishnan  <ramana.radhakrishnan@codito.com>
+	
+	* ChangeLog.codito: Remove more spurious entries.
+
+	PR arcgdb/1175
+	* arc-tdep.c(arc_push_dummy_call): New function.
+	  (push_stack_item):New function.
+	  (pop_stack_item):New function.
+	  (arc_add_reggroups_p):Register system_reggroup.
+	  (arc_register_reggroup_p):Add orig_r8 to system_reggroup.
+	  (arc_linux_write_pc):	Set orig_r8 to -3 to work correctly 
+	  dummy frames and signal handlers. Fixes failures in signals.exp.
+	  (arc_gdbarch_init):Set dummy call to use arc_push_dummy_call. 
+	  Set breakpoint for dummy code at entry point.
+	  Register arc_linux_write_pc.
+	* ChangeLog.codito: Remove spurious Changelog entry.
+
+2005-04-01  Ramana Radhakrishnan  <ramana.radhakrishnan@codito.com>
+
+	* arc-tdep.h: Add enum arc700_regnums for ARC register types. 
+
+
+
+2005-03-30  Ramana Radhakrishnan  <ramana.radhakrishnan@codito.com>
+
+	PR arcgdb/1172
+	* arc-tdep.c(arc_scan_prologue): Skip over argument save
+	registers. 
+
+2005-03-28  Ramana Radhakrishnan  <ramana@codito.com>
+
+<	* arc-tdep.c: Add contribution tag. 
+	  (printFrameInfo): Conditionally compile with ARC_DEBUG.
+	  (printInsnState): Likewise.
+	  (UPDATESTACKSPACE): Correct for variadic args. 
+	  (PUSHBLINKFI): Correct for variadic args. 
+	  (ISSUBSPFI): Update for mixed code.
+	  (arc_scan_prologue): Update prologue description and correct.
+	  (arc_scan_prologue): Clean up declarations. 
+	  Handle callee saves, Handle 16 bit ARCompact insns.
+	
+
+2005-03-21  Soam Vasani  <soam.vasani@codito.com>
+
+	* arc-tdep.c (arc_gdbarch_init): Assume OSABI = Linux for now.
+	Call gdbarch_init_osabi.
+	* arc-linux-tdep.c (_initialize_arc_linux_tdep): Pass machine = 0
+	to gdbarch_register_osabi.
+
+2005-03-20  Soam Vasani <soam.vasani@codito.com>
+
+	PR gdb/1098
+	* arc-tdep.c(arc_cannot_store_register): Don't print warning.
+	  (arc_register_reggroup_p): Remove read-only registers from 
+	  save/restore reggroups.
+
+2005-03-17  Ramana Radhakrishnan  <ramana.radhakrishnan@codito.com>
+
+	* arc-linux-tdep.c:Add copyright notice. 
+
+2005-03-17  Soam Vasani <soam.vasani@codito.com>
+
+	* gdb/arc-tdep.c: Cleanup and remove warnings.
+	* gdb/arc-linux-tdep.c: Ditto.
+
+2005-03-17  Soam Vasani <soam.vasani@codito.com>
+
+	* gdb/arc-linux-tdep.c (arc_sigtramp_insn): Defined.
+	  (arc_linux_sigtramp_p): Defined: check if PC is in a signal 
+	  trampoline.
+	  (arc_linux_sigcontext_addr): Defined: return the address of the
+	  sigcontext structure.
+	  (arc_linux_sc_reg_offset): Defined: mapping from regnum to
+	  sigcontext offset.
+	  (arc_linux_linux_init_abi): Defined: add stuff to gdbarch->tdep.
+	* gdb/arc-tdep.h (ARC_PC_REGNUM): Replaced by ARC_RET_REGNUM.
+	* gdb/arc-tdep.c (ARC_PC_REGNUM): Replace all references by either
+	  PC_REGNUM or ARC_RET_REGNUM.
+	  (arc_unwind_pc): Call the unwinder with PC_REGNUM instead of
+	  ARC_RET_REGNUM.  The unwinder will decide what register to give
+	  for PC_REGNUM, because PC_REGNUM itself is not a real register.
+	  (arc_sigtramp_frame_cache, arc_sigtramp_frame_this_id, 
+	  arc_sigtramp_frame_prev_register, arc_sigtramp_frame_unwind,
+	  arc_sigtramp_frame_sniffer): Defined.
+	  (arc_gdbarch_init): Append arc_sigtramp_frame_sniffer.
diff --git a/gdb/arc-jtag-ops.c b/gdb/arc-jtag-ops.c
new file mode 100644
index 0000000..0a237f6
--- /dev/null
+++ b/gdb/arc-jtag-ops.c
@@ -0,0 +1,1229 @@
+/* Target dependent code for ARC700, for GDB, the GNU debugger.
+
+   Copyright 2005 Free Software Foundation, Inc.
+
+   Contributed by Codito Technologies Pvt. Ltd. (www.codito.com)
+
+   Authors: 
+      Sameer Dhavale <sameer.dhavale@codito.com>
+      Soam Vasani <soam.vasani@codito.com>
+
+   This file is part of GDB.
+   
+   This program 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 of the License, or
+   (at your option) any later version.
+   
+   This program 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 this program; if not, write to the Free Software
+   Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.  
+*/
+
+#include <stdio.h>
+#include <unistd.h>
+#include <stdlib.h>
+#include <errno.h>
+#include <sys/io.h>
+#include <sys/types.h>
+#include <sys/stat.h>
+#include <fcntl.h>
+#include <assert.h>
+#include "arc-jtag-ops.h"
+#include "gpio.h"
+#include <signal.h>
+#include <defs.h>
+#include <sys/ioctl.h>
+#include "arc-tdep.h"
+#define printf printf_filtered
+
+
+unsigned int arcjtag_retry_count = 50;
+
+
+/* ------------------------------------ */
+/*         For ARC jtag Cable           */
+/*                                      */
+/* Pin no.  Signal           Word , Bit */
+/*                                      */
+/* - 	    TRST 	                */
+/* 8 	    TMS 	     Data 6     */
+/* 1 	    TCK 	     Control 0  */
+/* 9 	    TDI 	     Data 7     */
+/* 13 	    TDO 	     Status 4   */
+
+
+#define JTAG_TRST 0x00  /* not there */
+#define JTAG_TMS  0x40  /* data port */
+#define JTAG_TCK  0x01  /* control port. Driven Low. */
+
+#define JTAG_TDI  0x80  /* data port */
+#define JTAG_TDO  0x10  /* status port */
+
+/* ------------------------------------ */
+
+/* */
+#define A4_HALT_VALUE 0x02000000
+#define ARC700_HALT_VALUE 0x1
+
+
+/* Parallel port i/o addr. (LPT1) */
+#define DATA_PORT    0x378
+#define STATUS_PORT  0x379
+#define CONTROL_PORT 0x37A
+
+
+unsigned char tapc_dataport=0, tapc_statusport=0, tapc_controlport=0x1;
+int fd;
+struct GPIO_ioctl jtag_ioctl;
+sigset_t block_mask;
+
+enum AA3SSPinState
+  {
+    READ_FROM_AA3 = 0,
+    WRITE_TO_AA3 = 1
+  };
+enum AA3SSPinState rw_flag; 
+
+
+
+struct jtag_ops arc_jtag_ops;
+static enum ARCProcessorVersion ARCProcessor = UNSUPPORTED;
+
+
+/* Sanity check to give error if jtag is not opened at all. */
+
+static void 
+check_and_raise_error_if_jtag_closed (void)
+{
+  if( arc_jtag_ops.jtag_status == JTAG_CLOSED )
+    error ("JTAG connection is closed. Use target arcjtag first\n");
+}
+
+
+/* Initializations for GPIO interface */
+static int
+gpio_setup (void)
+{
+  fd=open("//dev//gpio",O_RDWR);
+  ioctl(fd,GPIO_IOC_HARDRESET);
+  ioctl(fd,GPIO_IOC_SET_PORT_BASE,0x378);
+  jtag_ioctl.inlen=0;
+  jtag_ioctl.outlen=0;
+  jtag_ioctl.inbuf=(unsigned char *)xmalloc(2*sizeof(unsigned char));
+  jtag_ioctl.outbuf=(unsigned char *)xmalloc(2*sizeof(unsigned char));
+  return 0;
+}
+
+void gpio_write(unsigned int port, unsigned char *data)
+{
+    jtag_ioctl.inlen=2;
+    jtag_ioctl.inbuf[1]=*data;
+    switch(port)
+    {
+    case DATA_PORT:
+	jtag_ioctl.inbuf[0]=0;
+	break;
+
+    case STATUS_PORT:
+	jtag_ioctl.inbuf[0]=1;
+	break;
+
+    case CONTROL_PORT:
+	jtag_ioctl.inbuf[0]=2;
+	break;
+	    
+    default:
+	error("Invalid port\n");
+    }
+
+ 
+    if(ioctl(fd,GPIO_IOC_DO_IO,&jtag_ioctl))
+	error("Failure writing to port 0x%x\n",port);
+
+}
+
+
+unsigned char gpio_read(unsigned int port)
+{
+    //jtag_ioctl.inbuf[1]=tapc_statusport;
+    jtag_ioctl.inlen=2;
+    jtag_ioctl.outlen=1;
+
+    switch(port)
+    {
+    case DATA_PORT:
+	jtag_ioctl.inbuf[0]=0x80;
+	break;
+
+    case STATUS_PORT:
+	jtag_ioctl.inbuf[0]=0x81;
+	break;
+
+    case CONTROL_PORT:
+	jtag_ioctl.inbuf[0]=0x82;
+	break;
+	    
+    default:
+	error("Invalid port\n");
+    }
+    
+    if(ioctl(fd,GPIO_IOC_DO_IO,&jtag_ioctl))
+	error("Failure reading from port 0x%x\n",port);
+	  
+    return jtag_ioctl.outbuf[0];
+
+
+}
+
+/* Helper functions for setting
+   TMS / TCK / TDI. Valid inputs
+   are 1 and 0. The tapc_<tms/tck/tdi> 
+   functions set the internal values 
+   to be written out to the port. The 
+   final values are written only by doing 
+   the pulse.
+ */
+
+static void
+tapc_set_tms (char x)
+{
+    if(x)
+	tapc_dataport |= JTAG_TMS;
+    else
+	tapc_dataport &= ~JTAG_TMS;
+
+    /* outb(tapc_dataport, DATA_PORT); */
+    gpio_write(DATA_PORT,&tapc_dataport);
+}
+
+
+/* Set TCK. */
+static void
+tapc_set_tck (char x)
+{
+  /* active low. The clock is active low. */
+    if(!x) 
+  	tapc_controlport |= JTAG_TCK;
+    else
+	tapc_controlport &= ~JTAG_TCK;
+    
+    if(rw_flag == READ_FROM_AA3)
+      tapc_controlport |= 0x4; 
+    else
+      tapc_controlport &= ~(0x4); 
+      
+    /* outb(tapc_controlport, CONTROL_PORT); */
+    gpio_write(CONTROL_PORT,&tapc_controlport);
+}
+
+
+static void
+tapc_set_tdi (char x)
+{
+    if(x)
+	tapc_dataport |= JTAG_TDI;
+    else
+	tapc_dataport &= ~JTAG_TDI;
+    
+    /* outb(tapc_dataport, DATA_PORT); */
+    gpio_write(DATA_PORT,&tapc_dataport);
+}
+
+/* Unused function clockdelay. Why not add a command
+ that allows the user to set the clock delay ? */
+
+static void
+clockdelay (void)
+{
+    int i;
+    //for (i=0; i<10; ++i)
+    
+    //   usleep(0);
+}
+
+/* Clock the JTAG on the ARC platform. */
+static void
+tapc_pulse (void)
+{
+    /* Control 0 bit is active low */
+    unsigned char temp;
+    assert( (tapc_controlport & JTAG_TCK) );  // clock should be zero on entry
+   
+    /* outb(tapc_controlport & ~JTAG_TCK, CONTROL_PORT); */
+    temp = tapc_controlport & ~JTAG_TCK;
+    gpio_write(CONTROL_PORT,&temp);
+   /*  outb(tapc_controlport, CONTROL_PORT); */
+    gpio_write(CONTROL_PORT,&tapc_controlport);
+    
+}
+
+/* All the JTAG state machine handlers.  */
+
+/* Reset the TAPC controller on the JTAG. 
+ */
+static void
+tapc_reset (void)
+{
+    /* from any state, these many ones should get us into "test-logic reset" 
+     */
+    tapc_set_tms(1);
+    tapc_set_tck(0);  /* want rising edge */
+    tapc_pulse();
+    tapc_pulse();
+    tapc_pulse();
+    tapc_pulse();
+    tapc_pulse();
+    tapc_pulse();
+}
+
+/* Set the tms to the value of the bit and 
+   clock the jtag. */
+
+static void
+tapc_tms (char x)
+{
+    tapc_set_tms(x);
+    tapc_pulse();
+}
+
+/* Read bit from the TDO of the JTAG. */
+static char
+tapc_readbit (void)
+{
+    if(gpio_read(STATUS_PORT) & JTAG_TDO)
+	return 1; 
+    else
+	return 0;
+}
+
+
+/* Interface functions that use the below mentioned 
+   JTAG state machine handler functions. 
+*/
+
+/* Shift one bit out on the JTAG TDI. */
+static char
+tapc_shiftbit (char x)
+{
+    char read;
+
+    //printf("tapc_shiftbit: Shifted %d\n", x);
+
+    read = tapc_readbit();    
+    tapc_set_tdi(x);
+    tapc_pulse();
+
+    return read;
+}
+
+
+/*
+ * Shift N bits from to_write into TDI, and out from TDO into read.
+ *
+ * If msb_first=0, shift LSB first, starting from to_write[0], to_write[1],
+ * etc.
+ 
+ * If msb_first=1, shift to_write[-1] MSB first, then to_write[-2] etc.
+ *
+ * Must be called in Shift DR/IR state.
+ * Leaves in Exit1 DR/IR state.
+ */ 
+static void
+tapc_shiftnbits (int n, 
+		unsigned char *to_write, 
+		unsigned char *read, 
+		char msb_first)
+{
+    unsigned char outbyte, inbyte;
+    int nbytes = (n-1)/8 + 1,limit=8;
+    int i, j;
+
+    for(i=0; i < nbytes; ++i)
+    {
+	if(msb_first)
+	    outbyte = to_write[-1-i];
+	else	   
+	    outbyte = to_write[i];
+
+	inbyte = 0;
+	/* should write a maximum of 8 bits */
+	if(i == nbytes-1)
+	    limit = ((n-1) % 8) + 1;  
+	
+	for(j = 0; j < limit; ++j)
+	{
+	    unsigned char outbit, inbit;
+
+	    if(msb_first)
+		outbit = !!(outbyte & 0x80);
+	    else
+		outbit = outbyte & 1;
+	    /* the last bit of the last byte */
+	    /* transition to EXIT-1 state before last bit */
+	    if((i == nbytes-1)&&(j == limit-1)) 
+	      tapc_set_tms(1); 
+	    
+	    inbit = tapc_shiftbit(outbit);
+
+	    if(msb_first)
+	      {
+		inbyte |= (inbit << (7-j));
+		outbyte <<= 1;
+	      }
+	    else
+	      {
+		inbyte |= inbit << j;
+		outbyte >>= 1;
+	    }
+	}
+
+	//tapc_tms(1);
+	if(msb_first)
+	    read[-1-i] = inbyte;
+	else
+	    read[i] = inbyte;
+    }
+}
+
+
+/* Read the JTAG status register. This indicates
+   the status of the JTAG for the user. 
+*/
+static unsigned int
+read_jtag_status_reg (void)
+{
+    unsigned int wr, rd;
+    int x;
+    //rw_flag=0;
+    //tapc_tms(0); // runtest/idle
+    tapc_tms(1); // select dr
+    tapc_tms(1); // select ir
+    tapc_tms(0); // capture ir
+    tapc_tms(0); // shift ir
+
+    wr = 0x8;    // IR = status register
+
+    tapc_shiftnbits(4, (unsigned char *)&wr, (unsigned char*)&rd, 0);
+
+    
+    
+    // goto shift DR
+    tapc_tms(1); // update ir
+    //tapc_tms(0); // runtest/idle
+    tapc_tms(1); // select dr
+    tapc_tms(0); // capture dr
+    tapc_tms(0); // shift dr
+
+    rd = 0;
+
+    // read 1 bit, if it is zero then keep reading
+    rd = tapc_shiftbit(0);
+    if (rd)
+	return rd; 
+
+    rd |= tapc_shiftbit(0) << 1;
+    if (rd)
+	return rd;
+    
+    rd |= tapc_shiftbit(0) << 2;
+
+    /* the last bit is optional */
+    /*rd |= tapc_shiftbit(0) << 3;*/
+    
+    return rd;    
+}
+
+
+/* Interpret the status message. */
+static void
+print_jtag_status_reg_val (unsigned int status)
+{
+    int i ;
+    char * messages [] = { "Stalled" , "Failure", "Ready", "PC Selected" };
+    for(i=0;i<=3;i++)
+    {
+	printf_filtered("%s %s \t",(status & 1)?"":"Not",messages[i]);
+	status = status >> 1;
+    }
+    printf_filtered("\n");
+}
+
+
+
+/* Write a JTAG Command to a JTAG register. 
+   enter in update dr/ir state
+   or Test-Logic-Reset.
+   exit in update dr
+*/
+static void
+write_jtag_reg (char regnum, unsigned int data, int ndatabits)
+{
+    unsigned int wr=0,rd=0;
+    rw_flag = WRITE_TO_AA3 ;
+    //    tapc_tms(0); // runtest/idle
+    tapc_tms(1); // select dr
+    tapc_tms(1); // select ir
+    tapc_tms(0); // capture ir
+    tapc_tms(0); // shift ir
+
+		
+    tapc_shiftnbits(4, (unsigned char *)&regnum, (unsigned char *)&rd, 0);
+
+    
+    tapc_tms(1); // update ir
+
+    tapc_tms(1); // select dr
+    tapc_tms(0); // capture dr
+    tapc_tms(0); // shift dr
+
+    tapc_shiftnbits(ndatabits, (unsigned char *)&data, 
+		    (unsigned char *)&rd, 0);
+    tapc_tms(1); // update dr
+}
+	    
+
+// enter in update dr/ir state
+// exit in update dr
+static unsigned int
+read_jtag_reg (char regnum, int ndatabits)
+{
+    unsigned int wr=0x0,rd=0;
+    rw_flag = READ_FROM_AA3;
+    //    tapc_tms(0); // runtest/idle
+    tapc_tms(1); // select dr
+    tapc_tms(1); // select ir
+    tapc_tms(0); // capture ir
+    tapc_tms(0); // shift ir
+
+    tapc_shiftnbits(4, (unsigned char *)&regnum, (unsigned char *)&rd, 0);
+    tapc_tms(1); // update ir
+
+    /* JTAG registers can be read without going to run-test/idle state.
+       
+       Doing tapc_tms(0) will take us to run-test/idle state.
+       This will make JTAG perform the transaction as per TCR.
+       We dont want this. 
+    */
+    //    tapc_tms(0); // runtest/idle
+    tapc_tms(1); // select dr
+    tapc_tms(0); // capture dr
+    tapc_tms(0); // shift dr
+
+    tapc_shiftnbits(ndatabits, (unsigned char *)&wr, (unsigned char *)&rd, 0);
+    tapc_tms(1); // update dr
+
+    return rd;
+}
+
+
+
+    
+    
+
+
+
+static int
+arc_jtag_read_core_reg (unsigned int regnum, unsigned int *readbuf)
+{
+    unsigned int rd, wr, data, i;
+    check_and_raise_error_if_jtag_closed();
+    tapc_reset();
+    tapc_tms(0);//run-test idle
+    write_jtag_reg(0xA, regnum, 32);//update dr
+
+    
+
+    // Setup instruction register to 0x9 indicating
+    // a JTAG instruction is being downloaded.
+    // jtag transaction command reg = 0x5 (read core reg)
+    write_jtag_reg(0x9, 0x5, 4);//update dr
+
+    /* Perform the transaction.
+     */
+    tapc_tms(0); // run-test idle
+    
+    // poll the status
+
+    for (i=0;i<arcjtag_retry_count;i++)
+    {
+	unsigned int status = read_jtag_status_reg();
+	//if( !(status & 1) && (status & 4) )
+	if(status == 4)
+	    break;
+	if(status == 2)
+	    return JTAG_READ_FAILURE;
+	tapc_tms(1);//exit1-dr
+	tapc_tms(1);//update-dr
+	/* Do not redo the transaction. Pause and re-try.
+	 */
+	//tapc_tms(0);//run-test-idle
+    }
+    if (i==arcjtag_retry_count)
+      return JTAG_READ_FAILURE;
+
+    /* JTAG status register leaves us in Shift DR */
+    tapc_tms(1); /* Move to Exit-1 DR */
+    tapc_tms(1); /* Move to Update DR */
+    
+    // data = jtag data reg
+    data = read_jtag_reg(0xB, 32);
+
+    *readbuf = data;
+    
+    return sizeof(data);
+}
+
+static int
+arc_jtag_write_core_reg (unsigned int regnum, unsigned int data)
+{
+    unsigned int rd, wr, i;
+
+    check_and_raise_error_if_jtag_closed();
+    tapc_reset();
+    tapc_tms(0);//run-test idle
+
+    // data = jtag data reg
+    write_jtag_reg(0xB, data, 32);//update dr
+
+    // jtag addr register = regnum:
+    write_jtag_reg(0xA, regnum, 32);//update dr
+    
+    
+
+    // jtag transaction command reg = 0x1(write core reg)
+    write_jtag_reg(0x9, 0x1, 4);//update dr
+
+    /* Perform the transaction.
+     */
+    tapc_tms(0); // run-test idle
+    
+    for (i=0;i<arcjtag_retry_count;i++)
+    {
+      unsigned int status = read_jtag_status_reg();
+      	if(status == 4)
+	    break;
+	if(status == 2)
+	    return JTAG_WRITE_FAILURE;
+	tapc_tms(1);//exit1-dr
+	tapc_tms(1);//update-dr
+	/* Do not redo the transaction. Pause and re-try.
+	 */
+	//tapc_tms(0);//run-test-idle
+    }
+    if (i==arcjtag_retry_count)
+      return JTAG_READ_FAILURE;
+
+    tapc_tms(1);//exit1-dr
+    tapc_tms(1);//update-dr
+    /* This should have been done earlier i.e. before
+       reading the JTAG status register.
+     */
+    //tapc_tms(0);//rn-test-idle
+    return sizeof(data);
+}
+
+static int
+arc_jtag_read_aux_reg (unsigned int regnum, unsigned int *readbuf)
+{
+    unsigned int rd, wr, data, i;
+    if(arc_jtag_ops.arc_jtag_state_machine_debug)
+      printf_filtered("\nEntered arc_jtag_read_aux_reg()\
+         \n Regnum:%d \n",regnum);
+    check_and_raise_error_if_jtag_closed();
+    check_and_raise_error_if_jtag_closed();
+    tapc_reset();
+    tapc_tms(0);//run-test idle
+    write_jtag_reg(0xA, regnum, 32);//update dr
+
+
+
+    // Setup instruction register to 0x9 indicating
+    // a JTAG instruction is being downloaded.
+    // jtag transaction command reg = 0x6 (read aux reg)
+    write_jtag_reg(0x9, 0x6, 4);//update dr
+
+    /* Perform the transaction.
+     */
+    tapc_tms(0); // run-test idle
+
+    // poll the status
+
+    for (i=0;i<arcjtag_retry_count;i++)
+    {
+	unsigned int status = read_jtag_status_reg();
+	
+	if(status == 4)
+	    break;
+	if(status == 2)
+	    return JTAG_READ_FAILURE;
+	tapc_tms(1);//exit1-dr
+	tapc_tms(1);//update-dr
+	/* Do not redo the transaction. Pause and re-try.
+	 */
+	//tapc_tms(0);//run-test-idle
+
+    }
+    if (i==arcjtag_retry_count)
+      return JTAG_READ_FAILURE;
+
+
+/*     JTAG status register leaves us in Shift DR */
+    tapc_tms(1); /* Move to Exit-1 IR */
+    tapc_tms(1); /* Move to Update IR */
+    
+    // data = jtag data reg
+    data = read_jtag_reg(0xB, 32);
+    *readbuf = data;
+    if(arc_jtag_ops.arc_jtag_state_machine_debug)
+      printf(" Data: %d\n",data);
+    return sizeof(data);
+}
+
+static int
+arc_jtag_write_aux_reg (unsigned int regnum, unsigned int data)
+{
+    unsigned int rd, wr, i;
+    if(arc_jtag_ops.arc_jtag_state_machine_debug)
+      printf_filtered("\nEntered arc_jtag_write_aux_reg()\n Regnum:%d\nData:%d\n",regnum,data);
+    check_and_raise_error_if_jtag_closed();
+    tapc_reset();
+    tapc_tms(0);//run-test idle
+    
+    // data = jtag data reg
+    write_jtag_reg(0xB, data, 32);//update dr
+
+    // jtag addr register = regnum:
+    write_jtag_reg(0xA, regnum, 32);//update dr
+    
+    
+
+    // jtag transaction command reg = 0x2 (write aux reg)
+    write_jtag_reg(0x9, 0x2, 4);//update dr
+
+    /* Perform the transaction.
+     */
+    tapc_tms(0); // run-test idle
+
+    for (i=0;i<arcjtag_retry_count;i++)
+    {
+	unsigned int status = read_jtag_status_reg();
+	if(status == 4)
+	    break;
+	if(status == 2)
+	    return JTAG_WRITE_FAILURE;
+	tapc_tms(1);//exit1-dr
+	tapc_tms(1);//update-dr
+	/* Do not redo the transaction. Pause and re-try.
+	 */
+	//tapc_tms(0);//run-test-idle
+    }
+    if (i==arcjtag_retry_count)
+      return JTAG_READ_FAILURE;
+
+	tapc_tms(1);//exit1-dr
+	tapc_tms(1);//update-dr
+	/* This should have been done earlier i.e. before
+	   reading the JTAG status register.
+	*/
+	//tapc_tms(0);//run-test-idle
+	return sizeof(data);
+}
+
+
+static int
+read_mem (unsigned int addr, unsigned int *readbuf)
+{
+    unsigned int rd, wr, data, i;
+
+    rw_flag = READ_FROM_AA3;
+    if(arc_jtag_ops.arc_jtag_state_machine_debug)
+      printf_filtered("\nEntered read_mem() 0x%x\n",addr);
+    // jtag addr register = regnum:
+    tapc_reset();
+    tapc_tms(0);//run-test idle
+    write_jtag_reg(0xA, addr, 32);//update dr
+
+    
+
+    // Setup instruction register to 0x9 indicating
+    // a JTAG instruction is being downloaded.
+    // jtag transaction command reg = 0x5 (read core reg)
+    write_jtag_reg(0x9, 0x4, 4);//update dr
+
+    /* Perform the transaction.
+     */
+    tapc_tms(0); // run-test idle
+
+    // poll the status
+
+    for (i=0;i<arcjtag_retry_count;i++)
+    {
+	unsigned int status = read_jtag_status_reg();
+	if(status == 4)
+	    break;
+	if(status == 2)
+	    return JTAG_READ_FAILURE;
+	tapc_tms(1);//exit1-dr
+	tapc_tms(1);//update-dr
+	/* Do not redo the transaction. Pause and re-try.
+	 */
+	//tapc_tms(0); // run-test-idle
+    }
+    if (i==arcjtag_retry_count)
+      return JTAG_READ_FAILURE;
+
+    /* JTAG status register leaves us in Shift DR */
+    tapc_tms(1); /* Move to Exit-1 DR */
+    tapc_tms(1); /* Move to Update DR */
+    
+    // data = jtag data reg
+    data = read_jtag_reg(0xB, 32);
+    *readbuf = data;
+    if(arc_jtag_ops.arc_jtag_state_machine_debug)
+    printf_filtered("\n Read rd =0x%x in read_mem",data);
+
+    return sizeof(data);
+}
+
+
+static int
+write_mem (unsigned int addr, unsigned int data)
+{
+    unsigned int rd, wr, i;
+    if(arc_jtag_ops.arc_jtag_state_machine_debug)
+      printf_filtered("\nEntered write_mem() to write 0x%x at 0x%x\n",data,addr);
+    tapc_reset();
+    tapc_tms(0);//run-test idle
+    
+    // data = jtag data reg
+    write_jtag_reg(0xB, data, 32);//update dr
+
+    // jtag addr register = regnum:
+    write_jtag_reg(0xA, addr, 32);//update dr
+    
+    
+
+    // jtag transaction command reg = 0x0(write mem)
+    write_jtag_reg(0x9, 0x0, 4);//update dr
+
+    /* Perform the transaction.
+     */
+    tapc_tms(0); // run-test idle
+
+    for (i=0;i<arcjtag_retry_count;i++)
+    {
+	unsigned int status = read_jtag_status_reg();
+	if(status == 4)
+	    break;
+	if(status == 2)
+	    return JTAG_WRITE_FAILURE;
+	tapc_tms(1);//exit1-dr
+	tapc_tms(1);//update-dr
+	/* Do not redo the transaction. Pause and re-try.
+	 */
+	//tapc_tms(0);//run-tes-idle
+    }
+    if (i==arcjtag_retry_count)
+      return JTAG_READ_FAILURE;
+
+    tapc_tms(1);//exit1-dr
+    tapc_tms(1);//update-dr
+    /* This should have been done earlier i.e. before
+       reading the JTAG status register.
+     */
+    //tapc_tms(0);//run-test-idle
+    return sizeof(data);
+}
+
+
+static int 
+arc_jtag_write_chunk (unsigned int addr, unsigned int *write_buf, int len)
+{
+  unsigned int rd, wr;
+  unsigned int status;
+  check_and_raise_error_if_jtag_closed();
+    
+  rw_flag = WRITE_TO_AA3 ;
+  int i = 0;
+  int len_mod = len % 4;
+  len = len - len_mod;
+  
+  tapc_reset();
+  if(arc_jtag_ops.arc_jtag_state_machine_debug)
+    printf_filtered("Entered arc_jtag_write_chunk()......0x%x\n",*write_buf);
+  tapc_tms(0);//run-test idle
+  
+  // jtag addr register = regnum:
+  write_jtag_reg(0xA, addr, 32);//update dr
+  
+  
+  
+  // jtag transaction command reg = 0x0(write mem)
+  write_jtag_reg(0x9, 0x0, 4);//update dr
+  
+  while(len)
+    {
+      
+      // data = jtag data reg
+      write_jtag_reg(0xB, write_buf[i++], 32);//update dr
+      
+      /* Perform the transaction.
+       */
+      tapc_tms(0); // run-test idle
+      
+      
+      while(1)
+	{
+	  status = read_jtag_status_reg();
+	  if(status == 4)
+	    break;
+	  if(status == 2)
+	    return (i-1) * 4;
+
+	  tapc_tms(1);//exit1-dr
+	  tapc_tms(1);//update-dr
+	  /* Do not redo the transaction. Pause and re-try.
+	   */
+	  //tapc_tms(0);//run-tes-idle
+	}
+      
+      tapc_tms(1);//exit1-dr
+      tapc_tms(1);//update-dr
+      /* This should have been done earlier i.e. before
+	 reading the JTAG status register.
+      */
+      //tapc_tms(0);//run-test idle
+      len = len - 4;
+    }
+
+  if(arc_jtag_ops.arc_jtag_state_machine_debug)
+    printf_filtered("leaving arc_jtag_write_chunk() with return value %d",i*4);
+  
+  // added support for writing no of bytes those are not exact mutiple of four
+  
+  if(!len_mod)
+    return i*4;
+  else
+    {
+      
+      addr=addr+(i*4);
+      if(read_mem(addr,&rd)==JTAG_READ_FAILURE)
+	  return i*4;
+      if(arc_jtag_ops.arc_jtag_state_machine_debug)
+      printf_filtered("\nrd=0x%x and wr=0x%x\n",rd,write_buf[i]);
+
+      switch(len_mod)
+	{
+	  
+	case 1:
+	  wr = (rd & 0xffffff00)|(write_buf[i] & 0xff);
+	  break;
+	  
+	case 2:
+	  wr = (rd & 0xffff0000)|(write_buf[i] & 0xffff);
+	  break;
+	  
+	case 3:
+	  wr = (rd & 0xff000000)|(write_buf[i] & 0xffffff);
+	  break;
+	  
+	}
+      if(arc_jtag_ops.arc_jtag_state_machine_debug)
+	printf_filtered("\nwrite_mem writing 0x%x at 0x%x",wr,addr);
+      arc_jtag_write_chunk(addr,&wr,4);
+      return (i*4 + len_mod);
+    }
+  
+  
+}
+
+static int 
+arc_jtag_read_chunk (unsigned int addr, unsigned int *read_buf, int len)
+{
+    unsigned int rd, wr, data;
+    int i=0;
+    rw_flag = READ_FROM_AA3 ;
+    int len_mod=len%4;
+    len=len-len_mod;
+    if(arc_jtag_ops.arc_jtag_state_machine_debug)
+      printf_filtered("\nEntered arc_jtag_read_chunk() 0x%x\n",addr);
+    check_and_raise_error_if_jtag_closed();
+
+    // jtag addr register = regnum:
+    tapc_reset();
+    tapc_tms(0);//run-test idle
+    
+    write_jtag_reg(0xA, addr, 32);//update dr
+
+    
+    while(len)
+    {
+    // Setup instruction register to 0x9 indicating
+    // a JTAG instruction is being downloaded.
+    // jtag transaction command reg = 0x5 (read core reg)
+    write_jtag_reg(0x9, 0x4, 4);//update dr
+
+    /* Perform the transaction.
+     */
+    tapc_tms(0); // run-test idle
+
+    // poll the status
+
+    while(1)
+    {
+	unsigned int status = read_jtag_status_reg();
+	if(status == 4)
+	    break;
+	if(status == 2)
+	    return (i-1)*4;
+	tapc_tms(1);//exit1-dr
+	tapc_tms(1);//update-dr
+	/* Do not redo the transaction. Pause and re-try.
+	 */
+	//tapc_tms(0);//run-test-idle
+
+    }
+
+    /* JTAG status register leaves us in Shift DR */
+    tapc_tms(1); /* Move to Exit-1 DR */
+    tapc_tms(1); /* Move to Update DR */
+    
+    // data = jtag data reg
+    read_buf[i++] = read_jtag_reg(0xB, 32);// exits in Update DR
+    len= len-4;
+    //tapc_tms(0);/* Move to run-test-idle */
+
+    }
+
+    // added support for reading no of bytes those are not exact mutiple of four
+
+    if(!len_mod)
+	return i*4;
+    else
+    {
+        char *ptr = (char *)read_buf + i*4;
+	addr=addr+(i*4);
+	if(read_mem(addr,&rd)==JTAG_READ_FAILURE)
+	    return i*4;
+
+	switch(len_mod)
+	{
+	case 1:
+	    ptr[0] = rd & 0xff;
+	    break;
+
+	case 2:
+	    ptr[0] = rd & 0xff;
+	    ptr[1] = (rd>>8) & 0xff;
+	    break;
+
+	case 3:
+	    ptr[0] = rd & 0xff;
+	    ptr[1] = (rd>>8) & 0xff;
+	    ptr[2] = (rd>>16) & 0xff;
+	    break;
+	}
+
+	return ((i*4)+len_mod);
+	
+    }
+
+
+}
+
+
+
+/*
+ * Return the Processor Variant that is connected.
+ */
+int
+arc_get_architecture() 
+{
+  if (ARCProcessor == UNSUPPORTED) {
+    unsigned int value;
+
+    /* Read the Identity Register. */
+    if (arc_jtag_read_aux_reg(4, &value) == JTAG_READ_FAILURE)
+      error("Failure reading from auxillary IDENTITY register");
+
+    /* Get Identity Mask. */
+    value &= 0xff ;
+
+    if((value >= 0x30) && (value <= 0x3f))
+      ARCProcessor = ARC700;
+    else if((value >= 0x20) && (value <= 0x2f))
+      ARCProcessor = ARC600;
+    else if((value >= 0x10) && (value <= 0x1f))
+      ARCProcessor = A5;
+    else if ((value >= 0x00) && (value <= 0x0f)) 
+      ARCProcessor = A4;
+    else 
+      error("Unsupported Processor Version 0x%x\n", value);
+  }
+
+  return ARCProcessor;
+}
+
+
+
+static void 
+arc_jtag_open (void)
+{
+  int retval;
+  unsigned int read_status = 0;
+  sigaddset(&block_mask,SIGINT);
+  retval = gpio_setup();
+  if(retval != 0)
+    {
+      error("Unable to open JTAG Port .%s \n",(retval == EINVAL)?
+	    "Invalid Params":"Permission Denied" );
+      arc_jtag_ops.jtag_status = JTAG_CLOSED;
+      return ;
+    }
+  arc_jtag_ops.jtag_status = JTAG_OPENED;
+
+  tapc_reset();
+  //Writing debug bit of debug register
+  
+  do
+    {
+      /* Note: Reading the status/status32 register here to
+         check if halt bit is set*/
+      if (IS_A4) {
+	if(arc_jtag_read_aux_reg( 0x0, &read_status) == JTAG_READ_FAILURE)
+	  error("Failure reading auxillary register 0xA\n");
+	if(read_status & A4_HALT_VALUE)
+	  break;
+      }
+      else {
+	if(arc_jtag_read_aux_reg( 0xA, &read_status) == JTAG_READ_FAILURE)
+	  error("Failure reading auxillary register 0xA\n");
+	if(read_status & ARC700_HALT_VALUE)
+	  break;
+      }
+      printf_filtered("Processor running. Trying to halt.....\n");
+      if(arc_jtag_write_aux_reg(0x5,0x2)==JTAG_WRITE_FAILURE)
+	error("Failure writing 0x2 to auxillary register 0x5:debug register\n");
+    }while(1);
+  if (arc_jtag_ops.arc_jtag_state_machine_debug)
+    printf_filtered("Processor halted.....\n");
+
+}
+
+static void 
+arc_jtag_close (void)
+{
+  ARCProcessor = UNSUPPORTED;
+
+  if(arc_jtag_ops.jtag_status != JTAG_CLOSED)
+    {
+      tapc_reset();
+      /* closing file descriptor opened for communication with gpio driver */
+      close(fd);
+      if(arc_jtag_ops.arc_jtag_state_machine_debug)
+	printf_filtered("arc-jtag closed\n");
+      arc_jtag_ops.jtag_status = JTAG_CLOSED;
+    }
+
+}
+
+static void 
+arc_jtag_wait(void)
+{
+  unsigned int read_status;
+  check_and_raise_error_if_jtag_closed();
+  do
+    {
+      sigprocmask(SIG_BLOCK,&block_mask, NULL);
+
+      if (IS_A4) {
+	if(arc_jtag_read_aux_reg( 0x0, &read_status) == JTAG_READ_FAILURE)
+	  error("Failure reading auxillary register 0x0\n");
+	//FIXMEA:    if(debug_arc_jtag_target_message)
+	//      printf_filtered ("\n Read Status: 0x%x,%d\n", read_status, read_status);
+
+	if(read_status & A4_HALT_VALUE)
+	  {
+	    sigprocmask(SIG_BLOCK,&block_mask, NULL);
+	    break;
+	  }
+      }
+      else {
+	if(arc_jtag_read_aux_reg( 0xA, &read_status) == JTAG_READ_FAILURE)
+	  error("Failure reading auxillary register 0xA\n");
+	if(read_status & ARC700_HALT_VALUE)
+	  {
+	    sigprocmask(SIG_BLOCK,&block_mask, NULL);
+	    break;
+
+	  }
+      }
+      sigprocmask(SIG_UNBLOCK,&block_mask, NULL);	
+    }while(1);
+
+  while (1)
+    {
+      if (arc_jtag_read_aux_reg (0x5,&read_status) == JTAG_READ_FAILURE)
+	error ("Failure reading Debug register \n");
+      if (!(read_status & 0x80000000))
+	break;
+    }
+}
+
+static void
+arc_jtag_reset_board (void)
+{
+  char c = 5;
+  int  auxval = 2 ;
+  check_and_raise_error_if_jtag_closed ();
+
+  /*
+    Writing 9 did not work. But thats 
+    what the manual says. Hmmm. 
+  gpio_write (CONTROL_PORT, &c);
+  */
+
+  gpio_write ( CONTROL_PORT, &c);
+  c = 0xd;
+  gpio_write ( CONTROL_PORT, &c);
+  c = 5;
+  gpio_write ( CONTROL_PORT, &c);
+
+  if (arc_jtag_write_aux_reg(0x5 , 2) == JTAG_WRITE_FAILURE)
+    error ("Failure writing to auxiliary register Debug\n");
+
+  c = 0;
+  gpio_write ( 0x378, &c);
+  c = 0x40;
+  gpio_write ( 0x378, &c);
+  c = 0;
+  gpio_write ( 0x378, &c);
+  
+  tapc_reset();
+}
+
+
+void
+_initialize_arc_jtag_ops (void)
+{
+    arc_jtag_ops.name=NULL;
+    arc_jtag_ops.jtag_open = arc_jtag_open;
+    arc_jtag_ops.jtag_close = arc_jtag_close;
+    arc_jtag_ops.jtag_memory_write = arc_jtag_write_chunk;
+    arc_jtag_ops.jtag_memory_read = arc_jtag_read_chunk;
+    arc_jtag_ops.jtag_memory_chunk_write = arc_jtag_write_chunk;
+    arc_jtag_ops.jtag_memory_chunk_read = arc_jtag_read_chunk;
+    arc_jtag_ops.jtag_write_aux_reg = arc_jtag_write_aux_reg;
+    arc_jtag_ops.jtag_read_aux_reg = arc_jtag_read_aux_reg;
+    arc_jtag_ops.jtag_read_core_reg = arc_jtag_read_core_reg;
+    arc_jtag_ops.jtag_write_core_reg = arc_jtag_write_core_reg;
+    arc_jtag_ops.jtag_wait = arc_jtag_wait;
+    arc_jtag_ops.jtag_reset_board = arc_jtag_reset_board;
+    arc_jtag_ops.jtag_status = JTAG_CLOSED ;
+}
diff --git a/gdb/arc-jtag-ops.h b/gdb/arc-jtag-ops.h
new file mode 100644
index 0000000..dbf49e6
--- /dev/null
+++ b/gdb/arc-jtag-ops.h
@@ -0,0 +1,62 @@
+/* Target dependent code for ARC700, for GDB, the GNU debugger.
+
+   Copyright 2005 Free Software Foundation, Inc.
+
+   Contributed by Codito Technologies Pvt. Ltd. (www.codito.com)
+
+   Authors: 
+      Sameer Dhavale <sameer.dhavale@codito.com>
+      Soam Vasani <soam.vasani@codito.com>
+
+   This file is part of GDB.
+   
+   This program 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 of the License, or
+   (at your option) any later version.
+   
+   This program 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 this program; if not, write to the Free Software
+   Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.  
+*/
+
+
+#define ARC_NR_CORE_REGS        64
+#define MAX_ARC700_REG_SIZE     4
+#define JTAG_READ_FAILURE 0
+#define JTAG_WRITE_FAILURE 0
+enum arc_jtag_status
+  {
+    JTAG_OPENED,
+    JTAG_CLOSED, 
+    JTAG_RUNNING
+  };
+
+struct jtag_ops{
+  char *name;
+  void (*jtag_open) (void);
+  void (*jtag_close) (void);
+  int (*jtag_memory_write) (unsigned int, unsigned int *, int);
+  int (*jtag_memory_chunk_write) (unsigned int, unsigned int *, int);
+  int (*jtag_memory_read) (unsigned int, unsigned int *, int);
+  int (*jtag_memory_chunk_read) (unsigned int, unsigned int *, int);
+  int (*jtag_read_aux_reg) (unsigned int, unsigned int *);
+  int (*jtag_write_aux_reg) (unsigned int, unsigned int);
+  int (*jtag_read_core_reg) (unsigned int, unsigned int *);
+  int (*jtag_write_core_reg) (unsigned int, unsigned int);
+  void (*jtag_wait) (void);
+  void (*jtag_reset_board) (void);
+  enum arc_jtag_status jtag_status;
+  int arc_jtag_state_machine_debug;
+};
+
+
+#define IS_ARC700	(arc_get_architecture() == ARC700)
+#define IS_ARC600	(arc_get_architecture() == ARC600)
+#define IS_A5		(arc_get_architecture() == A5)
+#define IS_A4		(arc_get_architecture() == A4)
diff --git a/gdb/arc-jtag-tdep.c b/gdb/arc-jtag-tdep.c
new file mode 100644
index 0000000..8401538
--- /dev/null
+++ b/gdb/arc-jtag-tdep.c
@@ -0,0 +1,638 @@
+/* Target dependent code for ARC700, for GDB, the GNU debugger.
+
+   Copyright 2005 Free Software Foundation, Inc.
+
+   Contributed by Codito Technologies Pvt. Ltd. (www.codito.com)
+
+   Authors: 
+      Soam Vasani <soam.vasani@codito.com>
+      Ramana Radhakrishnan <ramana.radhakrishnan@codito.com> 
+
+   This file is part of GDB.
+   
+   This program 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 of the License, or
+   (at your option) any later version.
+   
+   This program 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 this program; if not, write to the Free Software
+   Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.  
+*/
+#include <string.h>
+
+#include "defs.h"
+#include "osabi.h"
+#include "frame.h"
+#include "regcache.h"
+#include "gdb_assert.h"
+#include "inferior.h"
+#include "gdbcmd.h"
+#include "reggroups.h"
+
+#include "arc-tdep.h"
+#include "arc-jtag.h"
+
+
+#ifdef ARC4_JTAG
+/* brk */
+unsigned int a4_jtag_breakpoint_size = 4;
+unsigned char a4_jtag_breakpoint_insn[4] = { 0x00, 0xfe, 0xff, 0x1f };
+#define A4_HALT_VALUE 0x02000000
+#else
+/* brk_s */
+unsigned int arc700_jtag_breakpoint_size = 2;
+unsigned char arc700_jtag_breakpoint_insn[2] = { 0xff, 0x7f };
+#endif
+
+
+
+struct arc_reg_info 
+{
+  char *name ;
+  int hw_regno;
+  char *description;
+#ifdef ARC4_JTAG
+  enum arc4_jtag_regnums gdbregno;
+#else
+  enum arc700_jtag_regnums gdbregno;
+#endif
+  enum ARCProcessorVersion arcVersionSupported;
+};
+
+
+
+static const char *
+arc_jtag_register_name (int regno)
+{
+  static char jtag_names[][30] = {
+    "r0", "r1", "r2", "r3", "r4", "r5", "r6",
+    "r7", "r8", "r9", "r10", "r11", "r12", "r13",
+    "r14", "r15", "r16", "r17", "r18", "r19", "r20",
+    "r21", "r22", "r23", "r24", "r25", "r26",
+    
+    "fp",
+    "sp",
+    "ilink1",
+    "ilink2",
+    "blink",
+    
+    /* Extension core regs are 32..59 inclusive.  */
+    "r32", "r33", "r34", "r35", "r36", "r37", "r38", "r39",
+    "r40", "r41", "r42", "r43", "r44", "r45", "r46", "r47", "r48", "r49",
+    "r50", "r51", "r52", "r53", "r54", "r55", "r56", "r57", "r58", "r59",
+       
+    "lp_count",
+
+    /* 61 is reserved, 62 is not a real register.  */
+    /*FIXMEA: The following 3 are supposed to be registers
+     that are used only to encode immediate values in A4*/
+    "r61",
+    "r62",
+    
+    "pcl",
+
+    /* Now the aux registers.  */
+    
+    "status",
+    "semaphore",
+    "lp_start",
+    "lp_end",
+    "identity",
+    "debug",
+    
+#ifndef ARC4_JTAG
+    "pc",
+    "status32",
+    "status32_l1",
+    "status32_l2",
+
+    "count0",
+    "control0",
+    "limit0",
+    "int_vector_base",
+    "aux_macmode",
+    "aux_irq_lv12",
+
+
+    "count1",
+    "control1",
+    "limit1",
+    "aux_irq_lev",
+    "aux_irq_hint",
+    "eret",
+    "erbta",
+    "erstatus",
+    "ecr",
+    "efa",
+    "icause1",
+    "icause2",
+    "aux_ienable",
+    "aux_itrigger",
+    "xpu",
+    "bta",
+    "bta_l1",
+    "bta_l2",
+    "aux_irq_pulse_cancel",
+    "aux_irq_pending",
+
+    /* Build configuration registers.  */
+    "bcr_0",
+    "dccm_base_build",
+    "crc_base_build",
+    "bta_link_build",
+    "dvbf_build",
+    "tel_instr_build",
+    "bcr_6",
+    "memsubsys",
+    "vecbase_ac_build",
+    "p_base_address",
+    "bcr_a",
+    "bcr_b",
+    "bcr_c",
+    "bcr_d",
+    "bcr_e",
+    "mmu_build",
+    "arcangel_build",
+    "bcr_11",
+    "d_cache_build",
+    "madi_build",
+    "dccm_build",
+    "timer_build",
+    "ap_build",
+    "icache_build",
+    "iccm_build",
+    "dspram_build",
+    "mac_build",
+    "multiply_build",
+    "swap_build",
+    "norm_build",
+    "minmax_build",
+    "barrel_build",
+#endif
+    
+  };
+  
+  gdb_assert(ARRAY_SIZE (jtag_names) == NUM_REGS + NUM_PSEUDO_REGS);
+  gdb_assert(regno >=0 && regno < NUM_REGS + NUM_PSEUDO_REGS);
+
+  return jtag_names[regno];
+}
+
+int
+arc_jtag_register_reggroup_p (int regnum, struct reggroup *group)
+{
+  /* These registers don't exist, so they are not in any reggroup.  */
+  if ((regnum >= 32 && regnum <= 59) || (regnum == 61) || (regnum == 62))
+    return 0;
+
+  /* Which regs to save/restore ? */
+  if ((group == save_reggroup || group == restore_reggroup))
+    {
+      /* Save/restore:
+	 1. all core regs, except PCL (PCL is not writable)
+	 2. aux regs LP_START..LP_END (IDENTITY is not writable)
+	 3. aux regs PC_REGNUM..STATUS32_L2
+	 3. aux regs ERET..EFA */
+      return ( ( regnum >= 0 && regnum < ARC_PCL_REGNUM)
+	       || ( regnum >= ARC_LP_START_REGNUM && regnum<= ARC_LP_END_REGNUM)
+#ifdef ARC4_JTAG
+	       || ( regnum == ARC_STATUS_REGNUM)
+#else	       
+	       || ( regnum >= ARC_PC_REGNUM && regnum <= ARC_STATUS32_L2_REGNUM)
+	       || ( regnum >= ARC_ERET_REGNUM && regnum <= ARC_EFA_REGNUM)
+#endif
+	       );
+    }
+  
+  return -1;
+}
+
+static void
+arc_jtag_print_registers_info (struct gdbarch *gdbarch, struct ui_file *file,
+			       struct frame_info *frame, int regnum, int all)
+{
+  int i;
+
+  if (regnum >= 0 )
+    {
+      default_print_registers_info (gdbarch, file, frame, regnum, all);
+      return;
+    }
+
+  /* if regnum < 0 , print all registers */
+
+  for (i=0; i <= 26; ++i)
+    default_print_registers_info (gdbarch, file, frame, i, all);
+  default_print_registers_info (gdbarch, file, frame, 
+				ARC_FP_REGNUM, all);
+  default_print_registers_info (gdbarch, file, frame, 
+				ARC_SP_REGNUM, all);
+  default_print_registers_info (gdbarch, file, frame, 
+				ARC_ILINK1_REGNUM, all);
+  default_print_registers_info (gdbarch, file, frame, 
+				ARC_ILINK2_REGNUM, all);
+  default_print_registers_info (gdbarch, file, frame, 
+				ARC_BLINK_REGNUM, all);
+  default_print_registers_info (gdbarch, file, frame, 
+				ARC_LP_COUNT_REGNUM, all);
+  
+  /* now the aux registers */
+   if (!all)
+    {
+      default_print_registers_info (gdbarch, file, frame, 
+				    ARC_LP_START_REGNUM, all);
+      default_print_registers_info (gdbarch, file, frame, 
+				    ARC_LP_END_REGNUM, all);
+      
+#ifndef ARC4_JTAG 
+      default_print_registers_info (gdbarch, file,frame,
+				    ARC_STATUS32_REGNUM, all);
+      default_print_registers_info (gdbarch, file, frame, 
+				    ARC_BTA_REGNUM, all);
+      default_print_registers_info (gdbarch, file, frame, 
+				    ARC_EFA_REGNUM, all);
+      default_print_registers_info (gdbarch, file, frame, 
+				    ARC_ERET_REGNUM, all);
+      default_print_registers_info (gdbarch, file, frame, 
+				    ARC_STATUS32_L1_REGNUM, all);
+      default_print_registers_info (gdbarch, file, frame, 
+				    ARC_STATUS32_L2_REGNUM, all);
+      default_print_registers_info (gdbarch, file, frame, 
+				    ARC_ERSTATUS_REGNUM, all);
+      
+      
+      /* PC */
+      default_print_registers_info (gdbarch, file, frame, 
+				    ARC_PC_REGNUM, all);
+#endif
+    }
+   else
+     {
+       /* This part needs cleaning up. */
+       for (i = ARC_STATUS_REGNUM;
+#ifndef ARC4_JTAG
+	    i <= ARC_AUX_IRQ_PENDING_REGNUM;
+#else /*FIXMEA*/
+	    i <=  ARC_DEBUG_REGNUM;
+#endif
+	    i ++ )
+	 default_print_registers_info (gdbarch, file, frame , 
+				       i, all);
+
+       
+       for (i = ARC_STATUS_REGNUM ; 
+#ifndef ARC4_JTAG
+	    i <= ARC_AUX_IRQ_PENDING_REGNUM;
+#else /*FIXMEA*/
+	    i <=  ARC_DEBUG_REGNUM;
+#endif
+	    i ++ )
+	 default_print_registers_info (gdbarch, file, frame, 
+				       i, all);
+       
+#ifndef ARC4_JTAG
+       for (i = ARC_BCR_1_REGNUM ; 
+	    i <= ARC_BCR_5_REGNUM ;
+	    i ++ )
+	 default_print_registers_info (gdbarch, file , frame, 
+				       i , all);
+       
+       for (i = ARC_BCR_7_REGNUM ;
+	    i <= ARC_BCR_9_REGNUM;
+	    i ++ )
+	 default_print_registers_info (gdbarch, file, frame, 
+				       i , all);
+
+       for (i = ARC_BCR_F_REGNUM;
+	    i <= ARC_BCR_10_REGNUM;
+	    i ++ )
+	 default_print_registers_info (gdbarch, file, frame , 
+				       i , all);
+
+       for (i = ARC_BCR_12_REGNUM;
+	    i <= ARC_BCR_1F_REGNUM;
+	    i ++)
+	 default_print_registers_info (gdbarch, file, frame , 
+				       i , all);
+#endif //if no ARC4_JTAG
+
+
+     }
+}
+
+/* Command: aux-read <from> <to>
+
+   Read and display a range of aux registers.  Some of the aux registers
+   (pc, debug, etc.) are part of the register set, but this is a more
+   general interface.
+
+   We should eventually change this to use the ui_out stuff rather than
+   printf_filtered.  */
+static void
+arc_jtag_aux_read_command (char *arg, int from_tty)
+{
+  char *arg2 = 0;
+  struct expression *expr;
+  struct value *val;
+  struct cleanup *old_chain = 0;
+  int auxregno, auxregno2 = 0, nrregs;
+  unsigned int *buf;
+  int i, nrtransfered;
+
+  if (!arg)
+    {
+      printf_filtered ("aux-read <REG-FROM> [<REG-TO>]\n");
+      return;
+    }
+  
+  /* strip leading spaces */
+  while(*arg == ' ')
+    arg++;
+
+  /* two arguments ?  */
+  /* This assumes that the first arg cannot have spaces.  (The disas command
+     also seems to work this way.)  */
+  arg2 = strchr (arg, ' ');
+
+  /* get the second one */
+  if (arg2)
+    {
+      struct expression *expr2;
+      struct value *val2;
+
+      arg2[0] = 0;
+      arg2++;
+     
+      expr2 = parse_expression (arg2);
+      val2 = evaluate_expression (expr2);
+      xfree (expr2);
+
+      auxregno2 = *(int *)(VALUE_CONTENTS (val2));
+    }
+
+  /* first arg */
+  expr = parse_expression (arg);
+  val = evaluate_expression (expr);
+  old_chain = make_cleanup (free_current_contents, &expr);
+  
+  auxregno = *(int *)(VALUE_CONTENTS (val));
+
+  /* so, how many regs do we want ? */
+  if (arg2)
+    {
+      if (auxregno2 < auxregno)
+	{
+	  warning ("aux-read: %s < %s, showing one register", arg2, arg);
+	  nrregs = 1;
+	}
+      else
+	nrregs = auxregno2 - auxregno + 1;
+    }
+  else
+    nrregs = 1;
+
+  buf = xcalloc (nrregs, sizeof(int));
+  make_cleanup (free_current_contents, &buf);
+  
+  /* Go get 'em !  */
+  nrtransfered = target_read_aux_reg (buf, auxregno, nrregs);
+  if (nrtransfered <= 0)
+    {
+      do_cleanups (old_chain);
+      error ("aux-read: couldn't read any registers.");
+    }
+  else if (nrtransfered < nrregs)
+    {
+      warning ("aux-read: could only read %d registers", nrtransfered);
+    }
+  
+  gdb_assert (nrtransfered <= nrregs);
+
+  /* Show them.  */
+  for (i = auxregno; i - auxregno < nrtransfered; ++i)
+    {
+      if ((i - auxregno) % 4 == 0)
+	printf_filtered("%s%08x: ", ((i - auxregno) ? "\n" : ""), i);
+      
+      printf_filtered ("%08x ", buf[i - auxregno]);
+    }
+  printf_filtered ("\n");
+  
+  do_cleanups (old_chain);
+}
+
+/* aux-write <regnum> = <value>
+   Write VALUE to aux register REGNUM. */
+static void
+arc_jtag_aux_write_command (char *arg, int from_tty)
+{
+  char *value_arg = 0;
+  struct expression *regnum_expr, *value_expr;
+  struct value *regnum_val, *value_val;
+  struct cleanup *old_chain = 0;
+  unsigned int regnum, value;
+  int err;
+  
+  if (!arg)
+    {
+      printf_filtered ("aux-write <regnum> = <value>\n");
+      return;
+    }
+
+  value_arg = strchr(arg, '=');
+  if (!value_arg)
+    {
+      error ("aux-write: can't find second argument\n\
+Usage: aux-write <regnum> = <value>");
+      return;
+    }
+  value_arg[0] = 0;
+  value_arg++;
+
+  /* Regnum expression */
+  regnum_expr = parse_expression (arg);
+  regnum_val = evaluate_expression (regnum_expr);
+  old_chain = make_cleanup (free_current_contents, &regnum_expr);
+  regnum = *(unsigned int *)(VALUE_CONTENTS (regnum_val));
+
+  /* Value expression */
+  value_expr = parse_expression (value_arg);
+  value_val = evaluate_expression (value_expr);
+  make_cleanup (free_current_contents, &value_expr);
+  value = *(unsigned int *)(VALUE_CONTENTS (value_val));
+
+  /* Write it.  */
+  err = target_write_aux_reg (&value, regnum, 1);
+  if (err != 1)
+    {
+      do_cleanups (old_chain);
+      error ("aux-write: couldn't write to register 0x%x", regnum);
+    }
+
+  do_cleanups (old_chain);
+}
+
+#ifdef ARC4_JTAG
+//  gdbarch_write_pc_ftype *write_pc;
+/*
+  Write PC
+  Arguments:
+  1.CORE_ADDR val : Contains the value to be written into PC.
+  2.ptid_t ptid: Process id of the process.
+
+  Returns: void
+  Description: FIXMEA: Update
+      Reads the status register
+      Inserts the value (upper 24 bit) into the bits
+      0-23 in the status register
+      Write the status register
+ */
+void
+a4_jtag_write_pc (CORE_ADDR val, ptid_t ptid)
+{
+  CORE_ADDR insert_val = val >> 2;
+  unsigned int buffer;
+
+
+  if(debug_arc_jtag_target_message)
+      printf_filtered ("\n -----***------------ a4_jtag_write_pc Entered ---*%%*#\n");
+
+  
+  target_read_aux_reg (&buffer, ARC_HW_STATUS_REGNUM, 1);
+
+  if (!(buffer & A4_HALT_VALUE))
+    {
+      if(debug_arc_jtag_target_message)
+	printf_filtered ("\n***** Halting Processor... *********\n");
+      
+      buffer = buffer | A4_HALT_VALUE ;
+      target_write_aux_reg (&buffer, ARC_HW_STATUS_REGNUM, 1);
+      /* Now the A4 processor has halted*/
+    }
+  
+  if(debug_arc_jtag_target_message)
+    printf_filtered (" \nWriting value %u to PC\n", val);
+
+
+  target_read_aux_reg (&buffer, ARC_HW_STATUS_REGNUM, 1);
+  if(debug_arc_jtag_target_message)
+    printf_filtered (" \nValue of Status Register before writing %d\
+                     \n Value of PC: 0x%x\n", buffer, buffer & 0x00ffffff);
+
+  buffer = buffer & 0xff000000;
+  insert_val    = insert_val & 0x00ffffff;
+  buffer = buffer | insert_val ;
+  
+  if(debug_arc_jtag_target_message)
+    printf_filtered (" \nValue of Status Register to be written %d\
+                       \n Value of PC: 0x%x\n", buffer, buffer & 0x00ffffff);
+
+  //  jtag_ops.jtag_write_aux_reg (ARC_STATUS_REGNUM, buffer);
+  target_write_aux_reg (&buffer, ARC_HW_STATUS_REGNUM, 1);
+
+  if(debug_arc_jtag_target_message)
+    {
+      target_read_aux_reg (&buffer, ARC_HW_STATUS_REGNUM, 1);
+      printf_filtered (" \nValue of Status Register after reading again %d\
+                        \n Value of PC: 0x%x\n", buffer, buffer & 0x00ffffff);
+    }
+
+    if(debug_arc_jtag_target_message)
+      printf_filtered ("\n -----***------------ a4_jtag_write_pc Leaving ---*%%*#\n");
+
+}
+
+
+/*
+  Read PC
+  Arguments:
+  1.ptid_t ptid: Process id of the process.
+
+  Returns: CORE_ADDR 
+  Description:
+      Reads the status register
+      Extracts the PC value from it.
+      Right shift twice to get correct value of PC
+      return PC
+*/
+CORE_ADDR
+a4_jtag_read_pc (ptid_t ptid)
+{
+  unsigned int buffer;
+
+  if (debug_arc_jtag_target_message)
+    printf_filtered ("\n Entering a4_jtag_read_pc ()");
+  buffer = 0;
+  target_read_aux_reg (&buffer, ARC_HW_STATUS_REGNUM, 1);
+  if (debug_arc_jtag_target_message)
+    printf_filtered ("\n Value of Status Reg: 0x%x",buffer);
+  buffer = buffer & 0x00ffffff;
+  buffer = buffer << 2;
+
+  if (debug_arc_jtag_target_message)
+    printf_filtered ("\n Leaving a4_jtag_read_pc ()\
+                      \n Value of Pc: 0x%x\n", buffer);
+  
+  return buffer;
+}
+
+#endif // ARC4_JTAG
+
+ARCVariantsInfo arc_debug_processor_information;
+
+struct gdbarch *
+arc_jtag_init (struct gdbarch *gdbarch)
+{
+  struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
+
+#ifndef ARC4_JTAG
+  tdep->arc_breakpoint_size = arc700_jtag_breakpoint_size;
+  tdep->arc_breakpoint_insn = arc700_jtag_breakpoint_insn;
+#else
+  tdep->arc_breakpoint_size = a4_jtag_breakpoint_size;
+  tdep->arc_breakpoint_insn = a4_jtag_breakpoint_insn;
+#endif
+
+  set_gdbarch_num_regs (gdbarch, ARC_NR_REGS);
+#ifndef ARC4_JTAG
+  set_gdbarch_pc_regnum (gdbarch, ARC_PC_REGNUM);
+#else
+  //  set_gdbarch_pc_regnum (gdbarch, ARC_STATUS_REGNUM);
+  set_gdbarch_write_pc (gdbarch, a4_jtag_write_pc);
+  set_gdbarch_read_pc (gdbarch, a4_jtag_read_pc);
+#endif
+  set_gdbarch_register_name (gdbarch, arc_jtag_register_name);
+  
+  set_gdbarch_print_registers_info (gdbarch, arc_jtag_print_registers_info);
+
+  tdep->register_reggroup_p = arc_jtag_register_reggroup_p;
+
+  tdep->lowest_pc = 0;
+  
+  tdep->sigtramp_p = NULL;
+
+  tdep->arc_processor_variant_info = &arc_debug_processor_information;
+
+  /* Auxillary register commands.  */
+  add_cmd ("arc-aux-read", class_vars, arc_jtag_aux_read_command,
+	   "Read and show a range of auxillary registers.\n\
+Usage: arc-aux-read <REG-FROM> [<REG-TO>]\n\
+REG-FROM and REG-TO can be any expressions that evaluate to integers.\n\
+If REG-TO is not specified, one register is displayed.",
+	   &cmdlist);
+
+  add_cmd ("arc-aux-write", class_vars, arc_jtag_aux_write_command,
+	   "Write to an auxillary register.\n\
+Usage: arc-aux-write <REG> = <VALUE>\n\
+REG and VALUE can be any expressions that evaluate to integers.",
+	   &cmdlist);
+
+  return gdbarch;
+}
+
diff --git a/gdb/arc-jtag.c b/gdb/arc-jtag.c
new file mode 100644
index 0000000..9a86b6d
--- /dev/null
+++ b/gdb/arc-jtag.c
@@ -0,0 +1,1297 @@
+/* Target dependent code for ARC700, for GDB, the GNU debugger.
+
+   Copyright 2005 Free Software Foundation, Inc.
+
+   Contributed by Codito Technologies Pvt. Ltd. (www.codito.com)
+
+   Authors: 
+      Sameer Dhavale <sameer.dhavale@codito.com>
+      Ramana Radhakrishnan <ramana.radhakrishnan@codito.com> 
+
+   This file is part of GDB.
+   
+   This program 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 of the License, or
+   (at your option) any later version.
+   
+   This program 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 this program; if not, write to the Free Software
+   Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.  
+*/
+
+#include <stdio.h>
+#include <string.h>
+#include "defs.h"
+#include "inferior.h"
+#include "target.h"
+#include "breakpoint.h"
+
+#include "arc-tdep.h"
+
+#include <unistd.h>
+#include <stdlib.h>
+
+#include <sys/io.h>
+#include <sys/types.h>
+
+#include <assert.h>
+
+#include "arc-jtag.h"
+#include "arc-jtag-ops.h"
+#include "gdbcore.h"
+#include "gdbarch.h"
+#include "regcache.h"
+#include "command.h"
+#include "gdbcmd.h"
+#include <signal.h>
+
+/* Flag to print debug messages from here. */
+/* FIXMEA:
+static int debug_arc_jtag_target_message;
+*/
+
+#define ENTERMSG  \
+do {\
+if(debug_arc_jtag_target_message) \
+printf_filtered ("--- entered %s:%s()\n", __FILE__, __FUNCTION__); \
+} while(0)
+
+#define ENTERARGS(fmt, args...) \
+do { \
+if(debug_arc_jtag_target_message) \
+printf_filtered ("--- entered %s:%s(" fmt ")\n", __FILE__, __FUNCTION__, args);\
+} while(0)
+
+#define LEAVEMSG \
+do { \
+if(debug_arc_jtag_target_message) \
+printf_filtered ("--- exited %s:%s()\n", __FILE__, __FUNCTION__); \
+} while(0)
+
+/* The number of times a memory read/write operation should be attempted
+   before returning an error.
+*/
+#define MEMORY_TRANSFER_ATTEMPTS 10
+
+/* defined in arc-jtag-ops.c */
+extern unsigned int arcjtag_retry_count;
+
+struct target_ops arc_debug_ops;
+extern struct jtag_ops arc_jtag_ops;
+
+static void arc_debug_interrupt (int signo);
+static void arc_debug_interrupt_twice (int signo);
+static void arc_print_processor_variant_info (void);
+static int arc_debug_write_aux_register (int hwregno, int *buf);
+static int arc_debug_read_aux_register (int hwregno, int *buf);
+static int arc_debug_read_core_register (int hwregno, int *buf);
+
+
+/* Register Mapping information between GDB regnums
+   and actual hardware register numbers. 
+*/
+
+struct arc_reg_info 
+{
+  char *name ;
+  enum arc_hw_regnums hw_regno;
+  char *description;
+#ifdef ARC4_JTAG
+  enum arc4_jtag_regnums gdbregno;
+#else
+  enum arc700_jtag_regnums gdbregno;
+#endif
+  enum ARCProcessorVersion arcVersionSupported;
+};
+
+#define RBCR(name, hwregno , desc, gdbregno, version) { #name, hwregno , desc , gdbregno , version } ,
+
+#undef RAUX
+struct arc_reg_info arc_bcr_reg_info [] = 
+  {
+   #include "arc-regnums-defs.h"
+  };
+
+#undef RAUX
+#undef RBCR
+#define RAUX(name, hwregno , desc, gdbregno, version) { #name , hwregno , desc , gdbregno , version } ,
+struct arc_reg_info arc_aux_reg_map[] =
+  {
+    #include "arc-regnums-defs.h"
+  };
+
+
+
+static void 
+arc_update_architecture(void)
+{
+  unsigned int idinfo;
+  unsigned short tmp;
+  struct gdbarch_tdep * tdep = gdbarch_tdep (current_gdbarch);
+
+  if (IS_ARC700) {
+    tdep->arc_processor_variant_info->arcprocessorversion = ARC700;
+    set_gdbarch_decr_pc_after_break (current_gdbarch,0);
+  }
+  else if(IS_ARC600) {
+    tdep->arc_processor_variant_info->arcprocessorversion = ARC600;
+    set_gdbarch_decr_pc_after_break (current_gdbarch,2);
+  }
+  else if(IS_A5) {
+    warning ("A5 debugging is unsupported and may be buggy.");
+    tdep->arc_processor_variant_info->arcprocessorversion = A5;
+  }
+  else {
+    tdep->arc_processor_variant_info->arcprocessorversion = A4;
+    set_gdbarch_decr_pc_after_break (current_gdbarch,0);
+  }    
+}
+
+/* Get us out of user mode.  */
+static unsigned int
+clear_status32_user_bit ()
+{
+  int rd;
+#ifndef ARC4_JTAG  
+  if(arc_jtag_ops.jtag_read_aux_reg(ARC_HW_STATUS32_REGNUM, &rd) == JTAG_READ_FAILURE)
+    error("Failure reading auxillary register 0x%x:status32 register", ARC_HW_STATUS32_REGNUM);
+
+  if(arc_jtag_ops.jtag_write_aux_reg(ARC_HW_STATUS32_REGNUM, rd & ~0x80) == JTAG_READ_FAILURE)
+    error("Failure writing to auxillary register 0x%x:status32 register", ARC_HW_STATUS32_REGNUM);
+#endif
+  return rd;
+}
+
+/* Restore a saved status32; use with clear_status32_user_bit().  */
+static void
+restore_status32_user_bit (unsigned int status32)
+{
+#ifndef ARC4_JTAG
+  if(arc_jtag_ops.jtag_write_aux_reg(ARC_HW_STATUS32_REGNUM, status32) == JTAG_READ_FAILURE)
+    error("Failure writing to auxillary register 0x%x:status32 register", ARC_HW_STATUS32_REGNUM);
+#endif
+}
+
+/* UB bit in the debug register.  It allows brk_s to work in user mode.  */
+static void
+set_debug_user_bit ()
+{
+  if(is_arc700 ())
+    {
+      /* set UB = 1 */
+      unsigned int debug;
+      if (arc_jtag_ops.jtag_read_aux_reg (ARC_HW_DEBUG_REGNUM, &debug) == JTAG_READ_FAILURE)
+	error("Failure reading auxillary register 0x%x:debug register",ARC_HW_DEBUG_REGNUM);
+      debug |= 0x10000000;                     
+      arc_jtag_ops.jtag_write_aux_reg (ARC_HW_DEBUG_REGNUM, debug);
+    }
+}
+
+
+
+static void
+invalidateCaches (void)
+{
+    if(arc_jtag_ops.jtag_write_aux_reg ( ARC_HW_ICACHE_IVIC , 1)==JTAG_WRITE_FAILURE)
+	error("Failure writing 0x1 to auxillary register 0x%x:Icache invalidate\n",ARC_HW_ICACHE_IVIC);
+    if(arc_jtag_ops.jtag_write_aux_reg ( ARC_HW_DCACHE_IVIC , 1)==JTAG_WRITE_FAILURE)
+	error("Failure writing 0x1 to auxillary register 0x%x:Dcache invalidate\n",ARC_HW_DCACHE_IVIC);
+}
+
+static void
+disableCaches (void)
+{
+  /* Disabling Icache */
+    if(arc_jtag_ops.jtag_write_aux_reg( ARC_HW_ICACHE_CONTROL ,0x1)==JTAG_WRITE_FAILURE)
+      error("Failure writing 0x1 to auxillary register 0x%x:Icache control register\n",ARC_HW_ICACHE_CONTROL);
+  /* Disabling Dcache */
+    if(arc_jtag_ops.jtag_write_aux_reg( ARC_HW_DCACHE_CONTROL ,0x1)==JTAG_WRITE_FAILURE)
+	error("Failure writing 0x1 to auxillary register 0x%x:Dcache control register\n",ARC_HW_DCACHE_CONTROL);
+}
+
+
+/* Function: arc_debug_open
+ * Parameters :
+ * 1. args :
+ * 2. from_tty:
+ * Returns : void
+ * Description: 
+	1. Connect to the jtag target . 
+	2. Read the number of action points supported. 
+	3. Read the configuration of action points. 
+	4. Set up internal data structures for number of hardware
+	   breakpoints and watchpoints. 
+	5. Set the UB bit to 1 for ARC700 and not for ARC600.
+ * 
+ */
+
+void
+arc_debug_open (char *args, int from_tty)
+{
+  ENTERARGS("%s", args);
+  target_preopen(from_tty);
+  
+  reopen_exec_file ();
+  reread_symbols ();
+  
+  unpush_target (&arc_debug_ops);  
+  arc_jtag_ops.jtag_open();
+  push_target (&arc_debug_ops);
+
+  /* Call arc_update_architecture if opened successfully.  */
+  arc_update_architecture();
+  /* Fixme  :: Should these be in create_inferior or 
+     some place else ?. We would not like these here
+     when attach starts working. 
+  */
+  disableCaches();
+#ifdef ARC4_JTAG
+  if(arc_jtag_ops.jtag_write_aux_reg (ARC_HW_STATUS_REGNUM, 0x02000000)==JTAG_WRITE_FAILURE)
+          error("Failure writing 0x0200 0000 to auxillary register 0x%x:status register\n",ARC_HW_STATUS_REGNUM);
+
+  if (from_tty)
+    printf_filtered ("Connected to the arcjtag target.\n");  
+  
+#else
+  if(arc_jtag_ops.jtag_write_aux_reg (ARC_HW_STATUS32_REGNUM, 0x1)==JTAG_WRITE_FAILURE)
+
+    error("Failure writing 0x1 to auxillary register 0x%x:status32 register\n",ARC_HW_STATUS32_REGNUM);
+  
+  /* allow breakpoints in user mode.  */
+  set_debug_user_bit ();
+
+
+  if (from_tty)
+    printf_filtered ("Connected to the arcjtag target.\n");  
+#endif
+}
+
+void arc_debug_close()
+{
+    arc_jtag_ops.jtag_close();
+}
+
+/* Function: arc_debug_attach
+ * Parameters :
+ * 1. char *x:
+ * 2. int i:
+ * Returns : void
+ * Description: 
+ *  1. attach without resetting the board 
+ *  2. get all Board configuration registers of interest.
+ *  if ARC700 set the UB bit to 1. (This is invalid in the 
+ *  ARC600).
+ */
+
+
+void
+arc_debug_attach (char *x, int i)
+{
+
+  ENTERMSG;
+}
+
+
+/* Function: arc_debug_attach
+ * Parameters :
+ * 1. char *x:
+ * 2. int i:
+ * Returns : void
+ * Description: 
+ *  1. Detach without resetting the board. 
+ */
+void
+arc_debug_detach (char *x, int i)
+{
+	
+  ENTERMSG;
+
+  /* Let it continue.  */
+  target_resume (inferior_ptid, 0, 0);
+}
+
+
+/* Function: arc_debug_resume
+ * Parameters :
+ * 1. ptid_t ptid:
+ * 2. int step: 1 - single step , 0 run freely.
+ * 3. enum target_signal signal;
+ * Returns : void
+ * Description: 
+ *  	1. What about Pipecleaning?
+ *	2. Write 0 to the HALT bit in status32.
+ *      3. Send a signal (ignore) in this case. 
+ *      4. if(step) use hardware single step on the ARC700.
+ *          done by setting the IS bit in the debug register
+ *          and clearing the halt bit in status32. 
+ *	
+ */
+
+void
+arc_debug_resume (ptid_t ptid, int step, enum target_signal signal)
+{
+  
+  ENTERARGS("%d,%d,%d", ptid.pid, step, signal);
+  /* Make the inferior resume execution, sending a signal if necessary */
+  unsigned int rd;
+
+  /* Because breakpoints may have been set/removed.  */
+  invalidateCaches ();
+
+  /* This bit is required if breakpoints are to be allowed in user mode.  We
+     set it in target_open, but the operating system might clear it.  So we
+     set it every time we resume.  */
+  set_debug_user_bit ();
+
+  if(step)
+  {
+
+    /* reading debug reg */
+      if(arc_jtag_ops.jtag_read_aux_reg(ARC_HW_DEBUG_REGNUM,&rd)==JTAG_READ_FAILURE)
+	  error("Failure reading auxillary register 0x%x:debug register",ARC_HW_DEBUG_REGNUM);
+#ifdef ARC4_JTAG      
+      rd |= 0x801; /*Setting the IS and the SS bit in the status register
+		     for the A4 core to allow it to single step.  */
+#else
+      /* Mask for Single Stepping changes for ARC600 and ARC700. */
+      if(is_arc700())
+	rd |= 0x800;
+      else
+	if(is_arc600())
+	  rd |= 0x801;
+#endif
+      
+      /* Writing to IS bit in DEBUG register for 
+	 hardware single instruction stepping.  */
+      if(arc_jtag_ops.jtag_write_aux_reg(ARC_HW_DEBUG_REGNUM ,rd)==JTAG_WRITE_FAILURE)
+	  error("Failure writing 0x%x to auxillary register 0x%x:debug register\n",rd,ARC_HW_DEBUG_REGNUM);
+  }
+  else
+  {
+    /* Restarting the processor by clearing the 'H' bit in the status register*/
+#ifdef ARC4_JTAG    
+    /* reading the status reg */     
+    if(arc_jtag_ops.jtag_read_aux_reg(ARC_HW_STATUS_REGNUM,&rd)==JTAG_READ_FAILURE)
+      error("Failure reading auxillary register 0x%x:status register",ARC_HW_STATUS_REGNUM);
+  
+    rd = rd & ~(0x02000000);
+  
+    /* starting the halted processor */
+    if(arc_jtag_ops.jtag_write_aux_reg(ARC_HW_STATUS_REGNUM,rd)==JTAG_WRITE_FAILURE)
+      error("Failure writing 0x%x to auxillary register 0x%x:status register\n",rd,ARC_HW_STATUS_REGNUM);
+#else
+    /* reading the status32 reg */     
+    if(arc_jtag_ops.jtag_read_aux_reg(ARC_HW_STATUS32_REGNUM,&rd)==JTAG_READ_FAILURE)
+      error("Failure reading auxillary register 0x%x:status32 register",ARC_HW_STATUS32_REGNUM);
+  
+    rd = rd & ~(0x1);
+  
+    /* starting the halted processor */
+    if(arc_jtag_ops.jtag_write_aux_reg(ARC_HW_STATUS32_REGNUM,rd)==JTAG_WRITE_FAILURE)
+      error("Failure writing 0x%x to auxillary register 0x%x:status32 register\n",rd,ARC_HW_STATUS32_REGNUM);
+#endif
+  }
+}
+
+/* For the ^C signal handler.  */
+static  void (*ofunc) (int);
+
+/* The command line interface's stop routine.  This function is installed as
+   a signal handler for SIGINT.  The first time a user requests a stop, we
+   call target_stop to send a break or ^C.  If there is no response from the
+   target (it didn't stop when the user requested it), we ask the user if
+   he'd like to detach from the target.  */
+static void
+arc_debug_interrupt (int signo)
+{
+  /* If we get the signal twice, do something more drastic.  */
+  signal (signo, arc_debug_interrupt_twice);
+  
+  target_stop ();
+}
+
+/* The user typed ^C twice.  */
+static void
+arc_debug_interrupt_twice (int signo)
+{
+  signal (signo, ofunc);
+
+  if (query ("Interrupted while waiting for the program.\n\
+Give up (and stop debugging it)? "))
+    {
+      target_mourn_inferior ();
+      throw_exception (RETURN_QUIT);
+    }
+
+  signal (signo, arc_debug_interrupt);
+}
+
+/* Function: arc_debug_wait
+ * Parameters :
+ * 1. ptid_t ptid:
+ * 2. struct target_waitstatus *status: Indicates status at end
+                                        of wait for F.E.
+ * Returns : void
+ * Description: 
+ *        Poll status32 for the value of H bit.	
+ *        After H bit is set in status32. 
+ *        Wait till LD(load pending bit) in the DEBUG register
+ *        is cleared.
+ *        SH bit is set if flag instruction was used to halt the processor.
+ *        BH bit is set if the ARCompact processor stopped due to 
+ *        a brk_s instruction. Set the target_waitstatus (signal) to SIGTRAP
+ *        only in such a situation. 
+ *	
+ */
+
+ptid_t
+arc_debug_wait (ptid_t ptid, struct target_waitstatus *status)
+{
+  unsigned int debug;
+  ENTERMSG;
+
+  /* signal handler for Control-C.  */
+  ofunc = signal (SIGINT, arc_debug_interrupt);
+
+  arc_jtag_ops.jtag_wait();
+  /* put the old function back.  */
+  signal (SIGINT, ofunc);
+
+  /* If the SH ("self halt") bit is set, we stopped because of the flag
+     instruction, which is used by programs to exit.  */
+  if (arc_jtag_ops.jtag_read_aux_reg (ARC_HW_DEBUG_REGNUM,
+				      &debug) == JTAG_READ_FAILURE)
+    {
+      error ("Failure reading from debug register");
+    }
+
+  /* SH bit of debug register */
+  if (debug & ARC_DEBUG_REG_SH_BIT)
+    {
+      int exitcode;
+      status->kind = TARGET_WAITKIND_EXITED;
+
+      /* Exit code of the program.  */
+      if (arc_jtag_ops.jtag_read_core_reg (0, &exitcode) == JTAG_READ_FAILURE)
+	{
+	  warning ("Failure reading from register r0, assuming exit code = 0");
+	  status->value.integer = 0;
+	}
+      status->value.integer = exitcode;
+    }
+  else
+    {
+      status->kind = TARGET_WAITKIND_STOPPED;
+      status->value.sig = TARGET_SIGNAL_TRAP;
+    }
+
+#ifndef ARC4_JTAG
+  /* Bug #1311 (ARC600): Setting a breakpoint on the last instruction of a
+     ZOL causes GDB to stop at LP_START.  Detect this condition and warn the
+     user.  */
+  if (is_arc600 ())
+    {
+      unsigned int pc, lp_start, lp_end, lp_count;
+      arc_debug_read_core_register (ARC_LP_COUNT_REGNUM, &lp_count);
+      if (lp_count != 0)
+	{
+	  arc_debug_read_aux_register (ARC_HW_PC_REGNUM, &pc);
+	  arc_debug_read_aux_register (ARC_HW_LP_START_REGNUM, &lp_start);
+	  
+	  if (pc == lp_start)
+	    {
+	      extern struct breakpoint *breakpoint_chain;
+	      struct breakpoint *b;
+	      arc_debug_read_aux_register (ARC_HW_LP_END_REGNUM, &lp_end);
+
+	      for (b = breakpoint_chain; b; b = b->next)
+		{
+		  /* lp_end is the address of the last instruction + the
+		     size of the last instruction.  We could use the
+		     disassembler and find out the size, or just try both
+		     possible sizes.  */
+		  if ((b->enable_state == bp_enabled && !b->pending) &&
+		      b->loc->address == lp_end-4 || b->loc->address == lp_end-2)
+		    {
+		      warning ("Did you set a breakpoint on the last instruction of \n\
+a Zero Overhead Loop ?  Such breakpoints do not work properly.");
+		    }
+		}
+	    }
+	}
+    }
+#endif
+  return inferior_ptid;
+}
+
+static unsigned int 
+arc_get_hw_regnum_mapping ( int regno )
+{
+  int i;
+
+  if (regno >= ARC_STATUS_REGNUM 
+#ifdef ARC4_JTAG
+      && regno <= ARC_DEBUG_REGNUM
+#else
+      && regno <= ARC_AUX_IRQ_PENDING_REGNUM
+#endif      
+      )
+    return  arc_aux_reg_map[regno - ARC_STATUS_REGNUM].hw_regno;
+  
+  for ( i = 0 ; i < (sizeof(arc_bcr_reg_info) / sizeof (struct arc_reg_info)) ; i++)
+    {
+      if (regno == arc_bcr_reg_info[i].gdbregno)
+	return arc_bcr_reg_info[i].hw_regno;
+    }
+
+  return -1;
+}
+
+
+/* Function: arc_debug_fetch_regs.
+ * Parameters :
+ * 1. int regnum: Register number. If register number is -1.Fetch
+ *                all the registers.Read all core registers here.
+ * Returns : void
+ * Description: 
+ *          Set up regcache_raw_supply(current_regcache,regno)
+ *
+ */
+void
+arc_debug_fetch_regs (int regno)
+{
+	/* Read all core registers */
+  ENTERARGS("%d",regno);
+
+  int dummyvalue = 0xABCDABCD;
+  unsigned int hw_regno;
+  unsigned int read_buf;
+
+  if( regno < ARC_NR_CORE_REGS )
+  {
+      hw_regno = regno;
+      if(arc_jtag_ops.jtag_read_core_reg(regno,&read_buf)==JTAG_READ_FAILURE)
+	  error("Failure reading from core register 0x%x\n",regno);
+  }
+  else
+  {
+#ifndef ARC4_JTAG    
+    if( regno > ARC_NR_REGS)
+      error("Invalid Register Number\n");
+#endif
+    
+    hw_regno  = arc_get_hw_regnum_mapping (regno);
+    if(arc_jtag_ops.jtag_read_aux_reg(hw_regno,&read_buf)==JTAG_READ_FAILURE)
+	error("Failure reading auxillary register 0x%x",hw_regno);
+  }
+  
+  if(debug_arc_jtag_target_message)
+    {
+      printf_filtered("HW_Regno=0x%x",hw_regno);
+      printf_filtered("Read Regno 0x%x the value 0x%x\n",hw_regno,read_buf);
+    }
+  regcache_raw_supply(current_regcache,regno,&read_buf);
+
+  LEAVEMSG;
+}
+
+
+/* Function: arc_debug_fetch_regs.
+ * Parameters :
+ * 1. int regnum: Register number. If register number is -1.Fetch
+ *                all the registers.Read all core registers here.
+ * Returns : void
+ * Description: 
+ *          Use deprecated register information for this or regcache_read_unsigned .
+ * FIXME: would need to change to use regcache_raw_supply instead.
+ */
+
+
+void
+arc_debug_store_regs (int regno)
+{
+  /* write_all core registers */
+  ENTERARGS("%d", regno);
+  unsigned int hw_regno;
+  unsigned int write_buf;
+
+  if(debug_arc_jtag_target_message)
+    printf_filtered("\n%d",regno);
+
+  regcache_raw_collect(current_regcache,regno,&write_buf);
+  if( regno < ARC_NR_CORE_REGS )
+  {
+      if(arc_jtag_ops.jtag_write_core_reg(regno,write_buf)==JTAG_WRITE_FAILURE)
+	  error("Failure writing 0x%x to core register 0x%x",write_buf,regno);
+  }
+  else
+  {
+#ifndef ARC4_JTAG    
+    if (regno > ARC_NR_REGS)
+      error ("Invalid register number \n");
+#endif
+
+    hw_regno = arc_get_hw_regnum_mapping (regno);
+
+    if(debug_arc_jtag_target_message)
+	printf_filtered("Writing to regno 0x%x the value 0x%x",
+			hw_regno,write_buf);
+    if(arc_jtag_ops.jtag_write_aux_reg(hw_regno,write_buf)==JTAG_WRITE_FAILURE)
+	error("Failure writing 0x%x to auxillary register 0x%x\n",write_buf,hw_regno);
+  }
+
+}
+
+
+/* Function: arc_debug_prepare_to_store.
+ * Parameters :
+ * 1. int regnum: Register number. If register number is -1.Fetch
+ *                all the registers.Read all core registers here.
+ * Returns : void
+ * Description: 
+ *          Use deprecated register information for this. 
+ * FIXME: would need to change to use regcache_raw_supply instead.
+ */
+
+/* This gets called just before store_regs */
+void
+arc_debug_prepare_to_store (void)
+{
+	/* does nothing . Why is this around ? */
+  ENTERMSG;
+}
+
+/* Read or write memory */
+
+
+
+/* Function: arc_debug_xfer_memory. 
+ * Parameters : 
+ * 1. int regnum: Register number. If register number is -1.Fetch
+ *                all the registers.Read all core registers here.
+ * Returns : void
+ * Description: 
+ *    This has been superceded by target_xfer_memory_partial.
+ *
+ */
+int
+arc_debug_xfer_memory (CORE_ADDR memaddr, char *myaddr, int len, int write,
+		      struct mem_attrib *attrib, struct target_ops *target)
+{
+	/* There is no xfer_memory . Its been deprecated in 6.3 .Replace	
+	 * this by target_xfer_memory_partial .
+	 */
+  ENTERARGS("memaddr=%lx, myaddr=%lx, len=%d, write=%d",
+	    memaddr, (unsigned long)myaddr, len, write);
+  
+  return len; /* success */
+}
+
+
+    
+
+LONGEST 
+arc_debug_xfer_partial (struct target_ops *ops,
+			enum target_object object, 
+			const char *annex,
+			void *readbuf, 
+			const void *writebuf,
+			ULONGEST offset, 
+			LONGEST len)
+{
+
+  int i=0, read_num=0, temp_len=0;
+  unsigned int small_buf;
+  char query_type;
+  ULONGEST temp_offset=0;
+  if(debug_arc_jtag_target_message)
+    printf("..Entered arc_debug_xfer_partial()...with offset 0x%x\n",(unsigned int)offset);
+  /* Handle memory */
+  if (object == TARGET_OBJECT_MEMORY)
+    {
+      int saved_status32;
+      int xfered=0;
+      int attempts;
+      errno = 0;
+
+      /* Get out of user mode so that we can read/write anything anywhere.  */
+      saved_status32 = clear_status32_user_bit ();
+
+      if (writebuf != NULL)
+	{
+	    char *buffer=(char *)xmalloc(4);
+	    char *temp_buf = (char *)writebuf;
+
+	    /* Address alignment to integral multiple of four */
+	    temp_offset = offset;
+	    temp_len = temp_offset % 4;
+	    
+	    i = 0;
+	    if(temp_len)
+	    {
+		temp_offset = offset - temp_len;
+		if(debug_arc_jtag_target_message)
+		  {
+		    printf("---- Aligning-----------\n");
+		    printf("calling write_chunk at 0x%x where \
+offset = 0x%x\n",
+			   (unsigned int)temp_offset,(unsigned int)offset);
+		  }
+
+		attempts = 0;
+		do{
+		    if (attempts++ == MEMORY_TRANSFER_ATTEMPTS)
+		      return 0;
+		    xfered = arc_jtag_ops.jtag_memory_chunk_read(temp_offset,
+								 (unsigned int *)buffer,4);
+		}while(xfered != 4);
+		
+		for(i=0;i<len && i<(4-temp_len);i++)
+		    
+		    buffer[i+temp_len]=temp_buf[i];
+
+		attempts = 0;
+		do{
+		    if (attempts++ == MEMORY_TRANSFER_ATTEMPTS)
+		      return 0;
+		    xfered = arc_jtag_ops.jtag_memory_chunk_write(temp_offset,
+								  (unsigned int *)buffer,4);
+		}while(xfered != 4);
+
+		
+		temp_buf = (char *)writebuf + i;
+		temp_offset = offset + i;
+		len = len - i;
+	    }
+	    if(len>0)
+	      len =arc_jtag_ops.jtag_memory_chunk_write(temp_offset,
+							(unsigned int *)temp_buf,len);
+	    if(debug_arc_jtag_target_message)
+	      printf("...leaving arc_debug_xfer_partial() write.. \
+with return value %d",(int)len);
+
+	    restore_status32_user_bit (saved_status32);
+	  return (len + i);
+	}
+      else
+      {
+	  char *buffer=(char *)xmalloc(4);
+	  char *temp_buf = (char *)readbuf;
+	  /* Address alignment to integral multiple of four */
+	  temp_offset= offset;
+	  temp_len= temp_offset % 4 ;
+
+	  i = 0;
+	  if(temp_len)
+	    {
+	      temp_offset = offset - temp_len;
+	      if(debug_arc_jtag_target_message)
+		{
+		  printf("---- Aligning-----------\n");
+		  printf("calling read_chunk at 0x%x where offset =0x%x \n",
+			 (unsigned int)temp_offset,(unsigned int)offset);
+		}
+
+	      attempts = 0;
+	      do{
+		if (attempts++ == MEMORY_TRANSFER_ATTEMPTS)
+		  return 0;
+		xfered = arc_jtag_ops.jtag_memory_chunk_read(temp_offset,(unsigned int *)buffer,4);
+	      }while(xfered != 4);
+	      
+	      for(i=0;i<len && i<(4-temp_len);i++)
+		temp_buf[i]=buffer[i+temp_len];
+	      
+	      temp_buf = (char *)readbuf + i;
+	      temp_offset = offset + i;
+	      len = len - i;
+	    }
+	  if(len>0)
+	    len = arc_jtag_ops.jtag_memory_chunk_read(temp_offset,(unsigned int *)temp_buf,len);
+	  if(debug_arc_jtag_target_message)
+	    {
+	      printf("\nlen=%d",(int)len + temp_len);
+	      printf("...leaving arc_debug_xfer_partial() read.. \
+with return value %d",
+		     (int)len + temp_len);
+	    }
+
+	  restore_status32_user_bit (saved_status32);
+	  return (len + i);
+	  
+      }
+
+    }
+
+  /* ARC auxillary registers: they are 32bits wide and are in a 32 bit
+     address space, although only part of the address space is used.  */
+  else if (object == ARC_TARGET_OBJECT_AUXREGS)
+    {
+      unsigned int regno;
+
+      if (readbuf)
+	{
+	  for (regno = offset; regno < offset+len; ++regno)
+	    {
+	      unsigned int rd;
+
+	      if (arc_jtag_ops.jtag_read_aux_reg (regno, &rd) == JTAG_READ_FAILURE)
+		{
+		  return (regno - offset);
+		}
+	      ((int *)readbuf)[regno - offset] = rd;
+	    }
+	}
+      else if (writebuf)
+	{
+	  for (regno = offset; regno < offset+len; ++regno)
+	    {
+	      if (arc_jtag_ops.jtag_write_aux_reg (regno, ((int*)writebuf)[regno - offset]) ==
+		  JTAG_WRITE_FAILURE)
+		{
+		  return (regno - offset);
+		}
+	    }
+	}
+
+      /* success */
+      return (LONGEST)len;
+    }
+    else
+    {
+	printf("\nRequested target_object not yet supported with arc-jtag");
+    }
+
+  return -1;
+
+}
+
+
+
+
+void
+arc_debug_files_info (struct target_ops *target)
+{
+	/* Do nothing. Just say its a remote target */
+  ENTERMSG;
+}
+
+
+/* Function: arc_debug_insert_breakpoint
+ * Parameters : 
+ * 1. CORE_ADDR addr: Address for breakpoint.
+ * 2. char * contents: Contents for the breakpoint.
+ * Returns : int
+ * Description: 
+ * See if you can insert a hardware breakpoint using the actionpoints
+ * interface. Use brk_s if architecture is ARC700 and you need to use
+ * a software breakpoint.The gdbarch breakpoint should be initialized to
+ * the right value if used with target_arc_debug.
+ *
+ */
+
+
+int
+arc_debug_insert_breakpoint (CORE_ADDR addr, char *contents)
+{
+	
+  ENTERARGS("%x", (unsigned int)addr);
+#ifndef ARC4_JTAG
+  unsigned int bp = 0x20207fff; /*FIXMEA: what does 0x2020 stand for ?*/
+#else
+  unsigned int bp = 0x1ffffe00;
+#endif
+  unsigned int r;
+  int instr_size;
+  const unsigned char *breakpt_instr;
+  breakpt_instr=BREAKPOINT_FROM_PC(&addr,&instr_size);
+
+  /* save the existing value */
+  /* r==0 means the read succeeded */
+  if(debug_arc_jtag_target_message)
+    printf_filtered ("instrcution size = %d and instruction 0x%x",
+	   instr_size, *(unsigned int *)breakpt_instr);
+  r = target_read_memory (addr, contents, instr_size);
+  /* put the breakpoint */
+  if(r==0)
+    r = target_write_memory (addr, (char *)&bp, instr_size);
+  return r;
+}
+
+
+/* Function: arc_debug_remove_breakpoint. 
+ * Parameters : 
+ * 1. CORE_ADDR addr: Address. 
+ * 2. char * contents : contents. 
+ * Returns : int.
+ * Description: 
+ *  Write the old contents back for the breakpoint.
+ *
+ */
+
+int
+arc_debug_remove_breakpoint (CORE_ADDR addr, char *contents)
+{
+  ENTERARGS("%x, %lx", (unsigned int)addr, *(unsigned long *)contents);
+
+  /* write the old value back */
+#ifdef ARC4_JTAG
+  return target_write_memory (addr, contents, 4);
+#else
+  return target_write_memory (addr, contents, 2);
+#endif
+}
+
+
+
+/* Function: arc_debug_kill
+ * Parameters : void.
+
+ * Returns : void.
+ * Description: Heavy duty arsenal.Kill the process. 
+ * Maybe we do a board reset and kill it. Write 1 to Halt
+ * in Status32. 
+ */
+
+void
+arc_debug_kill (void)
+{
+  ENTERMSG;
+
+  /* Do stuff */
+
+  target_mourn_inferior ();
+}
+
+/* Function: arc_debug_load
+ * Parameters :
+ * 1. char * args: Arguments. 
+ * 2. int from_tty: Which terminal.
+ * Returns : void.
+ * Description: Load the program into jtag.
+ */
+
+void
+arc_debug_load (char *args, int from_tty)
+{
+	/* Write to RAM of the ARC700 board by running through the sections .*/
+  asection *bss_section;
+  CORE_ADDR bss_addr;
+  bfd_size_type bss_size;
+  char *zero_buf;
+  int target_errno;
+
+  ENTERARGS("%s", args);
+
+  generic_load(args, from_tty);
+
+  /* Zero the bss, if it exists.  */
+  bss_section = bfd_get_section_by_name (exec_bfd, ".bss");
+  if (bss_section)
+    {
+      bss_addr = bfd_section_lma (exec_bfd, bss_section);
+      bss_size = bfd_get_section_size (bss_section);
+      zero_buf = (char *)xcalloc (bss_size, 1);
+      
+      if (debug_arc_jtag_target_message)
+	printf_filtered("%s: bss at %x, size = %x\n", __FUNCTION__, (unsigned int)bss_addr,(unsigned int)bss_size);
+      
+      target_errno = target_write_memory (bss_addr, zero_buf, bss_size);
+      free (zero_buf);
+      if (target_errno)
+	{
+	  error ("load: error zeroing bss: %s\n", strerror(target_errno));
+	}
+    }
+  else
+    {
+      if (debug_arc_jtag_target_message)
+	printf_filtered("%s: no bss\n", __FUNCTION__);
+    }
+      
+  clear_symtab_users();
+}
+
+/* Function: arc_debug_create_inferior
+ * Parameters :
+ * 1. char * exec_file:
+ * 2. char * args: 
+ * 3. char ** env;
+ * Returns : void.
+ * Description: Set up sanity values for arc_debug_create_inferior. More thought
+ * needed for this. 
+ */
+
+
+void
+arc_debug_create_inferior (char *exec_file, char *args, char **env,int dummy)
+{
+  ENTERARGS("%s,%s", exec_file, args);
+
+  /* If no exec file handed to us, get it from the exec-file command
+     -- with a good, common error message if none is specified.  */
+  if (exec_file == 0)
+    exec_file = get_exec_file (1);
+
+  /* We dont really have a PID or anything, but GDB uses this value to check
+     if the program is running. */
+  inferior_ptid.pid = 42;
+
+  clear_proceed_status();
+  /* -1 means resume from current place
+     TARGET_SIGNAL_0 means dont give it any signal
+     Last arg should be true if you want to single step */
+  //proceed ((CORE_ADDR) -1, TARGET_SIGNAL_0, 0);
+  proceed (bfd_get_start_address (exec_bfd), TARGET_SIGNAL_0, 0);
+}
+
+
+/* Function: arc_debug_mourn_inferior
+ * Parameters :void.
+ * Returns : void.
+ * Description: Set up sanity values for arc_debug_create_inferior. More thought
+ * needed for this. 
+ */
+
+void
+arc_debug_mourn_inferior (void)
+{
+  ENTERMSG;
+
+  unpush_target (&arc_debug_ops);
+
+  generic_mourn_inferior ();
+}
+
+
+/* Function: arc_debug_mourn_inferior
+ * Parameters :ptid_t ptid.
+ * Returns : 1 always. 
+ * Description: Checks for return values .
+ */
+
+
+int
+arc_debug_thread_alive (ptid_t ptid)
+{
+  ENTERMSG;
+  return 1;
+}
+
+
+/* Function: arc_debug_stop
+ * Parameters: void
+ * Returns: void.
+ * Description: Stop the Processor. We stop by writing FH bit to Debug Register . 
+ *	write 1 to the FH bit in the Debug register after 
+ *	polling for the DEBUG register to have no loads pending .
+ */
+void
+arc_debug_stop (void)
+{
+
+  ENTERMSG;
+  int val = 0x2;
+  /* Stop using the FH bit in the debug register. */
+  arc_debug_write_aux_register (ARC_HW_DEBUG_REGNUM, &val);
+  
+}
+
+/* Read core register.  Return 0 on success.  */
+static int
+arc_debug_read_core_register (int hwregno, int *buf)
+{
+  int rd;
+  if(arc_jtag_ops.jtag_read_core_reg(hwregno,&rd)==JTAG_READ_FAILURE)
+      error("Failure reading auxillary register 0x%x",hwregno);
+  *buf = rd;
+  return 0;
+}
+
+/* Read aux register.  Return 0 on success.  */
+static int
+arc_debug_read_aux_register (int hwregno, int *buf)
+{
+  int rd;
+  if(arc_jtag_ops.jtag_read_aux_reg(hwregno,&rd)==JTAG_READ_FAILURE)
+      error("Failure reading auxillary register 0x%x",hwregno);
+  *buf = rd;
+  return 0;
+}
+
+/* Write aux register.  Return 0 on success.  */
+static int
+arc_debug_write_aux_register (int hwregno, int *buf)
+{
+    if(arc_jtag_ops.jtag_write_aux_reg(hwregno, *buf)==JTAG_WRITE_FAILURE)
+	error("Failure writing 0x%x to auxillary register 0x%x\n",*buf,hwregno);
+  return 0;
+}
+
+/* Helper routine for commands added.  */
+/* Print Processor Variant Info.  */
+static void
+arc_print_processor_variant_info (void)
+{
+  struct gdbarch_tdep *tdep  = gdbarch_tdep (current_gdbarch);
+  
+#ifdef ARC4_JTAG
+  if (tdep->arc_processor_variant_info && 
+      tdep->arc_processor_variant_info->arcprocessorversion == A4)
+    {
+      printf_filtered ("A4\n");
+    }
+#else
+  if (tdep->arc_processor_variant_info)
+    {
+      if(tdep->arc_processor_variant_info->arcprocessorversion == ARC700)
+	printf_filtered ("ARC700\n");
+      else
+	printf_filtered ("ARC600\n");
+    }
+#endif
+  else
+    {
+      printf_filtered ("ARC Processor Information not available \n");
+    }
+
+}
+
+
+static void 
+arc_print_bcr_regs (void)
+{
+  int i = 0;
+  unsigned int bcrval = 0;
+  for ( i = 0 ; i < (sizeof(arc_bcr_reg_info) / sizeof (struct arc_reg_info)) ; i++)
+    {
+	if(arc_jtag_ops.jtag_read_aux_reg (arc_bcr_reg_info[i].hw_regno, &bcrval)==JTAG_READ_FAILURE)
+	    error("Failure reading auxillary register 0x%x",arc_bcr_reg_info[i].hw_regno);
+      printf_filtered ("[%02x] %-15s : 0x%02x\n",arc_bcr_reg_info[i].hw_regno,
+		       arc_bcr_reg_info[i].name, bcrval );
+    }
+
+}
+
+static void
+arc_debug_jtag_reset_board (void)
+{
+  arc_jtag_ops.jtag_reset_board();
+}
+
+
+/* Function: init_arc_debug_ops
+ * Parameters: void
+ * Returns: void.
+ * Description: Initialize the jtag operations. 
+ */
+
+void
+init_arc_debug_ops (void)
+{
+  ENTERMSG;
+#ifdef ARC4_JTAG
+  arc_debug_ops.to_shortname = "arcjtag";
+  arc_debug_ops.to_longname = "Target for debugging an A4 board with JTAG.";
+  arc_debug_ops.to_doc = "Debug a remote A4 board via a JTAG"; /* to_doc */
+#else
+  arc_debug_ops.to_shortname = "arcjtag";
+  arc_debug_ops.to_longname = "Target for debugging an ARC700 board with JTAG.";
+  arc_debug_ops.to_doc = "Debug a remote ARC700 board via a JTAG"; /* to_doc */
+#endif
+
+
+  arc_debug_ops.to_open = arc_debug_open;
+  arc_debug_ops.to_close = arc_debug_close;
+  arc_debug_ops.to_attach = arc_debug_attach;
+  arc_debug_ops.to_detach = arc_debug_detach;
+  arc_debug_ops.to_resume = arc_debug_resume;
+  arc_debug_ops.to_wait = arc_debug_wait;
+
+  arc_debug_ops.to_fetch_registers = arc_debug_fetch_regs;
+  arc_debug_ops.to_store_registers = arc_debug_store_regs;
+  arc_debug_ops.to_prepare_to_store = arc_debug_prepare_to_store;
+  //arc_debug_ops.to_xfer_memory = arc_debug_xfer_memory;
+  arc_debug_ops.to_xfer_partial = arc_debug_xfer_partial;
+  arc_debug_ops.to_files_info = arc_debug_files_info;
+  arc_debug_ops.to_insert_breakpoint = arc_debug_insert_breakpoint;
+  arc_debug_ops.to_remove_breakpoint = arc_debug_remove_breakpoint;
+  arc_debug_ops.to_kill = arc_debug_kill;
+  arc_debug_ops.to_load = arc_debug_load;
+
+  arc_debug_ops.to_create_inferior = arc_debug_create_inferior;
+
+  arc_debug_ops.to_mourn_inferior = arc_debug_mourn_inferior;
+  arc_debug_ops.to_thread_alive = arc_debug_thread_alive;
+  arc_debug_ops.to_stop = arc_debug_stop;
+
+  arc_debug_ops.to_terminal_inferior = NULL;
+
+  
+  arc_debug_ops.to_stratum = process_stratum;
+  
+  arc_debug_ops.to_has_all_memory = 1;
+  arc_debug_ops.to_has_memory = 1;
+  arc_debug_ops.to_has_stack = 1;
+  arc_debug_ops.to_has_registers = 1;
+  arc_debug_ops.to_has_execution = 1;
+
+  arc_debug_ops.to_magic = OPS_MAGIC;
+}
+
+
+
+void
+_initialize_arc_debug (void)
+{
+  ENTERMSG;
+  init_arc_debug_ops ();
+  add_target (&arc_debug_ops);
+  add_setshow_boolean_cmd("arcjtag-debug-target",no_class, 
+			  &debug_arc_jtag_target_message,
+			  "Set whether to print arc jtag debug messages.\n",
+			  "Show whether to print arc jtag debug messages.\n",
+			  "If set the jtag debug messages from the target are \
+printed.\n",
+			  "Whether to print debug jtag messages is %s.\n",		  
+			  NULL,NULL,&setlist,&showlist);
+
+  add_setshow_boolean_cmd("arcjtag-debug-statemachine",no_class, 
+			  &(arc_jtag_ops.arc_jtag_state_machine_debug),
+			  "Set whether to print JTAG state machine \
+debug messages \n",
+			  "Show whether to print JTAG state machine \
+debug messages \n",
+			  "If set the JTAG state machine messages are \
+printed.\n",
+			  "Whether to print JTAG state machine debug \
+messages is %s\n",
+			  NULL,NULL,&setlist,&showlist);
+
+  add_setshow_uinteger_cmd("arcjtag-retry-count",no_class, &arcjtag_retry_count,
+			   "Set the number of attempts to be made for \
+a JTAG operation.\n",
+			   "Show the number of attempts to be made for \
+a JTAG operation.\n",
+			   "Indicates the number of times a JTAG operation \
+is attempted before returning a failure.\n",
+			   "The number of times a JTAG operation is attempted \
+before returning a failure is %s.\n",
+			   NULL, NULL, &setlist, &showlist);
+
+  add_cmd ("arc-configuration", class_info, arc_print_processor_variant_info,
+	   "Show ARC configuration information." , &infolist);
+
+  add_cmd ("arc-bcr-registers", class_info, arc_print_bcr_regs,
+           "Show BCR Registers in the ARC Processor Variant", &infolist);
+
+  add_cmd ("arc-reset-board", class_obscure, arc_debug_jtag_reset_board,
+           "Reset the board.", &cmdlist);
+
+}
diff --git a/gdb/arc-jtag.h b/gdb/arc-jtag.h
new file mode 100644
index 0000000..b770a53
--- /dev/null
+++ b/gdb/arc-jtag.h
@@ -0,0 +1,76 @@
+/* Target dependent code for ARC700, for GDB, the GNU debugger.
+
+   Copyright 2005 Free Software Foundation, Inc.
+
+   Contributed by Codito Technologies Pvt. Ltd. (www.codito.com)
+
+   Authors: 
+      Soam Vasani <soam.vasani@codito.com>
+
+   This file is part of GDB.
+   
+   This program 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 of the License, or
+   (at your option) any later version.
+   
+   This program 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 this program; if not, write to the Free Software
+   Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.  
+*/
+
+#define ARC_DEBUG_REG_SH_BIT 	0x40000000
+
+#define RAUX(name, hwregno , desc, gdbregno, version)  ARC_HW_##name##_REGNUM = hwregno , 
+#define RBCR(name, hwregno , desc, gdbregno, version)  ARC_HW_##name##_REGNUM = hwregno , 
+
+
+enum arc_hw_regnums
+  {
+    #include "arc-regnums-defs.h"
+    /* Specific ARCAngel Registers for Caches.  */
+    ARC_HW_ICACHE_IVIC = 0x10 , /* Invalidate Cache. */
+    ARC_HW_ICACHE_CONTROL = 0x11 , /* Disable ICache. ICache control. */
+    ARC_HW_DCACHE_IVIC = 0x47, /* Invalidate Cache. */
+    ARC_HW_DCACHE_CONTROL = 0x48 , /* Disable DCache. DCache Control. */
+  };
+
+#undef RBCR
+#undef RAUX
+
+#define ARC_TARGET_OBJECT_AUXREGS 	-1
+
+#define target_read_aux_reg(readbuf, offset, len)               \
+         (current_target.to_xfer_partial(&current_target,        \
+                                         ARC_TARGET_OBJECT_AUXREGS, NULL, readbuf, NULL, offset, len))
+	  
+#define target_write_aux_reg(writebuf, offset, len)             \
+         (current_target.to_xfer_partial(&current_target,        \
+                                         ARC_TARGET_OBJECT_AUXREGS, NULL, NULL, writebuf, offset, len))
+
+
+static inline int 
+is_arc700 (void)
+{
+  struct gdbarch_tdep * tdep = gdbarch_tdep (current_gdbarch);
+  if(tdep->arc_processor_variant_info->arcprocessorversion == ARC700)
+    return 1;
+  return 0;
+  
+}
+
+static inline int 
+is_arc600 (void)
+{
+  struct gdbarch_tdep * tdep = gdbarch_tdep (current_gdbarch);
+  if(tdep->arc_processor_variant_info->arcprocessorversion == ARC600)
+    return 1;
+  return 0;
+  
+}
+ int debug_arc_jtag_target_message;
diff --git a/gdb/arc-linux-tdep.c b/gdb/arc-linux-tdep.c
new file mode 100644
index 0000000..14d34a6
--- /dev/null
+++ b/gdb/arc-linux-tdep.c
@@ -0,0 +1,506 @@
+/* Target dependent code for ARC700, for GDB, the GNU debugger.
+
+   Copyright 2005 Free Software Foundation, Inc.
+
+   Authors: 
+      Soam Vasani <soam.vasani@codito.com>
+      Ramana Radhakrishnan <ramana.radhakrishnan@codito.com> 
+
+   This file is part of GDB.
+   
+   This program 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 of the License, or
+   (at your option) any later version.
+   
+   This program 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 this program; if not, write to the Free Software
+   Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.  
+*/
+
+#include <string.h>
+
+#include "defs.h"
+#include "osabi.h"
+#include "frame.h"
+#include "regcache.h"
+#include "gdb_assert.h"
+#include "inferior.h"
+#include "reggroups.h"
+#include "solib-svr4.h"
+#include "symtab.h"
+#include "objfiles.h"
+#include "block.h"
+
+#include "arc-tdep.h"
+#include "regset.h"
+
+//#define ARC_DEBUG 1
+
+/* Default Breakpoint instructions used for 
+   ARC700 Linux 
+*/
+unsigned int arc700_linux_breakpoint_size = 2;
+unsigned char arc700_linux_breakpoint_insn[2] = { 0x3e,0x78 } ;
+
+static const char *
+arc_linux_register_name (int regno)
+{
+  static char linux_names[][10] = {"r0", "r1", "r2", "r3", "r4", "r5", "r6",
+				   "r7", "r8", "r9", "r10", "r11", "r12", "r13",
+				   "r14", "r15", "r16", "r17", "r18", "r19", "r20",
+				   "r21", "r22", "r23", "r24", "r25", "r26",
+				   
+				   "bta",
+				   "lp_start", "lp_end", "lp_count",
+				   "status32", "blink",
+				   "fp", "sp", "efa",
+				   /* linux-only registers */
+				   "ret", "orig_r8", "pc",
+
+				   /* pseudo-regs */
+				   "ilink1", "ilink2", "eret",
+				   "status_l1", "status_l2", "erstatus" };
+
+  gdb_assert(ARRAY_SIZE (linux_names) == NUM_REGS + NUM_PSEUDO_REGS);
+  gdb_assert(regno >=0 && regno < NUM_REGS + NUM_PSEUDO_REGS);
+
+  return linux_names[regno];
+}
+
+/*
+ * The kernel stores only one of (ilink1,ilink2,eret).  This is stored in
+ * the ret "register".  ilink1 is stored when the kernel has been entered
+ * because of a level 1 interrupt, etc.
+ *
+ * Same story for (status_l1, status_l2, erstatus).
+ *
+ * This disambiguity has been fixed by adding orig_r8 to pt_regs.
+ * It will take the following values -
+ *    1. if an exception of any kind occurs then orig_r8 >= 0
+ *    2. Int level 1 : -1
+ *    3. Int level 2 : -2
+ *
+ * Registers whose value we don't know are given the value zero.
+ */
+static void
+arc_linux_pseudo_register_read (struct gdbarch *gdbarch, struct regcache *regcache,
+				int regno, void *buf)
+{
+  int status32, ret, orig_r8;
+  regcache_cooked_read (current_regcache, ARC_ORIG_R8_REGNUM, &orig_r8);
+
+  if(regno == ARC_ILINK1_REGNUM ||
+     regno == ARC_ILINK2_REGNUM ||
+     regno == ARC_ERET_REGNUM)
+    {
+      regcache_cooked_read (current_regcache, ARC_RET_REGNUM, &ret);
+
+      if(regno == ARC_ILINK1_REGNUM)
+	*((unsigned int *)buf) = ((orig_r8 == -1) ? ret : 0);
+      else if(regno == ARC_ILINK2_REGNUM)
+	*((unsigned int *)buf) = ((orig_r8 == -2) ? ret : 0);
+      else if(regno == ARC_ERET_REGNUM)
+	*((unsigned int *)buf) = ((orig_r8 >= 0) ? ret : 0);
+
+    }
+  else if(regno == ARC_STATUS32_L1_REGNUM ||
+	  regno == ARC_STATUS32_L2_REGNUM ||
+	  regno == ARC_ERSTATUS_REGNUM)
+    {
+      regcache_cooked_read (current_regcache, ARC_STATUS32_REGNUM, &status32);
+
+      if(regno == ARC_STATUS32_L1_REGNUM)
+	*((unsigned int *)buf) = ((orig_r8 == -1) ? status32 : 0);
+      else if(regno == ARC_STATUS32_L2_REGNUM)
+	*((unsigned int *)buf) = ((orig_r8 == -2) ? status32 : 0);
+      else if(regno == ARC_ERSTATUS_REGNUM)
+	*((unsigned int *)buf) = ((orig_r8 >= 0) ? status32 : 0);
+    }
+  else
+    internal_error(__FILE__, __LINE__, "arc_pseudo_register_read: bad register number (%d)", regno);
+}
+
+static void
+arc_linux_pseudo_register_write (struct gdbarch *gdbarch, struct regcache *regcache,
+				 int regno, const void *buf)
+{
+  /* none of our pseudo-regs are writable */
+  internal_error(__FILE__, __LINE__, "arc_pseudo_register_write: bad register number");
+}
+
+/*
+ * print registers in the correct order.
+ *
+ * Why not have the regnums in the right order in the first place ?
+ * Because some of the registers have to be pseudo-registers because of
+ * the way the kernel is written, and because gdb assumes that
+ * pseudo-registers have regnums greater than real register regnums.
+ */
+static void
+arc_linux_print_registers_info (struct gdbarch *gdbarch, struct ui_file *file,
+				struct frame_info *frame, int regnum, int all)
+{
+  int i;
+
+  if (regnum >= 0)
+    {
+      default_print_registers_info (gdbarch, file, frame, regnum, all);
+      return;
+    }
+
+  /* print all registers */
+
+  /* r0..r26 */
+  for (i=0; i <= 26; ++i)
+    default_print_registers_info (gdbarch, file, frame, i, all);
+
+  default_print_registers_info (gdbarch, file, frame, ARC_FP_REGNUM, all);
+  default_print_registers_info (gdbarch, file, frame, ARC_SP_REGNUM, all);
+  default_print_registers_info (gdbarch, file, frame, ARC_ILINK1_REGNUM, all);
+  default_print_registers_info (gdbarch, file, frame, ARC_ILINK2_REGNUM, all);
+  default_print_registers_info (gdbarch, file, frame, ARC_BLINK_REGNUM, all);
+  default_print_registers_info (gdbarch, file, frame, ARC_LP_COUNT_REGNUM, all);
+  
+  /* now the aux registers */
+  
+  default_print_registers_info (gdbarch, file, frame, ARC_BTA_REGNUM, all);
+  default_print_registers_info (gdbarch, file, frame, ARC_LP_START_REGNUM, all);
+  default_print_registers_info (gdbarch, file, frame, ARC_LP_END_REGNUM, all);
+  default_print_registers_info (gdbarch, file, frame, ARC_EFA_REGNUM, all);
+  default_print_registers_info (gdbarch, file, frame, ARC_ERET_REGNUM, all);
+  default_print_registers_info (gdbarch, file, frame, ARC_STATUS32_L1_REGNUM, all);
+  default_print_registers_info (gdbarch, file, frame, ARC_STATUS32_L2_REGNUM, all);
+  default_print_registers_info (gdbarch, file, frame, ARC_ERSTATUS_REGNUM, all);
+
+  /* show the pc */
+  default_print_registers_info (gdbarch, file, frame, ARC_STOP_PC_REGNUM, all);
+}
+
+
+/*
+ * mov r8,nr_sigreturn
+ * swi 
+ */
+static char arc_sigtramp_insn[] = { 0x8a, 0x20, 0xc1, 0x1d, 0x6f, 0x22, 0x3f, 0x00 };
+
+/* Return whether the frame preceding NEXT_FRAME corresponds to a
+   GNU/Linux sigtramp routine.  */
+static int
+arc_linux_sigtramp_p (struct frame_info *next_frame)
+{
+  CORE_ADDR pc = frame_pc_unwind (next_frame);
+  unsigned char buf[8];
+
+  if (!safe_frame_unwind_memory (next_frame, pc, buf, 8))
+    return 0;
+
+  if (memcmp(buf, arc_sigtramp_insn, 8) == 0)
+    return 1;
+  else
+    {
+      pc -= 4;
+      
+      if (!safe_frame_unwind_memory (next_frame, pc, buf, 8))
+	return 0;
+
+      if (memcmp(buf, arc_sigtramp_insn, 8) == 0)
+	return 1;
+    }
+
+  return 0;
+}
+
+/* Assuming NEXT_FRAME is a frame following a GNU/Linux sigtramp
+   routine, return the address of the associated sigcontext structure.  */
+static CORE_ADDR
+arc_linux_sigcontext_addr (struct frame_info *next_frame)
+{
+  char buf[4];
+  CORE_ADDR sp;
+  
+  frame_unwind_register (next_frame, ARC_SP_REGNUM, buf);
+  sp = extract_unsigned_integer (buf, 4);
+
+  return sp;
+}
+
+int
+arc_linux_register_reggroup_p (int regnum, struct reggroup *group)
+{
+  if(regnum == ARC_ORIG_R8_REGNUM && group == system_reggroup)
+    return 1;
+
+  if(regnum == ARC_RET_REGNUM && group == general_reggroup)
+    return 0;
+
+  return -1;
+}
+
+/* Mapping between the general-purpose registers in `struct
+   sigcontext' format and GDB's register cache layout.
+   arc_linux_sc_reg_offset[i] is the sigcontext offset of GDB regnum `i'.  */
+
+/* From <asm/sigcontext.h>.  */
+static int arc_linux_sc_reg_offset[] =
+{
+  23 * 4,				     /* r0 */
+  22 * 4,				     /* r1 */
+  21 * 4,				     /* r2 */
+  20 * 4,				     /* r3 */
+  19 * 4,				     /* r4 */
+  18 * 4,				     /* r5 */
+  17 * 4,				     /* r6 */
+  16 * 4,				     /* r7 */
+  15 * 4,				     /* r8 */
+  14 * 4,				     /* r9 */
+  13 * 4,				     /* r10 */
+  12 * 4,				     /* r11 */
+  11 * 4,				     /* r12 */
+  -1,					     /* r13 */
+  -1,					     /* r14 */
+  -1,					     /* r15 */
+  -1,					     /* r16 */
+  -1,					     /* r17 */
+  -1,					     /* r18 */
+  -1,					     /* r19 */
+  -1,					     /* r20 */
+  -1,					     /* r21 */
+  -1,					     /* r22 */
+  -1,					     /* r23 */
+  -1,					     /* r24 */
+  -1,					     /* r25 */
+  10 * 4,				     /* r26 */
+  2 * 4,				     /* bta */
+  3 * 4,				     /* lp_start */
+  4 * 4,				     /* lp_end */
+  5 * 4,				     /* lp_count */
+  6 * 4,				     /* status32 */
+  8 * 4,				     /* blink */
+  9 * 4,				     /* fp */
+  1 * 4,				     /* sp */
+  -1,					     /* efa */
+  7 * 4,				     /* ret */
+  -1,					     /* orig_r8 */
+  -1, 					     /* stop_pc */
+};
+
+
+/* Set the program counter for process PTID to PC.  */
+
+static void
+arc700_linux_write_pc (CORE_ADDR pc, ptid_t ptid)
+{
+  ULONGEST val;
+  write_register_pid (PC_REGNUM, pc, ptid);
+
+  /* We must be careful with modifying the program counter.  If we
+     just interrupted a system call, the kernel might try to restart
+     it when we resume the inferior.  On restarting the system call,
+     the kernel will try backing up the program counter even though it
+     no longer points at the system call.  This typically results in a
+     SIGSEGV or SIGILL.  We can prevent this by writing `-1' in the
+     "orig_r8" pseudo-register.
+
+     Note that "orig_r8" is saved when setting up a dummy call frame.
+     This means that it is properly restored when that frame is
+     popped, and that the interrupted system call will be restarted
+     when we resume the inferior on return from a function call from
+     within GDB.  In all other cases the system call will not be
+     restarted.  */
+  write_register_pid (ARC_ORIG_R8_REGNUM, -3, ptid);
+}
+
+
+/* See the comments for SKIP_SOLIB_RESOLVER at the top of infrun.c.
+
+   This is called on every single step thru the PLT and runtime resolver.
+
+   This function:
+   1) decides whether a PLT has sent us into the linker to resolve
+      a function reference, and 
+   2) if so, tells us where to set a temporary breakpoint that will
+      trigger when the dynamic linker is done.  */
+
+CORE_ADDR
+arc_linux_skip_solib_resolver (struct gdbarch *gdbarch, CORE_ADDR pc)
+{
+  /* For uClibc 0.9.26.
+
+     An unresolved PLT entry points to "__dl_linux_resolve", which calls
+     "__dl_linux_resolver" to do the resolving and then eventually jumps to
+     the function.
+
+     So we look for the symbol `_dl_linux_resolver', and if we are there,
+     we set a breakpoint at the return address, and continue.  */
+
+  /* lookup_minimal_symbol didn't work, for some reason.  */
+  struct symbol *resolver 
+    = lookup_symbol_global ("_dl_linux_resolver", 0, VAR_DOMAIN, 0);
+  
+#ifdef ARC_DEBUG
+  printf("--- arc_linux_skip_solib_resolver: pc = %x, resolver at %x\n", pc,
+	 resolver ? BLOCK_START (SYMBOL_BLOCK_VALUE (resolver)) : 0);
+#endif
+  
+  if (resolver && (BLOCK_START (SYMBOL_BLOCK_VALUE (resolver))) == pc)
+    {
+	return frame_pc_unwind (get_current_frame ());
+    }
+
+  return 0;
+}      
+
+
+/* arcompact_linux_core_reg_offsets[i] is the offset in the .reg section of GDB
+   regnum i .
+   
+   From include/asm-arc/user.h in the ARC Linux sources.  */
+static int arcompact_linux_core_reg_offsets[] = {
+  22 * 4,    /* r0 */
+  21 * 4,    /* r1 */
+  20 * 4,    /* r2 */
+  19 * 4,    /* r3 */
+  18 * 4,    /* r4 */
+  17 * 4,    /* r5 */
+  16 * 4,    /* r6 */
+  15 * 4,    /* r7 */
+  14 * 4,    /* r8 */
+  13 * 4,    /* r9 */
+  12 * 4,    /* r10 */
+  11 * 4,    /* r11 */
+  10 * 4,    /* r12 */
+  39 * 4,    /* r13 */
+  38 * 4,    /* r14 */
+  37 * 4,    /* r15 */
+  36 * 4,    /* r16 */
+  35 * 4,    /* r17 */
+  34 * 4,    /* r18 */
+  33 * 4,    /* r19 */
+  32 * 4,    /* r20 */
+  31 * 4,    /* r21 */
+  30 * 4,    /* r22 */
+  29 * 4,    /* r23 */
+  28 * 4,    /* r24 */
+  27 * 4,    /* r25 */
+   9 * 4,    /* r26 */
+   1 * 4,    /* bta */
+   2 * 4,    /* lp_start */
+   3 * 4,    /* lp_end */
+   4 * 4,    /* lp_count */
+   5 * 4,    /* status32 */
+   7 * 4,    /* blink */
+   8 * 4,    /* fp */
+  25 * 4,    /* sp */
+  -1,        /* efa */
+   6 * 4,    /* ret */
+  24 * 4,    /* orig_r8 */
+  40 * 4,    /* stop_pc */
+};
+
+/* Extract the register values found in the ABI GREGSET, storing their
+   values in REGCACHE.  */
+static void
+arcompact_linux_supply_gregset (struct regcache *regcache,
+				int regnum, const void *gregs, size_t size)
+{
+  int regi;
+  int arc_num_gprs = ARRAY_SIZE (arcompact_linux_core_reg_offsets);
+  const bfd_byte *buf = gregs;
+
+  for (regi = 0; regi < arc_num_gprs; regi++)
+    {
+      if (arcompact_linux_core_reg_offsets[regi] > 0)
+	regcache_raw_supply (regcache, regi,
+			     buf + arcompact_linux_core_reg_offsets[regi]);
+    }
+}
+
+/* Call the right architecture variant's supply_gregset function.  For now,
+   we only have ARCompact.  */
+static void
+arc_linux_supply_gregset (const struct regset *regset,
+			  struct regcache *regcache,
+			  int regnum, const void *gregs, size_t size)
+{
+  arcompact_linux_supply_gregset (regcache, regnum, gregs, size);
+}
+
+/* Functions for handling core files.
+   The first element is a parameter to pass the rest of the functions.  We
+   don't need it.
+   supply_gregset is for reading the core file.
+   collect_regset, which we haven't defined, would be for writing the core
+   file.  */
+static struct regset arc_linux_gregset = {
+  NULL, arc_linux_supply_gregset
+};
+
+/* This is called through gdbarch.  */
+static const struct regset *
+arc_linux_regset_from_core_section (struct gdbarch *core_arch,
+				    const char *sect_name, size_t sect_size)
+{
+  if (strcmp (sect_name, ".reg") == 0)
+    return &arc_linux_gregset;
+
+  return NULL;
+}
+
+/* Add the signal stuff to gdbarch->tdep.  */
+static void
+arc_linux_init_abi (struct gdbarch_info info, struct gdbarch *gdbarch)
+{
+  struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
+  
+  tdep->sigtramp_p = arc_linux_sigtramp_p;
+  tdep->sigcontext_addr = arc_linux_sigcontext_addr;
+  tdep->sc_reg_offset = arc_linux_sc_reg_offset;
+  tdep->sc_num_regs = ARRAY_SIZE (arc_linux_sc_reg_offset);
+
+  tdep->arc_breakpoint_size = arc700_linux_breakpoint_size;
+  tdep->arc_breakpoint_insn = arc700_linux_breakpoint_insn;
+
+  set_gdbarch_num_regs (gdbarch, ARC_NR_REGS);
+  set_gdbarch_num_pseudo_regs (gdbarch, ARC_NR_PSEUDO_REGS);
+  
+  set_gdbarch_pc_regnum (gdbarch, ARC_STOP_PC_REGNUM);
+  set_gdbarch_register_name (gdbarch, arc_linux_register_name);
+
+  set_gdbarch_software_single_step (gdbarch, arc_software_single_step);
+
+  set_gdbarch_write_pc (gdbarch, arc700_linux_write_pc);
+
+  tdep->pc_regnum_in_sigcontext = ARC_RET_REGNUM;
+
+
+  set_gdbarch_pseudo_register_read (gdbarch, arc_linux_pseudo_register_read);
+  set_gdbarch_pseudo_register_write (gdbarch, arc_linux_pseudo_register_write);
+
+  set_gdbarch_print_registers_info (gdbarch, arc_linux_print_registers_info);
+
+  tdep->register_reggroup_p = arc_linux_register_reggroup_p;
+  
+  tdep->lowest_pc = 0x74;
+
+  tdep->arc_processor_variant_info = NULL;
+  set_gdbarch_regset_from_core_section (gdbarch, 
+					arc_linux_regset_from_core_section);
+  /* GNU/Linux uses SVR4-style shared libraries.  */
+  set_solib_svr4_fetch_link_map_offsets
+    (gdbarch, svr4_ilp32_fetch_link_map_offsets);
+
+  set_gdbarch_skip_solib_resolver (gdbarch, arc_linux_skip_solib_resolver);
+}
+
+void
+_initialize_arc_linux_tdep (void)
+{
+  gdbarch_register_osabi (bfd_arch_arc, 0, GDB_OSABI_LINUX,
+			  arc_linux_init_abi);
+}
diff --git a/gdb/arc-regnums-defs.h b/gdb/arc-regnums-defs.h
new file mode 100644
index 0000000..6071ee4
--- /dev/null
+++ b/gdb/arc-regnums-defs.h
@@ -0,0 +1,108 @@
+/* Target dependent code for ARC700, for GDB, the GNU debugger.
+
+   Copyright 2005 Free Software Foundation, Inc.
+
+   Contributed by Codito Technologies Pvt. Ltd. (www.codito.com)
+
+   Authors: 
+      Ramana Radhakrishnan <ramana.radhakrishnan@codito.com> 
+
+   This file is part of GDB.
+   
+   This program 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 of the License, or
+   (at your option) any later version.
+   
+   This program 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 this program; if not, write to the Free Software
+   Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.  
+*/
+
+#ifdef RAUX
+#ifdef ARC4_JTAG
+
+RAUX ( STATUS , 0x0, "Status Regnum " , ARC_STATUS_REGNUM , A4 )
+RAUX ( SEMAPHORE ,  0x1, "Semaphore Regnum ", ARC_SEMAPHORE_REGNUM , A4  ) 
+RAUX ( LP_START , 0x2, "Loop Start" , ARC_LP_START_REGNUM , A4  )
+RAUX ( LP_END , 0x3, "Loop End", ARC_LP_END_REGNUM , A4 )
+RAUX ( IDENTITY , 0x4, "Identity", ARC_IDENTITY_REGNUM , A4 )
+RAUX ( DEBUG , 0x5, "Debug" , ARC_DEBUG_REGNUM , A4 )
+
+#else
+
+RAUX ( STATUS , 0x0, "Status Regnum (obsolete)" , ARC_STATUS_REGNUM , ARCompact )
+RAUX ( SEMAPHORE ,  0x1, "Semaphore Regnum ", ARC_SEMAPHORE_REGNUM , ARCompact  ) 
+RAUX ( LP_START , 0x2, "Loop Start" , ARC_LP_START_REGNUM , ARCompact  )
+RAUX ( LP_END , 0x3, "Loop End", ARC_LP_END_REGNUM , ARCompact )
+RAUX ( IDENTITY , 0x4, "Identity", ARC_IDENTITY_REGNUM , ARCompact )
+RAUX ( DEBUG , 0x5, "Debug" , ARC_DEBUG_REGNUM , ARCompact )
+RAUX ( PC, 0x6,"PC" , ARC_PC_REGNUM ,ARCompact )
+RAUX ( STATUS32 ,0xA,"STATUS32", ARC_STATUS32_REGNUM , ARCompact ) 
+RAUX ( STATUS32_L1 , 0xB, "STATUS32 register in case of L1 interrupts" ,ARC_STATUS32_L1_REGNUM , ARCompact )
+RAUX ( STATUS32_L2 , 0xC, "STATUS32 register in case of L2 interrupts" ,ARC_STATUS32_L2_REGNUM , ARCompact )
+RAUX ( COUNT0 , 0x21, "Processor Timer 1 Count Value", ARC_COUNT0_REGNUM , ARCompact )
+RAUX ( CONTROL0 , 0x22, "Processor Timer 1 Control Value" , ARC_CONTROL0_REGNUM, ARCompact)
+RAUX ( LIMIT0 , 0x23, "Processor Timer 1 Limit Value" , ARC_LIMIT0_REGNUM, ARCompact )
+RAUX ( INT_VECTOR_BASE , 0x25, "Interrupt Vector Base Register", ARC_INT_VECTOR_BASE_REGNUM , ARCompact )
+RAUX ( AUX_IRQ_MACMODE , 0x41, "Aux IRQ MAC Mode " , ARC_AUX_MACMODE_REGNUM , ARCompact )
+RAUX ( AUX_IRQ_LV12 , 0x42, "Aux IRQ Level 2 " , ARC_AUX_IRQ_LV12_REGNUM , ARCompact )
+RAUX ( COUNT1 , 0x100, "Processor Timer 1 Count Value", ARC_COUNT1_REGNUM , ARCompact )
+RAUX ( CONTROL1 , 0x101, "Processor Timer 1 Control Value" , ARC_CONTROL1_REGNUM , ARCompact)
+RAUX ( LIMIT1 , 0x102, "Processor Timer 1 Limit Value", ARC_LIMIT1_REGNUM , ARCompact)
+RAUX ( AUX_IRQ_LEV , 0x200, "Interrupt Level programming. ", ARC_AUX_IRQ_LEV_REGNUM , ARCompact)
+RAUX ( AUX_IRQ_HINT , 0x201, "Software Triggered Interrupt" , ARC_AUX_IRQ_HINT_REGNUM, ARCompact )
+RAUX ( ERET , 0x400, "Exception Return " , ARC_ERET_REGNUM, ARC700 )
+RAUX ( ERBTA , 0x401, "Exception BTA ", ARC_ERBTA_REGNUM, ARC700 )
+RAUX ( ERSTATUS , 0x402, "Exception Return Status" , ARC_ERSTATUS_REGNUM, ARC700 )
+RAUX ( ECR , 0x403, "Exception Cause Register" , ARC_ECR_REGNUM, ARC700 )
+RAUX ( EFA , 0x404, "Exception Fault Address" , ARC_EFA_REGNUM, ARC700 )
+RAUX ( ICAUSE1 , 0x40A, "Interrupt Cause (Level 1)", ARC_ICAUSE1_REGNUM,ARC700 )
+RAUX ( ICAUSE2 , 0x40B, "Interrupt Cause (Level 2)", ARC_ICAUSE2_REGNUM, ARC700)
+RAUX ( AUX_IENABLE , 0x40C, "Interrupt Mask Programming", ARC_AUX_IENABLE_REGNUM, ARC700 )
+RAUX ( AUX_ITRIGGER , 0x40D, "Interrupt Sensitivity Programming", ARC_AUX_ITRIGGER_REGNUM, ARC700 )
+RAUX ( XPU , 0x410, "User Mode Extension Permissions", ARC_XPU_REGNUM, ARC700 )
+RAUX ( BTA , 0x412, "Branch Target Address", ARC_BTA_REGNUM, ARC700 )
+RAUX ( BTA_L1 , 0x413, "Branch Target Address in Level 1", ARC_BTA_L1_REGNUM, ARC700 )
+RAUX ( BTA_L2 , 0x414, "Branch Target Address in Level 2", ARC_BTA_L2_REGNUM, ARC700 )
+RAUX ( AUX_IRQ_PULSE_CANCEL , 0x415, "Interrupt Pulse Cancel", ARC_AUX_IRQ_PULSE_CANCEL_REGNUM, ARC700 )
+RAUX ( AUX_IRQ_PENDING , 0x416, "Interrupt Pending Register", ARC_AUX_IRQ_PENDING_REGNUM, ARC700 )
+#endif // ARC4_JTAG
+#endif // RAUX
+
+#ifdef RBCR
+#ifndef ARC4_JTAG
+
+RBCR ( DCCM_BASE_BUILD , 0x61, "Base address for DCCM.", ARC_BCR_1_REGNUM, ARCompact)
+RBCR ( CRC_BASE_BUILD , 0x62, "BCRBCR for CRC Unit.", ARC_BCR_2_REGNUM , ARCompact)
+RBCR ( BTA_LINK_BUILD , 0x63, "Interrupt Link Registers Available for BTA",ARC_BCR_3_REGNUM, ARCompact )
+RBCR ( DVBF_BUILD , 0x64, "BCRBCR for Dual Viterbi Instruction.",ARC_BCR_4_REGNUM, ARCompact )
+RBCR ( TEL_INSTR_BUILD , 0x65, "BCRBCR for Extended Arithmetic Instructions. ",ARC_BCR_5_REGNUM, ARCompact)
+RBCR ( MEMSUBSYS , 0x67, "BCRBCR for Memory Subsystem. ",ARC_BCR_7_REGNUM, ARCompact)
+RBCR ( VECBASE_AC_BUILD ,0x68, "BCRBCR for Interrupt Vector Base. ", ARC_BCR_8_REGNUM,ARCompact) 
+RBCR ( P_BASE_ADDRESS , 0x69, "Peripheral Base Address" , ARC_BCR_9_REGNUM , ARCompact) 
+RBCR ( MMU_BUILD , 0x6F, "MMU Build. " , ARC_BCR_F_REGNUM, ARCompact)
+RBCR ( ARCANGEL_BUILD , 0x70, "ARC Angel Build config. ", ARC_BCR_10_REGNUM, ARCompact)
+RBCR ( D_CACHE_BUILD , 0x72, "D Cache Build Config. ", ARC_BCR_12_REGNUM , ARCompact )
+RBCR ( MADI_BUILD , 0x73 , "Multiple ARC Debug Interface. " , ARC_BCR_13_REGNUM , ARCompact)
+RBCR ( DCCM_BUILD , 0x74, "BCRBCR for DCCM.(Data Closely coupled Memory", ARC_BCR_14_REGNUM, ARCompact)
+RBCR ( TIMER_BUILD , 0x75, "BCRBCR for Timers. " , ARC_BCR_15_REGNUM , ARCompact)
+RBCR ( AP_BUILD, 0x76, "Actionpoints build. ", ARC_BCR_16_REGNUM , ARCompact )
+RBCR ( ICACHE_BUILD , 0x77, "Instruction Cache BCR", ARC_BCR_17_REGNUM , ARCompact )
+RBCR ( ICCM_BUILD , 0x78, "ICCM BCRBCR (Instruction Closely Coupled Memory.", ARC_BCR_18_REGNUM , ARCompact)
+RBCR ( DSPRAM_BUILD , 0x79, "DSP RAM Build", ARC_BCR_19_REGNUM , ARCompact)
+RBCR ( MAC_BUILD , 0x7A, "MAC Unit Build", ARC_BCR_1A_REGNUM , ARCompact)
+RBCR ( MULTIPLY_BUILD , 0x7B, "(32 X 32) Multiply Unit Build", ARC_BCR_1B_REGNUM , ARCompact)
+RBCR ( SWAP_BUILD , 0x7C, "SWAP Build", ARC_BCR_1C_REGNUM , ARCompact)
+RBCR ( NORM_BUILD , 0x7D ,"NORM Unit Build", ARC_BCR_1D_REGNUM, ARCompact)
+RBCR ( MINMAX_BUILD , 0x7E, "Minmax Unit Build", ARC_BCR_1E_REGNUM, ARCompact)
+RBCR ( BARREL_BUILD , 0x7F, "Barrel Shifter Build", ARC_BCR_1F_REGNUM , ARCompact) 
+
+
+#endif // ARC4_JTAG
+#endif // RBCR 
diff --git a/gdb/arc-tdep.c b/gdb/arc-tdep.c
new file mode 100644
index 0000000..8b54257
--- /dev/null
+++ b/gdb/arc-tdep.c
@@ -0,0 +1,1999 @@
+/* Target dependent code for ARC700, for GDB, the GNU debugger.
+
+   Copyright 2005 Free Software Foundation, Inc.
+
+   Contributed by Codito Technologies Pvt. Ltd. (www.codito.com)
+
+   Authors: 
+      Soam Vasani <soam.vasani@codito.com>
+      Ramana Radhakrishnan <ramana.radhakrishnan@codito.com> 
+
+   This file is part of GDB.
+   
+   This program 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 of the License, or
+   (at your option) any later version.
+   
+   This program 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 this program; if not, write to the Free Software
+   Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.  
+*/
+#include <string.h>
+
+#include "defs.h"
+#include "arch-utils.h"
+#include "dis-asm.h"
+#include "gdbtypes.h"
+#include "frame.h"
+#include "frame-unwind.h"
+#include "target.h"
+#include "breakpoint.h"
+#include "inferior.h"
+#include "regcache.h"
+#include "reggroups.h"
+#include "trad-frame.h"
+#include "dwarf2-frame.h"
+#include "gdbtypes.h"
+#include "gdb_assert.h"
+#include "gdbcore.h"
+#include "observer.h"
+#include "osabi.h"
+
+#include "opcode/arc.h"
+
+#include "arc-tdep.h"
+
+
+//#define ARC_DEBUG 1
+
+#if ARC_DEBUG
+#  define ENTERMSG printf ("--- entered %s:%s()\n", __FILE__, __FUNCTION__)
+#  define ENTERARGS(fmt, args...) printf ("--- entered %s:%s(" fmt ")\n", __FILE__, __FUNCTION__, args)
+#  define LEAVEMSG printf ("--- exited %s:%s()\n", __FILE__, __FUNCTION__)
+#else
+#  define ENTERMSG
+#  define ENTERARGS(fmt, args...) 
+#  define LEAVEMSG
+#endif
+
+#define ARC_STATUS32_A1 0x8
+#define ARC_STATUS32_A2 0x10
+#define ARC_STATUS32_AE 0x20
+#define ARC_STATUS32_L  0x100
+
+
+static CORE_ADDR arc_frame_align (struct gdbarch *gdbarch, CORE_ADDR sp);
+/* The frame unwind cache for the ARC 
+ */
+
+struct arc_unwind_cache
+{
+  /* blink offset in stack */
+  int blink_offset ;
+
+  /* Caller's PC */
+  CORE_ADDR prev_pc;
+
+  
+  /* The stack pointer at the time this frame was created; i.e. the
+     caller's stack pointer when this function was called.  It is used
+     to identify this frame.  */
+  
+  CORE_ADDR prev_sp;
+  /* The frame base */
+  CORE_ADDR frame_base;
+  /* Frame size */
+  int framesize;
+  
+  /* offset of sp from the stack frame base */
+  LONGEST sp_offset;
+  /* offset of fp from the stack frame base */
+  LONGEST fp_offset;
+  /* Is this a leaf function */
+  int is_leaf ;
+  /* Is there a frame pointer */
+  int uses_fp;
+  
+  
+  /* Offsets for each register in the stack frame */
+  struct trad_frame_saved_reg *saved_regs;
+};
+
+
+
+
+/* Function Prototypes */
+
+static CORE_ADDR arc_unwind_sp (struct gdbarch *gdbarch, 
+			       struct frame_info *next_frame);
+
+static CORE_ADDR arc_unwind_pc (struct gdbarch *gdbarch, 
+			       struct frame_info *next_frame);
+
+static struct arc_unwind_cache * arc_frame_unwind_cache (struct frame_info *next_frame, 
+							 void ** this_prologue);
+
+static CORE_ADDR arc_scan_prologue (CORE_ADDR pc, 
+				     struct frame_info *next_frame,
+				     struct arc_unwind_cache *info);
+
+
+static int arc_binutils_reg_to_regnum (int reg);
+
+extern struct arcDisState arcAnalyzeInstr (  bfd_vma address,disassemble_info* info );
+extern struct arcDisState a4AnalyzeInstr (  bfd_vma address,disassemble_info* info );
+
+/* defined in opcodes, but there's no header file with this prototype... */
+disassembler_ftype arcompact_get_disassembler (void *);
+
+/*  Standard register type for the ARC platform . 
+ *  It would be builtin_type_uint32 until 
+ *  we consider the DSP extensions 
+ */
+
+static struct type *
+arc_register_type (struct gdbarch *gdbarch, int regnum)
+{
+  return builtin_type_uint32;
+}
+
+
+void printFrameInfo(struct arc_unwind_cache * info)
+{
+#ifdef ARC_DEBUG
+  printf("-------------------\n");
+  printf("%lx \n",info );
+  printf("prev_sp = %lx \n",info->prev_sp);
+  printf("prev_pc = %lx \n",info->prev_pc);
+  printf("frame_base is %lx \n",info->frame_base);
+  printf("framesize is %lx \n",info->framesize);
+  printf("Blink offset %lx \n",info->blink_offset);
+  printf("sp_offset = %lx \n",info->sp_offset );
+  printf("fp_offset is %lx \n",info->fp_offset);
+  printf("is_leaf = %d, uses_fp=%d",info->is_leaf, info->uses_fp);
+#endif
+}
+
+/* Print the instruction state returned 
+   by the disassembler . Used for internal
+   debugging only 
+*/
+
+void printInsnState(struct arcDisState state)
+{
+#ifdef ARC_DEBUG
+  printf("---------------------------------\n");
+  printf("Instruction Length %d\n", state.instructionLen);
+  printf("Opcode [0x%x] : Cond [%x]\n", state._opcode, state._cond);
+  printf("Words 1 [%lx] : 2 [%lx]\n", state.words[0], state.words[1]);
+  printf("ea present [%x] : memload [%x]\n", state._ea_present, state._mem_load);
+  printf("Load length [%d]:\n", state._load_len);
+  printf("Address writeback [%d]\n", state._addrWriteBack);
+  printf("ea reg1 is [%x] offset [%x] \n", state.ea_reg1, state._offset);
+  printf("ea reg2 is [%x] \n", state.ea_reg2);
+  printf("operands buffer is %s \n", state.operandBuffer);
+  printf("SourceType is %d \n",state.sourceType);
+  printf("Flow is %d\n",state.flow);
+  printf("Branch is %d,'%c'\n",state.isBranch, state.isBranch);
+#endif
+}
+
+
+/* Scan the prologue and update the 
+ * corresponding frame cache for the frame unwinder for unwinding
+ * frames without debug info . In such a situation GDB attempts to 
+ * parse the prologue for this purpose . This currently would attempt
+ * to parse the prologue generated by our gcc 2.95 .(We should support 
+ * Metaware generated binaries at some suitable point of time )
+ * This function is called with the pc where gdb stopped , the next_frame 
+ * to be filled in (if need be?) and the existing cached info . 
+
+ * scan_prologue is called by our unwinder as well 
+ * as from skip_prologue in the case that it cannot detect 
+ * the end of the prologue. next_frame is set to NULL if we are called from 
+ * arc_skip_prologue in an attempt to discover the end of the prologue. In
+ * such a case we don't fill the frame info that is passed to us :-)
+
+ * Todos. 
+ * 1. Support 32 bit normal frames generated by GCC 2.95 .
+ * 2. Support 16 and 32 bit mixed frames generated by GCC 2.95
+ * 3. Support 32 bit normal variadic function frames by GCC 2.95
+ * 4. Support 32 bit normal frames from GCC 3.4.x with variadic args
+ * 5. Support 16 and 32 bit normal frames from GCC 3.4.x with variadic args
+ * 6. Support 16 and 32 bit mixed frames generated by GCC 3.4.x 
+ * 7. Support Metaware generated prologues .( The difference is 
+ * in the use of thunks to identify the saving and restoring of 
+ * callee saves :-) May have to do some hackery even in next_pc. 
+ * since the call is going to create its own set of problems 
+ * with our stack setup :-( 
+ * We attempt to use the disassembler interface from the opcodes
+ * library to do our disassembling .
+
+ * The usual 32 bit normal 
+ * gcc -O0 prologue looks like this. 
+
+ * Complete Prologue for all GCC frames (Cases #1 to #6 in Todos above)
+
+ * sub  sp, sp, limm    ; space for variadic arguments.
+ * st.a blink, [sp,-4]  ; push blink (if not a leaf function) 
+ * sub  sp, sp , limm   ; (optional space creation for callee saves )
+ * st   r13, [sp]    ; pushes of all callee saves.
+ * st   r14, [sp,4]  ; pushes of more callee saves.
+ * XXXX
+ * st.a fp , [sp,-4]  ; push fp (if fp has to be saved ) 
+ * mov  fp , sp ; Set the current frame up correctly 
+ * sub  sp , sp , #immediate ; Create space for local vars on the stack.
+ */
+
+
+
+/* Macros to be used with disassembling the prologue 
+ * and update the frame info.The *FI macros are to update
+ * the frame info and the ACT macros are to actually do the 
+ * action on a corresponding match. 
+ *
+*/
+#define CHECKOPDSTRING(targetcheck,searchstring)  \
+                               if(strstr(targetcheck,searchstring) == targetcheck)  \
+                                     {continue;}
+
+#define CHECKOPDSTRINGANDACT(targetcheck,searchstring,action)  \
+                               if(strstr(targetcheck,searchstring) == targetcheck)  \
+                                     {\
+                                       action;\
+				       continue;}
+
+
+/* The frame info changes by changing the decrementing
+   the sp_offset and setting the leaf function to be NIL; 
+   Also the offset of the blink register from the previous
+   value of sp is calculated. Finally this can be updated 
+   as 
+   info->blink_offset = info-> prev_sp + info->blink_offset ;
+   Also the addition below is coz the offsets are usually negative 
+*/
+
+#define PUSHBLINKACT do { \
+                          if(info) \
+                            {      \
+                              info->sp_offset += current_instr._offset; \
+                              info->blink_offset = info->sp_offset ; \
+                              info->is_leaf = 0;\
+                            }}while(0);
+                      
+
+#define ISPUSHBLINK(state) CHECKOPDSTRING(state.operandBuffer,"blink") 
+#define ISPUSHBLINKFI(state) CHECKOPDSTRINGANDACT(state.operandBuffer,"blink",PUSHBLINKACT) 
+
+
+#define PUSHFPACT    do { \
+                          if(info)  \
+                            {       \
+                               info->sp_offset += current_instr._offset ; \
+                               info->fp_offset = -info->sp_offset; \
+                            }}while(0);
+                             
+#define ISPUSHFP(state)    CHECKOPDSTRING(state.operandBuffer,"fp")
+#define ISPUSHFPFI(state)    CHECKOPDSTRINGANDACT(state.operandBuffer,"fp",PUSHFPACT)
+#define ISINSTRUCTION(insnname,searchstring)    !strcmp(insnname,searchstring)
+
+
+
+#define UPDATEFPACT    do {\
+                             if(info) {\
+					 info->uses_fp = 1;\
+			       }}while(0);
+
+
+
+#define ISUPDATEFPFI(state)  \
+ if(ISINSTRUCTION(state.instrBuffer,"mov")) \
+{ \
+  CHECKOPDSTRINGANDACT(state.operandBuffer,"fp,sp",UPDATEFPACT); \
+}
+
+
+
+#define ISUPDATEFP(state)  \
+ if(ISINSTRUCTION(state.instrBuffer,"mov")) \
+{ \
+  CHECKOPDSTRING(state.operandBuffer,"fp,sp") \
+}
+
+
+
+#define ISSUBSP(state)   \
+if(ISINSTRUCTION(state.instrBuffer,"sub"))\
+{ \
+  CHECKOPDSTRING(state.operandBuffer,"sp,sp") \
+}
+
+#define UPDATESTACKSPACE(state) do { \
+                                 if(info){ \
+/* Eat up sp,sp */  \
+                                      int tmp = atoi(state.operandBuffer + 6); \
+                                      info->sp_offset -= tmp; \
+                                        }}while(0);
+
+
+#define ISSUBSPFI(state)   \
+if(ISINSTRUCTION(state.instrBuffer,"sub") \
+   || ISINSTRUCTION(state.instrBuffer,"sub_s"))\
+{ \
+  CHECKOPDSTRINGANDACT(state.operandBuffer,"sp,sp",UPDATESTACKSPACE(state)) \
+}
+
+/*Function to scan the prologue of a A4 binary
+
+ARCtangent-A4 Prolog
+ The stack back-trace data structure is a 16-byte structure which is
+  used to save the return register (blink, 4 bytes), the frame pointer
+  register (fp, 4-bytes) and 8-bytes is reserved.
+ 
+ The compiler-generated prolog code does the following:
+  --> Allocates space for register arguments in case of variadic function
+        (functions with variable argument lists)
+  --> Saves the return address register (blink)
+  --> Saves the caller's frame pointer (fp), if required, and
+        sets the new frame pointer to this location
+  --> Decrements the stack pointer to account for the new stack frame
+  --> Saves required non-volatile general-purpose registers into the
+        register save area
+  --> Stores the arguments above the stack back-trace data structure
+
+
+  Demo Patterns:
+     st         blink,[sp,4] ; Saves the return address
+     st         fp,[sp] ; Saves the callers frame pointer
+     mov        fp,sp   ; Saves 
+     sub        sp,sp,24
+
+0xa  538e7e20     sub        sp,sp,32     ; Space for variadic args
+0x2  100e3e04     st         blink,[sp,4] ; Saves the return address
+0x2  100e3600     st         fp,[sp]      ; Saves the callers frame pointer
+0xc  636e3800     mov        fp,sp        ; Resets stack pointer to fp
+0xa  538e7e18     sub        sp,sp,24     ; Decrements sp to add for new
+                                          ; stack frame
+0x2  100d81fc     st         r0,[fp,-4]   ; Stores the args 
+0x2  100d83f8     st         r1,[fp,-8]   ; ----"-------
+     ...
+
+*/
+
+/* FIXMEA:
+called from arc_skip_prologue as
+     skip_pc = arc_scan_prologue(pc,NULL,NULL);
+        Then it is supposed to return the first valid pc
+	after the prologue
+
+   Prologue analysis does the rest...  
+   Currently our scan prologue does not
+    support getting input for the frame unwinder
+
+  
+  pc = frame_func_unwind(next_frame);
+  arc_scan_prologue (pc, next_frame, info);
+
+*/
+
+#ifdef ARC4_JTAG
+static CORE_ADDR 
+a4_scan_prologue (CORE_ADDR pc, struct frame_info *next_frame,
+		    struct arc_unwind_cache *info)
+{
+  /* End of prologue */
+  CORE_ADDR prologue_ends_pc = pc;
+  int i = 0;
+  struct arcDisState current_instr, instr_in_delay;
+  int insn_length;
+
+  /* Initializations to use the opcodes 
+   * library .
+   */
+  
+  struct disassemble_info di;
+
+  unsigned int saved_regs_mask = 0;
+  /* An arbitrary length on the length of the 
+     prologue. If next_frame is NULL this means that there was 
+     no debug info and we are called from arc_skip_prologue
+  */
+  /*FIXMEANOW: pc + 64 is probably the max size of the prologue*/
+  CORE_ADDR final_pc = (next_frame)?frame_pc_unwind(next_frame):pc+(16*4);
+  
+  
+
+
+  if (info)
+    {
+      /* All functions start as leaf functions until 
+	 we identify push blink 
+      */
+      info->is_leaf = 1;
+    }
+  
+
+
+  /* Initializations to use the opcodes 
+   * library .
+   */
+  init_disassemble_info(&di, gdb_stderr, fprintf_unfiltered);
+  di.arch = gdbarch_bfd_arch_info(current_gdbarch)->arch;
+  di.mach = gdbarch_bfd_arch_info(current_gdbarch)->mach;
+  di.endian = gdbarch_byte_order(current_gdbarch);
+  di.read_memory_func = target_read_memory;
+  
+  
+  for (prologue_ends_pc= pc;
+       prologue_ends_pc< final_pc; 
+       prologue_ends_pc += current_instr.instructionLen ) /*FIXMEA: This could as
+							    well be 4 */
+    {
+      current_instr = a4AnalyzeInstr(prologue_ends_pc, &di);
+      printInsnState(current_instr);
+#ifdef ARC_DEBUG
+      printf("Prologue PC: %d\n", prologue_ends_pc);
+      printf("Final PC: %d\n", final_pc);
+#endif
+
+
+      if (current_instr._opcode == 0x2)
+	{
+	  // Saves the return address    st blink,[sp,4]   0x100e3e04
+	  // Save the callers fp         st fp,[sp]        0x100e3600
+	  // Saves the args              st rX,[fp, #imm]  0x100d8xxx
+	  if (current_instr.ea_reg1 == 28)
+	    {
+	      if( strstr(current_instr.operandBuffer,"blink") == current_instr.operandBuffer)
+		{
+                  if(info)
+		    {      
+		      info->sp_offset += current_instr._offset;
+ //		      info->blink_offset = info->sp_offset ;
+		      info->blink_offset = current_instr._offset;
+		      info->is_leaf = 0;
+
+#ifdef ARC_DEBUG
+		      printf("Blink instruction:\n");
+		      printFrameInfo(info);
+#endif
+		    }
+		  continue;
+		}
+	      else
+		if(strstr(current_instr.operandBuffer,"fp") == current_instr.operandBuffer)
+		{
+		  if(info)
+		    {
+/* 		      info->sp_offset += current_instr._offset ; */
+/* 		      info->fp_offset = info->sp_offset; */
+		      info->fp_offset = 0;
+		    }
+		  continue;
+		}
+	    }
+	  else if (current_instr.ea_reg1 == 27)
+	    {
+	      /* Saving of arguments onto the stack using the
+		 frame pointer (r27).  */
+	      if(info)
+		{
+		  // Save regs offsets 
+		}
+#ifdef ARC_DEBUG	      
+	      printf(" Saving registers onto stack\n%s\n",current_instr.operandBuffer);
+#endif	      
+	      continue;
+	    }
+	  //	  ISPUSHBLINK(current_instr);
+	}
+      else if (current_instr._opcode == 0xc)
+	{
+	  // Resets stack pointer to fp
+	  // 0x636e3800
+	  //	  636e3800     mov        fp,sp
+	  if (current_instr.words[0] == 0x636e3800)
+	    {
+	      if (info)
+		{
+		  info->uses_fp = 1;
+		}
+	      continue;
+	    }
+	}
+      else if (current_instr._opcode == 0xa)
+	{
+	  // Decrements stackpointer to add for new stack frame
+	  // 0x538e7e18   sub        sp,sp,#imm
+	  // 538e7e20     sub        sp,sp,32
+	  if( current_instr.words[0] == 0x538e7e20)
+	    {
+	      //sub sp,sp, 32  //// variadic
+	      if (info)
+		{
+		  int tmp = atoi(current_instr.operandBuffer + 6); 
+		  info->sp_offset -= tmp; 
+		}
+	      continue;
+	    }
+	  else if((current_instr.words[0] & 0xffffff00) == 0x538e7e00)
+	    {
+	      // sub sp,sp,xx
+	      if(info)
+		{
+		  int tmp = atoi(current_instr.operandBuffer + 6); 
+		  info->sp_offset -= tmp; 
+		}
+	      continue;
+	    }
+	}
+
+      /* Found a instruction that is not in
+         the prologue*/
+#ifdef ARC_DEBUG
+      printf("End of Prologue reached \n");
+#endif
+      break;
+    }
+
+  /* Means we were called from skip_prologue */
+  if((next_frame == NULL)&& (info == NULL))
+    {
+      return prologue_ends_pc;
+    }
+
+
+  info->framesize = -info->sp_offset;
+  /* Compute the previous frame's stack pointer (which is also the
+     frame's ID's stack address), and this frame's base pointer.  */
+  if(info->uses_fp)
+    {
+
+      ULONGEST this_base;
+      /* The SP was moved to the FP.  This indicates that a new frame
+         was created.  Get THIS frame's FP value by unwinding it from
+         the next frame.  */
+      frame_unwind_unsigned_register(next_frame, ARC_FP_REGNUM,
+				     &this_base);
+      info->frame_base = this_base;
+      info->saved_regs[ARC_FP_REGNUM].addr = info->frame_base;
+
+      /* The previous sp is the current frame base + the offset of the
+	 fp in the current frame */
+      info->prev_sp = info->frame_base + info->fp_offset;
+      for(i = 13; i < 26 ; i++ )
+	{
+	  if(saved_regs_mask & (1 << i))
+	    info->saved_regs[i].addr += info->frame_base ;
+	}
+      
+      printFrameInfo(info);
+   
+    }
+  else
+    {
+      ULONGEST this_base;
+      /* Assume that the FP is this frame's SP but with that pushed
+         stack space added back.  */
+      frame_unwind_unsigned_register (next_frame, ARC_SP_REGNUM, &this_base);
+      info->frame_base = this_base;
+
+      /* In such a case it would be the previous SP + the size of the current frame */
+      info->prev_sp = info->frame_base + info->framesize;
+     
+    }
+  
+
+  if(!info->is_leaf)
+    {
+
+      /* Usually blink is saved before the callee save registers and
+	 below the space created for variadic arguments  . We maintain
+	 info->blink_offset as negative when we stored it initially
+       */
+      info->saved_regs[ARC_BLINK_REGNUM].addr = info->prev_sp + info->blink_offset;
+#ifdef ARC_DEBUG
+      printf("blink offset is [%x] \n",info->blink_offset);
+#endif
+    }
+      
+    /* The PC is found in blink (the actual register or located on the stack).  */
+  // FIXMEA:
+  //info->saved_regs[ARC_STATUS_REGNUM] |= (info->saved_regs[ARC_BLINK_REGNUM] & 0xffffff)>>2;
+  info->saved_regs[ARC_STATUS_REGNUM] = info->saved_regs[ARC_BLINK_REGNUM];
+  return prologue_ends_pc;
+
+}
+#endif
+
+static CORE_ADDR 
+arc_scan_prologue (CORE_ADDR pc, struct frame_info *next_frame,
+		    struct arc_unwind_cache *info)
+{
+#ifdef ARC4_JTAG
+#ifdef ARC_DEBUG
+  printf("\narc_scan_prologue called\n");
+#endif
+#else
+  /* End of prologue */
+  CORE_ADDR prologue_ends_pc = pc;
+  int i = 0;
+  struct arcDisState current_instr, instr_in_delay;
+  int insn_length;
+
+  /* Initializations to use the opcodes 
+   * library .
+   */
+  
+  struct disassemble_info di;
+
+  unsigned int saved_regs_mask = 0;
+  /* An arbitrary length on the length of the 
+     prologue. If next_frame is NULL this means that there was 
+     no debug info and we are called from arc_skip_prologue
+  */
+  CORE_ADDR final_pc = (next_frame)?frame_pc_unwind(next_frame):pc+64; 
+  
+  
+
+
+  if (info)
+    {
+      /* All functions start as leaf functions until 
+	 we identify push blink 
+      */
+      info->is_leaf = 1;
+      
+    }
+  
+
+
+  /* Initializations to use the opcodes 
+   * library .
+   */
+  init_disassemble_info(&di, gdb_stderr, fprintf_unfiltered);
+  di.arch = gdbarch_bfd_arch_info(current_gdbarch)->arch;
+  di.mach = gdbarch_bfd_arch_info(current_gdbarch)->mach;
+  di.endian = gdbarch_byte_order(current_gdbarch);
+  di.read_memory_func = target_read_memory;
+  
+  
+  for(prologue_ends_pc= pc; prologue_ends_pc< final_pc; 
+      prologue_ends_pc += current_instr.instructionLen )
+    {
+      current_instr = arcAnalyzeInstr(prologue_ends_pc, &di);
+      printInsnState(current_instr);
+        /* Might be a push or a pop */
+      if(current_instr._opcode == 0x3)
+	{
+	  if(current_instr._addrWriteBack)
+	    {
+	      /* This is a st.a  */
+	      if((current_instr.ea_reg1 == 28) &&
+		 (current_instr._offset == -4))
+		{
+		  
+		  /* This is a push something at sp */
+		  /* Is it a push of the blink */
+		  ISPUSHBLINKFI(current_instr);
+		  /* Is it a push for fp */
+		  ISPUSHFPFI(current_instr);
+		  
+		}
+	      
+	    } 
+	  else
+	    {
+	      /* Is this a store of some register onto 
+		 the stack using the stack pointer.*/
+	      if(current_instr.ea_reg1 == 28)
+		{
+		  if(current_instr.sourceType == ARC_REGISTER )
+		    {
+		      /* R13..R26 are the callee saved registers.  [R27 (fp)
+			 is also a callee saved register, but it's usually
+			 pushed using st.a and so handled in the st.a case
+			 above.]  */
+		      if((current_instr.source_operand.registerNum > 12 
+			  && current_instr.source_operand.registerNum <= 26))
+			{
+			  if(info)
+			    {
+			      printFrameInfo(info);
+			      /* Save up the offsets for the correct instruction */
+			      info->saved_regs[current_instr.source_operand.registerNum].addr
+				= - info->sp_offset - current_instr._offset;
+			      saved_regs_mask |= (1 << current_instr.source_operand.registerNum);
+			    }
+			  continue;
+			}
+		      
+		    }		  
+		  
+		}
+	      /* Is this the store of some register on the 
+		 stack using the frame pointer. We check 
+		 for argument registers getting saved and
+		 restored.
+	      */
+	      if(current_instr.ea_reg1 == 27)
+		if((current_instr.source_operand.registerNum <= 7))
+		  {
+		    /* Saving argument registers.Don't save them in saved_regs, just skip. 
+		     */
+		    continue;
+		  }
+		
+	      
+	      
+	    }
+	}
+
+      if(current_instr._opcode == 0x4)
+	{
+	  /* A major opcode 0x4 instruction */
+	  /* We are usually interested in a 
+	     mov or a sub */
+	  ISUPDATEFPFI(current_instr);
+	  ISSUBSPFI(current_instr);
+	}
+      if(current_instr._opcode == 0x18)
+	{
+	  /* sub_s sp,sp,constant */
+	  ISSUBSPFI(current_instr);
+	  /* push_s blink */
+	  if(strcmp(current_instr.instrBuffer,"push_s") == 0)
+	    {
+	      if(strcmp(current_instr.operandBuffer,"blink") == 0)
+		{
+		  if(info) 
+		    {   
+		      info->sp_offset += 4; 
+		      info->blink_offset = info->sp_offset ; 
+		      info->is_leaf = 0;
+		    }
+		  continue;
+		}
+	    }
+	}
+
+      /* If we reach here . we have 
+       * reached end of the prologue
+       */
+      break;
+      
+    }
+  
+  /* Means we were called from skip_prologue */
+  if((next_frame == NULL)&& (info == NULL))
+    {
+      return prologue_ends_pc;
+    }
+  
+  
+  info->framesize = -info->sp_offset;
+  /* Compute the previous frame's stack pointer (which is also the
+     frame's ID's stack address), and this frame's base pointer.  */
+  if(info->uses_fp)
+    {
+
+      ULONGEST this_base;
+      /* The SP was moved to the FP.  This indicates that a new frame
+         was created.  Get THIS frame's FP value by unwinding it from
+         the next frame.  */
+      frame_unwind_unsigned_register(next_frame, ARC_FP_REGNUM,
+				     &this_base);
+      info->frame_base = this_base;
+      info->saved_regs[ARC_FP_REGNUM].addr = info->frame_base;
+
+      /* The previous sp is the current frame base + the offset of the 
+	 fp in the current frame */
+      info->prev_sp = info->frame_base + info->fp_offset;
+      for(i = 13; i < 26 ; i++ )
+	{
+	  if(saved_regs_mask & (1 << i))
+	    info->saved_regs[i].addr += info->frame_base ;
+	}
+      
+      printFrameInfo(info);
+   
+    }
+  else
+    {
+      ULONGEST this_base;      
+      /* Assume that the FP is this frame's SP but with that pushed
+         stack space added back.  */
+      frame_unwind_unsigned_register (next_frame, ARC_SP_REGNUM, &this_base);
+      info->frame_base = this_base;
+
+      /* In such a case it would be the previous SP + the size of the current frame */
+      info->prev_sp = info->frame_base + info->framesize;
+     
+    }
+  
+
+  if(!info->is_leaf)
+    {
+
+      /* Usually blink is saved before the callee save registers and 
+	 below the space created for variadic arguments  . We maintain
+	 info->blink_offset as negative when we stored it initially
+       */
+      info->saved_regs[ARC_BLINK_REGNUM].addr = info->prev_sp + info->blink_offset;
+#ifdef ARC_DEBUG
+      printf("blink offset is [%x] \n",info->blink_offset);
+#endif
+    }
+      
+    /* The PC is found in blink (the actual register or located on the stack).  */
+  info->saved_regs[PC_REGNUM] = info->saved_regs[ARC_BLINK_REGNUM];
+  /*info->saved_regs[ARC_PC_REGNUM] = info->saved_regs[ARC_BLINK_REGNUM];*/
+  return prologue_ends_pc;
+#endif
+}
+
+
+/* Skip the prologue for the function at pc. 
+ * This is done by checking from the line  
+ * information picked up during dwarf reading
+ * FIXME: more stuff to be added when we 
+ * parse the prologue.
+ */
+
+static CORE_ADDR
+arc_skip_prologue (CORE_ADDR pc)
+{
+  //#ifdef ARC4_JTAG
+#ifdef ARC_DEBUG
+  printf ("\narc_skip_prologue called\n");
+#endif
+  // FIXMEA: cleanup #else
+  unsigned long inst;
+  unsigned long addend = 4;
+  CORE_ADDR skip_pc = pc;
+  CORE_ADDR func_addr, func_end = 0;
+  char *func_name;
+  struct symtab_and_line sal;
+
+  /* If we're in a dummy frame, don't even try to skip the prologue.  */
+  if (deprecated_pc_in_call_dummy (pc))
+    return pc;
+
+  /* See what the symbol table says.  */
+
+  if (find_pc_partial_function (pc, &func_name, &func_addr, &func_end))
+    {
+      struct symbol *sym;
+
+      /* Found a function.  */
+      sym = lookup_symbol (func_name, NULL, VAR_DOMAIN, NULL, NULL);
+      if (sym && SYMBOL_LANGUAGE (sym) != language_asm)
+        {
+	  /* Don't use this trick for assembly source files.  */
+	  sal = find_pc_line (func_addr, 0);
+	  if ((sal.line != 0) && (sal.end < func_end))
+	    return sal.end;
+        }
+    }
+  
+#ifdef ARC4_JTAG 
+  skip_pc = a4_scan_prologue(pc, NULL, NULL);
+#else
+  skip_pc = arc_scan_prologue(pc,NULL,NULL);
+#endif  
+  return skip_pc;		/* End of prologue */
+
+  //#endif
+}
+
+/* Breakpoint from pc. Return whatever is in the tdep 
+ * structure. The tdep structure is changed depending 
+ * on the correct target / architecture chosen. 
+ */
+
+static const unsigned char *
+arc_breakpoint_from_pc (CORE_ADDR *pcptr, int *lenptr)
+{
+
+  struct gdbarch_tdep *tdep = gdbarch_tdep (current_gdbarch);
+  *lenptr = tdep->arc_breakpoint_size;
+  return tdep->arc_breakpoint_insn;
+}
+
+
+/* Assuming NEXT_FRAME->prev is a dummy, return the frame ID of that
+   dummy frame.  The frame ID's base needs to match the TOS value
+   saved by save_dummy_frame_tos(), and the PC match the dummy frame's
+   breakpoint. */
+
+static struct frame_id
+arc_unwind_dummy_id (struct gdbarch *gdbarch, struct frame_info *next_frame)
+{
+  return frame_id_build (arc_unwind_sp (gdbarch, next_frame),
+			 frame_pc_unwind (next_frame));
+}
+
+/* The workhorse : frame_unwind_cache for the ARC700 platform .
+ */
+static struct arc_unwind_cache *
+arc_frame_unwind_cache  (struct frame_info *next_frame,
+			 void **this_prologue_cache)
+{
+  //#ifdef ARC4_JTAG
+#ifdef ARC_DEBUG
+  printf ("\narc_frame_unwind_cache called\n ");
+#endif
+  //#else
+  CORE_ADDR pc;
+  struct arc_unwind_cache *info;
+  int i;
+
+ 
+  if ((*this_prologue_cache))
+    return (*this_prologue_cache);
+  
+  info = FRAME_OBSTACK_ZALLOC (struct arc_unwind_cache);
+  (*this_prologue_cache) = info;
+  info->saved_regs = trad_frame_alloc_saved_regs (next_frame);
+
+  /* Zero all fields.  */
+  info->blink_offset = 0;
+  info->prev_pc = 0;
+  info->prev_sp = 0;
+  info->frame_base = 0;
+  info->framesize = 0;
+  info->sp_offset = 0;
+  info->fp_offset = 0;
+  info->prev_pc = 0;
+  info->is_leaf = 0;
+  info->uses_fp = 0;
+
+  /* Prologue analysis does the rest...  */
+  /* Currently our scan prologue does not
+   * support getting input for the frame unwinder
+   */ 
+  
+  pc = frame_func_unwind(next_frame);
+#ifdef ARC4_JTAG
+  a4_scan_prologue (pc, next_frame, info);
+#else
+  arc_scan_prologue (pc, next_frame, info);
+#endif
+
+  return info;
+  //#endif
+}
+
+
+
+/*
+ * Construct frame id for the normal frame 
+ */
+
+static void
+arc_frame_this_id (struct frame_info *next_frame,
+		    void **this_prologue_cache,
+		    struct frame_id *this_id)
+{
+  // FIXMEA: cleanup #ifdef ARC4_JTAG
+#ifdef ARC_DEBUG
+  printf ("\n arc_frame_this_id called()\n  ");
+#endif
+  //#else
+
+  struct arc_unwind_cache *info
+    = arc_frame_unwind_cache (next_frame, this_prologue_cache);
+  CORE_ADDR base;
+  CORE_ADDR func;
+  struct frame_id id;
+
+  /* The FUNC is easy.  */
+  func = frame_func_unwind (next_frame);
+
+ /* This is meant to halt the backtrace at the entry point (_start).  */
+  if (func <= gdbarch_tdep (current_gdbarch)->lowest_pc)
+    return;
+  
+  /* Hopefully the prologue analysis either correctly determined the
+     frame's base (which is the SP from the previous frame), or set
+     that base to "NULL".  */
+  base = info->prev_sp;
+  if (base == 0)
+    return;
+
+  id = frame_id_build (base, func);
+
+  (*this_id) = id;
+  //#endif
+
+}
+
+
+/* 
+ * Unwind and obtain the register information 
+ */
+static void
+arc_frame_prev_register (struct frame_info *next_frame,
+			  void **this_prologue_cache,
+			  int regnum, int *optimizedp,
+			  enum lval_type *lvalp, CORE_ADDR *addrp,
+			  int *realnump, void *bufferp)
+{
+  // FIXMEA:
+  //#ifdef ARC4_JTAG
+#ifdef ARC_DEBUG
+  printf ("\n arc_frame_prev_register() called for regnum %d\n ",regnum );
+#endif
+  //#else
+  struct arc_unwind_cache *info
+    = arc_frame_unwind_cache (next_frame, this_prologue_cache);
+
+
+  /* If we are asked to unwind the PC, then we need to return blink
+     instead.  The saved value of PC points into this frame's
+     prologue, not the next frame's resume location.  */
+#ifdef ARC4_JTAG
+  if (regnum == ARC_STATUS_REGNUM)
+#else
+  if (regnum == PC_REGNUM)
+#endif
+    regnum = ARC_BLINK_REGNUM;
+
+  /* SP is generally not saved to the stack, but this frame is
+     identified by NEXT_FRAME's stack pointer at the time of the call.
+     The value was already reconstructed into PREV_SP.  */
+  if (regnum == ARC_SP_REGNUM)
+    {
+      *lvalp = not_lval;
+      if (bufferp)
+	store_unsigned_integer (bufferp, 4, info->prev_sp);
+      return;
+    }
+
+
+  trad_frame_get_prev_register (next_frame, info->saved_regs, regnum,
+				optimizedp, lvalp, addrp, realnump, bufferp);
+
+
+#ifdef ARC_DEBUG
+  printf("-*-*-*\n Regnum =%d, realnump=%d,%d \n",regnum, (char *)(bufferp), *((char*)bufferp));
+#endif
+  //#endif
+}
+
+
+
+
+static const struct frame_unwind arc_frame_unwind = {
+  NORMAL_FRAME,
+  arc_frame_this_id,
+  arc_frame_prev_register
+};
+
+const struct frame_unwind *
+arc_frame_sniffer (struct frame_info *next_frame)
+{
+  return &arc_frame_unwind;
+}
+
+
+/* read-only registers */
+static int
+arc_cannot_store_register (int regno)
+{
+  if(
+#ifndef ARC4_JTAG
+     regno == ARC_EFA_REGNUM ||
+     regno == ARC_ERET_REGNUM ||
+     regno == ARC_STATUS32_L1_REGNUM ||
+     regno == ARC_STATUS32_L2_REGNUM ||
+     regno == ARC_ERSTATUS_REGNUM ||
+#endif
+     regno == ARC_ILINK1_REGNUM ||
+     regno == ARC_ILINK2_REGNUM 
+     )
+    {
+      /* No warning should be printed.  arc_cannot_store_register being
+	 called does not imply that someone is actually writing to regnum.  */
+
+      /*warning("writing to read-only register: %s\n", arc_register_name(regno));*/
+      return 1;
+    }
+  return 0;
+}
+
+/* Returns true if the insn at PC is a branch. *fall_thru is the address of
+   the next insn.  *target is the branch target. */
+static int
+arc_next_pc(CORE_ADDR pc, CORE_ADDR *fall_thru, CORE_ADDR *target)
+{
+#ifdef ARC4_JTAG
+#ifdef ARC_DEBUG
+  printf ("\narc_next_pc called\n");
+#endif
+#else
+  struct arcDisState instr, instr_d;
+  int insn_length;
+  struct disassemble_info di;
+  int two_targets = 0;
+  
+  init_disassemble_info(&di, NULL, NULL);
+  di.arch = gdbarch_bfd_arch_info(current_gdbarch)->arch;
+  di.mach = gdbarch_bfd_arch_info(current_gdbarch)->mach;
+  di.endian = gdbarch_byte_order(current_gdbarch);
+  di.read_memory_func = target_read_memory;
+  
+  instr = arcAnalyzeInstr(pc, &di);
+
+  *fall_thru = pc + instr.instructionLen;
+
+#ifdef ARC_DEBUG
+  printf("--- arc_next_pc(%x) = %x, isBranch = %d, tcnt = %d [%x], flow = %s (%d), "
+	 "reg for indirect jump = %d, nullifyMode = %s\n",
+	 pc, *fall_thru, instr.isBranch, instr.tcnt, instr.targets[0],
+	 (instr.flow == direct_jump || instr.flow == direct_call) ? "direct" : "indirect",
+	 instr.flow,
+	 instr.register_for_indirect_jump,
+	 (instr.nullifyMode == BR_exec_always ? "delay slot" : "no delay"));
+#endif
+
+  if(instr.isBranch)
+    {
+      two_targets = 1;
+      
+      if(instr.flow == direct_jump || instr.flow == direct_call)
+	*target = instr.targets[0];
+      else
+	regcache_cooked_read(current_regcache,
+			     arc_binutils_reg_to_regnum(instr.register_for_indirect_jump),
+			     target);
+    }
+
+  /* for instructions with delay slots, the fall thru is not the instruction
+     immediately after the branch instruction, but the one after that */
+  if(instr.isBranch && instr.nullifyMode == BR_exec_always)
+    {
+      instr_d = arcAnalyzeInstr(*fall_thru, &di);
+      *fall_thru += instr_d.instructionLen;
+    }
+
+  /* zero-overhead loops:
+        if(status32[L] == 0 && next_pc == lp_end && lp_count > 1)
+          next_pc = lp_start;
+  */
+  {
+    unsigned int lp_end, lp_start, lp_count, status32;
+
+    regcache_cooked_read(current_regcache, ARC_LP_START_REGNUM, &lp_start);
+    regcache_cooked_read(current_regcache, ARC_LP_END_REGNUM, &lp_end);
+    regcache_cooked_read(current_regcache, ARC_LP_COUNT_REGNUM, &lp_count);
+#ifndef ARC4_JTAG    
+    regcache_cooked_read(current_regcache, ARC_STATUS32_REGNUM, &status32);
+#endif
+
+    if( !(status32 & ARC_STATUS32_L) && *fall_thru == lp_end && lp_count > 1)
+      {
+	two_targets = 1;
+	*target = lp_start;
+      }
+  }
+  
+  return two_targets;
+#endif //
+}
+
+/* this is called with insert_breakpoints_p = 1 before single-stepping and
+   with insert_breakpoints_p = 0 after the step */
+void
+arc_software_single_step(enum target_signal ignore, int insert_breakpoints_p)
+{
+#ifdef ARC4_JTAG
+#ifdef ARC_DEBUG
+  printf ("\narc_software_single_step called\n" );
+#endif
+#else
+  typedef char binsn_quantum[BREAKPOINT_MAX];
+
+  static CORE_ADDR fall_thru, branch_target;
+  static binsn_quantum break_mem[2];
+  static char two_breakpoints;
+  CORE_ADDR pc;
+
+  {
+#ifdef ARC_DEBUG
+    unsigned int efa, ret;
+    regcache_cooked_read(current_regcache, ARC_EFA_REGNUM, &efa);
+    //    regcache_cooked_read(current_regcache, ARC_RET_REGNUM, &ret);
+    
+    printf("--- arc_software_single_step, efa = %x, ret = %x, (%s)\n", efa, ret,
+	   (insert_breakpoints_p ? "add" : "remove"));
+#endif
+  }
+  
+  if (insert_breakpoints_p)
+    {
+      pc = read_pc ();
+      two_breakpoints = arc_next_pc (pc, &fall_thru, &branch_target);
+
+      if (two_breakpoints && branch_target == pc) 
+	{
+	  warning ("Cannot single-step branch-to-self or single instruction zero overhead loop,\n"
+		   "    Stepping across it.");
+	  /* Don't insert/remove the branch-target breakpoint.  */
+	  two_breakpoints = 0;
+	}
+      
+      target_insert_breakpoint (fall_thru, break_mem[0]);
+      if(two_breakpoints)
+	target_insert_breakpoint (branch_target, break_mem[1]);
+    }
+  else
+    {
+      target_remove_breakpoint (fall_thru, break_mem[0]);
+      if(two_breakpoints)
+	target_remove_breakpoint (branch_target, break_mem[1]);
+    }
+#endif
+}
+
+/*
+ * mapping from binutils/gcc register number to
+ * GDB register number ("regnum")
+ */
+static int
+arc_binutils_reg_to_regnum (int reg)
+{
+#ifdef ARC4_JTAG
+    if (reg >= 0 && reg <= 26)
+    return reg;
+  else if (reg == 27)			     /* fp */
+    return ARC_FP_REGNUM;
+  else if (reg == 28)			     /* sp */
+    return ARC_SP_REGNUM;
+  else if (reg == 29)			     /* ilink1 */
+    return ARC_ILINK1_REGNUM;
+  else if (reg == 30)			     /* ilink2 */
+    return ARC_ILINK2_REGNUM;
+  else if (reg == 31)			     /* blink */
+    return ARC_BLINK_REGNUM;
+
+#else
+  /* from gcc/config/arc/arc.h */
+
+  if (reg >= 0 && reg <= 26)
+    return reg;
+  else if (reg == 27)			     /* fp */
+    return ARC_FP_REGNUM;
+  else if (reg == 28)			     /* sp */
+    return ARC_SP_REGNUM;
+  else if (reg == 29)			     /* ilink1 */
+    return ARC_ILINK1_REGNUM;
+  else if (reg == 30)			     /* ilink2 */
+    return ARC_ILINK2_REGNUM;
+  else if (reg == 31)			     /* blink */
+    return ARC_BLINK_REGNUM;
+  else if (reg >= 32 && reg <= 59)	     /* reserved */
+    ;
+  else if (reg == 60)			     /* lp_count */
+    return ARC_LP_COUNT_REGNUM;
+  else if (reg == 61)			     /* reserved */
+    ;
+  else if (reg == 62)			     /* no such register */
+    ;
+/*   else if (reg == 63)			     /\* PCL *\/ */
+/*     return ARC_RET_REGNUM; */
+
+#endif
+  warning ("Unmapped register #%d encountered\n", reg);
+  return -1; 
+}
+
+
+static void
+arc_add_reggroups (struct gdbarch *gdbarch)
+{
+  reggroup_add (gdbarch, general_reggroup);
+  reggroup_add (gdbarch, all_reggroup);
+  reggroup_add (gdbarch, system_reggroup);
+}
+
+int
+arc_register_reggroup_p (struct gdbarch *gdbarch, int regnum,
+			  struct reggroup *group)
+{
+  struct gdbarch_tdep *tdep = gdbarch_tdep (current_gdbarch);
+  int tdep_answer;
+  
+  tdep_answer = tdep->register_reggroup_p (regnum, group);
+  if(tdep_answer != -1)
+    return tdep_answer;
+  
+  if (group == all_reggroup)
+    return 1;
+  else if (group == save_reggroup || group == restore_reggroup)
+    {
+      /* don't save/restore read-only registers. */
+      return (!arc_cannot_store_register(regnum)); 
+    }
+  else if (group == general_reggroup)
+    {
+#ifndef ARC4_JTAG
+      if (regnum == ARC_STATUS32_REGNUM)
+	return 0;
+#endif
+      return 1;
+    }
+  else
+    {
+      internal_error(__FILE__, __LINE__, "bad register group");
+    }
+}
+
+
+
+static void
+arc_dwarf2_frame_init_reg (struct gdbarch *gdbarch, int regnum,
+                            struct dwarf2_frame_state_reg *reg)
+{
+#ifdef ARC4_JTAG
+  // FIXMEA: Clean up.  if ( debug_arc_jtag_target_message)
+#ifdef ARC_DEBUG  
+  printf ("\n arc_dwarf2_frame_init_reg called.\n Regno no:%d,0x%x\n",regnum,regnum);
+#endif
+    /* The return address column.  */
+  if (regnum == ARC_STATUS_REGNUM)
+    reg->how = DWARF2_FRAME_REG_RA;
+  
+  /* The call frame address.  */
+  if (regnum == ARC_SP_REGNUM)
+    reg->how = DWARF2_FRAME_REG_CFA;
+
+#else
+  /* The return address column.  */
+  if (regnum == PC_REGNUM)
+    reg->how = DWARF2_FRAME_REG_RA;
+  
+  /* The call frame address.  */
+  if (regnum == ARC_SP_REGNUM)
+    reg->how = DWARF2_FRAME_REG_CFA;
+#endif
+}
+
+static CORE_ADDR
+arc_unwind_pc (struct gdbarch *gdbarch, struct frame_info *next_frame)
+{
+  ULONGEST pc;
+#ifdef ARC4_JTAG
+  frame_unwind_unsigned_register (next_frame, ARC_STATUS_REGNUM, &pc);
+  pc = pc & 0x00ffffff;
+  pc = pc << 2;
+#else
+  frame_unwind_unsigned_register (next_frame, PC_REGNUM, &pc);
+#endif
+  return pc;
+}
+
+static CORE_ADDR
+arc_unwind_sp (struct gdbarch *gdbarch, struct frame_info *next_frame)
+{
+  ULONGEST sp;
+  frame_unwind_unsigned_register (next_frame, SP_REGNUM, &sp);
+  return sp;
+}
+
+
+
+static void
+arc_extract_return_value (struct type *type, struct regcache *regcache,
+			  void *valbuf)
+{
+  //#ifdef ARC4_JTAG
+#ifdef ARC_DEBUG
+  printf ("\narc_extract_return_value called\n");
+#endif
+  //#else
+  ULONGEST val;
+  int len = TYPE_LENGTH (type);
+  
+  if (len <= 4)
+    {
+      /* Get the return value from R0.  */
+      regcache_cooked_read_unsigned (regcache, ARC_RETURN1_REGNUM, &val);
+      store_unsigned_integer (valbuf, len, val);
+    }
+  else if (len <= 8)
+    {
+      /* Get the return value from R0 and R1.  */
+      /* R0 holds the lower-order bytes */
+      regcache_cooked_read_unsigned (regcache, ARC_RETURN1_REGNUM, &val);
+      store_unsigned_integer (valbuf, 4, val);
+      regcache_cooked_read_unsigned (regcache, ARC_RETURN2_REGNUM, &val);
+      store_unsigned_integer ((char *)valbuf + 4, len - 4, val);
+    }
+  else
+    error ("arc_extract_return_value: type length too large");
+  //#endif
+}
+
+static void
+arc_store_return_value (struct type *type, struct regcache *regcache,
+			const void *valbuf)
+{
+  //#ifdef ARC4_JTAG
+#ifdef ARC_DEBUG
+  printf ("\narc_store_return_value called\n ");
+#endif
+  //#else
+  ULONGEST val;
+  int len = TYPE_LENGTH (type);
+  
+  if (len <= 4)
+    {
+      /* Put the return value in R0.  */
+      val = extract_unsigned_integer (valbuf, len);
+      regcache_cooked_write_unsigned (regcache, ARC_RETURN1_REGNUM, val);
+    }
+  else if (len <= 8)
+    {
+      /* Put the return value in R10 and R11.  */
+      val = extract_unsigned_integer (valbuf, 4);
+      regcache_cooked_write_unsigned (regcache, ARC_RETURN1_REGNUM, val);
+      val = extract_unsigned_integer ((char *)valbuf + 4, len - 4);
+      regcache_cooked_write_unsigned (regcache, ARC_RETURN2_REGNUM, val);
+    }
+  else
+    error ("arc_store_return_value: type length too large.");
+  //#endif
+}
+
+
+static enum return_value_convention
+arc_return_value (struct gdbarch *gdbarch, struct type *valtype,
+		  struct regcache *regcache, void *readbuf,
+		  const void *writebuf)
+{
+  //#ifdef ARC4_JTAG
+#ifdef ARC_DEBUG
+  printf ("\narc_return_value called");
+#endif
+  //#else
+  /* This will change with the ABI */
+  int struct_return = (TYPE_CODE (valtype) == TYPE_CODE_STRUCT ||
+		       TYPE_CODE (valtype) == TYPE_CODE_UNION ||
+		       TYPE_LENGTH (valtype) > 8);
+  
+
+  if (writebuf != NULL)
+    {
+      gdb_assert (!struct_return);
+      arc_store_return_value (valtype, regcache, writebuf);
+    }
+
+  if (readbuf != NULL)
+    {
+      gdb_assert (!struct_return);
+      arc_extract_return_value (valtype, regcache, readbuf);
+    }
+
+  if (struct_return)
+    return RETURN_VALUE_STRUCT_CONVENTION;
+  else
+    return RETURN_VALUE_REGISTER_CONVENTION;
+  //#endif
+}
+
+/* Signal Trampoline Frame Unwinder. These 
+ * unwinders allow frame unwinding to happen 
+ * from within signal handlers. 
+ */
+
+static struct arc_unwind_cache *
+arc_sigtramp_frame_cache (struct frame_info *next_frame,
+			  void **this_cache)
+{
+  // FIXMEA: cleanup#ifdef ARC4_JTAG
+#ifdef ARC_DEBUG
+  printf ("\narc_sigtramp_frame_cache called");
+#endif
+  //#else
+  struct arc_unwind_cache *cache;
+  struct gdbarch_tdep *tdep = gdbarch_tdep (current_gdbarch);
+  CORE_ADDR addr;
+  char buf[4];
+
+  if (*this_cache)
+    return *this_cache;
+
+  cache = FRAME_OBSTACK_ZALLOC (struct arc_unwind_cache);
+  (*this_cache) = cache;
+  cache->saved_regs = trad_frame_alloc_saved_regs (next_frame);
+
+  /* Zero all fields.  */
+  cache->blink_offset = 0;
+  cache->prev_pc = 0;
+  cache->prev_sp = 0;
+  cache->frame_base = 0;
+  cache->framesize = 0;
+  cache->sp_offset = 0;
+  cache->fp_offset = 0;
+  cache->prev_pc = 0;
+  cache->is_leaf = 0;
+  cache->uses_fp = 0;
+
+  
+  frame_unwind_register (next_frame, SP_REGNUM, buf);
+  cache->frame_base = extract_unsigned_integer (buf, 4);
+
+  addr = tdep->sigcontext_addr (next_frame);
+  if (tdep->sc_reg_offset)
+    {
+      int i;
+      
+      for (i = 0; i < tdep->sc_num_regs; i++)
+	if (tdep->sc_reg_offset[i] != -1)
+	  cache->saved_regs[i].addr = addr + tdep->sc_reg_offset[i];
+    }
+
+  return cache;
+  //#endif
+}
+
+static void
+arc_sigtramp_frame_this_id (struct frame_info *next_frame, void **this_cache,
+			    struct frame_id *this_id)
+{
+  //FIXMEA: cleanup #ifdef ARC4_JTAG
+#ifdef ARC_DEBUG
+  printf ("\narc_sigtramp_frame_this_id called");
+#endif
+  //#else
+  struct arc_unwind_cache *cache = 
+    arc_sigtramp_frame_cache (next_frame, this_cache);
+  
+  (*this_id) = frame_id_build (cache->frame_base, frame_pc_unwind (next_frame));
+  //#endif
+}
+
+static void
+arc_sigtramp_frame_prev_register (struct frame_info *next_frame,
+				  void **this_cache,
+				  int regnum, int *optimizedp,
+				  enum lval_type *lvalp, CORE_ADDR *addrp,
+				  int *realnump, void *valuep)
+{
+  // FIXMEA: cleanup#ifdef ARC4_JTAG
+#ifdef ARC_DEBUG
+  printf ("\narc_sigtramp_frame_prev_register called");
+#endif
+  //#else
+  struct gdbarch_tdep *tdep = gdbarch_tdep (current_gdbarch);
+
+  /* Make sure we've initialized the cache.  */ 
+  struct arc_unwind_cache *cache = 
+    arc_sigtramp_frame_cache (next_frame, this_cache);
+
+  /* on a signal, the PC is in ret */
+#ifdef ARC4_JTAG
+  if (regnum == ARC_STATUS_REGNUM)
+#else
+  if(regnum == PC_REGNUM)
+#endif
+    regnum = tdep->pc_regnum_in_sigcontext;
+  
+  trad_frame_get_prev_register (next_frame, cache->saved_regs, regnum,
+				optimizedp, lvalp, addrp, realnump, valuep);
+  //#endif
+}
+
+
+static const struct frame_unwind arc_sigtramp_frame_unwind =
+{
+  SIGTRAMP_FRAME,
+  arc_sigtramp_frame_this_id,
+  arc_sigtramp_frame_prev_register
+};
+
+const struct frame_unwind *
+arc_sigtramp_frame_sniffer (struct frame_info *next_frame)
+{
+  //FIXMEA: cleanup#ifdef ARC4_JTAG
+#ifdef ARC_DEBUG  
+  printf ("\narc_sigtramp_frame_sniffer called() ");
+#endif
+  //#else
+  CORE_ADDR pc = frame_pc_unwind (next_frame);
+  struct gdbarch_tdep *tdep = gdbarch_tdep (get_frame_arch (next_frame));
+
+  /* We shouldn't even bother if we don't have a sigcontext_addr
+     handler.  */
+  if (tdep->sigcontext_addr == NULL)
+    return NULL;
+
+  if (tdep->sigtramp_p != NULL)
+    {
+      if (tdep->sigtramp_p (next_frame))
+	{
+	  return &arc_sigtramp_frame_unwind;
+	}
+    }
+
+  return NULL;
+  //#endif
+}
+
+
+
+/* Allow calls to be made to functions defined in the debuggee. 
+   a.k.a dummy calls 
+*/
+/* When arguments must be pushed onto the stack, they go on in reverse
+   order.  The below implements a FILO (stack) to do this.  
+   Copied from d10v-tdep.c.  */
+
+struct stack_item
+{
+  int len;
+  struct stack_item *prev;
+  void *data;
+};
+
+static struct stack_item *
+push_stack_item (struct stack_item *prev, void *contents, int len)
+{
+  struct stack_item *si;
+  si = xmalloc (sizeof (struct stack_item));
+  si->data = xmalloc (len);
+  si->len = len;
+  si->prev = prev;
+  memcpy (si->data, contents, len);
+  return si;
+}
+
+static struct stack_item *
+pop_stack_item (struct stack_item *si)
+{
+  struct stack_item *dead = si;
+  si = si->prev;
+  xfree (dead->data);
+  xfree (dead);
+  return si;
+}
+
+
+
+
+/* arc_push_dummy_call :
+ *  gdbarch  : gdbarch structure for the backend to use if needed.
+ *  function : 
+ *  regcache : 
+ *  bp_addr  : Return address for the breakpoint.
+ *  sp       : Current value of sp.
+ *  struct_return: struct_return is 1 if structures are returned by 
+ *                 the function.
+ *  struct_addr: Hidden address for returning a struct.
+ */
+
+
+static CORE_ADDR
+arc_push_dummy_call(struct gdbarch *gdbarch, struct value *function,
+		     struct regcache *regcache, CORE_ADDR bp_addr, int nargs,
+		     struct value **args, CORE_ADDR sp, int struct_return,
+		     CORE_ADDR struct_addr)
+
+{
+  //#ifdef ARC4_JTAG
+#ifdef ARC_DEBUG
+  printf ("\narc_push_dummy_call called");
+#endif
+  // #else
+  int stack_alloc;
+  int stack_offset;
+  int argreg;
+  int argnum;
+
+  CORE_ADDR regval;
+  struct stack_item *si = NULL;
+
+
+  /* Push the return address.  */
+#ifdef ARC4_JTAG
+  CORE_ADDR modified_bp_addr;
+  modified_bp_addr = arc_debug_fetch_regs(ARC_STATUS_REGNUM);
+  regcache_raw_collect(regcache, ARC_STATUS_REGNUM, &modified_bp_addr);
+  modified_bp_addr = modified_bp_addr & 0xff000000;
+  bp_addr = bp_addr >>2;
+  modified_bp_addr |= bp_addr;
+  regcache_cooked_write_unsigned (regcache, ARC_BLINK_REGNUM, modified_bp_addr);
+#else
+  regcache_cooked_write_unsigned (regcache, ARC_BLINK_REGNUM, bp_addr);
+#endif
+
+  /* Are we returning a value using a structure return or a normal value
+     return?  struct_addr is the address of the reserved space for the return
+     structure to be written on the stack.
+  */
+  /* FIXME:: Ramana :: What about 4 byte structures returned in r0 as
+     claimed by Metaware. 
+  */
+  
+  /* Now load as many as possible of the first arguments into registers,
+     and push the rest onto the stack.  */
+  argreg = ARC_ARG0_REGNUM;
+ 
+  if (struct_return)
+    {
+      regcache_cooked_write_unsigned (regcache, ARC_ARG0_REGNUM, struct_addr);
+      argreg++;
+#ifdef ARC4_JTAG
+      sp = sp - 16;
+#endif
+    }
+
+  stack_offset = 0;
+
+  for (argnum = 0; argnum < nargs; argnum++)
+    {
+      int len;
+      char *val;
+      int reg_demand;
+      int i;
+      
+      len = TYPE_LENGTH (VALUE_TYPE (args[argnum]));
+      val = (char *) VALUE_CONTENTS (args[argnum]);
+      
+      /* How may registers worth of storage do we need for this argument?  */
+      reg_demand = (len / 4) + (len % 4 != 0 ? 1 : 0);
+        
+      if (argreg + reg_demand - 1 <= ARC_ARG7_REGNUM)
+        {
+          /* Data passed by value.  Fits in available register(s).  */
+          for (i = 0; i < reg_demand; i++)
+            {
+              regcache_cooked_write_unsigned (regcache, argreg, 
+					      *(unsigned long *) val);
+              argreg++;
+              val += 4;
+            }
+        }
+      else if (argreg <= ARC_ARG7_REGNUM)
+        {
+          /* Data passed by value. Does not fit in available register(s).
+             Use the register(s) first, then the stack.  */
+          for (i = 0; i < reg_demand; i++)
+            {
+              if (argreg <= ARC_ARG7_REGNUM)
+                {
+		  regcache_cooked_write_unsigned (regcache, argreg, 
+						  *(unsigned long *) val);
+                  argreg++;
+                  val += 4;
+                }
+              else
+                {
+		  /* Push item for later so that pushed arguments
+		     come in the right order.  */
+		  si = push_stack_item (si, val, 4);
+                  val += 4;
+                }
+            }
+        }
+      else if (len > (2 * 4))
+        {
+	  /* FIXME */
+	  internal_error (__FILE__, __LINE__, "We don't do this");
+        }
+      else
+        {
+          /* Data passed by value.  No available registers.  Put it on
+             the stack.  */
+	   si = push_stack_item (si, val, len);
+        }
+    }
+
+  while (si)
+    {
+      /* fp_arg must be word-aligned (i.e., don't += len) to match
+	 the function prologue.  */
+      sp = (sp - si->len) & ~3;
+#ifdef ARC4_JTAG
+      write_memory (sp + 16, si->data, si->len);
+#else
+      write_memory (sp, si->data, si->len);
+#endif
+      si = pop_stack_item (si);
+    }
+
+  /* Finally, update the SP register.  */
+  regcache_cooked_write_unsigned (regcache, ARC_SP_REGNUM, sp);
+
+  return sp;
+  //#endif
+}
+
+/* Align Frame */
+static CORE_ADDR
+arc_frame_align (struct gdbarch *gdbarch, CORE_ADDR sp)
+{
+  /* Align to the normal alignment on the stack).  */
+  return sp & ~3;
+}
+
+
+/* Print interesting information about the floating point processor
+   (if present) or emulator.  */
+static void
+arc_print_float_info (struct gdbarch *gdbarch, struct ui_file *file,
+		      struct frame_info *frame, const char *args)
+{
+  printf("Software FPU \n");
+}
+
+
+/* Set the main_name to "_main" if required.
+   This is set as an observer of inferior_created.  */
+static void
+arc_set_main_name (struct target_ops *objfile, int from_tty)
+{
+  struct minimal_symbol *umainsym, *mainsym;
+
+  /* Old ARC toolchains prepend an underscore to symbol names.  If there is
+     an _main but no main, then we're probably debugging a binary that was
+     made with the old toolchain.  */
+  umainsym = lookup_minimal_symbol ("_main", NULL, NULL);
+  mainsym = lookup_minimal_symbol ("main", NULL, NULL);
+  if(umainsym && !mainsym)
+    {
+      set_main_name ("_main");
+    }
+
+  /* If we don't have any symbols, the default, i.e. "main", will get used.  */
+}
+
+
+/* The following piece of code is borrowed from d10v */
+static void
+a4_address_to_pointer (struct type *type, void *buf, CORE_ADDR addr)
+{
+#ifdef ARC4_JTAG
+  if (TYPE_CODE (TYPE_TARGET_TYPE (type)) == TYPE_CODE_FUNC
+      || TYPE_CODE (TYPE_TARGET_TYPE (type)) == TYPE_CODE_METHOD)
+    store_unsigned_integer (buf, TYPE_LENGTH (type), (addr>>2) & 0xffffff);
+  else
+    store_unsigned_integer (buf, TYPE_LENGTH (type), addr);
+#endif
+}
+
+static CORE_ADDR
+a4_pointer_to_address (struct type *type, const void *buf)
+{
+#ifdef ARC4_JTAG  
+  CORE_ADDR addr = extract_unsigned_integer (buf, TYPE_LENGTH(type));
+  /* Is it a code address?  */
+  if (TYPE_CODE (TYPE_TARGET_TYPE (type)) == TYPE_CODE_FUNC
+      || TYPE_CODE (TYPE_TARGET_TYPE (type)) == TYPE_CODE_METHOD
+      || TYPE_CODE_SPACE (TYPE_TARGET_TYPE (type)))
+    return ((addr<<2) & 0x2ffffff);
+  else
+    return addr;
+#endif
+}
+
+static struct gdbarch *
+arc_gdbarch_init (struct gdbarch_info info, struct gdbarch_list *arches)
+{
+  struct gdbarch_tdep *tdep;
+  struct gdbarch *gdbarch;
+
+  tdep = xmalloc (sizeof (struct gdbarch_tdep));
+  gdbarch = gdbarch_alloc (&info, tdep);
+  
+  /* Fixme :: Worry about default initialization of breakpoints 
+     for the ARC platform. In our case currently this is handled
+     out of arc-linux-tdep.c for default arc linux breakpoints.
+  */
+
+  info.osabi = CONFIG_OSABI;
+  gdbarch_init_osabi(info, gdbarch);
+  
+  /* Put stuff in gdbarch. */
+
+  /* Characters are unsigned by default */
+  set_gdbarch_char_signed (gdbarch, 0);
+
+  set_gdbarch_print_float_info (gdbarch, arc_print_float_info);
+  set_gdbarch_sp_regnum (gdbarch, ARC_SP_REGNUM);
+  set_gdbarch_register_type (gdbarch, arc_register_type);  
+
+  set_gdbarch_cannot_store_register (gdbarch, arc_cannot_store_register);
+
+
+  /* Advance PC across function entry code.  */
+  set_gdbarch_skip_prologue (gdbarch, arc_skip_prologue);
+
+  
+  /* Hook in the Dwarf-2 frame sniffer.  */
+  set_gdbarch_dwarf2_reg_to_regnum (gdbarch, arc_binutils_reg_to_regnum);
+  dwarf2_frame_set_init_reg (gdbarch, arc_dwarf2_frame_init_reg);
+  frame_unwind_append_sniffer (gdbarch, dwarf2_frame_sniffer);
+
+  /* signal frames */
+  frame_unwind_append_sniffer (gdbarch, arc_sigtramp_frame_sniffer);
+
+
+
+  /* The stack grows downward.  */
+  set_gdbarch_inner_than (gdbarch, core_addr_lessthan);
+
+  set_gdbarch_unwind_pc (gdbarch, arc_unwind_pc);
+  set_gdbarch_unwind_sp (gdbarch, arc_unwind_sp);
+  set_gdbarch_unwind_dummy_id (gdbarch, arc_unwind_dummy_id);
+  frame_unwind_append_sniffer (gdbarch, arc_frame_sniffer);
+ 
+
+  set_gdbarch_return_value (gdbarch, arc_return_value);
+
+  /* Add the arc register groups.  */
+  arc_add_reggroups (gdbarch);
+  set_gdbarch_register_reggroup_p (gdbarch, arc_register_reggroup_p);
+  
+  /* Breakpoint manipulation.  */
+  set_gdbarch_breakpoint_from_pc (gdbarch, arc_breakpoint_from_pc);
+  set_gdbarch_frame_align(gdbarch,arc_frame_align);
+
+  /* Dummy Frame handling */
+  set_gdbarch_push_dummy_call (gdbarch, arc_push_dummy_call);
+  set_gdbarch_call_dummy_location (gdbarch,AT_ENTRY_POINT);
+  
+  /* Disassembly.  */
+  {
+    /* the arc libopcodes wants abfd so that it can find out what CPU
+       extensions are there */
+    bfd abfd;
+    abfd.sections = NULL;
+
+
+#ifndef ARC4_JTAG
+    set_gdbarch_print_insn(gdbarch, arcompact_get_disassembler(&abfd));
+#else
+    set_gdbarch_print_insn(gdbarch, arc_get_disassembler(&abfd));
+#endif
+  }
+
+#ifdef ARC4_JTAG  
+  set_gdbarch_address_to_pointer (gdbarch, a4_address_to_pointer);
+  set_gdbarch_pointer_to_address (gdbarch, a4_pointer_to_address);
+#endif
+  //#ifndef ARC4_JTAG
+  /* Set main_name to _main if necessary.  Ideally we'd want a hook that
+     gets called when symbols are loaded, but it seems there isn't one; so
+     we'll use this.  This will not work if the user does "target remote
+     ..." and then "add-symbol-file ..."  */
+  observer_attach_inferior_created (arc_set_main_name);
+  //#endif
+
+#ifdef ARC4_JTAG
+  //  set_gdbarch_write_pc (gdbarch, a4_write_pc);
+#endif
+
+  CONFIG_INIT_TDEP (gdbarch);
+  
+  return gdbarch;
+}
+
+static void
+arc_dump_tdep (struct gdbarch *current_gdbarch, struct ui_file *file)
+{
+}
+
+void
+_initialize_arc_tdep (void)
+{
+  gdbarch_register (bfd_arch_arc, arc_gdbarch_init, arc_dump_tdep);
+}
+
diff --git a/gdb/arc-tdep.h b/gdb/arc-tdep.h
new file mode 100644
index 0000000..4251eb4
--- /dev/null
+++ b/gdb/arc-tdep.h
@@ -0,0 +1,109 @@
+/* Target dependent code for ARC700, for GDB, the GNU debugger.
+
+   Copyright 2005 Free Software Foundation, Inc.
+
+   Contributed by Codito Technologies Pvt. Ltd. (www.codito.com)
+
+   Authors: 
+      Soam Vasani <soam.vasani@codito.com>
+      Ramana Radhakrishnan <ramana.radhakrishnan@codito.com> 
+
+   This file is part of GDB.
+   
+   This program 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 of the License, or
+   (at your option) any later version.
+   
+   This program 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 this program; if not, write to the Free Software
+   Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.  
+*/
+enum arc700_api_regnums
+  {
+    ARC_ARG0_REGNUM     =        0,
+    ARC_ARG1_REGNUM     =        1,
+    ARC_ARG2_REGNUM     =        2,
+    ARC_ARG3_REGNUM     =        3,
+    ARC_ARG4_REGNUM     =        4,
+    ARC_ARG5_REGNUM     =        5,
+    ARC_ARG6_REGNUM     =        6,
+    ARC_ARG7_REGNUM     =        7,
+
+    /* When a return value is stored in registers, is in either r0 or in
+       (r1,r0).  Used in arc_extract_return_value */
+    ARC_RETURN1_REGNUM	=	 0,
+    ARC_RETURN2_REGNUM 	=	 1
+  };
+
+
+
+enum ARCProcessorVersion
+  {
+    UNSUPPORTED,
+    ARCompact,
+    ARC600,
+    ARC700,
+    A5,
+    A4,
+  };
+
+
+enum ARCExtensionsSupportedInformation
+  {
+    ARC700_MMU
+  };
+
+
+
+typedef struct ARCProcessorInformation
+{
+  enum ARCProcessorVersion arcprocessorversion;
+  enum ARCExtensionsSupportedInformation extensionsSupported;
+
+}ARCVariantsInfo;
+
+struct gdbarch_tdep
+{
+  /* Detect sigtramp.  */
+  int (*sigtramp_p) (struct frame_info *);
+  
+  /* Get address of sigcontext for sigtramp.  */
+  CORE_ADDR (*sigcontext_addr) (struct frame_info *);
+
+  /* Offset of registers in `struct sigcontext'.  */
+  int *sc_reg_offset;
+  int sc_num_regs;
+
+  /* In our linux target, gdbarch_pc_regnum points to stop_pc, which is a
+     register that's made-up by the kernel and does not actually exist.
+     stop_pc is NOT saved in the sigcontext; what is saved is the ret
+     "register".  Since ret is a linux-only register, it's regnum is visible
+     only in arc-linux-tdep.c; hence initialize pc_regnum_in_sigcontext in
+     arc-linux-tdep.c.  */
+  int pc_regnum_in_sigcontext;
+
+  /* Returns false, true, or -1; -1 means the tdep has nothing to say about this
+     register and group.  */
+  int (*register_reggroup_p) (int, struct reggroup *);
+  
+  /* Breakpoint instruction to be used */
+  unsigned char * arc_breakpoint_insn;
+  int arc_breakpoint_size;
+
+  /* For stopping backtraces.  */
+  CORE_ADDR lowest_pc;
+  
+  /* ARC Processor variant information.  */
+  ARCVariantsInfo * arc_processor_variant_info ;
+
+};
+
+
+void arc_software_single_step(enum target_signal ignore, int insert_breakpoints_p);
+
diff --git a/gdb/doc/ChangeLog.codito b/gdb/doc/ChangeLog.codito
new file mode 100644
index 0000000..0a335d9
--- /dev/null
+++ b/gdb/doc/ChangeLog.codito
@@ -0,0 +1,7 @@
+2005-05-16  Soam Vasani  <soam.vasani@codito.com>
+
+	* gdb.texinfo (Embedded Processors): Add a menu item for ARC and
+	include arc.texi.
+	* arc.texi: New file.  ARC specific commands etc.
+	* Makefile.in (GDB_DOC_SOURCE_INCLUDES): Add arc.texi to the list.
+
diff --git a/gdb/doc/arc.texi b/gdb/doc/arc.texi
new file mode 100644
index 0000000..9a00571
--- /dev/null
+++ b/gdb/doc/arc.texi
@@ -0,0 +1,155 @@
+@c \input texinfo
+@c %**start of header
+@c @setfilename arc-cmds.info
+@c @settitle ARC specific commands
+@c @setchapternewpage off
+@c %**end of header
+
+@node ARC
+@subsection ARC
+
+GDB for ARC supports the ARC600 and ARC700 cores.
+
+On ARC700, you can debug linux applications using gdbserver.  On
+ARC700 and ARC600, you can debug any program using the arcjtag target.
+
+
+@menu
+* ARC specific commands::        ARC specific commands
+@end menu
+
+@node ARC specific commands, , , ARC
+@subsection ARC specific commands
+
+These commands can only be used when GDB has been build for ARC.
+
+
+@menu
+* target arcjtag::                  Use the JTAG target
+* arc-reset-board::                 Reset the ARC board
+* arc-aux-read::                    Read a range of auxillary registers
+* arc-aux-write::                   Write an auxillary register
+* info arc-bcr-registers::          Show build configuration registers
+
+Debugging:
+* set arcjtag-debug-statemachine::  JTAG state machine debugging messages
+* set arcjtag-debug-target::        arcjtag target debugging messages
+@end menu
+
+@node target arcjtag
+@subsubsection target arcjtag
+
+Usage: @code{target arcjtag}
+
+Connect to the arcjtag target.
+
+This target expects the ARC board to be connected to the parallel port
+on the host.  Currently we support debugging only on GNU/Linux hosts.
+
+This target uses the gpio device to access the parallel.  You must
+have the gpio driver installed and you must have read/write privileges
+to /dev/gpio.
+
+
+@node arc-reset-board
+@subsubsection arc-reset-board
+
+Usage: @code{arc-reset-board}
+
+Reset the board.
+
+For this command to work, you must be connected to the arcjtag target,
+by using the command @code{target arcjtag}.
+
+
+@node arc-aux-read
+@subsubsection arc-aux-read
+
+Usage: @code{arc-aux-read <REG-FROM> [<REG-TO>]}
+
+Read and show a range of auxillary registers.
+REG-FROM and REG-TO can be any expressions that evaluate to integers.
+REG-TO is optional; if it is not specified, only one register is displayed.
+
+For example:
+@example
+(gdb) arc-aux-read 0x400 0x406
+00000400: 00000100 80001abc 00001620 00200000
+00000404: 00000100 00000000 00000000
+@end example
+
+For this command to work, you must be connected to the arcjtag target,
+by using the command @code{target arcjtag}.
+
+
+
+@node arc-aux-write
+@subsubsection arc-aux-write
+
+Usage: @code{arc-aux-write <REG> = <VALUE>}
+
+Write to an auxillary register.
+REG and VALUE can be any expressions that evaluate to integers.
+
+For example:
+@example
+(gdb) arc-aux-write 6 = 0x123
+@end example
+
+For this command to work, you must be connected to the arcjtag target,
+by using the command @code{target arcjtag}.
+
+@node info arc-bcr-registers
+@subsubsection info arc-bcr-registers
+
+Usage: @code{info arc-bcr-registers}
+
+Show all the build configuration registers.
+
+For example:
+@example
+(gdb) info arc-bcr-registers
+[61] DCCM_BASE_BUILD : 0x1010121
+[62] CRC_BASE_BUILD  : 0x00
+[63] BTA_LINK_BUILD  : 0x1010121
+[64] DVBF_BUILD      : 0x00
+[65] TEL_INSTR_BUILD : 0x00
+[67] MEMSUBSYS       : 0x01
+[68] VECBASE_AC_BUILD : 0x01
+[69] P_BASE_ADDRESS  : 0xfc0001
+[6f] MMU_BUILD       : 0x1010121
+[70] ARCANGEL_BUILD  : 0x1010121
+[72] D_CACHE_BUILD   : 0x12001
+[73] MADI_BUILD      : 0x00
+[74] DCCM_BUILD      : 0x00
+[75] TIMER_BUILD     : 0x303
+[76] AP_BUILD        : 0x00
+[77] ICACHE_BUILD    : 0x22001
+[78] ICCM_BUILD      : 0x1010121
+[79] DSPRAM_BUILD    : 0x1203
+[7a] MAC_BUILD       : 0x00
+[7b] MULTIPLY_BUILD  : 0x01
+[7c] SWAP_BUILD      : 0x01
+[7d] NORM_BUILD      : 0x02
+[7e] MINMAX_BUILD    : 0x00
+[7f] BARREL_BUILD    : 0x02
+@end example
+
+For this command to work, you must be connected to the arcjtag target,
+by using the command @code{target arcjtag}.
+
+@node set arcjtag-debug-statemachine
+@subsubsection set arcjtag-debug-statemachine
+
+Usage: @code{set arcjtag-debug-statemachine ARG}
+
+Switch on JTAG state machine debugging messages if ARG is non-zero.
+Switch them off if it is zero.
+
+@node set arcjtag-debug-target
+@subsubsection set arcjtag-debug-target
+
+Usage: @code{set arcjtag-debug-target ARG}
+
+Switch on JTAG target debugging messages if ARG is non-zero.
+Switch them off if it is zero.
diff --git a/gdb/gdbserver/ChangeLog.codito b/gdb/gdbserver/ChangeLog.codito
new file mode 100644
index 0000000..e36df7c
--- /dev/null
+++ b/gdb/gdbserver/ChangeLog.codito
@@ -0,0 +1,34 @@
+2005-05-14  Soam Vasani  <soam.vasani@codito.com>
+
+	* proc-service.c (ps_pglobal_lookup): First look for NAME, then
+	for NAME with an underscore prepended.  The toolchain no longer
+	prepends underscores, but we should still work with older
+	toolchains.
+
+2005-05-14  Soam Vasani  <soam.vasani@codito.com>
+
+	* linux-arc-low.c (arg_regmap): Offsets were wrong, correct them.
+
+2005-05-14  Soam Vasani  <soam.vasani@codito.com>
+
+	* linux-arc-low.c: Remove #include reg.h.  Include linux/user.h to
+	get offsets of registers in the struct ptrace.
+
+2005-04-11  Soam Vasani  <soam.vasani@codito.com>
+
+	* linux-arc-low.c (arc_get_pc): Return stop_pc, not EFA.
+
+2005-04-09  Soam Vasani  <soam.vasani@codito.com>
+
+	* proc-service.c (ps_pglobal_lookup): Prepend underscore to symbol
+	names, because the toolchain does that.  Remove this hack when we
+	change the toolchain.
+	* linux-arc-low.c (arc_get_pc): Return EFA's value instead of RET,
+	so that gdbserver can do it's own breakpoints correctly.
+	(arc_reinsert_addr): Return blink's value.
+
+2005-04-07  Ramana Radhakrishnan  <ramana.radhakrishnan@codito.com>
+
+	* configure.srv: Change arc-*-elf* to arc-linux .Include 
+	thread debugging for the ARC platform. 
+
diff --git a/gdb/gdbserver/linux-arc-low.c b/gdb/gdbserver/linux-arc-low.c
new file mode 100644
index 0000000..28c7ead
--- /dev/null
+++ b/gdb/gdbserver/linux-arc-low.c
@@ -0,0 +1,149 @@
+/* GNU/Linux/ARC specific low level interface, for the remote server for GDB.
+   Copyright 1995, 1996, 1998, 1999, 2000, 2001, 2002, 2003, 2004
+   Free Software Foundation, Inc.
+
+   This file is part of GDB.
+
+   This program 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 of the License, or
+   (at your option) any later version.
+
+   This program 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 this program; if not, write to the Free Software
+   Foundation, Inc., 59 Temple Place - Suite 330,
+   Boston, MA 02111-1307, USA.  */
+
+#include "server.h"
+#include "linux-low.h"
+
+#include <linux/user.h>
+
+#define OFFSET(member,structure) (int)(&( ((struct structure *)0)->member ))
+
+#define arc_num_regs 39
+
+/* arc_regmap[i] is the offset of Ri in Linux's user struct */
+static int arc_regmap[] = {
+    OFFSET(r0, user_regs_struct),
+    OFFSET(r1, user_regs_struct),
+    OFFSET(r2, user_regs_struct),
+    OFFSET(r3, user_regs_struct),
+    OFFSET(r4, user_regs_struct),
+    OFFSET(r5, user_regs_struct),
+    OFFSET(r6, user_regs_struct),
+    OFFSET(r7, user_regs_struct),
+    OFFSET(r8, user_regs_struct),
+    OFFSET(r9, user_regs_struct),
+    OFFSET(r10, user_regs_struct),
+    OFFSET(r11, user_regs_struct),
+    OFFSET(r12, user_regs_struct),
+    OFFSET(r13, user_regs_struct),
+    OFFSET(r14, user_regs_struct),
+    OFFSET(r15, user_regs_struct),
+    OFFSET(r16, user_regs_struct),
+    OFFSET(r17, user_regs_struct),
+    OFFSET(r18, user_regs_struct),
+    OFFSET(r19, user_regs_struct),
+    OFFSET(r20, user_regs_struct),
+    OFFSET(r21, user_regs_struct),
+    OFFSET(r22, user_regs_struct),
+    OFFSET(r23, user_regs_struct),
+    OFFSET(r24, user_regs_struct),
+    OFFSET(r25, user_regs_struct),
+    OFFSET(r26, user_regs_struct),
+    OFFSET(bta, user_regs_struct),
+    OFFSET(lp_start, user_regs_struct),
+    OFFSET(lp_end, user_regs_struct),
+    OFFSET(lp_count, user_regs_struct),
+    OFFSET(status32, user_regs_struct),
+    OFFSET(blink, user_regs_struct),
+    OFFSET(fp, user_regs_struct),
+    OFFSET(sp, user_regs_struct),
+    OFFSET(efa, user_regs_struct),
+    OFFSET(ret, user_regs_struct),
+    OFFSET(orig_r8, user_regs_struct),
+    OFFSET(stop_pc, user_regs_struct)
+};
+
+static int
+arc_cannot_store_register (int regno)
+{
+  return (regno == 35 || regno >= arc_num_regs); /* FIXME, this is dirty */
+}
+
+static int
+arc_cannot_fetch_register (int regno)
+{
+  return (regno >= arc_num_regs);
+}
+
+extern int debug_threads;
+
+static CORE_ADDR
+arc_get_pc ()
+{
+  unsigned long pc;
+  collect_register_by_name ("stop_pc", &pc);
+  if (debug_threads)
+    fprintf (stderr, "stop pc is %08lx\n", pc);
+  return pc;
+}
+
+static void
+arc_set_pc (CORE_ADDR pc)
+{
+  unsigned long newpc = pc;
+  supply_register_by_name ("ret", &newpc);
+}
+
+
+/* trap_s 1 */
+/* FIXME: dependent on target endianness */
+static const unsigned long arc_breakpoint = 0x783E;
+#define arc_breakpoint_len 2
+
+static int
+arc_breakpoint_at (CORE_ADDR where)
+{
+  unsigned long insn;
+
+  (*the_target->read_memory) (where, (char *) &insn, arc_breakpoint_len);
+  if (insn == arc_breakpoint)
+    return 1;
+
+  /* If necessary, recognize more trap instructions here.  GDB only uses the
+     one.  */
+  return 0;
+}
+
+
+/* We only place breakpoints in empty marker functions, and thread locking
+   is outside of the function.  So rather than importing software single-step,
+   we can just run until exit.  */
+static CORE_ADDR
+arc_reinsert_addr ()
+{
+  unsigned long pc;
+  collect_register_by_name ("blink", &pc);
+  return pc;
+}
+
+struct linux_target_ops the_low_target = {
+  arc_num_regs,
+  arc_regmap,
+  arc_cannot_fetch_register,
+  arc_cannot_store_register,
+  arc_get_pc,
+  arc_set_pc,
+  (const char *) &arc_breakpoint,
+  arc_breakpoint_len,
+  arc_reinsert_addr,
+  0,
+  arc_breakpoint_at,
+};
diff --git a/gdb/gpio.h b/gdb/gpio.h
new file mode 100644
index 0000000..86aa4ca
--- /dev/null
+++ b/gdb/gpio.h
@@ -0,0 +1,38 @@
+struct GPIO_ioctl {
+    // This is used for general input and output in the same ioctl.
+    // inlen is replaced by the number of input bytes consumed.
+    // inlen is always even and represents a number of pairs:
+    //	[0/1/2,value]: write value to port_base+0/1/2.
+    //	[0x80/0x81/0x82, --]: read value from port_base+0/1/2
+    //	and append result to outbuf.
+    // Thus one can intermix read and write in the same ioctl.
+    unsigned inlen; char *inbuf;
+    // outlen is replaced by # of output bytes written.
+    unsigned outlen; char *outbuf;
+    };
+
+// IO control numbers
+
+// Linux kernel uses 0x54XX for special purposes.  Avoid such.
+// We'll pick large numbers.
+// We don't use the linux convention of dividing the IOC into a bunch
+// of bit fields.  We can always switch to this later, as the
+// IOC 0 returns the driver version (which IOC value will never change).
+
+#define GPIO_IOC_VERSION 0	// returns version
+#define GPIO_IOC_BASE 0xaa3a0000	// Intended for use on ARCangel 3!
+
+// Switch base address of parallel port.  0x3f8 is assumed.
+// WARNING!  You can write on any port whatsoever with this driver.
+// BE CAREFUL!
+#define GPIO_IOC_SET_PORT_BASE 	(GPIO_IOC_BASE+1) // cmd, arg=port base
+
+// General input/output ioctl.  See GPIO_ioctl struct.
+#define GPIO_IOC_DO_IO  	(GPIO_IOC_BASE+2) // cmd, arg=GPIO_ioctl *
+
+// For emergency purposes in case the driver is goofed up.
+#define GPIO_IOC_HARDRESET 	(GPIO_IOC_BASE+3) // cmd, no arg
+
+// Do you have an antiquated parallel port?  You might need to ask
+// the driver to use outb_p and inb_p (_p = pause).  Default is not to.
+#define GPIO_IOC_SET_PAUSE 	(GPIO_IOC_BASE+4) // arg = 1 => use pause; o/wise not.
diff --git a/gdb/regformats/reg-arc.dat b/gdb/regformats/reg-arc.dat
new file mode 100644
index 0000000..74f3b06
--- /dev/null
+++ b/gdb/regformats/reg-arc.dat
@@ -0,0 +1,41 @@
+name:arc
+expedite:fp,sp,ret
+32:r0
+32:r1
+32:r2
+32:r3
+32:r4
+32:r5
+32:r6
+32:r7
+32:r8
+32:r9
+32:r10
+32:r11
+32:r12
+32:r13
+32:r14
+32:r15
+32:r16
+32:r17
+32:r18
+32:r19
+32:r20
+32:r21
+32:r22
+32:r23
+32:r24
+32:r25
+32:r26
+32:bta
+32:lp_start
+32:lp_end
+32:lp_count
+32:status32
+32:blink
+32:fp
+32:sp
+32:efa
+32:ret
+32:orig_r8
+32:stop_pc
diff --git a/gdb/testsuite/ChangeLog.codito b/gdb/testsuite/ChangeLog.codito
new file mode 100644
index 0000000..87e1277
--- /dev/null
+++ b/gdb/testsuite/ChangeLog.codito
@@ -0,0 +1,151 @@
+2005-11-08  Kunal Parmar  <kunal.parmar@codito.com>
+
+	* arcgdbserverusinggdbserver.exp: Is a duplicate of
+	lib/arc-gdbserver.exp. Remove it.
+	* lib/arc-jtag.exp: Remove hardcoded compiler, assembler, etc. Use
+	environment variables instead.
+	* lib/arc-gdbserver.exp: Ditto. Disallow fileio tests. Use default
+	timeout. 
+	* config/remote-gdbserver.exp (rsh_gdbserver_spawn): Expect output
+	from the spawned rsh program. Check for errors. Return -1 on
+	error.
+	(gdbserver_spawn): Return spawn_id.
+	(gdb_load): Check the returned spawn_id from gdbserver_spawn and
+	return -1 on error. Remove sleep and expect output from the
+	spawned process instead. Do a wait on the spawned process after it
+	finishes.
+	* lib/mi-support.exp (gdb_load): Ditto.
+
+2005-10-31  Kunal Parmar  <kunal.parmar@codito.com>
+
+	* gdb.asm/asm-source.exp: Add linker flag -marclinux for target arc.
+
+2005-10-24  Kunal Parmar  <kunal.parmar@codito.com>
+
+	* gdb.asm/asm-source.exp: Set debug-flags to -gdwarf-2 for target arc.
+
+2005-10-21  Kunal Parmar  <kunal.parmar@codito.com>
+
+	* gdb.asm/arc.inc: Define macro's declare and end.
+
+2005-10-18  Kunal Parmar  <kunal.parmar@codito.com>
+
+	Bug #1183
+	* lib/mi-support.exp (mi_gdb_load): Add support for target
+	remote. Fix for Bug #1183 (Testsuite does not complete for
+	gdb.mi).
+
+2005-10-14  Kunal Parmar  <kunal.parmar@codito.com>
+
+	* config/remote-gdbserver.exp (gdb_load): Check the return value
+	from gdb_target_cmd. Retry on failure.
+
+2005-09-28  Kunal Parmar  <kunal.parmar@codito.com>
+
+	* lib/arc-jtag.exp: Skip the huge.exp test.
+
+2005-09-28  Kunal Parmar  <kunal.parmar@codito.com>
+
+	Bug #1183
+	* lib/mi-support.exp (mi_gdb_load): Add support for target
+	arcjtag. Fix for Bug #1183 (Testsuite does not complete for
+	gdb.mi).
+
+2005-09-23  Kunal Parmar  <kunal.parmar@codito.com>
+
+	* config/arc-jtag.exp: Take care about timeouts. Kill previous
+	program being debugged after doing arc-reset-board.
+	* lib/arc-jtag.exp: Add board_info to disallow unsupported tests.
+	Add board_info for arcjtag as gdb_protocol.
+
+2005-05-20  Soam Vasani  <soam.vasani@codito.com>
+
+	* gdb.arch/arc-step-jtag.s: Define "main" label.
+	* gdb.arch/arc-step.s: Ditto.
+
+2005-05-15  Soam Vasani  <soam.vasani@codito.com>
+
+	* gdb.arch/arc-step-jtag.exp: Check gdb_load's return value.
+
+2005-05-15  Soam Vasani  <soam.vasani@codito.com>
+
+	* config/arc-jtag.exp (gdb_target_arcjtag): Increase timeout.
+	Kill previous program being debugged.  Return zero on success,
+	non-zero otherwise.
+	(gdb_load): Check return value of gdb_target_arcjtag.  Return zero
+	on success, non-zero otherwise.
+
+2005-05-14  Soam Vasani  <soam.vasani@codito.com>
+
+	* gdb.arch/arc-step-jtag.exp: Oops.  Use arc-step-jtag.s, not
+	arc-step.s.
+
+2005-05-14  Soam Vasani  <soam.vasani@codito.com>
+
+	* gdb.arch/arc-step-jtag.exp: New file for the JTAG target.
+	* arc-step-jtag.s: New file, derived from arc-step.s: added labels
+	in delay slots and ended using "flag 1"
+	(JTAG uses hardware single step which can step thru delay slots,
+	unlike software single step.)
+	* gdb.arch/arc-step.exp: Quit if not on linux.
+
+2005-05-14  Soam Vasani  <soam.vasani@codito.com>
+
+	* config/arc-jtag.exp (gdb_target_arcjtag): If target arcjtag
+	fails, once do arc-reset-board and try again.
+
+2005-05-12  Ramana Radhakrishnan  <ramana@codito.com>
+
+	* lib/gdbserver.exp: Use a special tests dir for specifying
+	the tests directory where the tests have been downloaded. 
+	* arcgdbserverusinggdbserver.exp: Use this to run the testsuite. 
+
+2005-05-04  Soam Vasani  <soam.vasani@codito.com>
+
+	* config/arc-jtag.exp: Target-specific file for the arcjtag target.
+	* lib/arc-jtag.exp: Baseboard file for arcjtag target.  (No real
+	reason to put it in this directory, but...)
+
+2005-04-13  Soam Vasani  <soam.vasani@codito.com>
+
+	* gdb.arch/arc-step.exp: Tests for software single step across
+	32 bit / 16bit instructions, branches with/without delay slots,
+	and zero-overhead-loops.
+	* gdb.arch/arc-step.s: Ditto.
+
+2005-04-11  Soam Vasani  <soam.vasani@codito.com>
+
+	* gdb.threads/thread_check.exp: Applied
+	  http://sources.redhat.com/ml/gdb-patches/2004-11/msg00458.html,
+	  which corrects the filename and the regexp.
+
+2005-04-08  Ramana Radhakrishnan  <ramana.radhakrishnan@codito.com>
+
+	* gdb.base/float.exp: Add support for the ARC platform. 
+
+2005-03-30  Soam Vasani  <soam.vasani@codito.com>
+
+	* config/remote-gdbserver.exp (rsh_gdbserver_spawn): Find RSH.
+	* lib/arc-gdbserver.exp: Use rsh instead of telnet.
+
+2005-03-21  Soam Vasani  <soam.vasani@codito.com>
+
+	* config/remote-gdbserver.exp (mynewtelnet_open_and_exec): Assume
+	that telnet-exec.exp is in the path; do not hardcode the path.
+	* lib/arc-gdbserver.exp: Remove hardcoded paths, port numbers,
+	etc.  Use environment variables instead.
+
+2005-03-15  Ramana Radhakrishnan  <ramana.radhakrishnan@codito.com>
+
+	* config/remote-gdbserver.exp: New file for nfs copying
+	* gdb.asm/arc.inc: New file for assembly language testing
+	* gdb.asm/asm-source.exp: Handle the arc architecture. 
+	* lib/telnet-exec.exp: A replacement for rsh using telnet to allow
+	  executing commands on the arc board. Used while testing
+	  gdbserver on ARC700. 
+	* lib/arc-gdbserver.exp: A setup for running the testsuite
+	  using arc-gdbserver. Should be a part of the dejagnu
+	  distribution but is kept here for convinience. Tailor this 
+	  for use. (Store usually in /usr/share/dejagnu/baseboards directory)
+	
+
diff --git a/gdb/testsuite/config/arc-jtag.exp b/gdb/testsuite/config/arc-jtag.exp
new file mode 100644
index 0000000..1689111
--- /dev/null
+++ b/gdb/testsuite/config/arc-jtag.exp
@@ -0,0 +1,112 @@
+# Test Framework Driver for GDB using the arcjtag target.
+
+#   Copyright 2005 Free Software Foundation, Inc.
+#
+# This program 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 of the License, or
+# (at your option) any later version.
+# 
+# This program 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 this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.  
+
+load_lib gdb.exp
+
+#
+# gdb_target_arcjtag
+# Set gdb to target arcjtag.
+#
+proc gdb_target_arcjtag { } {
+    global gdb_prompt
+    global exit_status
+
+    # our arcjtag target doesn't take any options (yet)
+    #set target_arcjtag_options "[board_info target gdb,target_sim_options]";
+
+    send_gdb "target arcjtag\n"
+
+    gdb_expect 60 {
+        -re "A program is being debugged already.*Kill it.*y or n. $" {
+            send_gdb "y\n"
+	    verbose "\t\tKilling previous program being debugged"
+            exp_continue
+        }
+	-re "Connected to the arcjtag target.*$gdb_prompt $"	{
+	    verbose "Set target to arcjtag"
+	}
+	-re "$gdb_prompt $" {
+	    verbose "Retrying target arcjtag..."
+	    send_gdb "arc-reset-board\n"
+	    send_gdb "target arcjtag\n"
+
+	    gdb_expect 60 {
+		-re "A program is being debugged already.*Kill it.*y or n. $" {
+		    send_gdb "y\n"
+		    verbose "\t\tKilling previous program being debugged"
+		    exp_continue
+		}
+		-re "Connected to the arcjtag target.*$gdb_prompt $"	{
+		    verbose "Set target to arcjtag"
+		}
+		timeout { 
+		    perror "Couldn't set target to arcjtag (timeout)."
+		    return 1
+		}
+	    }
+	}
+	timeout { 
+	    perror "Couldn't set target to arcjtag (timeout)."
+	    return 1
+	}
+    }
+
+    return 0
+}
+
+#
+# gdb_load -- load a file into the debugger.
+#             return a -1 if anything goes wrong.
+#
+proc gdb_load { arg } {
+    global verbose
+    global loadpath
+    global loadfile
+    global GDB
+    global gdb_prompt
+
+    if { $arg != "" } {
+	if [gdb_file_cmd $arg] then { return -1 }
+    }
+    
+    if { [gdb_target_arcjtag] != 0 } {
+	return -1
+    }
+
+    # gotta do something about the timeout....
+    send_gdb "load\n"
+
+    gdb_expect 180 {
+	-re ".*$gdb_prompt $" {
+	    if $verbose>1 then {
+		send_user "Loaded $arg into $GDB\n"
+	    }
+	    return 0
+	}
+	-re "$gdb_prompt $" {
+	    if $verbose>1 then {
+		perror "GDB couldn't load."
+	    }
+	}
+	timeout {
+	    perror "Timed out trying to load $arg."
+	}
+    }
+
+    return 1
+}
diff --git a/gdb/testsuite/config/remote-gdbserver.exp b/gdb/testsuite/config/remote-gdbserver.exp
new file mode 100644
index 0000000..60d106d
--- /dev/null
+++ b/gdb/testsuite/config/remote-gdbserver.exp
@@ -0,0 +1,570 @@
+# Test framework for GDB (remote protocol) using a "gdbserver",
+# ie. a debug agent running as a native process on the same or
+# a different host.
+
+# Copyright 2000, 2001, 2003 Free Software Foundation, Inc.
+
+# This program 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 of the License, or
+# (at your option) any later version.
+# 
+# This program 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 this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.  
+
+# Please email any bugs, comments, and/or additions to this file to:
+# bug-gdb@prep.ai.mit.edu
+
+# This file was written by Michael Snyder. (msnyder@redhat.com)
+
+#
+# This module to be used for testing gdb with a "gdbserver" 
+# built either from libremote or from gdb/gdbserver.
+#
+
+# Load the basic testing library, and the remote stuff.
+load_lib ../config/monitor.exp
+load_lib telnet.exp
+#
+# To be addressed or set in your baseboard config file:
+#
+#   set_board_info gdb_protocol "remote"
+#	Unles you have a gdbserver that uses a different protocol...
+#
+#   set_board_info use_gdb_stub 1
+#	This tells the rest of the test suite not to do things
+#	like "run" which don't work well on remote targets.
+#
+#   set_board_info gdb,do_reload_on_run 1
+#	Unles you have a gdbserver that can handle multiple sessions.
+#
+#   set_board_info noargs 1
+#	At present there is no provision in the remote protocol
+#	for passing arguments.  This test framework does not
+#	address the issue, so it's best to set this variable
+#	in your baseboard configuration file.  
+#	FIXME: there's no reason why the test harness couldn't
+#	pass commandline args when it spawns gdbserver.
+#
+#   set_board_info gdb,noinferiorio 1
+#	Neither the traditional gdbserver nor the one in libremote
+#	can presently capture stdout and relay it to GDB via the
+#	'O' packet.  This means that tests involving printf will
+#	fail unles you set this varibale in your baseboard
+#	configuration file.
+#   
+#   set_board_info gdb,no_hardware_watchpoints 1
+#	Unles you have a gdbserver that supports hardware watchpoints.
+#	FIXME: gdb should detect if the target doesn't support them,
+#	and fall back to using software watchpoints.
+#
+#   set_board_info gdb_server_prog
+#	This will be the path to the gdbserver program you want to test.
+#	Defaults to "gdbserver".
+#
+#   set_board_info sockethost
+#	The name of the host computer whose socket is being used.
+#	Defaults to "localhost".  Note: old gdbserver requires 
+#	that you define this, but libremote/gdbserver does not.
+#
+#   set_board_info socketport
+#	Port id to use for socket connection.  If not set explicitly,
+#	it will start at "2345" and increment for each use.
+#
+#   set_board_info rsh_prog
+#	The program to use to spawn executables on the remote board.
+#	Default: "rsh"
+#
+#   set_board_info rcp_prog
+#	The program to use to copy test executables to the remote board.
+#	Default: "rcp"
+#
+#   set_board_info nfsdir
+#	If rcp_prog is set to "cp", specify the local directory name that
+#	is NFS mounted by the board.
+
+#
+# gdb_load -- load a file into the debugger.
+#             return a -1 if anything goes wrong.
+#
+
+global server_exec;
+global portnum;
+set portnum "2000";
+
+proc gdb_load { args } {
+    global server_exec;
+    global portnum;
+    global verbose;
+    global gdb_prompt;
+
+    # Port id -- either specified in baseboard file, or managed here.
+    if [target_info exists gdb,socketport] {
+	set portnum [target_info gdb,socketport];
+    } else {
+	# Bump the port number to avoid conflicts with hung ports.
+	incr portnum;
+    }
+
+    # Extract the local and remote host ids from the target board struct.
+
+    if [target_info exists sockethost] {
+	set debughost  [target_info sockethost];
+    } else {
+	set debughost "localhost:";
+    }
+    # Extract the protocol
+    if [target_info exists gdb_protocol] {
+	set protocol [target_info gdb_protocol];
+    } else {
+	set protocol "remote";
+    }
+
+    # Extract the name of the gdbserver, if known (default 'gdbserver').
+    if [target_info exists gdb_server_prog] {
+	set gdbserver [target_info gdb_server_prog];
+    } else {
+	set gdbserver "gdbserver";
+    }
+    # Extract the socket hostname
+    if [target_info exists sockethost] {
+	set sockethost [target_info sockethost];
+    } else {
+	set sockethost ""
+    }
+
+    # Get target name
+    if [target_info exists hostname] {
+	set target_address [target_info hostname];
+    } else {
+	set target_address "localhost"
+    }
+
+    # Get the username on the target
+    if [target_info exists "username"] {
+	set username [target_info username];
+    } else {
+	set username "";
+    }
+
+    # Get download dir
+    if [target_info exists download_dir] {
+	set download_dir [target_info download_dir];
+    } else {
+	set download_dir "/tmp"
+    }
+
+    # Get tests dir
+    if [target_info exists tests_dir] {
+	set tests_dir [target_info tests_dir];
+    } else {
+	set tests_dir $download_dir
+    }
+
+    # Export the host:port pair.
+    set gdbport $debughost$portnum;
+
+    if { $args == "" || $args == "{}" } {
+	if [info exists server_exec] {
+	    set args $server_exec;
+	} else {
+	    send_gdb "info files\n";
+	    gdb_expect 30 {
+		-re "Symbols from \"(\[^\"\]+)\"" {
+		    set args $expect_out(1,string);
+		    exp_continue;
+		}
+		-re "Local exec file:\[\r\n\]+\[ \t\]*`(\[^'\]+)'," {
+		    set args $expect_out(1,string);
+		    exp_continue;
+		}
+		-re "$gdb_prompt $" { }
+	    }
+	}
+    }
+
+    # remember new exec file 
+    set server_exec $args;
+
+    # Download the test files into the test_board
+    gdbserver_download $target_address $username $server_exec \
+	$download_dir/a-$portnum.out
+
+    # tell gdb what file we are debugging
+    if [gdb_file_cmd $args] {
+	return -1;
+    }
+
+    if [target_info exists solib_path] {
+	send_gdb "set solib-absolute-prefix [target_info solib_path]\n"
+	gdb_expect 30 {
+	    -re "$gdb_prompt $" {
+		if $verbose>1 then {
+		    send_user "set library path\n"
+		}
+	    }
+	    default { 
+		perror "Couldn't set library path\n"
+		return -1
+	    }
+	}
+    }
+
+    for {set i 1} {$i <= 3} {incr i} {
+	# Fire off the debug agent
+	set server_spawn_id [gdbserver_spawn $target_address $username \
+				 "$gdbserver $target_address:$portnum $tests_dir/a-$portnum.out 2>&1"]
+	
+	if { $server_spawn_id <= 0 } { return -1 }
+
+	# Wait for the server to produce at least one line and an additional
+	# character of output.  This will wait until any TCP socket has been
+	# created, so that GDB can connect.
+	expect {
+	    # expect output from $server_spawn_id
+	    -i $server_spawn_id
+	    -re ".*\n." { }
+	}
+    
+	# We can't just call close, because if gdbserver is local then that means
+	# that it will get a SIGHUP.  Doing it this way could also allow us to
+	# get at the inferior's input or output if necessary, and means that we
+	# don't need to redirect output.
+	expect_background {
+	   -i $server_spawn_id
+	   -re "." { }
+	   eof {
+	       # The spawn ID is already closed now (but not yet waited for).
+	       wait -nowait -i $expect_out(spawn_id)
+	   }
+	}
+	
+	# attach to the "serial port"
+	if {[gdb_target_cmd $protocol $gdbport] == 0 } {
+	    break
+	}
+	verbose -log "Unable to connect to target. Re-trying.."
+    }	
+
+    # do the real load if needed
+    if [target_info exists gdb_server_do_load] {
+        send_gdb "load\n"
+        set timeout 2400
+        verbose "Timeout is now $timeout seconds" 2
+        gdb_expect {
+            -re ".*$gdb_prompt $" {
+                if $verbose>1 then {
+                    send_user "Loaded $arg into $GDB\n"
+                }
+                set timeout 30
+                verbose "Timeout is now $timeout seconds" 2
+                return 1
+            }
+            -re "$gdb_prompt $"     {
+                if $verbose>1 then {
+                    perror "GDB couldn't load."
+                }
+            }
+            timeout {
+                if $verbose>1 then {
+                    perror "Timed out trying to load $arg."
+                }
+            }
+        }
+    }
+
+    return 0;
+}
+
+
+# Use RSH or telnet depending on the program chosen
+# by the board file. 
+# Return spawn_id
+proc gdbserver_spawn { dest username commandline } {
+    global board_info 
+    if ![target_info exists rsh_prog] {
+        if { [which remsh] != 0 } {
+            set RSH remsh
+        } else {
+            set RSH rsh
+        }
+    } else {
+        set RSH [target_info rsh_prog];
+    }
+
+    if { $RSH == "rsh" } {
+	return [rsh_gdbserver_spawn $dest $username $commandline]
+    } else {
+
+	if { $RSH == "telnet" } {
+	    # Spawn the shell
+	    return [telnet_gdbserver_spawn $dest $username $commandline]
+	    
+	    # expect the shell prompt obtained from 
+	    # the board description.
+	    # Now spawn gdbserver with its parameters
+	    # and dont expect any output from the gdbserver
+	    # other than the shell prompt
+	    # FIXME ?? Where do I close the telnet
+	    # session ( could use gdb_finish for closing the telnet session)
+
+	    
+
+	} else {
+	    verbose "Unknown rsh program "
+	    return -1
+	}
+    }
+}
+
+proc mynewtelnet_open_and_exec {  dest port shell_prompt commandline } {
+    global board_info
+    
+    spawn "telnet-exec.exp" $dest $commandline
+    set board_info($dest,fileid) $spawn_id;
+    return $spawn_id;
+}
+
+
+proc mytelnet_open_and_exec {  dest port shell_prompt commandline } {
+    set tries 0
+    set result -1
+    set need_respawn 1
+    
+    verbose "Starting a telnet connection to $dest:$port $shell_prompt " 2
+    while { $result < 0 && $tries <= 3 } {
+	if { $need_respawn } {
+	    set need_respawn 0
+	    spawn "telnet" $dest $port
+	}
+	expect {
+	    "Trying " {
+		exp_continue
+	    }
+	    -re "$shell_prompt.*$" {
+		verbose "Got prompt $shell_prompt\n"
+		set result 0
+		exp_send $commandline
+	   
+	    }
+	    -re "nt Name:|ogin:" {
+		if [board_info $connhost exists telnet_username] {
+		    exp_send "[board_info $connhost telnet_username]\n"
+		    exp_continue
+		}
+		if [board_info $connhost exists username] {
+		    exp_send "[board_info $connhost username]\n"
+		    exp_continue
+		}
+		perror "telnet: need to login"
+		break
+	    }
+	    "assword:" {
+		if [board_info $connhost exists telnet_password] {
+		    exp_send "[board_info $connhost telnet_password]\n"
+		    exp_continue
+		}
+		if [board_info $connhost exists password] {
+		    exp_send "[board_info $connhost password]\n"
+		    exp_continue
+		}
+		perror "telnet: need a password"
+		break
+	    }
+	    -re "advance.*y/n.*\\?" {
+		exp_send "n\n"
+		exp_continue
+	    }
+	    -re {([Aa]dvanced|[Ss]imple) or ([Ss]imple|[Aa]dvanced)} {
+		exp_send "simple\n"
+		exp_continue
+	    }
+	    "Connected to" {
+		exp_continue
+	    }
+	    "unknown host" {
+		exp_send "\003"
+		perror "telnet: unknown host"
+		break
+	    }
+	    "VxWorks Boot" {
+		exp_send "@\n"
+		sleep 20
+		exp_continue
+	    }
+	    -re "Escape character is.*\\.\[\r\n\]" {
+		    exp_continue
+	    }
+	    "has logged on from" {
+		exp_continue
+	    }
+	    "You have no Kerberos tickets" {
+		warning "telnet: no kerberos Tickets, please kinit"
+		break
+	    }
+	    -re "Connection refused.*$" {
+		catch "exp_send \"\003\"" foo
+		sleep 5
+		warning "telnet: connection refused."
+	    }
+	    -re "Sorry, this system is engaged.*" {
+		exp_send "\003"
+		warning "telnet: already connected."
+	    }
+	    "Connection closed by foreign host.*$" {
+		warning "telnet: connection closed by foreign host."
+		break
+	    }
+	    -re "\[\r\n\]+" {
+		exp_continue
+	    }
+	    timeout {
+		exp_send "\n"
+	    }
+	    eof {
+		warning "telnet: got unexpected EOF from telnet."
+		catch close
+		catch wait
+		set need_respawn 1
+		sleep 5
+	    }
+	}
+	incr tries
+    }
+
+    
+    verbose "spawn id is $spawn_id"
+    set board_info($dest,fileid) $spawn_id;
+    return $spawn_id
+}
+
+# Use telnet to spawn a session 
+proc telnet_gdbserver_spawn { dest username commandline } {
+    global board_info
+    set remote $dest
+    set telnet_prog "telnet"
+    set prompt [target_info shell_prompt]
+    set mport 23 
+    verbose "commandline is $commandline"
+    return [mynewtelnet_open_and_exec $remote $mport $prompt $commandline]
+}
+
+
+#
+# Use $RSH to spawn $commandline on remote machine $dest as user $username.
+# (Note $username on $dest will have to have appropriate .rhost entries.)
+#
+proc rsh_gdbserver_spawn { dest username commandline } {
+    global board_info
+
+    if [target_info exists rsh_prog] {
+	set RSH [target_info rsh_prog];
+    } else {
+        set RSH rsh
+    }
+
+    if [board_info $dest exists hostname] {
+	set remote [board_info $dest hostname];
+    } else {
+	set remote $dest;
+    }
+
+    if { $username == "" } {
+	set rsh_useropts ""
+    } else {
+	set rsh_useropts "-l"
+    }
+
+    verbose "spawn $RSH $rsh_useropts $username $remote $commandline";
+    spawn $RSH $rsh_useropts $username $remote $commandline;
+    set board_info($dest,fileid) $spawn_id;
+
+    set timeout 60
+    expect {
+	# expect output from $spawn_id
+	-i $spawn_id
+	-re "(.*No route to host)|(poll: protocol failure in circuit setup)|(.*Unknown host)|(.*Connection refused)|(Login incorrect)|(Permission denied)" {
+	    verbose -log "$RSH to $remote failed, output \"$expect_out(buffer)\""
+	    return -1
+	}
+	-re ".*\r" { }
+	timeout {
+	    verbose -log "$RSH to $remote timedout (timeout=$timeout)"
+	    return -1
+	}
+	eof {
+	    verbose -log "$RSH to $remote failed"	    
+	    return -1
+	}
+    }
+
+    return $spawn_id;
+}
+
+#
+# Download $srcfile to $destfile on $desthost as user $username using rcp.
+#
+
+proc gdbserver_download {desthost username srcfile destfile} {
+    if [target_info exists rsh_prog] {
+	set RSH [target_info rsh_prog];
+    } else {
+        set RSH rsh
+    }
+
+    if ![target_info exists rcp_prog] {
+        set RCP rcp
+    } else {
+	set RCP [target_info rcp_prog];
+    }
+
+    if [board_info $desthost exists name] {
+	set desthost [board_info $desthost name];
+    }
+
+    if [board_info $desthost exists hostname] {
+	set desthost [board_info $desthost hostname];
+    }
+
+    if { $username == "" } {
+	set rsh_useropts ""
+	set rcp_dest $desthost
+    } else {
+	set rsh_useropts "-l $username"
+	set rcp_dest "$username@$desthost"
+    }
+
+    # Delete the output file
+    # set status [catch "exec $RSH $rsh_useropts $desthost rm -f $destfile |& cat" output] 
+
+    if { $RCP != "cp" } {
+	set status [catch "exec $RCP $srcfile $rcp_dest:$destfile |& cat" output]
+    } else {
+	if [target_info exists nfsdir] {
+	    set nfsdir [target_info nfsdir];
+	    verbose -log "nfsdir is  $nfsdir"
+	    set status [catch "exec cp $srcfile $nfsdir/$destfile |& cat" output]
+	} else {
+	    verbose "\nnfsdir not set\n"
+	    set status 1
+	}
+    }
+    if { $status == 0 } {
+	if [target_info exists nfsdir] {
+	    verbose "Copied $srcfile to $nfsdir/$destfile" 2
+	    return $destfile;
+	} else {
+	    verbose "Copied $srcfile to $desthost:$destfile" 2
+	    return $destfile;
+	}
+    } else {
+	verbose "Download to $desthost failed, $output."
+	return ""
+    }
+}
diff --git a/gdb/testsuite/gdb.arch/arc-step-jtag.exp b/gdb/testsuite/gdb.arch/arc-step-jtag.exp
new file mode 100644
index 0000000..a51f00e
--- /dev/null
+++ b/gdb/testsuite/gdb.arch/arc-step-jtag.exp
@@ -0,0 +1,88 @@
+if $tracelevel {
+    strace $tracelevel
+}
+
+# Test single-stepping zero-overhead-loops and delay slots
+
+if ![istarget "arc-*-*"] then {
+    verbose "Skipping ARC single-step tests."
+    return
+}
+
+if ![istarget "*elf32*"] then {
+    verbose "Skipping ARC JTAG single-step tests."
+    return
+}
+
+set testfile "arc-step-jtag"
+set srcfile ${testfile}.s
+set binfile ${objdir}/${subdir}/${testfile}
+if { [gdb_compile "${srcdir}/${subdir}/${srcfile}" "${binfile}" executable ""] != "" } {
+    gdb_suppress_entire_file "Testcase compile failed, so all tests in this file will automatically fail."
+}
+
+gdb_exit
+gdb_start
+gdb_reinitialize_dir $srcdir/$subdir
+
+if { [ gdb_load ${binfile} ] != 0 } {
+    gdb_suppress_entire_file "Load failed, so all tests in this file will automatically fail."
+}
+
+#
+# Run to `main' where we begin our tests.
+#
+
+gdb_test "adv _main" 	".* in _main .*"  "advance to _main"
+
+gdb_test "stepi"     	".* Lmov .*"      "step mov instruction"
+gdb_test "p \$r0"    	".*= 1"           "r0 value after mov instruction"
+
+gdb_test "stepi"     	".* Lmov_s .*"    "step mov_s instruction"
+gdb_test "p \$r0"    	".*= 2"           "r0 value after mov_s instruction"
+
+gdb_test "stepi"     	".* Lb .*"        "step b instruction"
+
+gdb_test "stepi"     	".* Lb_s .*"      "step b_s instruction"
+
+gdb_test "stepi"     	".* Lbdotd_dslot .*"    "step b.d branch"
+gdb_test "stepi"     	".* Lbdotd .*"          "step b.d delay slot"
+gdb_test "p \$r0"    	".*= 5"                 "r0 value after b.d delay slot"
+
+gdb_test "stepi"     	".* Lbl .*"       "step bl instruction"
+
+gdb_test "stepi"     	".* Lj_sdotd_dslot .*"  "step j_s.d \[blink\] branch"
+gdb_test "stepi"     	".* Lj_sdotd .*"        "step j_s.d \[blink\] delay slot"
+gdb_test "p \$r0"    	".*= 6"                 "r0 value after j_s.d \[blink\] delay slot"
+
+gdb_test "stepi"     	".* Lj .*"        "step j instruction"
+
+gdb_test "stepi"     	".*"              "step mov instruction"
+gdb_test "stepi"     	".* ZOLstart .*"  "step lp instruction"
+
+gdb_test "p \$lp_count" ".*= 3"           "lp_count value"
+gdb_test "p \$lp_end - \$lp_start" \
+                        ".* = 8"          "lp_end - lp_start == 8"
+
+gdb_test "p \$r0"       ".* = 6"          "r0 value before loop"
+
+# step thru the loop, checking the value of r0
+
+# first iteration
+gdb_test "stepi"        ".* ZOLmiddle .*" "step add instruction (inside ZOL)"
+gdb_test "p \$r0"       ".* = 7"          "r0 value after 1 iteration"
+gdb_test "stepi"        ".* ZOLstart .*"  "step across end of ZOL"
+
+# second iteration
+gdb_test "stepi"        ".* ZOLmiddle .*" "step add instruction (inside ZOL)"
+gdb_test "p \$r0"       ".* = 8"          "r0 value after 2 iterations"
+gdb_test "stepi"        ".* ZOLstart .*"  "step across end of ZOL"
+
+# last iteration
+gdb_test "stepi"        ".* ZOLmiddle .*" "step add instruction (inside ZOL)"
+gdb_test "p \$r0"       ".* = 9"          "r0 value after 3 iterations"
+gdb_test "stepi"        ".* ZOLend .*"    "step out of end of ZOL"
+
+# exit(r0)
+gdb_test "continue"     ".*Program exited.*011.*" \
+                                          "value of r0 on exit"
diff --git a/gdb/testsuite/gdb.arch/arc-step-jtag.s b/gdb/testsuite/gdb.arch/arc-step-jtag.s
new file mode 100644
index 0000000..7ad8e1f
--- /dev/null
+++ b/gdb/testsuite/gdb.arch/arc-step-jtag.s
@@ -0,0 +1,46 @@
+_main:
+	.global _main
+main:	
+	.global main
+
+	mov   r0,1		; 32 bit instruction
+Lmov:	
+	mov_s r0,2		; 16 bit instruction
+Lmov_s:	
+	b Lb			; 32 bit, no delay slot
+	mov r0,3
+	nop
+Lb:	
+	b_s Lb_s		; 16 bit, no delay slot
+	mov r0,4
+	nop
+Lb_s:	
+	b.d Lbdotd		; 32 bit, delay slot
+Lbdotd_dslot:
+	mov r0,5
+	nop
+Lbdotd:
+
+	bl Lbl
+Lj_sdotd:
+	j Lj
+Lbl:	
+	j_s.d [blink]		; 16 bit, delay slot
+Lj_sdotd_dslot:
+	mov r0,6
+Lj:	
+	mov lp_count,3		; zero-overhead loop
+	lp ZOLend
+ZOLstart:
+	add r0,r0,1
+ZOLmiddle:
+	nop
+ZOLend:	
+	;; r0 should be 9
+	
+	
+	;; exit(r0)
+	flag 1
+	nop
+	nop
+	nop
diff --git a/gdb/testsuite/gdb.arch/arc-step.exp b/gdb/testsuite/gdb.arch/arc-step.exp
new file mode 100644
index 0000000..e958b5f
--- /dev/null
+++ b/gdb/testsuite/gdb.arch/arc-step.exp
@@ -0,0 +1,83 @@
+if $tracelevel {
+    strace $tracelevel
+}
+
+# Test single-stepping zero-overhead-loops and delay slots
+
+if ![istarget "arc-*-*"] then {
+    verbose "Skipping ARC single-step tests."
+    return
+}
+
+if ![istarget "*linux*"] then {
+    verbose "Skipping ARC linux single-step tests."
+    return
+}
+
+set testfile "arc-step"
+set srcfile ${testfile}.s
+set binfile ${objdir}/${subdir}/${testfile}
+if { [gdb_compile "${srcdir}/${subdir}/${srcfile}" "${binfile}" executable ""] != "" } {
+    gdb_suppress_entire_file "Testcase compile failed, so all tests in this file will automatically fail."
+}
+
+gdb_exit
+gdb_start
+gdb_reinitialize_dir $srcdir/$subdir
+gdb_load ${binfile}
+
+#
+# Run to `main' where we begin our tests.
+#
+
+gdb_test "adv _main" 	".* in _main .*"  "advance to _main"
+
+gdb_test "stepi"     	".* Lmov .*"      "step mov instruction"
+gdb_test "p \$r0"    	".*= 1"           "r0 value after mov instruction"
+
+gdb_test "stepi"     	".* Lmov_s .*"    "step mov_s instruction"
+gdb_test "p \$r0"    	".*= 2"           "r0 value after mov_s instruction"
+
+gdb_test "stepi"     	".* Lb .*"        "step b instruction"
+
+gdb_test "stepi"     	".* Lb_s .*"      "step b_s instruction"
+
+gdb_test "stepi"     	".* Lbdotd .*"    "step b.d instruction"
+gdb_test "p \$r0"    	".*= 5"           "r0 value after b.d instruction"
+
+gdb_test "stepi"     	".* Lbl .*"       "step bl instruction"
+
+gdb_test "stepi"     	".* Lj_sdotd .*"  "step j_s.d \[blink\] instruction"
+gdb_test "p \$r0"    	".*= 6"           "r0 value after j_s.d \[blink\] instruction"
+
+gdb_test "stepi"     	".* Lj .*"        "step j instruction"
+
+gdb_test "stepi"     	".*"              "step mov instruction"
+gdb_test "stepi"     	".* ZOLstart .*"  "step lp instruction"
+
+gdb_test "p \$lp_count" ".*= 3"           "lp_count value"
+gdb_test "p \$lp_end - \$lp_start" \
+                        ".* = 8"          "lp_end - lp_start == 8"
+
+gdb_test "p \$r0"       ".* = 6"          "r0 value before loop"
+
+# step thru the loop, checking the value of r0
+
+# first iteration
+gdb_test "stepi"        ".* ZOLmiddle .*" "step add instruction (inside ZOL)"
+gdb_test "p \$r0"       ".* = 7"          "r0 value after 1 iteration"
+gdb_test "stepi"        ".* ZOLstart .*"  "step across end of ZOL"
+
+# second iteration
+gdb_test "stepi"        ".* ZOLmiddle .*" "step add instruction (inside ZOL)"
+gdb_test "p \$r0"       ".* = 8"          "r0 value after 1 iteration"
+gdb_test "stepi"        ".* ZOLstart .*"  "step across end of ZOL"
+
+# last iteration
+gdb_test "stepi"        ".* ZOLmiddle .*" "step add instruction (inside ZOL)"
+gdb_test "p \$r0"       ".* = 9"          "r0 value after 1 iteration"
+gdb_test "stepi"        ".* ZOLend .*"    "step out of end of ZOL"
+
+# exit(r0)
+gdb_test "continue"     ".*Program exited.*011.*" \
+                                          "value of r0 on exit"
diff --git a/gdb/testsuite/gdb.arch/arc-step.s b/gdb/testsuite/gdb.arch/arc-step.s
new file mode 100644
index 0000000..8dce39a
--- /dev/null
+++ b/gdb/testsuite/gdb.arch/arc-step.s
@@ -0,0 +1,43 @@
+_main:
+	.global _main
+main:	
+	.global main
+
+	mov   r0,1		; 32 bit instruction
+Lmov:	
+	mov_s r0,2		; 16 bit instruction
+Lmov_s:	
+	b Lb			; 32 bit, no delay slot
+	mov r0,3
+	nop
+Lb:	
+	b_s Lb_s		; 16 bit, no delay slot
+	mov r0,4
+	nop
+Lb_s:	
+	b.d Lbdotd		; 32 bit, delay slot
+	mov r0,5
+	nop
+Lbdotd:
+
+	bl Lbl
+Lj_sdotd:
+	j Lj
+Lbl:	
+	j_s.d [blink]		; 16 bit, delay slot
+	mov r0,6
+Lj:	
+	mov lp_count,3		; zero-overhead loop
+	lp ZOLend
+ZOLstart:
+	add r0,r0,1
+ZOLmiddle:
+	nop
+ZOLend:	
+	;; r0 should be 9
+	
+	
+	;; exit(r0)
+	;; mov r0,0
+	mov r8,1
+	trap_s 0
diff --git a/gdb/testsuite/gdb.asm/arc.inc b/gdb/testsuite/gdb.asm/arc.inc
new file mode 100644
index 0000000..e22c35c
--- /dev/null
+++ b/gdb/testsuite/gdb.asm/arc.inc
@@ -0,0 +1,55 @@
+
+	comment "subroutine prologue"
+	.macro gdbasm_enter
+	st.a    blink,[sp,-4]
+	st.a	fp, [sp,-4]
+	mov	fp,sp
+	.endm
+
+	comment "subroutine epilogue"
+	.macro gdbasm_leave
+	ld.ab  fp, [sp,4]
+	ld     blink,[sp,0]
+	j.d    [blink]
+	add    sp,sp,4
+	.endm
+
+	.macro gdbasm_call subr
+	bl	\subr
+	.endm
+
+	.macro gdbasm_several_nops
+	nop
+	nop
+	nop
+	nop
+	.endm
+
+	comment "exit (0)"
+	.macro gdbasm_exit0
+	mov_s    r0,0
+	trap_s	 0
+	.endm
+
+	comment "crt0 startup"
+	.macro gdbasm_startup
+	mov    fp, 0
+	.endm
+
+	comment "Declare a data variable"
+	.macro gdbasm_datavar name value
+	.data
+\name:
+	.long	\value
+	.endm
+
+	comment "Declare the start of a subroutine"
+	.macro gdbasm_declare name
+	.type	\name, @function
+\name:
+	.endm
+
+	comment "End a subroutine"
+	.macro gdbasm_end name
+	.size	\name, .-name
+	.endm
diff --git a/gdb/testsuite/lib/arc-gdbserver.exp b/gdb/testsuite/lib/arc-gdbserver.exp
new file mode 100644
index 0000000..6674e92
--- /dev/null
+++ b/gdb/testsuite/lib/arc-gdbserver.exp
@@ -0,0 +1,98 @@
+# Copyright (C) 1997, 1998, 1999, 2000, 2001, 2002, 2003 Free Software
+# Foundation, Inc.
+#
+# This file is part of DejaGnu.
+#
+# DejaGnu 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 of the License, or
+# (at your option) any later version.
+#
+# DejaGnu 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 DejaGnu; if not, write to the Free Software Foundation,
+# Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+
+# gdbserver running cross
+
+#load the config file
+load_generic_config "remote-gdbserver"
+
+
+process_multilib_options ""
+
+# The default compiler for this target.
+set_board_info compiler  "$env(GDBTEST_CC)"
+set_board_info cflags    "$env(GDBTEST_CFLAGS)"
+set_board_info assembler "$env(GDBTEST_AS) $env(GDBTEST_ASFLAGS)"
+set_board_info linker    "$env(GDBTEST_LD)" 
+set_board_info ldflags   "$env(GDBTEST_LDFLAGS)"
+
+# We will be using the standard GDB remote protocol
+set_board_info gdb_protocol "remote"
+
+set_board_info netport "$env(GDBTEST_GDBSERVER_HOST):$env(GDBTEST_GDBSERVER_PORT)"
+
+# Path to the gdbserver executable, if required.
+set_board_info gdb_server_prog $env(GDBTEST_GDBSERVER_PATH)
+#    "../gdbserver/gdbserver"
+
+# Name of the computer whose socket will be used, if required.
+set_board_info sockethost "$env(GDBTEST_GDBSERVER_HOST):"
+
+# Port ID to use for socket connection
+set_board_info gdb,socketport $env(GDBTEST_GDBSERVER_PORT)
+
+# Use techniques appropriate to a stub
+set_board_info use_gdb_stub 1
+
+# This gdbserver can only run a process once per session.
+set_board_info gdb,do_reload_on_run 1
+
+# There's no support for argument-passing (yet).
+set_board_info noargs 1
+
+# Can't do FILE IO in current gdbserver
+set_board_info gdb,nofileio 1
+
+# Can't do input (or output) in the current gdbserver.
+set_board_info gdb,noinferiorio 1
+
+# Can't do hardware watchpoints, in general
+set_board_info gdb,no_hardware_watchpoints 1
+
+# Copy the testcases using cp 
+set_board_info rcp_prog "cp"
+
+
+# Set nfs directory 
+# On my machine this is how it is mounted. - ramana
+# kanika:/home/opt/share on /mnt/nfsmounts type nfs (rw,addr=192.168.100.68)
+set_board_info nfsdir $env(GDBTEST_NFSDIR)
+
+# Set the test directory on the board. Where is this mounted 
+# on the board. 
+set_board_info tests_dir $env(GDBTEST_TESTS_DIR)
+
+# run on target using rsh
+set_board_info rsh_prog "rsh"
+
+# Download directory
+set_board_info download_dir $env(GDBTEST_DOWNLOAD_DIR)
+
+# Hostname 
+set_board_info hostname $env(GDBTEST_GDBSERVER_HOST)
+set_board_info username "root"
+set_board_info sockethost "$env(GDBTEST_GDBSERVER_HOST):"
+
+#Shell prompt
+set_board_info shell_prompt "\[arcLinux\]$"
+
+#set_board_info board,connect "telnet"
+
+# timeout
+#set_board_info gdb,timeout 300
diff --git a/gdb/testsuite/lib/arc-jtag.exp b/gdb/testsuite/lib/arc-jtag.exp
new file mode 100644
index 0000000..c613f30
--- /dev/null
+++ b/gdb/testsuite/lib/arc-jtag.exp
@@ -0,0 +1,32 @@
+#
+# The baseboard file for the arcjtag target
+#
+
+load_generic_config "arc-jtag"
+
+set_board_info compiler  "$env(GDBTEST_CC)"
+set_board_info cflags    "$env(GDBTEST_CFLAGS)"
+set_board_info assembler "$env(GDBTEST_AS) $env(GDBTEST_ASFLAGS)"
+set_board_info linker    "$env(GDBTEST_LD)"
+set_board_info ldflags   "$env(GDBTEST_LDFLAGS)"
+
+#Reload the file before running
+set_board_info gdb,do_reload_on_run 1
+
+#Arguments cannot be passed
+set_board_info noargs               1
+
+#File IO not supported
+set_board_info gdb,nofileio         1
+
+#Inferior is unable to do I/O
+set_board_info gdb,noinferiorio     1
+
+#Signals not supported
+set_board_info gdb,nosignals        1
+
+#Skip the huge.exp test
+set_board_info gdb,skip_huge_test   1
+
+#We use "target arcjtag" to talk to JTAG
+set_board_info gdb_protocol         "arcjtag"
diff --git a/gdb/testsuite/lib/telnet-exec.exp b/gdb/testsuite/lib/telnet-exec.exp
new file mode 100644
index 0000000..8bbaa8d
--- /dev/null
+++ b/gdb/testsuite/lib/telnet-exec.exp
@@ -0,0 +1,29 @@
+#!/usr/bin/expect -f 
+
+#
+#
+#
+
+
+set host "192.168.100.222"
+set debuggee [lindex $argv 0]
+
+set timeout 360
+set env(TERM) vt100;			# actual value doesn't matter, just has to be set
+
+spawn telnet $host
+sleep 1;				# wait for telnet to happen
+send "PS1=\\# \r"
+expect "\# "
+#expect "\[arcLinux\]\$"
+#send_user "one\n"
+
+
+send "cd /nfs/gdbserver-tests/ \r"
+expect "\# "
+#expect "\[arcLinux\]\$"
+send_user "starting gdbserver...\n"
+send "./gdbserver host:4004 /nfs/gdbserver-tests/ramana-tests/a-4004.out \r"
+
+expect "xxx"
+send "exit"
\ No newline at end of file
diff --git a/include/elf/ChangeLog.codito b/include/elf/ChangeLog.codito
new file mode 100644
index 0000000..d30c7c4
--- /dev/null
+++ b/include/elf/ChangeLog.codito
@@ -0,0 +1,8 @@
+2005-05-15  Ramana Radhakrishnan  <ramana@codito.com>
+
+	* arc.h: Merge new ELF relocs.
+
+2005-05-12  Ramana Radhakrishnan  <ramana@codito.com>
+
+	* dwarf2.h: Add Metaware specific CFA info. 
+
diff --git a/opcodes/ChangeLog.codito b/opcodes/ChangeLog.codito
new file mode 100644
index 0000000..253e0df
--- /dev/null
+++ b/opcodes/ChangeLog.codito
@@ -0,0 +1,16 @@
+2006-03-03  Ashwin Pathmudi  <ashwin.pathmudi@codito.com>
+
+	* arc-dis.c (a4AnalyzeInstr): New. Disassembler function
+	called by gdb for the a4 core.  
+
+2005-03-30  Ramana Radhakrishnan  <ramana.radhakrishnan@codito.com>
+
+	* arcompact-dis.c(dsmOneArcInst): Update ARC register information
+	for the debugger.
+	* include/opcode/arc.h: Update struct arcDisState to contain
+	information about the targets of operands.
+
+2005-03-07  Ramana Radhakrishnan  <ramana.radhakrishnan@codito.com>
+
+	* arcompact-dis.c(dsmOneArcInst):Update address
+	writeback for the debugger. 
diff --git a/opcodes/arc-asm.c b/opcodes/arc-asm.c
new file mode 100644
index 0000000..498a7fd
--- /dev/null
+++ b/opcodes/arc-asm.c
@@ -0,0 +1,898 @@
+/* Assembler interface for targets using CGEN. -*- C -*-
+   CGEN: Cpu tools GENerator
+
+   THIS FILE IS MACHINE GENERATED WITH CGEN.
+   - the resultant file is machine generated, cgen-asm.in isn't
+
+   Copyright 1996, 1997, 1998, 1999, 2000, 2001, 2005, 2007
+   Free Software Foundation, Inc.
+
+   This file is part of libopcodes.
+
+   This library 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 3, or (at your option)
+   any later version.
+
+   It 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 this program; if not, write to the Free Software Foundation, Inc.,
+   51 Franklin Street - Fifth Floor, Boston, MA 02110-1301, USA.  */
+
+
+/* ??? Eventually more and more of this stuff can go to cpu-independent files.
+   Keep that in mind.  */
+
+#include "sysdep.h"
+#include <stdio.h>
+#include "ansidecl.h"
+#include "bfd.h"
+#include "symcat.h"
+#include "arc-desc.h"
+#include "arc-opc.h"
+#include "opintl.h"
+#include "xregex.h"
+#include "libiberty.h"
+#include "safe-ctype.h"
+
+#undef  min
+#define min(a,b) ((a) < (b) ? (a) : (b))
+#undef  max
+#define max(a,b) ((a) > (b) ? (a) : (b))
+
+static const char * parse_insn_normal
+  (CGEN_CPU_DESC, const CGEN_INSN *, const char **, CGEN_FIELDS *);
+
+/* -- assembler routines inserted here.  */
+
+/* -- asm.c */
+#if 0
+static const char * MISSING_CLOSING_PARENTHESIS = N_("missing `)'");
+
+/* Handle '#' prefixes (i.e. skip over them).  */
+
+static const char *
+parse_hash (CGEN_CPU_DESC cd ATTRIBUTE_UNUSED,
+	    const char **strp,
+	    int opindex ATTRIBUTE_UNUSED,
+	    long *valuep ATTRIBUTE_UNUSED)
+{
+  if (**strp == '#')
+    ++*strp;
+  return NULL;
+}
+
+/* Handle shigh(), high().  */
+
+static const char *
+parse_hi16 (CGEN_CPU_DESC cd,
+	    const char **strp,
+	    int opindex,
+	    unsigned long *valuep)
+{
+  const char *errmsg;
+  enum cgen_parse_operand_result result_type;
+  bfd_vma value;
+
+  if (**strp == '#')
+    ++*strp;
+
+  if (strncasecmp (*strp, "high(", 5) == 0)
+    {
+      *strp += 5;
+      errmsg = cgen_parse_address (cd, strp, opindex, BFD_RELOC_M32R_HI16_ULO,
+				   & result_type, & value);
+      if (**strp != ')')
+	return MISSING_CLOSING_PARENTHESIS;
+      ++*strp;
+      if (errmsg == NULL
+  	  && result_type == CGEN_PARSE_OPERAND_RESULT_NUMBER)
+	{
+	  value >>= 16;
+	  value &= 0xffff;
+	}
+      *valuep = value;
+      return errmsg;
+    }
+  else if (strncasecmp (*strp, "shigh(", 6) == 0)
+    {
+      *strp += 6;
+      errmsg = cgen_parse_address (cd, strp, opindex, BFD_RELOC_M32R_HI16_SLO,
+ 				   & result_type, & value);
+      if (**strp != ')')
+	return MISSING_CLOSING_PARENTHESIS;
+      ++*strp;
+      if (errmsg == NULL
+	  && result_type == CGEN_PARSE_OPERAND_RESULT_NUMBER)
+        {
+          value += 0x8000;
+          value >>= 16;
+	  value &= 0xffff;
+        }
+      *valuep = value;
+      return errmsg;
+    }
+
+  return cgen_parse_unsigned_integer (cd, strp, opindex, valuep);
+}
+
+/* Handle low() in a signed context.  Also handle sda().
+   The signedness of the value doesn't matter to low(), but this also
+   handles the case where low() isn't present.  */
+
+static const char *
+parse_slo16 (CGEN_CPU_DESC cd,
+	     const char ** strp,
+	     int opindex,
+	     long * valuep)
+{
+  const char *errmsg;
+  enum cgen_parse_operand_result result_type;
+  bfd_vma value;
+
+  if (**strp == '#')
+    ++*strp;
+
+  if (strncasecmp (*strp, "low(", 4) == 0)
+    {
+      *strp += 4;
+      errmsg = cgen_parse_address (cd, strp, opindex, BFD_RELOC_M32R_LO16,
+				   & result_type, & value);
+      if (**strp != ')')
+	return MISSING_CLOSING_PARENTHESIS;
+      ++*strp;
+      if (errmsg == NULL
+	  && result_type == CGEN_PARSE_OPERAND_RESULT_NUMBER)
+	value = ((value & 0xffff) ^ 0x8000) - 0x8000;
+      *valuep = value;
+      return errmsg;
+    }
+
+  if (strncasecmp (*strp, "sda(", 4) == 0)
+    {
+      *strp += 4;
+      errmsg = cgen_parse_address (cd, strp, opindex, BFD_RELOC_M32R_SDA16,
+				   NULL, & value);
+      if (**strp != ')')
+	return MISSING_CLOSING_PARENTHESIS;
+      ++*strp;
+      *valuep = value;
+      return errmsg;
+    }
+
+  return cgen_parse_signed_integer (cd, strp, opindex, valuep);
+}
+
+/* Handle low() in an unsigned context.
+   The signedness of the value doesn't matter to low(), but this also
+   handles the case where low() isn't present.  */
+
+static const char *
+parse_ulo16 (CGEN_CPU_DESC cd,
+	     const char **strp,
+	     int opindex,
+	     unsigned long *valuep)
+{
+  const char *errmsg;
+  enum cgen_parse_operand_result result_type;
+  bfd_vma value;
+
+  if (**strp == '#')
+    ++*strp;
+
+  if (strncasecmp (*strp, "low(", 4) == 0)
+    {
+      *strp += 4;
+      errmsg = cgen_parse_address (cd, strp, opindex, BFD_RELOC_M32R_LO16,
+				   & result_type, & value);
+      if (**strp != ')')
+	return MISSING_CLOSING_PARENTHESIS;
+      ++*strp;
+      if (errmsg == NULL
+	  && result_type == CGEN_PARSE_OPERAND_RESULT_NUMBER)
+	value &= 0xffff;
+      *valuep = value;
+      return errmsg;
+    }
+
+  return cgen_parse_unsigned_integer (cd, strp, opindex, valuep);
+}
+#endif
+
+/* -- */
+
+const char * arc_cgen_parse_operand
+  (CGEN_CPU_DESC, int, const char **, CGEN_FIELDS *);
+
+/* Main entry point for operand parsing.
+
+   This function is basically just a big switch statement.  Earlier versions
+   used tables to look up the function to use, but
+   - if the table contains both assembler and disassembler functions then
+     the disassembler contains much of the assembler and vice-versa,
+   - there's a lot of inlining possibilities as things grow,
+   - using a switch statement avoids the function call overhead.
+
+   This function could be moved into `parse_insn_normal', but keeping it
+   separate makes clear the interface between `parse_insn_normal' and each of
+   the handlers.  */
+
+const char *
+arc_cgen_parse_operand (CGEN_CPU_DESC cd,
+			   int opindex,
+			   const char ** strp,
+			   CGEN_FIELDS * fields)
+{
+  const char * errmsg = NULL;
+  /* Used by scalar operands that still need to be parsed.  */
+  long junk ATTRIBUTE_UNUSED;
+
+  switch (opindex)
+    {
+    case ARC_OPERAND_EXDI :
+      errmsg = cgen_parse_keyword (cd, strp, & arc_cgen_opval_h_Di, & fields->f_F);
+      break;
+    case ARC_OPERAND_F :
+      errmsg = cgen_parse_keyword (cd, strp, & arc_cgen_opval_h_uflags, & fields->f_F);
+      break;
+    case ARC_OPERAND_F0 :
+      errmsg = cgen_parse_keyword (cd, strp, & arc_cgen_opval_h_nil, & fields->f_F);
+      break;
+    case ARC_OPERAND_F1 :
+      errmsg = cgen_parse_keyword (cd, strp, & arc_cgen_opval_h_auflags, & fields->f_F);
+      break;
+    case ARC_OPERAND_F1F :
+      errmsg = cgen_parse_keyword (cd, strp, & arc_cgen_opval_h_aufflags, & fields->f_F);
+      break;
+    case ARC_OPERAND_GP :
+      errmsg = cgen_parse_keyword (cd, strp, & arc_cgen_opval_h_gp, & junk);
+      break;
+    case ARC_OPERAND_LDODI :
+      errmsg = cgen_parse_keyword (cd, strp, & arc_cgen_opval_h_Di, & fields->f_LDODi);
+      break;
+    case ARC_OPERAND_LDRDI :
+      errmsg = cgen_parse_keyword (cd, strp, & arc_cgen_opval_h_Di, & fields->f_LDRDi);
+      break;
+    case ARC_OPERAND_NE :
+      errmsg = cgen_parse_keyword (cd, strp, & arc_cgen_opval_h_ne, & junk);
+      break;
+    case ARC_OPERAND_PCL :
+      errmsg = cgen_parse_keyword (cd, strp, & arc_cgen_opval_h_pcl, & junk);
+      break;
+    case ARC_OPERAND_QCONDB :
+      errmsg = cgen_parse_keyword (cd, strp, & arc_cgen_opval_h_Qcondb, & fields->f_cond_Q);
+      break;
+    case ARC_OPERAND_QCONDI :
+      errmsg = cgen_parse_keyword (cd, strp, & arc_cgen_opval_h_Qcondi, & fields->f_cond_Q);
+      break;
+    case ARC_OPERAND_QCONDJ :
+      errmsg = cgen_parse_keyword (cd, strp, & arc_cgen_opval_h_Qcondj, & fields->f_cond_Q);
+      break;
+    case ARC_OPERAND_R0 :
+      errmsg = cgen_parse_keyword (cd, strp, & arc_cgen_opval_h_r0, & junk);
+      break;
+    case ARC_OPERAND_R31 :
+      errmsg = cgen_parse_keyword (cd, strp, & arc_cgen_opval_h_r31, & junk);
+      break;
+    case ARC_OPERAND_RA :
+      errmsg = cgen_parse_keyword (cd, strp, & arc_cgen_opval_cr_names, & fields->f_op_A);
+      break;
+    case ARC_OPERAND_RA_0 :
+      errmsg = cgen_parse_keyword (cd, strp, & arc_cgen_opval_h_nil, & fields->f_op_A);
+      break;
+    case ARC_OPERAND_RB :
+      errmsg = cgen_parse_keyword (cd, strp, & arc_cgen_opval_cr_names, & fields->f_op_B);
+      break;
+    case ARC_OPERAND_RB_0 :
+      errmsg = cgen_parse_keyword (cd, strp, & arc_cgen_opval_h_nil, & fields->f_op_B);
+      break;
+    case ARC_OPERAND_RC :
+      errmsg = cgen_parse_keyword (cd, strp, & arc_cgen_opval_cr_names, & fields->f_op_C);
+      break;
+    case ARC_OPERAND_RC_ILINK :
+      errmsg = cgen_parse_keyword (cd, strp, & arc_cgen_opval_h_ilinkx, & fields->f_op_Cj);
+      break;
+    case ARC_OPERAND_RC_NOILINK :
+      errmsg = cgen_parse_keyword (cd, strp, & arc_cgen_opval_h_noilink, & fields->f_op_Cj);
+      break;
+    case ARC_OPERAND_R_A :
+      errmsg = cgen_parse_keyword (cd, strp, & arc_cgen_opval_h_cr16, & fields->f_op__a);
+      break;
+    case ARC_OPERAND_R_B :
+      errmsg = cgen_parse_keyword (cd, strp, & arc_cgen_opval_h_cr16, & fields->f_op__b);
+      break;
+    case ARC_OPERAND_R_C :
+      errmsg = cgen_parse_keyword (cd, strp, & arc_cgen_opval_h_cr16, & fields->f_op__c);
+      break;
+    case ARC_OPERAND_RCC :
+      errmsg = cgen_parse_keyword (cd, strp, & arc_cgen_opval_h_Rcc, & fields->f_brcond);
+      break;
+    case ARC_OPERAND_RCCS :
+      errmsg = cgen_parse_keyword (cd, strp, & arc_cgen_opval_h_RccS, & fields->f_brscond);
+      break;
+    case ARC_OPERAND_RH :
+      errmsg = cgen_parse_keyword (cd, strp, & arc_cgen_opval_cr_names, & fields->f_op_h);
+      break;
+    case ARC_OPERAND_SP :
+      errmsg = cgen_parse_keyword (cd, strp, & arc_cgen_opval_h_sp, & junk);
+      break;
+    case ARC_OPERAND_STODI :
+      errmsg = cgen_parse_keyword (cd, strp, & arc_cgen_opval_h_Di, & fields->f_STODi);
+      break;
+    case ARC_OPERAND_U6 :
+      errmsg = cgen_parse_unsigned_integer (cd, strp, ARC_OPERAND_U6, (unsigned long *) (& fields->f_u6));
+      break;
+    case ARC_OPERAND_U6X2 :
+      errmsg = cgen_parse_unsigned_integer (cd, strp, ARC_OPERAND_U6X2, (unsigned long *) (& fields->f_u6x2));
+      break;
+    case ARC_OPERAND__AW :
+      errmsg = cgen_parse_keyword (cd, strp, & arc_cgen_opval_h__aw, & junk);
+      break;
+    case ARC_OPERAND__L :
+      errmsg = cgen_parse_keyword (cd, strp, & arc_cgen_opval_h_insn32, & junk);
+      break;
+    case ARC_OPERAND__S :
+      errmsg = cgen_parse_keyword (cd, strp, & arc_cgen_opval_h_insn16, & junk);
+      break;
+    case ARC_OPERAND_CBIT :
+      errmsg = cgen_parse_unsigned_integer (cd, strp, ARC_OPERAND_CBIT, (unsigned long *) (& junk));
+      break;
+    case ARC_OPERAND_DELAY_N :
+      errmsg = cgen_parse_keyword (cd, strp, & arc_cgen_opval_h_delay, & fields->f_delay_N);
+      break;
+    case ARC_OPERAND_DUMMY_OP :
+      errmsg = cgen_parse_unsigned_integer (cd, strp, ARC_OPERAND_DUMMY_OP, (unsigned long *) (& fields->f_dummy));
+      break;
+    case ARC_OPERAND_I2COND :
+      errmsg = cgen_parse_keyword (cd, strp, & arc_cgen_opval_h_i2cond, & fields->f_cond_i2);
+      break;
+    case ARC_OPERAND_I3COND :
+      errmsg = cgen_parse_keyword (cd, strp, & arc_cgen_opval_h_i3cond, & fields->f_cond_i3);
+      break;
+    case ARC_OPERAND_LABEL10 :
+      {
+        bfd_vma value = 0;
+        errmsg = cgen_parse_address (cd, strp, ARC_OPERAND_LABEL10, 0, NULL,  & value);
+        fields->f_rel10 = value;
+      }
+      break;
+    case ARC_OPERAND_LABEL13A :
+      {
+        bfd_vma value = 0;
+        errmsg = cgen_parse_address (cd, strp, ARC_OPERAND_LABEL13A, 0, NULL,  & value);
+        fields->f_rel13bl = value;
+      }
+      break;
+    case ARC_OPERAND_LABEL21 :
+      {
+        bfd_vma value = 0;
+        errmsg = cgen_parse_address (cd, strp, ARC_OPERAND_LABEL21, 0, NULL,  & value);
+        fields->f_rel21 = value;
+      }
+      break;
+    case ARC_OPERAND_LABEL21A :
+      {
+        bfd_vma value = 0;
+        errmsg = cgen_parse_address (cd, strp, ARC_OPERAND_LABEL21A, 0, NULL,  & value);
+        fields->f_rel21bl = value;
+      }
+      break;
+    case ARC_OPERAND_LABEL25 :
+      {
+        bfd_vma value = 0;
+        errmsg = cgen_parse_address (cd, strp, ARC_OPERAND_LABEL25, 0, NULL,  & value);
+        fields->f_rel25 = value;
+      }
+      break;
+    case ARC_OPERAND_LABEL25A :
+      {
+        bfd_vma value = 0;
+        errmsg = cgen_parse_address (cd, strp, ARC_OPERAND_LABEL25A, 0, NULL,  & value);
+        fields->f_rel25bl = value;
+      }
+      break;
+    case ARC_OPERAND_LABEL7 :
+      {
+        bfd_vma value = 0;
+        errmsg = cgen_parse_address (cd, strp, ARC_OPERAND_LABEL7, 0, NULL,  & value);
+        fields->f_rel7 = value;
+      }
+      break;
+    case ARC_OPERAND_LABEL8 :
+      {
+        bfd_vma value = 0;
+        errmsg = cgen_parse_address (cd, strp, ARC_OPERAND_LABEL8, 0, NULL,  & value);
+        fields->f_rel8 = value;
+      }
+      break;
+    case ARC_OPERAND_LABEL9 :
+      {
+        bfd_vma value = 0;
+        errmsg = cgen_parse_address (cd, strp, ARC_OPERAND_LABEL9, 0, NULL,  & value);
+        fields->f_rel9 = value;
+      }
+      break;
+    case ARC_OPERAND_LBIT :
+      errmsg = cgen_parse_unsigned_integer (cd, strp, ARC_OPERAND_LBIT, (unsigned long *) (& junk));
+      break;
+    case ARC_OPERAND_NBIT :
+      errmsg = cgen_parse_unsigned_integer (cd, strp, ARC_OPERAND_NBIT, (unsigned long *) (& junk));
+      break;
+    case ARC_OPERAND_S12 :
+      errmsg = cgen_parse_signed_integer (cd, strp, ARC_OPERAND_S12, (long *) (& fields->f_s12));
+      break;
+    case ARC_OPERAND_S12X2 :
+      errmsg = cgen_parse_signed_integer (cd, strp, ARC_OPERAND_S12X2, (long *) (& fields->f_s12x2));
+      break;
+    case ARC_OPERAND_S1BIT :
+      errmsg = cgen_parse_unsigned_integer (cd, strp, ARC_OPERAND_S1BIT, (unsigned long *) (& junk));
+      break;
+    case ARC_OPERAND_S2BIT :
+      errmsg = cgen_parse_unsigned_integer (cd, strp, ARC_OPERAND_S2BIT, (unsigned long *) (& junk));
+      break;
+    case ARC_OPERAND_S9 :
+      errmsg = cgen_parse_signed_integer (cd, strp, ARC_OPERAND_S9, (long *) (& fields->f_s9));
+      break;
+    case ARC_OPERAND_S9X4 :
+      errmsg = cgen_parse_unsigned_integer (cd, strp, ARC_OPERAND_S9X4, (unsigned long *) (& fields->f_s9x4));
+      break;
+    case ARC_OPERAND_SC_S9_ :
+      errmsg = cgen_parse_unsigned_integer (cd, strp, ARC_OPERAND_SC_S9_, (unsigned long *) (& fields->f_s9x4));
+      break;
+    case ARC_OPERAND_SC_S9B :
+      errmsg = cgen_parse_unsigned_integer (cd, strp, ARC_OPERAND_SC_S9B, (unsigned long *) (& fields->f_s9x1));
+      break;
+    case ARC_OPERAND_SC_S9W :
+      errmsg = cgen_parse_unsigned_integer (cd, strp, ARC_OPERAND_SC_S9W, (unsigned long *) (& fields->f_s9x2));
+      break;
+    case ARC_OPERAND_SC_U5_ :
+      errmsg = cgen_parse_unsigned_integer (cd, strp, ARC_OPERAND_SC_U5_, (unsigned long *) (& fields->f_u5x4));
+      break;
+    case ARC_OPERAND_SC_U5B :
+      errmsg = cgen_parse_unsigned_integer (cd, strp, ARC_OPERAND_SC_U5B, (unsigned long *) (& fields->f_u5));
+      break;
+    case ARC_OPERAND_SC_U5W :
+      errmsg = cgen_parse_unsigned_integer (cd, strp, ARC_OPERAND_SC_U5W, (unsigned long *) (& fields->f_u5x2));
+      break;
+    case ARC_OPERAND_TRAPNUM :
+      errmsg = cgen_parse_unsigned_integer (cd, strp, ARC_OPERAND_TRAPNUM, (unsigned long *) (& fields->f_trapnum));
+      break;
+    case ARC_OPERAND_U3 :
+      errmsg = cgen_parse_unsigned_integer (cd, strp, ARC_OPERAND_U3, (unsigned long *) (& fields->f_u3));
+      break;
+    case ARC_OPERAND_U5 :
+      errmsg = cgen_parse_unsigned_integer (cd, strp, ARC_OPERAND_U5, (unsigned long *) (& fields->f_u5));
+      break;
+    case ARC_OPERAND_U5X4 :
+      errmsg = cgen_parse_unsigned_integer (cd, strp, ARC_OPERAND_U5X4, (unsigned long *) (& fields->f_u5x4));
+      break;
+    case ARC_OPERAND_U7 :
+      errmsg = cgen_parse_unsigned_integer (cd, strp, ARC_OPERAND_U7, (unsigned long *) (& fields->f_u7));
+      break;
+    case ARC_OPERAND_U8 :
+      errmsg = cgen_parse_unsigned_integer (cd, strp, ARC_OPERAND_U8, (unsigned long *) (& fields->f_u8));
+      break;
+    case ARC_OPERAND_U8X4 :
+      errmsg = cgen_parse_unsigned_integer (cd, strp, ARC_OPERAND_U8X4, (unsigned long *) (& fields->f_u8x4));
+      break;
+    case ARC_OPERAND_UNCONDB :
+      errmsg = cgen_parse_keyword (cd, strp, & arc_cgen_opval_h_uncondb, & junk);
+      break;
+    case ARC_OPERAND_UNCONDI :
+      errmsg = cgen_parse_keyword (cd, strp, & arc_cgen_opval_h_uncondi, & junk);
+      break;
+    case ARC_OPERAND_UNCONDJ :
+      errmsg = cgen_parse_keyword (cd, strp, & arc_cgen_opval_h_uncondj, & junk);
+      break;
+    case ARC_OPERAND_VBIT :
+      errmsg = cgen_parse_unsigned_integer (cd, strp, ARC_OPERAND_VBIT, (unsigned long *) (& junk));
+      break;
+    case ARC_OPERAND_ZBIT :
+      errmsg = cgen_parse_unsigned_integer (cd, strp, ARC_OPERAND_ZBIT, (unsigned long *) (& junk));
+      break;
+
+    default :
+      /* xgettext:c-format */
+      fprintf (stderr, _("Unrecognized field %d while parsing.\n"), opindex);
+      abort ();
+  }
+
+  return errmsg;
+}
+
+cgen_parse_fn * const arc_cgen_parse_handlers[] = 
+{
+  parse_insn_normal,
+};
+
+void
+arc_cgen_init_asm (CGEN_CPU_DESC cd)
+{
+  arc_cgen_init_opcode_table (cd);
+  arc_cgen_init_ibld_table (cd);
+  cd->parse_handlers = & arc_cgen_parse_handlers[0];
+  cd->parse_operand = arc_cgen_parse_operand;
+#ifdef CGEN_ASM_INIT_HOOK
+CGEN_ASM_INIT_HOOK
+#endif
+}
+
+
+
+/* Regex construction routine.
+
+   This translates an opcode syntax string into a regex string,
+   by replacing any non-character syntax element (such as an
+   opcode) with the pattern '.*'
+
+   It then compiles the regex and stores it in the opcode, for
+   later use by arc_cgen_assemble_insn
+
+   Returns NULL for success, an error message for failure.  */
+
+char * 
+arc_cgen_build_insn_regex (CGEN_INSN *insn)
+{  
+  CGEN_OPCODE *opc = (CGEN_OPCODE *) CGEN_INSN_OPCODE (insn);
+  const char *mnem = CGEN_INSN_MNEMONIC (insn);
+  char rxbuf[CGEN_MAX_RX_ELEMENTS];
+  char *rx = rxbuf;
+  const CGEN_SYNTAX_CHAR_TYPE *syn;
+  int reg_err;
+
+  syn = CGEN_SYNTAX_STRING (CGEN_OPCODE_SYNTAX (opc));
+
+  /* Mnemonics come first in the syntax string.  */
+  if (! CGEN_SYNTAX_MNEMONIC_P (* syn))
+    return _("missing mnemonic in syntax string");
+  ++syn;
+
+  /* Generate a case sensitive regular expression that emulates case
+     insensitive matching in the "C" locale.  We cannot generate a case
+     insensitive regular expression because in Turkish locales, 'i' and 'I'
+     are not equal modulo case conversion.  */
+
+  /* Copy the literal mnemonic out of the insn.  */
+  for (; *mnem; mnem++)
+    {
+      char c = *mnem;
+
+      if (ISALPHA (c))
+	{
+	  *rx++ = '[';
+	  *rx++ = TOLOWER (c);
+	  *rx++ = TOUPPER (c);
+	  *rx++ = ']';
+	}
+      else
+	*rx++ = c;
+    }
+
+  /* Copy any remaining literals from the syntax string into the rx.  */
+  for(; * syn != 0 && rx <= rxbuf + (CGEN_MAX_RX_ELEMENTS - 7 - 4); ++syn)
+    {
+      if (CGEN_SYNTAX_CHAR_P (* syn)) 
+	{
+	  char c = CGEN_SYNTAX_CHAR (* syn);
+
+	  switch (c) 
+	    {
+	      /* Escape any regex metacharacters in the syntax.  */
+	    case '.': case '[': case '\\': 
+	    case '*': case '^': case '$': 
+
+#ifdef CGEN_ESCAPE_EXTENDED_REGEX
+	    case '?': case '{': case '}': 
+	    case '(': case ')': case '*':
+	    case '|': case '+': case ']':
+#endif
+	      *rx++ = '\\';
+	      *rx++ = c;
+	      break;
+
+	    default:
+	      if (ISALPHA (c))
+		{
+		  *rx++ = '[';
+		  *rx++ = TOLOWER (c);
+		  *rx++ = TOUPPER (c);
+		  *rx++ = ']';
+		}
+	      else
+		*rx++ = c;
+	      break;
+	    }
+	}
+      else
+	{
+	  /* Replace non-syntax fields with globs.  */
+	  *rx++ = '.';
+	  *rx++ = '*';
+	}
+    }
+
+  /* Trailing whitespace ok.  */
+  * rx++ = '['; 
+  * rx++ = ' '; 
+  * rx++ = '\t'; 
+  * rx++ = ']'; 
+  * rx++ = '*'; 
+
+  /* But anchor it after that.  */
+  * rx++ = '$'; 
+  * rx = '\0';
+
+  CGEN_INSN_RX (insn) = xmalloc (sizeof (regex_t));
+  reg_err = regcomp ((regex_t *) CGEN_INSN_RX (insn), rxbuf, REG_NOSUB);
+
+  if (reg_err == 0) 
+    return NULL;
+  else
+    {
+      static char msg[80];
+
+      regerror (reg_err, (regex_t *) CGEN_INSN_RX (insn), msg, 80);
+      regfree ((regex_t *) CGEN_INSN_RX (insn));
+      free (CGEN_INSN_RX (insn));
+      (CGEN_INSN_RX (insn)) = NULL;
+      return msg;
+    }
+}
+
+
+/* Default insn parser.
+
+   The syntax string is scanned and operands are parsed and stored in FIELDS.
+   Relocs are queued as we go via other callbacks.
+
+   ??? Note that this is currently an all-or-nothing parser.  If we fail to
+   parse the instruction, we return 0 and the caller will start over from
+   the beginning.  Backtracking will be necessary in parsing subexpressions,
+   but that can be handled there.  Not handling backtracking here may get
+   expensive in the case of the m68k.  Deal with later.
+
+   Returns NULL for success, an error message for failure.  */
+
+static const char *
+parse_insn_normal (CGEN_CPU_DESC cd,
+		   const CGEN_INSN *insn,
+		   const char **strp,
+		   CGEN_FIELDS *fields)
+{
+  /* ??? Runtime added insns not handled yet.  */
+  const CGEN_SYNTAX *syntax = CGEN_INSN_SYNTAX (insn);
+  const char *str = *strp;
+  const char *errmsg;
+  const char *p;
+  const CGEN_SYNTAX_CHAR_TYPE * syn;
+#ifdef CGEN_MNEMONIC_OPERANDS
+  /* FIXME: wip */
+  int past_opcode_p;
+#endif
+
+  /* For now we assume the mnemonic is first (there are no leading operands).
+     We can parse it without needing to set up operand parsing.
+     GAS's input scrubber will ensure mnemonics are lowercase, but we may
+     not be called from GAS.  */
+  p = CGEN_INSN_MNEMONIC (insn);
+  while (*p && TOLOWER (*p) == TOLOWER (*str))
+    ++p, ++str;
+
+  if (* p)
+    return _("unrecognized instruction");
+
+#ifndef CGEN_MNEMONIC_OPERANDS
+  if (* str && ! ISSPACE (* str))
+    return _("unrecognized instruction");
+#endif
+
+  CGEN_INIT_PARSE (cd);
+  cgen_init_parse_operand (cd);
+#ifdef CGEN_MNEMONIC_OPERANDS
+  past_opcode_p = 0;
+#endif
+
+  /* We don't check for (*str != '\0') here because we want to parse
+     any trailing fake arguments in the syntax string.  */
+  syn = CGEN_SYNTAX_STRING (syntax);
+
+  /* Mnemonics come first for now, ensure valid string.  */
+  if (! CGEN_SYNTAX_MNEMONIC_P (* syn))
+    abort ();
+
+  ++syn;
+
+  while (* syn != 0)
+    {
+      /* Non operand chars must match exactly.  */
+      if (CGEN_SYNTAX_CHAR_P (* syn))
+	{
+	  /* FIXME: While we allow for non-GAS callers above, we assume the
+	     first char after the mnemonic part is a space.  */
+	  /* FIXME: We also take inappropriate advantage of the fact that
+	     GAS's input scrubber will remove extraneous blanks.  */
+	  if (TOLOWER (*str) == TOLOWER (CGEN_SYNTAX_CHAR (* syn)))
+	    {
+#ifdef CGEN_MNEMONIC_OPERANDS
+	      if (CGEN_SYNTAX_CHAR(* syn) == ' ')
+		past_opcode_p = 1;
+#endif
+	      ++ syn;
+	      ++ str;
+	    }
+	  else if (*str)
+	    {
+	      /* Syntax char didn't match.  Can't be this insn.  */
+	      static char msg [80];
+
+	      /* xgettext:c-format */
+	      sprintf (msg, _("syntax error (expected char `%c', found `%c')"),
+		       CGEN_SYNTAX_CHAR(*syn), *str);
+	      return msg;
+	    }
+	  else
+	    {
+	      /* Ran out of input.  */
+	      static char msg [80];
+
+	      /* xgettext:c-format */
+	      sprintf (msg, _("syntax error (expected char `%c', found end of instruction)"),
+		       CGEN_SYNTAX_CHAR(*syn));
+	      return msg;
+	    }
+	  continue;
+	}
+
+      /* We have an operand of some sort.  */
+      errmsg = cd->parse_operand (cd, CGEN_SYNTAX_FIELD (*syn),
+					  &str, fields);
+      if (errmsg)
+	return errmsg;
+
+      /* Done with this operand, continue with next one.  */
+      ++ syn;
+    }
+
+  /* If we're at the end of the syntax string, we're done.  */
+  if (* syn == 0)
+    {
+      /* FIXME: For the moment we assume a valid `str' can only contain
+	 blanks now.  IE: We needn't try again with a longer version of
+	 the insn and it is assumed that longer versions of insns appear
+	 before shorter ones (eg: lsr r2,r3,1 vs lsr r2,r3).  */
+      while (ISSPACE (* str))
+	++ str;
+
+      if (* str != '\0')
+	return _("junk at end of line"); /* FIXME: would like to include `str' */
+
+      return NULL;
+    }
+
+  /* We couldn't parse it.  */
+  return _("unrecognized instruction");
+}
+
+/* Main entry point.
+   This routine is called for each instruction to be assembled.
+   STR points to the insn to be assembled.
+   We assume all necessary tables have been initialized.
+   The assembled instruction, less any fixups, is stored in BUF.
+   Remember that if CGEN_INT_INSN_P then BUF is an int and thus the value
+   still needs to be converted to target byte order, otherwise BUF is an array
+   of bytes in target byte order.
+   The result is a pointer to the insn's entry in the opcode table,
+   or NULL if an error occured (an error message will have already been
+   printed).
+
+   Note that when processing (non-alias) macro-insns,
+   this function recurses.
+
+   ??? It's possible to make this cpu-independent.
+   One would have to deal with a few minor things.
+   At this point in time doing so would be more of a curiosity than useful
+   [for example this file isn't _that_ big], but keeping the possibility in
+   mind helps keep the design clean.  */
+
+const CGEN_INSN *
+arc_cgen_assemble_insn (CGEN_CPU_DESC cd,
+			   const char *str,
+			   CGEN_FIELDS *fields,
+			   CGEN_INSN_BYTES_PTR buf,
+			   char **errmsg)
+{
+  const char *start;
+  CGEN_INSN_LIST *ilist;
+  const char *parse_errmsg = NULL;
+  const char *insert_errmsg = NULL;
+  int recognized_mnemonic = 0;
+
+  /* Skip leading white space.  */
+  while (ISSPACE (* str))
+    ++ str;
+
+  /* The instructions are stored in hashed lists.
+     Get the first in the list.  */
+  ilist = CGEN_ASM_LOOKUP_INSN (cd, str);
+
+  /* Keep looking until we find a match.  */
+  start = str;
+  for ( ; ilist != NULL ; ilist = CGEN_ASM_NEXT_INSN (ilist))
+    {
+      const CGEN_INSN *insn = ilist->insn;
+      recognized_mnemonic = 1;
+
+#ifdef CGEN_VALIDATE_INSN_SUPPORTED 
+      /* Not usually needed as unsupported opcodes
+	 shouldn't be in the hash lists.  */
+      /* Is this insn supported by the selected cpu?  */
+      if (! arc_cgen_insn_supported (cd, insn))
+	continue;
+#endif
+      /* If the RELAXED attribute is set, this is an insn that shouldn't be
+	 chosen immediately.  Instead, it is used during assembler/linker
+	 relaxation if possible.  */
+      if (CGEN_INSN_ATTR_VALUE (insn, CGEN_INSN_RELAXED) != 0)
+	continue;
+
+      str = start;
+
+      /* Skip this insn if str doesn't look right lexically.  */
+      if (CGEN_INSN_RX (insn) != NULL &&
+	  regexec ((regex_t *) CGEN_INSN_RX (insn), str, 0, NULL, 0) == REG_NOMATCH)
+	continue;
+
+      /* Allow parse/insert handlers to obtain length of insn.  */
+      CGEN_FIELDS_BITSIZE (fields) = CGEN_INSN_BITSIZE (insn);
+
+      parse_errmsg = CGEN_PARSE_FN (cd, insn) (cd, insn, & str, fields);
+      if (parse_errmsg != NULL)
+	continue;
+
+      /* ??? 0 is passed for `pc'.  */
+      insert_errmsg = CGEN_INSERT_FN (cd, insn) (cd, insn, fields, buf,
+						 (bfd_vma) 0);
+      if (insert_errmsg != NULL)
+        continue;
+
+      /* It is up to the caller to actually output the insn and any
+         queued relocs.  */
+      return insn;
+    }
+
+  {
+    static char errbuf[150];
+#ifdef CGEN_VERBOSE_ASSEMBLER_ERRORS
+    const char *tmp_errmsg;
+
+    /* If requesting verbose error messages, use insert_errmsg.
+       Failing that, use parse_errmsg.  */
+    tmp_errmsg = (insert_errmsg ? insert_errmsg :
+		  parse_errmsg ? parse_errmsg :
+		  recognized_mnemonic ?
+		  _("unrecognized form of instruction") :
+		  _("unrecognized instruction"));
+
+    if (strlen (start) > 50)
+      /* xgettext:c-format */
+      sprintf (errbuf, "%s `%.50s...'", tmp_errmsg, start);
+    else 
+      /* xgettext:c-format */
+      sprintf (errbuf, "%s `%.50s'", tmp_errmsg, start);
+#else
+    if (strlen (start) > 50)
+      /* xgettext:c-format */
+      sprintf (errbuf, _("bad instruction `%.50s...'"), start);
+    else 
+      /* xgettext:c-format */
+      sprintf (errbuf, _("bad instruction `%.50s'"), start);
+#endif
+      
+    *errmsg = errbuf;
+    return NULL;
+  }
+}
diff --git a/opcodes/arc-desc.c b/opcodes/arc-desc.c
new file mode 100644
index 0000000..006b6eb
--- /dev/null
+++ b/opcodes/arc-desc.c
@@ -0,0 +1,4057 @@
+/* CPU data for arc.
+
+THIS FILE IS MACHINE GENERATED WITH CGEN.
+
+Copyright 1996-2007 Free Software Foundation, Inc.
+
+This file is part of the GNU Binutils and/or GDB, the GNU debugger.
+
+   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
+   the Free Software Foundation; either version 3, or (at your option)
+   any later version.
+
+   It 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 this program; if not, write to the Free Software Foundation, Inc.,
+   51 Franklin Street - Fifth Floor, Boston, MA 02110-1301, USA.
+
+*/
+
+#include "sysdep.h"
+#include <stdio.h>
+#include <stdarg.h>
+#include "ansidecl.h"
+#include "bfd.h"
+#include "symcat.h"
+#include "arc-desc.h"
+#include "arc-opc.h"
+#include "opintl.h"
+#include "libiberty.h"
+#include "xregex.h"
+
+/* Attributes.  */
+
+static const CGEN_ATTR_ENTRY bool_attr[] =
+{
+  { "#f", 0 },
+  { "#t", 1 },
+  { 0, 0 }
+};
+
+static const CGEN_ATTR_ENTRY MACH_attr[] ATTRIBUTE_UNUSED =
+{
+  { "base", MACH_BASE },
+  { "a5", MACH_A5 },
+  { "arc600", MACH_ARC600 },
+  { "arc700", MACH_ARC700 },
+  { "max", MACH_MAX },
+  { 0, 0 }
+};
+
+static const CGEN_ATTR_ENTRY ISA_attr[] ATTRIBUTE_UNUSED =
+{
+  { "ARCompact", ISA_ARCOMPACT },
+  { "max", ISA_MAX },
+  { 0, 0 }
+};
+
+static const CGEN_ATTR_ENTRY LIMM_attr[] ATTRIBUTE_UNUSED =
+{
+  { "none", LIMM_NONE },
+  { "h", LIMM_H },
+  { "B", LIMM_B },
+  { "BC", LIMM_BC },
+  { "C", LIMM_C },
+  { 0, 0 }
+};
+
+const CGEN_ATTR_TABLE arc_cgen_ifield_attr_table[] =
+{
+  { "MACH", & MACH_attr[0], & MACH_attr[0] },
+  { "VIRTUAL", &bool_attr[0], &bool_attr[0] },
+  { "PCREL-ADDR", &bool_attr[0], &bool_attr[0] },
+  { "ABS-ADDR", &bool_attr[0], &bool_attr[0] },
+  { "RESERVED", &bool_attr[0], &bool_attr[0] },
+  { "SIGN-OPT", &bool_attr[0], &bool_attr[0] },
+  { "SIGNED", &bool_attr[0], &bool_attr[0] },
+  { 0, 0, 0 }
+};
+
+const CGEN_ATTR_TABLE arc_cgen_hardware_attr_table[] =
+{
+  { "MACH", & MACH_attr[0], & MACH_attr[0] },
+  { "VIRTUAL", &bool_attr[0], &bool_attr[0] },
+  { "CACHE-ADDR", &bool_attr[0], &bool_attr[0] },
+  { "PC", &bool_attr[0], &bool_attr[0] },
+  { "PROFILE", &bool_attr[0], &bool_attr[0] },
+  { 0, 0, 0 }
+};
+
+const CGEN_ATTR_TABLE arc_cgen_operand_attr_table[] =
+{
+  { "MACH", & MACH_attr[0], & MACH_attr[0] },
+  { "VIRTUAL", &bool_attr[0], &bool_attr[0] },
+  { "PCREL-ADDR", &bool_attr[0], &bool_attr[0] },
+  { "ABS-ADDR", &bool_attr[0], &bool_attr[0] },
+  { "SIGN-OPT", &bool_attr[0], &bool_attr[0] },
+  { "SIGNED", &bool_attr[0], &bool_attr[0] },
+  { "NEGATIVE", &bool_attr[0], &bool_attr[0] },
+  { "RELAX", &bool_attr[0], &bool_attr[0] },
+  { "SEM-ONLY", &bool_attr[0], &bool_attr[0] },
+  { 0, 0, 0 }
+};
+
+const CGEN_ATTR_TABLE arc_cgen_insn_attr_table[] =
+{
+  { "MACH", & MACH_attr[0], & MACH_attr[0] },
+  { "LIMM", & LIMM_attr[0], & LIMM_attr[0] },
+  { "ALIAS", &bool_attr[0], &bool_attr[0] },
+  { "VIRTUAL", &bool_attr[0], &bool_attr[0] },
+  { "UNCOND-CTI", &bool_attr[0], &bool_attr[0] },
+  { "COND-CTI", &bool_attr[0], &bool_attr[0] },
+  { "SKIP-CTI", &bool_attr[0], &bool_attr[0] },
+  { "DELAY-SLOT", &bool_attr[0], &bool_attr[0] },
+  { "RELAXABLE", &bool_attr[0], &bool_attr[0] },
+  { "RELAXED", &bool_attr[0], &bool_attr[0] },
+  { "NO-DIS", &bool_attr[0], &bool_attr[0] },
+  { "PBB", &bool_attr[0], &bool_attr[0] },
+  { "SHORT_P", &bool_attr[0], &bool_attr[0] },
+  { 0, 0, 0 }
+};
+
+/* Instruction set variants.  */
+
+static const CGEN_ISA arc_cgen_isa_table[] = {
+  { "ARCompact", 32, 32, 32, 32 },
+  { 0, 0, 0, 0, 0 }
+};
+
+/* Machine variants.  */
+
+static const CGEN_MACH arc_cgen_mach_table[] = {
+  { "a5", "A5", MACH_A5, 16 },
+  { "arc600", "ARC600", MACH_ARC600, 16 },
+  { "arc700", "ARC700", MACH_ARC700, 16 },
+  { 0, 0, 0, 0 }
+};
+
+static CGEN_KEYWORD_ENTRY arc_cgen_opval_cr_names_entries[] =
+{
+  { "gp", 26, {0, {{{0, 0}}}}, 0, 0 },
+  { "fp", 27, {0, {{{0, 0}}}}, 0, 0 },
+  { "sp", 28, {0, {{{0, 0}}}}, 0, 0 },
+  { "blink", 31, {0, {{{0, 0}}}}, 0, 0 },
+  { "mlo", 57, {0, {{{0, 0}}}}, 0, 0 },
+  { "mmid", 58, {0, {{{0, 0}}}}, 0, 0 },
+  { "mhi", 59, {0, {{{0, 0}}}}, 0, 0 },
+  { "lp_count", 60, {0, {{{0, 0}}}}, 0, 0 },
+  { "pcl", 63, {0, {{{0, 0}}}}, 0, 0 },
+  { "ilink1", 29, {0, {{{0, 0}}}}, 0, 0 },
+  { "ilink2", 30, {0, {{{0, 0}}}}, 0, 0 },
+  { "r29", 29, {0, {{{0, 0}}}}, 0, 0 },
+  { "r30", 30, {0, {{{0, 0}}}}, 0, 0 },
+  { "r0", 0, {0, {{{0, 0}}}}, 0, 0 },
+  { "r1", 1, {0, {{{0, 0}}}}, 0, 0 },
+  { "r2", 2, {0, {{{0, 0}}}}, 0, 0 },
+  { "r3", 3, {0, {{{0, 0}}}}, 0, 0 },
+  { "r4", 4, {0, {{{0, 0}}}}, 0, 0 },
+  { "r5", 5, {0, {{{0, 0}}}}, 0, 0 },
+  { "r6", 6, {0, {{{0, 0}}}}, 0, 0 },
+  { "r7", 7, {0, {{{0, 0}}}}, 0, 0 },
+  { "r8", 8, {0, {{{0, 0}}}}, 0, 0 },
+  { "r9", 9, {0, {{{0, 0}}}}, 0, 0 },
+  { "r10", 10, {0, {{{0, 0}}}}, 0, 0 },
+  { "r11", 11, {0, {{{0, 0}}}}, 0, 0 },
+  { "r12", 12, {0, {{{0, 0}}}}, 0, 0 },
+  { "r13", 13, {0, {{{0, 0}}}}, 0, 0 },
+  { "r14", 14, {0, {{{0, 0}}}}, 0, 0 },
+  { "r15", 15, {0, {{{0, 0}}}}, 0, 0 },
+  { "r16", 16, {0, {{{0, 0}}}}, 0, 0 },
+  { "r17", 17, {0, {{{0, 0}}}}, 0, 0 },
+  { "r18", 18, {0, {{{0, 0}}}}, 0, 0 },
+  { "r19", 19, {0, {{{0, 0}}}}, 0, 0 },
+  { "r20", 20, {0, {{{0, 0}}}}, 0, 0 },
+  { "r21", 21, {0, {{{0, 0}}}}, 0, 0 },
+  { "r22", 22, {0, {{{0, 0}}}}, 0, 0 },
+  { "r23", 23, {0, {{{0, 0}}}}, 0, 0 },
+  { "r24", 24, {0, {{{0, 0}}}}, 0, 0 },
+  { "r25", 25, {0, {{{0, 0}}}}, 0, 0 },
+  { "r26", 26, {0, {{{0, 0}}}}, 0, 0 },
+  { "r27", 27, {0, {{{0, 0}}}}, 0, 0 },
+  { "r28", 28, {0, {{{0, 0}}}}, 0, 0 },
+  { "r31", 31, {0, {{{0, 0}}}}, 0, 0 },
+  { "r32", 32, {0, {{{0, 0}}}}, 0, 0 },
+  { "r33", 33, {0, {{{0, 0}}}}, 0, 0 },
+  { "r34", 34, {0, {{{0, 0}}}}, 0, 0 },
+  { "r35", 35, {0, {{{0, 0}}}}, 0, 0 },
+  { "r36", 36, {0, {{{0, 0}}}}, 0, 0 },
+  { "r37", 37, {0, {{{0, 0}}}}, 0, 0 },
+  { "r38", 38, {0, {{{0, 0}}}}, 0, 0 },
+  { "r39", 39, {0, {{{0, 0}}}}, 0, 0 },
+  { "r40", 40, {0, {{{0, 0}}}}, 0, 0 },
+  { "r41", 41, {0, {{{0, 0}}}}, 0, 0 },
+  { "r42", 42, {0, {{{0, 0}}}}, 0, 0 },
+  { "r43", 43, {0, {{{0, 0}}}}, 0, 0 },
+  { "r44", 44, {0, {{{0, 0}}}}, 0, 0 },
+  { "r45", 45, {0, {{{0, 0}}}}, 0, 0 },
+  { "r46", 46, {0, {{{0, 0}}}}, 0, 0 },
+  { "r47", 47, {0, {{{0, 0}}}}, 0, 0 },
+  { "r48", 48, {0, {{{0, 0}}}}, 0, 0 },
+  { "r49", 49, {0, {{{0, 0}}}}, 0, 0 },
+  { "r50", 50, {0, {{{0, 0}}}}, 0, 0 },
+  { "r51", 51, {0, {{{0, 0}}}}, 0, 0 },
+  { "r52", 52, {0, {{{0, 0}}}}, 0, 0 },
+  { "r53", 53, {0, {{{0, 0}}}}, 0, 0 },
+  { "r54", 54, {0, {{{0, 0}}}}, 0, 0 },
+  { "r55", 55, {0, {{{0, 0}}}}, 0, 0 },
+  { "r56", 56, {0, {{{0, 0}}}}, 0, 0 },
+  { "r57", 57, {0, {{{0, 0}}}}, 0, 0 },
+  { "r58", 58, {0, {{{0, 0}}}}, 0, 0 },
+  { "r59", 59, {0, {{{0, 0}}}}, 0, 0 },
+  { "r60", 60, {0, {{{0, 0}}}}, 0, 0 }
+};
+
+CGEN_KEYWORD arc_cgen_opval_cr_names =
+{
+  & arc_cgen_opval_cr_names_entries[0],
+  72,
+  0, 0, 0, 0, ""
+};
+
+static CGEN_KEYWORD_ENTRY arc_cgen_opval_h_Qcondb_entries[] =
+{
+  { "", 0, {0, {{{0, 0}}}}, 0, 0 },
+  { "ra", 0, {0, {{{0, 0}}}}, 0, 0 },
+  { "al", 0, {0, {{{0, 0}}}}, 0, 0 },
+  { "eq", 1, {0, {{{0, 0}}}}, 0, 0 },
+  { "z", 1, {0, {{{0, 0}}}}, 0, 0 },
+  { "ne", 2, {0, {{{0, 0}}}}, 0, 0 },
+  { "nz", 2, {0, {{{0, 0}}}}, 0, 0 },
+  { "pl", 3, {0, {{{0, 0}}}}, 0, 0 },
+  { "p", 3, {0, {{{0, 0}}}}, 0, 0 },
+  { "mi", 4, {0, {{{0, 0}}}}, 0, 0 },
+  { "n", 4, {0, {{{0, 0}}}}, 0, 0 },
+  { "cs", 5, {0, {{{0, 0}}}}, 0, 0 },
+  { "c", 5, {0, {{{0, 0}}}}, 0, 0 },
+  { "lo", 5, {0, {{{0, 0}}}}, 0, 0 },
+  { "cc", 6, {0, {{{0, 0}}}}, 0, 0 },
+  { "nc", 6, {0, {{{0, 0}}}}, 0, 0 },
+  { "hs", 6, {0, {{{0, 0}}}}, 0, 0 },
+  { "vs", 7, {0, {{{0, 0}}}}, 0, 0 },
+  { "v", 7, {0, {{{0, 0}}}}, 0, 0 },
+  { "vc", 8, {0, {{{0, 0}}}}, 0, 0 },
+  { "nv", 8, {0, {{{0, 0}}}}, 0, 0 },
+  { "gt", 9, {0, {{{0, 0}}}}, 0, 0 },
+  { "ge", 10, {0, {{{0, 0}}}}, 0, 0 },
+  { "lt", 11, {0, {{{0, 0}}}}, 0, 0 },
+  { "le", 12, {0, {{{0, 0}}}}, 0, 0 },
+  { "hi", 13, {0, {{{0, 0}}}}, 0, 0 },
+  { "ls", 14, {0, {{{0, 0}}}}, 0, 0 },
+  { "pnz", 15, {0, {{{0, 0}}}}, 0, 0 }
+};
+
+CGEN_KEYWORD arc_cgen_opval_h_Qcondb =
+{
+  & arc_cgen_opval_h_Qcondb_entries[0],
+  28,
+  0, 0, 0, 0, ""
+};
+
+static CGEN_KEYWORD_ENTRY arc_cgen_opval_h_Qcondj_entries[] =
+{
+  { "", 0, {0, {{{0, 0}}}}, 0, 0 },
+  { "al", 0, {0, {{{0, 0}}}}, 0, 0 },
+  { "eq", 1, {0, {{{0, 0}}}}, 0, 0 },
+  { "z", 1, {0, {{{0, 0}}}}, 0, 0 },
+  { "ne", 2, {0, {{{0, 0}}}}, 0, 0 },
+  { "nz", 2, {0, {{{0, 0}}}}, 0, 0 },
+  { "pl", 3, {0, {{{0, 0}}}}, 0, 0 },
+  { "p", 3, {0, {{{0, 0}}}}, 0, 0 },
+  { "mi", 4, {0, {{{0, 0}}}}, 0, 0 },
+  { "n", 4, {0, {{{0, 0}}}}, 0, 0 },
+  { "cs", 5, {0, {{{0, 0}}}}, 0, 0 },
+  { "c", 5, {0, {{{0, 0}}}}, 0, 0 },
+  { "lo", 5, {0, {{{0, 0}}}}, 0, 0 },
+  { "cc", 6, {0, {{{0, 0}}}}, 0, 0 },
+  { "nc", 6, {0, {{{0, 0}}}}, 0, 0 },
+  { "hs", 6, {0, {{{0, 0}}}}, 0, 0 },
+  { "vs", 7, {0, {{{0, 0}}}}, 0, 0 },
+  { "v", 7, {0, {{{0, 0}}}}, 0, 0 },
+  { "vc", 8, {0, {{{0, 0}}}}, 0, 0 },
+  { "nv", 8, {0, {{{0, 0}}}}, 0, 0 },
+  { "gt", 9, {0, {{{0, 0}}}}, 0, 0 },
+  { "ge", 10, {0, {{{0, 0}}}}, 0, 0 },
+  { "lt", 11, {0, {{{0, 0}}}}, 0, 0 },
+  { "le", 12, {0, {{{0, 0}}}}, 0, 0 },
+  { "hi", 13, {0, {{{0, 0}}}}, 0, 0 },
+  { "ls", 14, {0, {{{0, 0}}}}, 0, 0 },
+  { "pnz", 15, {0, {{{0, 0}}}}, 0, 0 }
+};
+
+CGEN_KEYWORD arc_cgen_opval_h_Qcondj =
+{
+  & arc_cgen_opval_h_Qcondj_entries[0],
+  27,
+  0, 0, 0, 0, ""
+};
+
+static CGEN_KEYWORD_ENTRY arc_cgen_opval_h_Qcondi_entries[] =
+{
+  { "", 0, {0, {{{0, 0}}}}, 0, 0 },
+  { ".al", 0, {0, {{{0, 0}}}}, 0, 0 },
+  { ".eq", 1, {0, {{{0, 0}}}}, 0, 0 },
+  { ".z", 1, {0, {{{0, 0}}}}, 0, 0 },
+  { ".ne", 2, {0, {{{0, 0}}}}, 0, 0 },
+  { ".nz", 2, {0, {{{0, 0}}}}, 0, 0 },
+  { ".pl", 3, {0, {{{0, 0}}}}, 0, 0 },
+  { ".p", 3, {0, {{{0, 0}}}}, 0, 0 },
+  { ".mi", 4, {0, {{{0, 0}}}}, 0, 0 },
+  { ".n", 4, {0, {{{0, 0}}}}, 0, 0 },
+  { ".cs", 5, {0, {{{0, 0}}}}, 0, 0 },
+  { ".c", 5, {0, {{{0, 0}}}}, 0, 0 },
+  { ".lo", 5, {0, {{{0, 0}}}}, 0, 0 },
+  { ".cc", 6, {0, {{{0, 0}}}}, 0, 0 },
+  { ".nc", 6, {0, {{{0, 0}}}}, 0, 0 },
+  { ".hs", 6, {0, {{{0, 0}}}}, 0, 0 },
+  { ".vs", 7, {0, {{{0, 0}}}}, 0, 0 },
+  { ".v", 7, {0, {{{0, 0}}}}, 0, 0 },
+  { ".vc", 8, {0, {{{0, 0}}}}, 0, 0 },
+  { ".nv", 8, {0, {{{0, 0}}}}, 0, 0 },
+  { ".gt", 9, {0, {{{0, 0}}}}, 0, 0 },
+  { ".ge", 10, {0, {{{0, 0}}}}, 0, 0 },
+  { ".lt", 11, {0, {{{0, 0}}}}, 0, 0 },
+  { ".le", 12, {0, {{{0, 0}}}}, 0, 0 },
+  { ".hi", 13, {0, {{{0, 0}}}}, 0, 0 },
+  { ".ls", 14, {0, {{{0, 0}}}}, 0, 0 },
+  { ".pnz", 15, {0, {{{0, 0}}}}, 0, 0 }
+};
+
+CGEN_KEYWORD arc_cgen_opval_h_Qcondi =
+{
+  & arc_cgen_opval_h_Qcondi_entries[0],
+  27,
+  0, 0, 0, 0, ""
+};
+
+static CGEN_KEYWORD_ENTRY arc_cgen_opval_h_uncondb_entries[] =
+{
+  { "", 0, {0, {{{0, 0}}}}, 0, 0 },
+  { "al", 0, {0, {{{0, 0}}}}, 0, 0 },
+  { "ra", 0, {0, {{{0, 0}}}}, 0, 0 }
+};
+
+CGEN_KEYWORD arc_cgen_opval_h_uncondb =
+{
+  & arc_cgen_opval_h_uncondb_entries[0],
+  3,
+  0, 0, 0, 0, ""
+};
+
+static CGEN_KEYWORD_ENTRY arc_cgen_opval_h_uncondj_entries[] =
+{
+  { "", 0, {0, {{{0, 0}}}}, 0, 0 },
+  { "al", 0, {0, {{{0, 0}}}}, 0, 0 }
+};
+
+CGEN_KEYWORD arc_cgen_opval_h_uncondj =
+{
+  & arc_cgen_opval_h_uncondj_entries[0],
+  2,
+  0, 0, 0, 0, ""
+};
+
+static CGEN_KEYWORD_ENTRY arc_cgen_opval_h_uncondi_entries[] =
+{
+  { "", 0, {0, {{{0, 0}}}}, 0, 0 },
+  { ".al", 0, {0, {{{0, 0}}}}, 0, 0 }
+};
+
+CGEN_KEYWORD arc_cgen_opval_h_uncondi =
+{
+  & arc_cgen_opval_h_uncondi_entries[0],
+  2,
+  0, 0, 0, 0, ""
+};
+
+static CGEN_KEYWORD_ENTRY arc_cgen_opval_h_i2cond_entries[] =
+{
+  { "COND2_", 0, {0, {{{0, 0}}}}, 0, 0 },
+  { "COND2_al", 0, {0, {{{0, 0}}}}, 0, 0 },
+  { "COND2_ra", 0, {0, {{{0, 0}}}}, 0, 0 },
+  { "COND2_eq", 1, {0, {{{0, 0}}}}, 0, 0 },
+  { "COND2_z", 1, {0, {{{0, 0}}}}, 0, 0 },
+  { "COND2_ne", 2, {0, {{{0, 0}}}}, 0, 0 },
+  { "COND2_nz", 2, {0, {{{0, 0}}}}, 0, 0 }
+};
+
+CGEN_KEYWORD arc_cgen_opval_h_i2cond =
+{
+  & arc_cgen_opval_h_i2cond_entries[0],
+  7,
+  0, 0, 0, 0, ""
+};
+
+static CGEN_KEYWORD_ENTRY arc_cgen_opval_h_i3cond_entries[] =
+{
+  { "COND3_gt", 0, {0, {{{0, 0}}}}, 0, 0 },
+  { "COND3_ge", 1, {0, {{{0, 0}}}}, 0, 0 },
+  { "COND3_lt", 2, {0, {{{0, 0}}}}, 0, 0 },
+  { "COND3_le", 3, {0, {{{0, 0}}}}, 0, 0 },
+  { "COND3_hi", 4, {0, {{{0, 0}}}}, 0, 0 },
+  { "COND3_cc", 5, {0, {{{0, 0}}}}, 0, 0 },
+  { "COND3_nc", 5, {0, {{{0, 0}}}}, 0, 0 },
+  { "COND3_hs", 5, {0, {{{0, 0}}}}, 0, 0 },
+  { "COND3_cs", 6, {0, {{{0, 0}}}}, 0, 0 },
+  { "COND3_c", 6, {0, {{{0, 0}}}}, 0, 0 },
+  { "COND3_lo", 6, {0, {{{0, 0}}}}, 0, 0 },
+  { "COND3_ls", 7, {0, {{{0, 0}}}}, 0, 0 }
+};
+
+CGEN_KEYWORD arc_cgen_opval_h_i3cond =
+{
+  & arc_cgen_opval_h_i3cond_entries[0],
+  12,
+  0, 0, 0, 0, ""
+};
+
+static CGEN_KEYWORD_ENTRY arc_cgen_opval_h_delay_entries[] =
+{
+  { "", 0, {0, {{{0, 0}}}}, 0, 0 },
+  { ".d", 1, {0, {{{0, 0}}}}, 0, 0 }
+};
+
+CGEN_KEYWORD arc_cgen_opval_h_delay =
+{
+  & arc_cgen_opval_h_delay_entries[0],
+  2,
+  0, 0, 0, 0, ""
+};
+
+static CGEN_KEYWORD_ENTRY arc_cgen_opval_h_uflags_entries[] =
+{
+  { "", 0, {0, {{{0, 0}}}}, 0, 0 },
+  { ".f", 1, {0, {{{0, 0}}}}, 0, 0 }
+};
+
+CGEN_KEYWORD arc_cgen_opval_h_uflags =
+{
+  & arc_cgen_opval_h_uflags_entries[0],
+  2,
+  0, 0, 0, 0, ""
+};
+
+static CGEN_KEYWORD_ENTRY arc_cgen_opval_h_nil_entries[] =
+{
+  { "", 0, {0, {{{0, 0}}}}, 0, 0 }
+};
+
+CGEN_KEYWORD arc_cgen_opval_h_nil =
+{
+  & arc_cgen_opval_h_nil_entries[0],
+  1,
+  0, 0, 0, 0, ""
+};
+
+static CGEN_KEYWORD_ENTRY arc_cgen_opval_h_auflags_entries[] =
+{
+  { "", 1, {0, {{{0, 0}}}}, 0, 0 }
+};
+
+CGEN_KEYWORD arc_cgen_opval_h_auflags =
+{
+  & arc_cgen_opval_h_auflags_entries[0],
+  1,
+  0, 0, 0, 0, ""
+};
+
+static CGEN_KEYWORD_ENTRY arc_cgen_opval_h_aufflags_entries[] =
+{
+  { ".f", 1, {0, {{{0, 0}}}}, 0, 0 },
+  { "", 1, {0, {{{0, 0}}}}, 0, 0 }
+};
+
+CGEN_KEYWORD arc_cgen_opval_h_aufflags =
+{
+  & arc_cgen_opval_h_aufflags_entries[0],
+  2,
+  0, 0, 0, 0, ""
+};
+
+static CGEN_KEYWORD_ENTRY arc_cgen_opval_h_Di_entries[] =
+{
+  { "", 0, {0, {{{0, 0}}}}, 0, 0 },
+  { ".di", 1, {0, {{{0, 0}}}}, 0, 0 }
+};
+
+CGEN_KEYWORD arc_cgen_opval_h_Di =
+{
+  & arc_cgen_opval_h_Di_entries[0],
+  2,
+  0, 0, 0, 0, ""
+};
+
+static CGEN_KEYWORD_ENTRY arc_cgen_opval_h_insn16_entries[] =
+{
+  { "_s", 0, {0, {{{0, 0}}}}, 0, 0 },
+  { "", 0, {0, {{{0, 0}}}}, 0, 0 }
+};
+
+CGEN_KEYWORD arc_cgen_opval_h_insn16 =
+{
+  & arc_cgen_opval_h_insn16_entries[0],
+  2,
+  0, 0, 0, 0, ""
+};
+
+static CGEN_KEYWORD_ENTRY arc_cgen_opval_h_insn32_entries[] =
+{
+  { "", 0, {0, {{{0, 0}}}}, 0, 0 },
+  { "_l", 0, {0, {{{0, 0}}}}, 0, 0 }
+};
+
+CGEN_KEYWORD arc_cgen_opval_h_insn32 =
+{
+  & arc_cgen_opval_h_insn32_entries[0],
+  2,
+  0, 0, 0, 0, ""
+};
+
+static CGEN_KEYWORD_ENTRY arc_cgen_opval_h__aw_entries[] =
+{
+  { ".a", 0, {0, {{{0, 0}}}}, 0, 0 },
+  { ".aw", 0, {0, {{{0, 0}}}}, 0, 0 }
+};
+
+CGEN_KEYWORD arc_cgen_opval_h__aw =
+{
+  & arc_cgen_opval_h__aw_entries[0],
+  2,
+  0, 0, 0, 0, ""
+};
+
+static CGEN_KEYWORD_ENTRY arc_cgen_opval_h_cr16_entries[] =
+{
+  { "r0", 0, {0, {{{0, 0}}}}, 0, 0 },
+  { "r1", 1, {0, {{{0, 0}}}}, 0, 0 },
+  { "r2", 2, {0, {{{0, 0}}}}, 0, 0 },
+  { "r3", 3, {0, {{{0, 0}}}}, 0, 0 },
+  { "r12", 4, {0, {{{0, 0}}}}, 0, 0 },
+  { "r13", 5, {0, {{{0, 0}}}}, 0, 0 },
+  { "r14", 6, {0, {{{0, 0}}}}, 0, 0 },
+  { "r15", 7, {0, {{{0, 0}}}}, 0, 0 }
+};
+
+CGEN_KEYWORD arc_cgen_opval_h_cr16 =
+{
+  & arc_cgen_opval_h_cr16_entries[0],
+  8,
+  0, 0, 0, 0, ""
+};
+
+static CGEN_KEYWORD_ENTRY arc_cgen_opval_h_r0_entries[] =
+{
+  { "r0", 0, {0, {{{0, 0}}}}, 0, 0 }
+};
+
+CGEN_KEYWORD arc_cgen_opval_h_r0 =
+{
+  & arc_cgen_opval_h_r0_entries[0],
+  1,
+  0, 0, 0, 0, ""
+};
+
+static CGEN_KEYWORD_ENTRY arc_cgen_opval_h_gp_entries[] =
+{
+  { "r26", 0, {0, {{{0, 0}}}}, 0, 0 },
+  { "gp", 0, {0, {{{0, 0}}}}, 0, 0 }
+};
+
+CGEN_KEYWORD arc_cgen_opval_h_gp =
+{
+  & arc_cgen_opval_h_gp_entries[0],
+  2,
+  0, 0, 0, 0, ""
+};
+
+static CGEN_KEYWORD_ENTRY arc_cgen_opval_h_sp_entries[] =
+{
+  { "sp", 0, {0, {{{0, 0}}}}, 0, 0 },
+  { "r28", 0, {0, {{{0, 0}}}}, 0, 0 }
+};
+
+CGEN_KEYWORD arc_cgen_opval_h_sp =
+{
+  & arc_cgen_opval_h_sp_entries[0],
+  2,
+  0, 0, 0, 0, ""
+};
+
+static CGEN_KEYWORD_ENTRY arc_cgen_opval_h_pcl_entries[] =
+{
+  { "pcl", 0, {0, {{{0, 0}}}}, 0, 0 },
+  { "r63", 0, {0, {{{0, 0}}}}, 0, 0 }
+};
+
+CGEN_KEYWORD arc_cgen_opval_h_pcl =
+{
+  & arc_cgen_opval_h_pcl_entries[0],
+  2,
+  0, 0, 0, 0, ""
+};
+
+static CGEN_KEYWORD_ENTRY arc_cgen_opval_h_noilink_entries[] =
+{
+  { "gp", 26, {0, {{{0, 0}}}}, 0, 0 },
+  { "fp", 27, {0, {{{0, 0}}}}, 0, 0 },
+  { "sp", 28, {0, {{{0, 0}}}}, 0, 0 },
+  { "blink", 31, {0, {{{0, 0}}}}, 0, 0 },
+  { "mlo", 57, {0, {{{0, 0}}}}, 0, 0 },
+  { "mmid", 58, {0, {{{0, 0}}}}, 0, 0 },
+  { "mhi", 59, {0, {{{0, 0}}}}, 0, 0 },
+  { "lp_count", 60, {0, {{{0, 0}}}}, 0, 0 },
+  { "pcl", 63, {0, {{{0, 0}}}}, 0, 0 },
+  { "r0", 0, {0, {{{0, 0}}}}, 0, 0 },
+  { "r1", 1, {0, {{{0, 0}}}}, 0, 0 },
+  { "r2", 2, {0, {{{0, 0}}}}, 0, 0 },
+  { "r3", 3, {0, {{{0, 0}}}}, 0, 0 },
+  { "r4", 4, {0, {{{0, 0}}}}, 0, 0 },
+  { "r5", 5, {0, {{{0, 0}}}}, 0, 0 },
+  { "r6", 6, {0, {{{0, 0}}}}, 0, 0 },
+  { "r7", 7, {0, {{{0, 0}}}}, 0, 0 },
+  { "r8", 8, {0, {{{0, 0}}}}, 0, 0 },
+  { "r9", 9, {0, {{{0, 0}}}}, 0, 0 },
+  { "r10", 10, {0, {{{0, 0}}}}, 0, 0 },
+  { "r11", 11, {0, {{{0, 0}}}}, 0, 0 },
+  { "r12", 12, {0, {{{0, 0}}}}, 0, 0 },
+  { "r13", 13, {0, {{{0, 0}}}}, 0, 0 },
+  { "r14", 14, {0, {{{0, 0}}}}, 0, 0 },
+  { "r15", 15, {0, {{{0, 0}}}}, 0, 0 },
+  { "r16", 16, {0, {{{0, 0}}}}, 0, 0 },
+  { "r17", 17, {0, {{{0, 0}}}}, 0, 0 },
+  { "r18", 18, {0, {{{0, 0}}}}, 0, 0 },
+  { "r19", 19, {0, {{{0, 0}}}}, 0, 0 },
+  { "r20", 20, {0, {{{0, 0}}}}, 0, 0 },
+  { "r21", 21, {0, {{{0, 0}}}}, 0, 0 },
+  { "r22", 22, {0, {{{0, 0}}}}, 0, 0 },
+  { "r23", 23, {0, {{{0, 0}}}}, 0, 0 },
+  { "r24", 24, {0, {{{0, 0}}}}, 0, 0 },
+  { "r25", 25, {0, {{{0, 0}}}}, 0, 0 },
+  { "r26", 26, {0, {{{0, 0}}}}, 0, 0 },
+  { "r27", 27, {0, {{{0, 0}}}}, 0, 0 },
+  { "r28", 28, {0, {{{0, 0}}}}, 0, 0 },
+  { "r31", 31, {0, {{{0, 0}}}}, 0, 0 },
+  { "r32", 32, {0, {{{0, 0}}}}, 0, 0 },
+  { "r33", 33, {0, {{{0, 0}}}}, 0, 0 },
+  { "r34", 34, {0, {{{0, 0}}}}, 0, 0 },
+  { "r35", 35, {0, {{{0, 0}}}}, 0, 0 },
+  { "r36", 36, {0, {{{0, 0}}}}, 0, 0 },
+  { "r37", 37, {0, {{{0, 0}}}}, 0, 0 },
+  { "r38", 38, {0, {{{0, 0}}}}, 0, 0 },
+  { "r39", 39, {0, {{{0, 0}}}}, 0, 0 },
+  { "r40", 40, {0, {{{0, 0}}}}, 0, 0 },
+  { "r41", 41, {0, {{{0, 0}}}}, 0, 0 },
+  { "r42", 42, {0, {{{0, 0}}}}, 0, 0 },
+  { "r43", 43, {0, {{{0, 0}}}}, 0, 0 },
+  { "r44", 44, {0, {{{0, 0}}}}, 0, 0 },
+  { "r45", 45, {0, {{{0, 0}}}}, 0, 0 },
+  { "r46", 46, {0, {{{0, 0}}}}, 0, 0 },
+  { "r47", 47, {0, {{{0, 0}}}}, 0, 0 },
+  { "r48", 48, {0, {{{0, 0}}}}, 0, 0 },
+  { "r49", 49, {0, {{{0, 0}}}}, 0, 0 },
+  { "r50", 50, {0, {{{0, 0}}}}, 0, 0 },
+  { "r51", 51, {0, {{{0, 0}}}}, 0, 0 },
+  { "r52", 52, {0, {{{0, 0}}}}, 0, 0 },
+  { "r53", 53, {0, {{{0, 0}}}}, 0, 0 },
+  { "r54", 54, {0, {{{0, 0}}}}, 0, 0 },
+  { "r55", 55, {0, {{{0, 0}}}}, 0, 0 },
+  { "r56", 56, {0, {{{0, 0}}}}, 0, 0 },
+  { "r57", 57, {0, {{{0, 0}}}}, 0, 0 },
+  { "r58", 58, {0, {{{0, 0}}}}, 0, 0 },
+  { "r59", 59, {0, {{{0, 0}}}}, 0, 0 },
+  { "r60", 60, {0, {{{0, 0}}}}, 0, 0 }
+};
+
+CGEN_KEYWORD arc_cgen_opval_h_noilink =
+{
+  & arc_cgen_opval_h_noilink_entries[0],
+  68,
+  0, 0, 0, 0, ""
+};
+
+static CGEN_KEYWORD_ENTRY arc_cgen_opval_h_ilinkx_entries[] =
+{
+  { "ilink1", 29, {0, {{{0, 0}}}}, 0, 0 },
+  { "r29", 29, {0, {{{0, 0}}}}, 0, 0 },
+  { "ilink2", 30, {0, {{{0, 0}}}}, 0, 0 },
+  { "r30", 30, {0, {{{0, 0}}}}, 0, 0 }
+};
+
+CGEN_KEYWORD arc_cgen_opval_h_ilinkx =
+{
+  & arc_cgen_opval_h_ilinkx_entries[0],
+  4,
+  0, 0, 0, 0, ""
+};
+
+static CGEN_KEYWORD_ENTRY arc_cgen_opval_h_r31_entries[] =
+{
+  { "blink", 0, {0, {{{0, 0}}}}, 0, 0 },
+  { "r31", 0, {0, {{{0, 0}}}}, 0, 0 }
+};
+
+CGEN_KEYWORD arc_cgen_opval_h_r31 =
+{
+  & arc_cgen_opval_h_r31_entries[0],
+  2,
+  0, 0, 0, 0, ""
+};
+
+static CGEN_KEYWORD_ENTRY arc_cgen_opval_h_status32_entries[] =
+{
+  { "status32", 0, {0, {{{0, 0}}}}, 0, 0 }
+};
+
+CGEN_KEYWORD arc_cgen_opval_h_status32 =
+{
+  & arc_cgen_opval_h_status32_entries[0],
+  1,
+  0, 0, 0, 0, ""
+};
+
+static CGEN_KEYWORD_ENTRY arc_cgen_opval_h_ne_entries[] =
+{
+  { "ne", 0, {0, {{{0, 0}}}}, 0, 0 }
+};
+
+CGEN_KEYWORD arc_cgen_opval_h_ne =
+{
+  & arc_cgen_opval_h_ne_entries[0],
+  1,
+  0, 0, 0, 0, ""
+};
+
+static CGEN_KEYWORD_ENTRY arc_cgen_opval_h_RccS_entries[] =
+{
+  { "eq", 0, {0, {{{0, 0}}}}, 0, 0 },
+  { "ne", 1, {0, {{{0, 0}}}}, 0, 0 }
+};
+
+CGEN_KEYWORD arc_cgen_opval_h_RccS =
+{
+  & arc_cgen_opval_h_RccS_entries[0],
+  2,
+  0, 0, 0, 0, ""
+};
+
+static CGEN_KEYWORD_ENTRY arc_cgen_opval_h_Rcc_entries[] =
+{
+  { "req", 0, {0, {{{0, 0}}}}, 0, 0 },
+  { "rne", 1, {0, {{{0, 0}}}}, 0, 0 },
+  { "rlt", 2, {0, {{{0, 0}}}}, 0, 0 },
+  { "rge", 3, {0, {{{0, 0}}}}, 0, 0 },
+  { "rlo", 4, {0, {{{0, 0}}}}, 0, 0 },
+  { "rhs", 5, {0, {{{0, 0}}}}, 0, 0 },
+  { "bit0", 14, {0, {{{0, 0}}}}, 0, 0 },
+  { "bit1", 15, {0, {{{0, 0}}}}, 0, 0 }
+};
+
+CGEN_KEYWORD arc_cgen_opval_h_Rcc =
+{
+  & arc_cgen_opval_h_Rcc_entries[0],
+  8,
+  0, 0, 0, 0, ""
+};
+
+
+/* The hardware table.  */
+
+#if defined (__STDC__) || defined (ALMOST_STDC) || defined (HAVE_STRINGIZE)
+#define A(a) (1 << CGEN_HW_##a)
+#else
+#define A(a) (1 << CGEN_HW_/**/a)
+#endif
+
+const CGEN_HW_ENTRY arc_cgen_hw_table[] =
+{
+  { "h-memory", HW_H_MEMORY, CGEN_ASM_NONE, 0, { 0, { { { (1<<MACH_BASE), 0 } } } } },
+  { "h-sint", HW_H_SINT, CGEN_ASM_NONE, 0, { 0, { { { (1<<MACH_BASE), 0 } } } } },
+  { "h-uint", HW_H_UINT, CGEN_ASM_NONE, 0, { 0, { { { (1<<MACH_BASE), 0 } } } } },
+  { "h-addr", HW_H_ADDR, CGEN_ASM_NONE, 0, { 0, { { { (1<<MACH_BASE), 0 } } } } },
+  { "h-iaddr", HW_H_IADDR, CGEN_ASM_NONE, 0, { 0, { { { (1<<MACH_BASE), 0 } } } } },
+  { "h-lbit", HW_H_LBIT, CGEN_ASM_NONE, 0, { 0, { { { (1<<MACH_BASE), 0 } } } } },
+  { "h-zbit", HW_H_ZBIT, CGEN_ASM_NONE, 0, { 0, { { { (1<<MACH_BASE), 0 } } } } },
+  { "h-nbit", HW_H_NBIT, CGEN_ASM_NONE, 0, { 0, { { { (1<<MACH_BASE), 0 } } } } },
+  { "h-cbit", HW_H_CBIT, CGEN_ASM_NONE, 0, { 0, { { { (1<<MACH_BASE), 0 } } } } },
+  { "h-vbit", HW_H_VBIT, CGEN_ASM_NONE, 0, { 0, { { { (1<<MACH_BASE), 0 } } } } },
+  { "h-ubit", HW_H_UBIT, CGEN_ASM_NONE, 0, { 0, { { { (1<<MACH_BASE), 0 } } } } },
+  { "h-e1", HW_H_E1, CGEN_ASM_NONE, 0, { 0, { { { (1<<MACH_BASE), 0 } } } } },
+  { "h-e2", HW_H_E2, CGEN_ASM_NONE, 0, { 0, { { { (1<<MACH_BASE), 0 } } } } },
+  { "h-s1bit", HW_H_S1BIT, CGEN_ASM_NONE, 0, { 0, { { { (1<<MACH_BASE), 0 } } } } },
+  { "h-s2bit", HW_H_S2BIT, CGEN_ASM_NONE, 0, { 0, { { { (1<<MACH_BASE), 0 } } } } },
+  { "h-Qcondb", HW_H_QCONDB, CGEN_ASM_KEYWORD, (PTR) & arc_cgen_opval_h_Qcondb, { 0|A(VIRTUAL), { { { (1<<MACH_BASE), 0 } } } } },
+  { "h-Qcondj", HW_H_QCONDJ, CGEN_ASM_KEYWORD, (PTR) & arc_cgen_opval_h_Qcondj, { 0|A(VIRTUAL), { { { (1<<MACH_BASE), 0 } } } } },
+  { "h-Qcondi", HW_H_QCONDI, CGEN_ASM_KEYWORD, (PTR) & arc_cgen_opval_h_Qcondi, { 0|A(VIRTUAL), { { { (1<<MACH_BASE), 0 } } } } },
+  { "h-uncondb", HW_H_UNCONDB, CGEN_ASM_KEYWORD, (PTR) & arc_cgen_opval_h_uncondb, { 0, { { { (1<<MACH_BASE), 0 } } } } },
+  { "h-uncondj", HW_H_UNCONDJ, CGEN_ASM_KEYWORD, (PTR) & arc_cgen_opval_h_uncondj, { 0, { { { (1<<MACH_BASE), 0 } } } } },
+  { "h-uncondi", HW_H_UNCONDI, CGEN_ASM_KEYWORD, (PTR) & arc_cgen_opval_h_uncondi, { 0, { { { (1<<MACH_BASE), 0 } } } } },
+  { "h-i2cond", HW_H_I2COND, CGEN_ASM_KEYWORD, (PTR) & arc_cgen_opval_h_i2cond, { 0|A(VIRTUAL), { { { (1<<MACH_BASE), 0 } } } } },
+  { "h-i3cond", HW_H_I3COND, CGEN_ASM_KEYWORD, (PTR) & arc_cgen_opval_h_i3cond, { 0|A(VIRTUAL), { { { (1<<MACH_BASE), 0 } } } } },
+  { "h-delay", HW_H_DELAY, CGEN_ASM_KEYWORD, (PTR) & arc_cgen_opval_h_delay, { 0, { { { (1<<MACH_BASE), 0 } } } } },
+  { "h-uflags", HW_H_UFLAGS, CGEN_ASM_KEYWORD, (PTR) & arc_cgen_opval_h_uflags, { 0, { { { (1<<MACH_BASE), 0 } } } } },
+  { "h-nil", HW_H_NIL, CGEN_ASM_KEYWORD, (PTR) & arc_cgen_opval_h_nil, { 0, { { { (1<<MACH_BASE), 0 } } } } },
+  { "h-auflags", HW_H_AUFLAGS, CGEN_ASM_KEYWORD, (PTR) & arc_cgen_opval_h_auflags, { 0, { { { (1<<MACH_BASE), 0 } } } } },
+  { "h-aufflags", HW_H_AUFFLAGS, CGEN_ASM_KEYWORD, (PTR) & arc_cgen_opval_h_aufflags, { 0, { { { (1<<MACH_BASE), 0 } } } } },
+  { "h-Di", HW_H_DI, CGEN_ASM_KEYWORD, (PTR) & arc_cgen_opval_h_Di, { 0, { { { (1<<MACH_BASE), 0 } } } } },
+  { "h-insn16", HW_H_INSN16, CGEN_ASM_KEYWORD, (PTR) & arc_cgen_opval_h_insn16, { 0, { { { (1<<MACH_BASE), 0 } } } } },
+  { "h-insn32", HW_H_INSN32, CGEN_ASM_KEYWORD, (PTR) & arc_cgen_opval_h_insn32, { 0, { { { (1<<MACH_BASE), 0 } } } } },
+  { "h-_aw", HW_H__AW, CGEN_ASM_KEYWORD, (PTR) & arc_cgen_opval_h__aw, { 0, { { { (1<<MACH_BASE), 0 } } } } },
+  { "h-cr", HW_H_CR, CGEN_ASM_KEYWORD, (PTR) & arc_cgen_opval_cr_names, { 0, { { { (1<<MACH_BASE), 0 } } } } },
+  { "h-cr16", HW_H_CR16, CGEN_ASM_KEYWORD, (PTR) & arc_cgen_opval_h_cr16, { 0|A(VIRTUAL), { { { (1<<MACH_BASE), 0 } } } } },
+  { "h-r0", HW_H_R0, CGEN_ASM_KEYWORD, (PTR) & arc_cgen_opval_h_r0, { 0|A(VIRTUAL), { { { (1<<MACH_BASE), 0 } } } } },
+  { "h-gp", HW_H_GP, CGEN_ASM_KEYWORD, (PTR) & arc_cgen_opval_h_gp, { 0|A(VIRTUAL), { { { (1<<MACH_BASE), 0 } } } } },
+  { "h-sp", HW_H_SP, CGEN_ASM_KEYWORD, (PTR) & arc_cgen_opval_h_sp, { 0|A(VIRTUAL), { { { (1<<MACH_BASE), 0 } } } } },
+  { "h-pcl", HW_H_PCL, CGEN_ASM_KEYWORD, (PTR) & arc_cgen_opval_h_pcl, { 0|A(VIRTUAL), { { { (1<<MACH_BASE), 0 } } } } },
+  { "h-noilink", HW_H_NOILINK, CGEN_ASM_KEYWORD, (PTR) & arc_cgen_opval_h_noilink, { 0|A(VIRTUAL), { { { (1<<MACH_BASE), 0 } } } } },
+  { "h-ilinkx", HW_H_ILINKX, CGEN_ASM_KEYWORD, (PTR) & arc_cgen_opval_h_ilinkx, { 0|A(VIRTUAL), { { { (1<<MACH_BASE), 0 } } } } },
+  { "h-r31", HW_H_R31, CGEN_ASM_KEYWORD, (PTR) & arc_cgen_opval_h_r31, { 0|A(VIRTUAL), { { { (1<<MACH_BASE), 0 } } } } },
+  { "h-auxr", HW_H_AUXR, CGEN_ASM_KEYWORD, (PTR) & arc_cgen_opval_cr_names, { 0, { { { (1<<MACH_BASE), 0 } } } } },
+  { "h-status32", HW_H_STATUS32, CGEN_ASM_KEYWORD, (PTR) & arc_cgen_opval_h_status32, { 0|A(VIRTUAL), { { { (1<<MACH_BASE), 0 } } } } },
+  { "h-timer-expire", HW_H_TIMER_EXPIRE, CGEN_ASM_NONE, 0, { 0, { { { (1<<MACH_BASE), 0 } } } } },
+  { "h-prof-offset", HW_H_PROF_OFFSET, CGEN_ASM_NONE, 0, { 0, { { { (1<<MACH_BASE), 0 } } } } },
+  { "h-ne", HW_H_NE, CGEN_ASM_KEYWORD, (PTR) & arc_cgen_opval_h_ne, { 0, { { { (1<<MACH_BASE), 0 } } } } },
+  { "h-pc", HW_H_PC, CGEN_ASM_NONE, 0, { 0|A(PROFILE)|A(PC), { { { (1<<MACH_BASE), 0 } } } } },
+  { "h-RccS", HW_H_RCCS, CGEN_ASM_KEYWORD, (PTR) & arc_cgen_opval_h_RccS, { 0, { { { (1<<MACH_BASE), 0 } } } } },
+  { "h-Rcc", HW_H_RCC, CGEN_ASM_KEYWORD, (PTR) & arc_cgen_opval_h_Rcc, { 0, { { { (1<<MACH_BASE), 0 } } } } },
+  { 0, 0, CGEN_ASM_NONE, 0, { 0, { { { (1<<MACH_BASE), 0 } } } } }
+};
+
+#undef A
+
+
+/* The instruction field table.  */
+
+#if defined (__STDC__) || defined (ALMOST_STDC) || defined (HAVE_STRINGIZE)
+#define A(a) (1 << CGEN_IFLD_##a)
+#else
+#define A(a) (1 << CGEN_IFLD_/**/a)
+#endif
+
+const CGEN_IFLD arc_cgen_ifld_table[] =
+{
+  { ARC_F_NIL, "f-nil", 0, 0, 0, 0, { 0, { { { (1<<MACH_BASE), 0 } } } }  },
+  { ARC_F_ANYOF, "f-anyof", 0, 0, 0, 0, { 0, { { { (1<<MACH_BASE), 0 } } } }  },
+  { ARC_F_COND_Q, "f-cond-Q", 0, 32, 27, 5, { 0, { { { (1<<MACH_BASE), 0 } } } }  },
+  { ARC_F_COND_I2, "f-cond-i2", 0, 32, 5, 2, { 0, { { { (1<<MACH_BASE), 0 } } } }  },
+  { ARC_F_COND_I3, "f-cond-i3", 0, 32, 7, 3, { 0, { { { (1<<MACH_BASE), 0 } } } }  },
+  { ARC_F_BRCOND, "f-brcond", 0, 32, 28, 4, { 0, { { { (1<<MACH_BASE), 0 } } } }  },
+  { ARC_F_OP__A, "f-op--a", 0, 32, 13, 3, { 0, { { { (1<<MACH_BASE), 0 } } } }  },
+  { ARC_F_OP__B, "f-op--b", 0, 32, 5, 3, { 0, { { { (1<<MACH_BASE), 0 } } } }  },
+  { ARC_F_OP__C, "f-op--c", 0, 32, 8, 3, { 0, { { { (1<<MACH_BASE), 0 } } } }  },
+  { ARC_F_B_5_3, "f-B-5-3", 0, 32, 17, 3, { 0, { { { (1<<MACH_BASE), 0 } } } }  },
+  { ARC_F_OP_B, "f-op-B", 0, 0, 0, 0,{ 0|A(VIRTUAL), { { { (1<<MACH_BASE), 0 } } } }  },
+  { ARC_F_OP_C, "f-op-C", 0, 32, 20, 6, { 0, { { { (1<<MACH_BASE), 0 } } } }  },
+  { ARC_F_OP_CJ, "f-op-Cj", 0, 32, 20, 6, { 0, { { { (1<<MACH_BASE), 0 } } } }  },
+  { ARC_F_H_2_0, "f-h-2-0", 0, 32, 8, 3, { 0, { { { (1<<MACH_BASE), 0 } } } }  },
+  { ARC_F_H_5_3, "f-h-5-3", 0, 32, 13, 3, { 0, { { { (1<<MACH_BASE), 0 } } } }  },
+  { ARC_F_OP_H, "f-op-h", 0, 0, 0, 0,{ 0|A(VIRTUAL), { { { (1<<MACH_BASE), 0 } } } }  },
+  { ARC_F_U6, "f-u6", 0, 32, 20, 6, { 0, { { { (1<<MACH_BASE), 0 } } } }  },
+  { ARC_F_U6X2, "f-u6x2", 0, 32, 20, 6, { 0, { { { (1<<MACH_BASE), 0 } } } }  },
+  { ARC_F_DELAY_N, "f-delay-N", 0, 32, 26, 1, { 0, { { { (1<<MACH_BASE), 0 } } } }  },
+  { ARC_F_RES27, "f-res27", 0, 32, 27, 1, { 0|A(RESERVED), { { { (1<<MACH_BASE), 0 } } } }  },
+  { ARC_F_F, "f-F", 0, 32, 16, 1, { 0, { { { (1<<MACH_BASE), 0 } } } }  },
+  { ARC_F_CBRANCH_IMM, "f-cbranch-imm", 0, 32, 27, 1, { 0, { { { (1<<MACH_BASE), 0 } } } }  },
+  { ARC_F_OP_A, "f-op-A", 0, 32, 26, 6, { 0, { { { (1<<MACH_BASE), 0 } } } }  },
+  { ARC_F_S12H, "f-s12h", 0, 32, 26, 6, { 0, { { { (1<<MACH_BASE), 0 } } } }  },
+  { ARC_F_S12, "f-s12", 0, 0, 0, 0,{ 0|A(VIRTUAL), { { { (1<<MACH_BASE), 0 } } } }  },
+  { ARC_F_S12X2, "f-s12x2", 0, 0, 0, 0,{ 0|A(VIRTUAL), { { { (1<<MACH_BASE), 0 } } } }  },
+  { ARC_F_REL10, "f-rel10", 0, 32, 7, 9, { 0|A(PCREL_ADDR), { { { (1<<MACH_BASE), 0 } } } }  },
+  { ARC_F_REL7, "f-rel7", 0, 32, 10, 6, { 0|A(PCREL_ADDR), { { { (1<<MACH_BASE), 0 } } } }  },
+  { ARC_F_REL8, "f-rel8", 0, 32, 9, 7, { 0|A(PCREL_ADDR), { { { (1<<MACH_BASE), 0 } } } }  },
+  { ARC_F_REL13BL, "f-rel13bl", 0, 32, 5, 11, { 0|A(PCREL_ADDR), { { { (1<<MACH_BASE), 0 } } } }  },
+  { ARC_F_D21L, "f-d21l", 0, 32, 5, 10, { 0, { { { (1<<MACH_BASE), 0 } } } }  },
+  { ARC_F_D21BL, "f-d21bl", 0, 32, 5, 9, { 0, { { { (1<<MACH_BASE), 0 } } } }  },
+  { ARC_F_D21H, "f-d21h", 0, 32, 16, 10, { 0, { { { (1<<MACH_BASE), 0 } } } }  },
+  { ARC_F_D25M, "f-d25m", 0, 32, 16, 10, { 0, { { { (1<<MACH_BASE), 0 } } } }  },
+  { ARC_F_D25H, "f-d25h", 0, 32, 28, 4, { 0, { { { (1<<MACH_BASE), 0 } } } }  },
+  { ARC_F_REL21, "f-rel21", 0, 0, 0, 0,{ 0|A(PCREL_ADDR)|A(VIRTUAL), { { { (1<<MACH_BASE), 0 } } } }  },
+  { ARC_F_REL21BL, "f-rel21bl", 0, 0, 0, 0,{ 0|A(PCREL_ADDR)|A(VIRTUAL), { { { (1<<MACH_BASE), 0 } } } }  },
+  { ARC_F_REL25, "f-rel25", 0, 0, 0, 0,{ 0|A(PCREL_ADDR)|A(VIRTUAL), { { { (1<<MACH_BASE), 0 } } } }  },
+  { ARC_F_REL25BL, "f-rel25bl", 0, 0, 0, 0,{ 0|A(PCREL_ADDR)|A(VIRTUAL), { { { (1<<MACH_BASE), 0 } } } }  },
+  { ARC_F_D9L, "f-d9l", 0, 32, 8, 7, { 0, { { { (1<<MACH_BASE), 0 } } } }  },
+  { ARC_F_D9H, "f-d9h", 0, 32, 16, 1, { 0, { { { (1<<MACH_BASE), 0 } } } }  },
+  { ARC_F_REL9, "f-rel9", 0, 0, 0, 0,{ 0|A(PCREL_ADDR)|A(VIRTUAL), { { { (1<<MACH_BASE), 0 } } } }  },
+  { ARC_F_U3, "f-u3", 0, 32, 13, 3, { 0, { { { (1<<MACH_BASE), 0 } } } }  },
+  { ARC_F_U5, "f-u5", 0, 32, 11, 5, { 0, { { { (1<<MACH_BASE), 0 } } } }  },
+  { ARC_F_U7, "f-u7", 0, 32, 9, 7, { 0, { { { (1<<MACH_BASE), 0 } } } }  },
+  { ARC_F_U8, "f-u8", 0, 32, 8, 8, { 0, { { { (1<<MACH_BASE), 0 } } } }  },
+  { ARC_F_S9, "f-s9", 0, 0, 0, 0,{ 0|A(VIRTUAL), { { { (1<<MACH_BASE), 0 } } } }  },
+  { ARC_F_U5X2, "f-u5x2", 0, 32, 11, 5, { 0, { { { (1<<MACH_BASE), 0 } } } }  },
+  { ARC_F_U5X4, "f-u5x4", 0, 32, 11, 5, { 0, { { { (1<<MACH_BASE), 0 } } } }  },
+  { ARC_F_U8X4, "f-u8x4", 0, 32, 8, 8, { 0, { { { (1<<MACH_BASE), 0 } } } }  },
+  { ARC_F_S9X1, "f-s9x1", 0, 32, 7, 9, { 0, { { { (1<<MACH_BASE), 0 } } } }  },
+  { ARC_F_S9X2, "f-s9x2", 0, 32, 7, 9, { 0, { { { (1<<MACH_BASE), 0 } } } }  },
+  { ARC_F_S9X4, "f-s9x4", 0, 32, 7, 9, { 0, { { { (1<<MACH_BASE), 0 } } } }  },
+  { ARC_F_DUMMY, "f-dummy", 0, 32, 16, 16, { 0, { { { (1<<MACH_BASE), 0 } } } }  },
+  { ARC_F_OPM, "f-opm", 0, 32, 0, 5, { 0, { { { (1<<MACH_BASE), 0 } } } }  },
+  { ARC_F_GO_TYPE, "f-go-type", 0, 32, 8, 2, { 0, { { { (1<<MACH_BASE), 0 } } } }  },
+  { ARC_F_GO_CC_TYPE, "f-go-cc-type", 0, 32, 26, 1, { 0, { { { (1<<MACH_BASE), 0 } } } }  },
+  { ARC_F_GO_OP, "f-go-op", 0, 32, 10, 6, { 0, { { { (1<<MACH_BASE), 0 } } } }  },
+  { ARC_F_I16_43, "f-i16-43", 0, 32, 11, 2, { 0, { { { (1<<MACH_BASE), 0 } } } }  },
+  { ARC_F_I16_GO, "f-i16-go", 0, 32, 11, 5, { 0, { { { (1<<MACH_BASE), 0 } } } }  },
+  { ARC_F_I16_GP_TYPE, "f-i16-gp-type", 0, 32, 5, 2, { 0, { { { (1<<MACH_BASE), 0 } } } }  },
+  { ARC_F_I16ADDCMPU7_TYPE, "f-i16addcmpu7-type", 0, 32, 8, 1, { 0, { { { (1<<MACH_BASE), 0 } } } }  },
+  { ARC_F_BUF, "f-buf", 0, 32, 15, 1, { 0, { { { (1<<MACH_BASE), 0 } } } }  },
+  { ARC_F_BR, "f-br", 0, 32, 27, 1, { 0, { { { (1<<MACH_BASE), 0 } } } }  },
+  { ARC_F_BLUF, "f-bluf", 0, 32, 14, 1, { 0, { { { (1<<MACH_BASE), 0 } } } }  },
+  { ARC_F_BRSCOND, "f-brscond", 0, 32, 8, 1, { 0, { { { (1<<MACH_BASE), 0 } } } }  },
+  { ARC_F_LDOZZX, "f-ldozzx", 0, 32, 23, 3, { 0, { { { (1<<MACH_BASE), 0 } } } }  },
+  { ARC_F_LDR6ZZX, "f-ldr6zzx", 0, 32, 10, 6, { 0, { { { (1<<MACH_BASE), 0 } } } }  },
+  { ARC_F_STOZZR, "f-stozzr", 0, 32, 29, 3, { 0, { { { (1<<MACH_BASE), 0 } } } }  },
+  { ARC_F_LDOAA, "f-ldoaa", 0, 32, 21, 2, { 0, { { { (1<<MACH_BASE), 0 } } } }  },
+  { ARC_F_LDRAA, "f-ldraa", 0, 32, 8, 2, { 0, { { { (1<<MACH_BASE), 0 } } } }  },
+  { ARC_F_STOAA, "f-stoaa", 0, 32, 27, 2, { 0, { { { (1<<MACH_BASE), 0 } } } }  },
+  { ARC_F_LDODI, "f-LDODi", 0, 32, 20, 1, { 0, { { { (1<<MACH_BASE), 0 } } } }  },
+  { ARC_F_LDRDI, "f-LDRDi", 0, 32, 16, 1, { 0, { { { (1<<MACH_BASE), 0 } } } }  },
+  { ARC_F_STODI, "f-STODi", 0, 32, 26, 1, { 0, { { { (1<<MACH_BASE), 0 } } } }  },
+  { ARC_F_TRAPNUM, "f-trapnum", 0, 32, 5, 6, { 0, { { { (1<<MACH_BASE), 0 } } } }  },
+  { 0, 0, 0, 0, 0, 0, { 0, { { { (1<<MACH_BASE), 0 } } } } }
+};
+
+#undef A
+
+
+
+/* multi ifield declarations */
+
+const CGEN_MAYBE_MULTI_IFLD ARC_F_OP_B_MULTI_IFIELD [];
+const CGEN_MAYBE_MULTI_IFLD ARC_F_OP_H_MULTI_IFIELD [];
+const CGEN_MAYBE_MULTI_IFLD ARC_F_S12_MULTI_IFIELD [];
+const CGEN_MAYBE_MULTI_IFLD ARC_F_S12X2_MULTI_IFIELD [];
+const CGEN_MAYBE_MULTI_IFLD ARC_F_REL21_MULTI_IFIELD [];
+const CGEN_MAYBE_MULTI_IFLD ARC_F_REL21BL_MULTI_IFIELD [];
+const CGEN_MAYBE_MULTI_IFLD ARC_F_REL25_MULTI_IFIELD [];
+const CGEN_MAYBE_MULTI_IFLD ARC_F_REL25BL_MULTI_IFIELD [];
+const CGEN_MAYBE_MULTI_IFLD ARC_F_REL9_MULTI_IFIELD [];
+const CGEN_MAYBE_MULTI_IFLD ARC_F_S9_MULTI_IFIELD [];
+
+
+/* multi ifield definitions */
+
+const CGEN_MAYBE_MULTI_IFLD ARC_F_OP_B_MULTI_IFIELD [] =
+{
+    { 0, { (const PTR) &arc_cgen_ifld_table[ARC_F_OP__B] } },
+    { 0, { (const PTR) &arc_cgen_ifld_table[ARC_F_B_5_3] } },
+    { 0, { (const PTR) 0 } }
+};
+const CGEN_MAYBE_MULTI_IFLD ARC_F_OP_H_MULTI_IFIELD [] =
+{
+    { 0, { (const PTR) &arc_cgen_ifld_table[ARC_F_H_2_0] } },
+    { 0, { (const PTR) &arc_cgen_ifld_table[ARC_F_H_5_3] } },
+    { 0, { (const PTR) 0 } }
+};
+const CGEN_MAYBE_MULTI_IFLD ARC_F_S12_MULTI_IFIELD [] =
+{
+    { 0, { (const PTR) &arc_cgen_ifld_table[ARC_F_U6] } },
+    { 0, { (const PTR) &arc_cgen_ifld_table[ARC_F_S12H] } },
+    { 0, { (const PTR) 0 } }
+};
+const CGEN_MAYBE_MULTI_IFLD ARC_F_S12X2_MULTI_IFIELD [] =
+{
+    { 0, { (const PTR) &arc_cgen_ifld_table[ARC_F_U6] } },
+    { 0, { (const PTR) &arc_cgen_ifld_table[ARC_F_S12H] } },
+    { 0, { (const PTR) 0 } }
+};
+const CGEN_MAYBE_MULTI_IFLD ARC_F_REL21_MULTI_IFIELD [] =
+{
+    { 0, { (const PTR) &arc_cgen_ifld_table[ARC_F_D21L] } },
+    { 0, { (const PTR) &arc_cgen_ifld_table[ARC_F_D21H] } },
+    { 0, { (const PTR) 0 } }
+};
+const CGEN_MAYBE_MULTI_IFLD ARC_F_REL21BL_MULTI_IFIELD [] =
+{
+    { 0, { (const PTR) &arc_cgen_ifld_table[ARC_F_D21BL] } },
+    { 0, { (const PTR) &arc_cgen_ifld_table[ARC_F_D21H] } },
+    { 0, { (const PTR) 0 } }
+};
+const CGEN_MAYBE_MULTI_IFLD ARC_F_REL25_MULTI_IFIELD [] =
+{
+    { 0, { (const PTR) &arc_cgen_ifld_table[ARC_F_D21L] } },
+    { 0, { (const PTR) &arc_cgen_ifld_table[ARC_F_D25M] } },
+    { 0, { (const PTR) &arc_cgen_ifld_table[ARC_F_D25H] } },
+    { 0, { (const PTR) 0 } }
+};
+const CGEN_MAYBE_MULTI_IFLD ARC_F_REL25BL_MULTI_IFIELD [] =
+{
+    { 0, { (const PTR) &arc_cgen_ifld_table[ARC_F_D21BL] } },
+    { 0, { (const PTR) &arc_cgen_ifld_table[ARC_F_D25M] } },
+    { 0, { (const PTR) &arc_cgen_ifld_table[ARC_F_D25H] } },
+    { 0, { (const PTR) 0 } }
+};
+const CGEN_MAYBE_MULTI_IFLD ARC_F_REL9_MULTI_IFIELD [] =
+{
+    { 0, { (const PTR) &arc_cgen_ifld_table[ARC_F_D9L] } },
+    { 0, { (const PTR) &arc_cgen_ifld_table[ARC_F_D9H] } },
+    { 0, { (const PTR) 0 } }
+};
+const CGEN_MAYBE_MULTI_IFLD ARC_F_S9_MULTI_IFIELD [] =
+{
+    { 0, { (const PTR) &arc_cgen_ifld_table[ARC_F_U8] } },
+    { 0, { (const PTR) &arc_cgen_ifld_table[ARC_F_D9H] } },
+    { 0, { (const PTR) 0 } }
+};
+
+/* The operand table.  */
+
+#if defined (__STDC__) || defined (ALMOST_STDC) || defined (HAVE_STRINGIZE)
+#define A(a) (1 << CGEN_OPERAND_##a)
+#else
+#define A(a) (1 << CGEN_OPERAND_/**/a)
+#endif
+#if defined (__STDC__) || defined (ALMOST_STDC) || defined (HAVE_STRINGIZE)
+#define OPERAND(op) ARC_OPERAND_##op
+#else
+#define OPERAND(op) ARC_OPERAND_/**/op
+#endif
+
+const CGEN_OPERAND arc_cgen_operand_table[] =
+{
+/* pc: program counter */
+  { "pc", ARC_OPERAND_PC, HW_H_PC, 0, 0,
+    { 0, { (const PTR) &arc_cgen_ifld_table[ARC_F_NIL] } }, 
+    { 0|A(SEM_ONLY), { { { (1<<MACH_BASE), 0 } } } }  },
+/* lbit: loop inhibit bit */
+  { "lbit", ARC_OPERAND_LBIT, HW_H_LBIT, 0, 0,
+    { 0, { (const PTR) 0 } }, 
+    { 0, { { { (1<<MACH_BASE), 0 } } } }  },
+/* zbit: zero bit */
+  { "zbit", ARC_OPERAND_ZBIT, HW_H_ZBIT, 0, 0,
+    { 0, { (const PTR) 0 } }, 
+    { 0, { { { (1<<MACH_BASE), 0 } } } }  },
+/* nbit: negative bit */
+  { "nbit", ARC_OPERAND_NBIT, HW_H_NBIT, 0, 0,
+    { 0, { (const PTR) 0 } }, 
+    { 0, { { { (1<<MACH_BASE), 0 } } } }  },
+/* cbit: carry bit */
+  { "cbit", ARC_OPERAND_CBIT, HW_H_CBIT, 0, 0,
+    { 0, { (const PTR) 0 } }, 
+    { 0, { { { (1<<MACH_BASE), 0 } } } }  },
+/* vbit: overflow bit */
+  { "vbit", ARC_OPERAND_VBIT, HW_H_VBIT, 0, 0,
+    { 0, { (const PTR) 0 } }, 
+    { 0, { { { (1<<MACH_BASE), 0 } } } }  },
+/* s1bit: channel 1 saturate */
+  { "s1bit", ARC_OPERAND_S1BIT, HW_H_S1BIT, 0, 0,
+    { 0, { (const PTR) 0 } }, 
+    { 0, { { { (1<<MACH_BASE), 0 } } } }  },
+/* s2bit: channel 2 saturate */
+  { "s2bit", ARC_OPERAND_S2BIT, HW_H_S2BIT, 0, 0,
+    { 0, { (const PTR) 0 } }, 
+    { 0, { { { (1<<MACH_BASE), 0 } } } }  },
+/* Qcondb: Condition */
+  { "Qcondb", ARC_OPERAND_QCONDB, HW_H_QCONDB, 27, 5,
+    { 0, { (const PTR) &arc_cgen_ifld_table[ARC_F_COND_Q] } }, 
+    { 0, { { { (1<<MACH_BASE), 0 } } } }  },
+/* Qcondj: Condition */
+  { "Qcondj", ARC_OPERAND_QCONDJ, HW_H_QCONDJ, 27, 5,
+    { 0, { (const PTR) &arc_cgen_ifld_table[ARC_F_COND_Q] } }, 
+    { 0, { { { (1<<MACH_BASE), 0 } } } }  },
+/* Qcondi: Condition */
+  { "Qcondi", ARC_OPERAND_QCONDI, HW_H_QCONDI, 27, 5,
+    { 0, { (const PTR) &arc_cgen_ifld_table[ARC_F_COND_Q] } }, 
+    { 0, { { { (1<<MACH_BASE), 0 } } } }  },
+/* uncondb: unconditional branch */
+  { "uncondb", ARC_OPERAND_UNCONDB, HW_H_UNCONDB, 0, 0,
+    { 0, { (const PTR) 0 } }, 
+    { 0, { { { (1<<MACH_BASE), 0 } } } }  },
+/* uncondj: unconditional jump */
+  { "uncondj", ARC_OPERAND_UNCONDJ, HW_H_UNCONDJ, 0, 0,
+    { 0, { (const PTR) 0 } }, 
+    { 0, { { { (1<<MACH_BASE), 0 } } } }  },
+/* uncondi: unconditional insn */
+  { "uncondi", ARC_OPERAND_UNCONDI, HW_H_UNCONDI, 0, 0,
+    { 0, { (const PTR) 0 } }, 
+    { 0, { { { (1<<MACH_BASE), 0 } } } }  },
+/* i2cond: Condition */
+  { "i2cond", ARC_OPERAND_I2COND, HW_H_I2COND, 5, 2,
+    { 0, { (const PTR) &arc_cgen_ifld_table[ARC_F_COND_I2] } }, 
+    { 0, { { { (1<<MACH_BASE), 0 } } } }  },
+/* i3cond: Condition */
+  { "i3cond", ARC_OPERAND_I3COND, HW_H_I3COND, 7, 3,
+    { 0, { (const PTR) &arc_cgen_ifld_table[ARC_F_COND_I3] } }, 
+    { 0, { { { (1<<MACH_BASE), 0 } } } }  },
+/* delay_N: Delay slot exposed */
+  { "delay_N", ARC_OPERAND_DELAY_N, HW_H_DELAY, 26, 1,
+    { 0, { (const PTR) &arc_cgen_ifld_table[ARC_F_DELAY_N] } }, 
+    { 0, { { { (1<<MACH_BASE), 0 } } } }  },
+/* _S: 16 bit opcode */
+  { "_S", ARC_OPERAND__S, HW_H_INSN16, 0, 0,
+    { 0, { (const PTR) 0 } }, 
+    { 0, { { { (1<<MACH_BASE), 0 } } } }  },
+/* _L: 32 bit opcode */
+  { "_L", ARC_OPERAND__L, HW_H_INSN32, 0, 0,
+    { 0, { (const PTR) 0 } }, 
+    { 0, { { { (1<<MACH_BASE), 0 } } } }  },
+/* F: update flags */
+  { "F", ARC_OPERAND_F, HW_H_UFLAGS, 16, 1,
+    { 0, { (const PTR) &arc_cgen_ifld_table[ARC_F_F] } }, 
+    { 0, { { { (1<<MACH_BASE), 0 } } } }  },
+/* F1: always update flags */
+  { "F1", ARC_OPERAND_F1, HW_H_AUFLAGS, 16, 1,
+    { 0, { (const PTR) &arc_cgen_ifld_table[ARC_F_F] } }, 
+    { 0, { { { (1<<MACH_BASE), 0 } } } }  },
+/* F1F: always update flags; .F allowed */
+  { "F1F", ARC_OPERAND_F1F, HW_H_AUFFLAGS, 16, 1,
+    { 0, { (const PTR) &arc_cgen_ifld_table[ARC_F_F] } }, 
+    { 0, { { { (1<<MACH_BASE), 0 } } } }  },
+/* F0: never update flags */
+  { "F0", ARC_OPERAND_F0, HW_H_NIL, 16, 1,
+    { 0, { (const PTR) &arc_cgen_ifld_table[ARC_F_F] } }, 
+    { 0, { { { (1<<MACH_BASE), 0 } } } }  },
+/* R_a: Core Register a */
+  { "R_a", ARC_OPERAND_R_A, HW_H_CR16, 13, 3,
+    { 0, { (const PTR) &arc_cgen_ifld_table[ARC_F_OP__A] } }, 
+    { 0, { { { (1<<MACH_BASE), 0 } } } }  },
+/* RA: Core Register A */
+  { "RA", ARC_OPERAND_RA, HW_H_CR, 26, 6,
+    { 0, { (const PTR) &arc_cgen_ifld_table[ARC_F_OP_A] } }, 
+    { 0, { { { (1<<MACH_BASE), 0 } } } }  },
+/* R_b: Core Register b */
+  { "R_b", ARC_OPERAND_R_B, HW_H_CR16, 5, 3,
+    { 0, { (const PTR) &arc_cgen_ifld_table[ARC_F_OP__B] } }, 
+    { 0, { { { (1<<MACH_BASE), 0 } } } }  },
+/* RB: Core Register B */
+  { "RB", ARC_OPERAND_RB, HW_H_CR, 5, 6,
+    { 2, { (const PTR) &ARC_F_OP_B_MULTI_IFIELD[0] } }, 
+    { 0|A(VIRTUAL), { { { (1<<MACH_BASE), 0 } } } }  },
+/* R_c: Core Register b */
+  { "R_c", ARC_OPERAND_R_C, HW_H_CR16, 8, 3,
+    { 0, { (const PTR) &arc_cgen_ifld_table[ARC_F_OP__C] } }, 
+    { 0, { { { (1<<MACH_BASE), 0 } } } }  },
+/* RC: Core Register C */
+  { "RC", ARC_OPERAND_RC, HW_H_CR, 20, 6,
+    { 0, { (const PTR) &arc_cgen_ifld_table[ARC_F_OP_C] } }, 
+    { 0, { { { (1<<MACH_BASE), 0 } } } }  },
+/* Rh: Core register h */
+  { "Rh", ARC_OPERAND_RH, HW_H_CR, 8, 6,
+    { 2, { (const PTR) &ARC_F_OP_H_MULTI_IFIELD[0] } }, 
+    { 0|A(VIRTUAL), { { { (1<<MACH_BASE), 0 } } } }  },
+/* R0: Core Register 0 */
+  { "R0", ARC_OPERAND_R0, HW_H_R0, 0, 0,
+    { 0, { (const PTR) 0 } }, 
+    { 0, { { { (1<<MACH_BASE), 0 } } } }  },
+/* R31: Core Register 31 */
+  { "R31", ARC_OPERAND_R31, HW_H_R31, 0, 0,
+    { 0, { (const PTR) 0 } }, 
+    { 0, { { { (1<<MACH_BASE), 0 } } } }  },
+/* GP: Global Pointer */
+  { "GP", ARC_OPERAND_GP, HW_H_GP, 0, 0,
+    { 0, { (const PTR) 0 } }, 
+    { 0, { { { (1<<MACH_BASE), 0 } } } }  },
+/* SP: Stack Pointer */
+  { "SP", ARC_OPERAND_SP, HW_H_SP, 0, 0,
+    { 0, { (const PTR) 0 } }, 
+    { 0, { { { (1<<MACH_BASE), 0 } } } }  },
+/* PCL: read PC - aligned */
+  { "PCL", ARC_OPERAND_PCL, HW_H_PCL, 0, 0,
+    { 0, { (const PTR) 0 } }, 
+    { 0, { { { (1<<MACH_BASE), 0 } } } }  },
+/* RA_0: encode A as 0 */
+  { "RA_0", ARC_OPERAND_RA_0, HW_H_NIL, 26, 6,
+    { 0, { (const PTR) &arc_cgen_ifld_table[ARC_F_OP_A] } }, 
+    { 0, { { { (1<<MACH_BASE), 0 } } } }  },
+/* RB_0: encode B as 0 */
+  { "RB_0", ARC_OPERAND_RB_0, HW_H_NIL, 5, 6,
+    { 2, { (const PTR) &ARC_F_OP_B_MULTI_IFIELD[0] } }, 
+    { 0|A(VIRTUAL), { { { (1<<MACH_BASE), 0 } } } }  },
+/* RC_ilink: inlink[01] as op C */
+  { "RC_ilink", ARC_OPERAND_RC_ILINK, HW_H_ILINKX, 20, 6,
+    { 0, { (const PTR) &arc_cgen_ifld_table[ARC_F_OP_CJ] } }, 
+    { 0, { { { (1<<MACH_BASE), 0 } } } }  },
+/* RC_noilink: Core reg C, not ilink */
+  { "RC_noilink", ARC_OPERAND_RC_NOILINK, HW_H_NOILINK, 20, 6,
+    { 0, { (const PTR) &arc_cgen_ifld_table[ARC_F_OP_CJ] } }, 
+    { 0, { { { (1<<MACH_BASE), 0 } } } }  },
+/* NE: NE condition  */
+  { "NE", ARC_OPERAND_NE, HW_H_NE, 0, 0,
+    { 0, { (const PTR) 0 } }, 
+    { 0, { { { (1<<MACH_BASE), 0 } } } }  },
+/* U6: 6 bit unsigned immediate */
+  { "U6", ARC_OPERAND_U6, HW_H_UINT, 20, 6,
+    { 0, { (const PTR) &arc_cgen_ifld_table[ARC_F_U6] } }, 
+    { 0, { { { (1<<MACH_BASE), 0 } } } }  },
+/* U6x2: 6 bit unsigned immediate */
+  { "U6x2", ARC_OPERAND_U6X2, HW_H_UINT, 20, 6,
+    { 0, { (const PTR) &arc_cgen_ifld_table[ARC_F_U6X2] } }, 
+    { 0, { { { (1<<MACH_BASE), 0 } } } }  },
+/* u3: 3 bit unsigned immediate */
+  { "u3", ARC_OPERAND_U3, HW_H_UINT, 13, 3,
+    { 0, { (const PTR) &arc_cgen_ifld_table[ARC_F_U3] } }, 
+    { 0, { { { (1<<MACH_BASE), 0 } } } }  },
+/* u5: 5 bit unsigned immediate */
+  { "u5", ARC_OPERAND_U5, HW_H_UINT, 11, 5,
+    { 0, { (const PTR) &arc_cgen_ifld_table[ARC_F_U5] } }, 
+    { 0, { { { (1<<MACH_BASE), 0 } } } }  },
+/* u7: 7 bit unsigned immediate */
+  { "u7", ARC_OPERAND_U7, HW_H_UINT, 9, 7,
+    { 0, { (const PTR) &arc_cgen_ifld_table[ARC_F_U7] } }, 
+    { 0, { { { (1<<MACH_BASE), 0 } } } }  },
+/* u8: 8 bit unsigned immediate */
+  { "u8", ARC_OPERAND_U8, HW_H_UINT, 8, 8,
+    { 0, { (const PTR) &arc_cgen_ifld_table[ARC_F_U8] } }, 
+    { 0, { { { (1<<MACH_BASE), 0 } } } }  },
+/* s9: 8 bit signed immediate */
+  { "s9", ARC_OPERAND_S9, HW_H_SINT, 8, 9,
+    { 2, { (const PTR) &ARC_F_S9_MULTI_IFIELD[0] } }, 
+    { 0|A(VIRTUAL), { { { (1<<MACH_BASE), 0 } } } }  },
+/* s12: 12 bit signed immediate */
+  { "s12", ARC_OPERAND_S12, HW_H_SINT, 20, 12,
+    { 2, { (const PTR) &ARC_F_S12_MULTI_IFIELD[0] } }, 
+    { 0|A(VIRTUAL), { { { (1<<MACH_BASE), 0 } } } }  },
+/* s12x2: 12 bit signed immediate */
+  { "s12x2", ARC_OPERAND_S12X2, HW_H_SINT, 20, 12,
+    { 2, { (const PTR) &ARC_F_S12X2_MULTI_IFIELD[0] } }, 
+    { 0|A(VIRTUAL), { { { (1<<MACH_BASE), 0 } } } }  },
+/* u5x4: 5 bit uns imm times 4 */
+  { "u5x4", ARC_OPERAND_U5X4, HW_H_UINT, 11, 5,
+    { 0, { (const PTR) &arc_cgen_ifld_table[ARC_F_U5X4] } }, 
+    { 0, { { { (1<<MACH_BASE), 0 } } } }  },
+/* sc_u5_: 5 bit uns imm times 4 */
+  { "sc_u5_", ARC_OPERAND_SC_U5_, HW_H_UINT, 11, 5,
+    { 0, { (const PTR) &arc_cgen_ifld_table[ARC_F_U5X4] } }, 
+    { 0, { { { (1<<MACH_BASE), 0 } } } }  },
+/* sc_u5w: 5 bit uns imm times 2 */
+  { "sc_u5w", ARC_OPERAND_SC_U5W, HW_H_UINT, 11, 5,
+    { 0, { (const PTR) &arc_cgen_ifld_table[ARC_F_U5X2] } }, 
+    { 0, { { { (1<<MACH_BASE), 0 } } } }  },
+/* sc_u5b: 5 bit uns imm times 1 */
+  { "sc_u5b", ARC_OPERAND_SC_U5B, HW_H_UINT, 11, 5,
+    { 0, { (const PTR) &arc_cgen_ifld_table[ARC_F_U5] } }, 
+    { 0, { { { (1<<MACH_BASE), 0 } } } }  },
+/* u8x4: 8 bit uns imm times 4 */
+  { "u8x4", ARC_OPERAND_U8X4, HW_H_UINT, 8, 8,
+    { 0, { (const PTR) &arc_cgen_ifld_table[ARC_F_U8X4] } }, 
+    { 0, { { { (1<<MACH_BASE), 0 } } } }  },
+/* s9x4: 9 bit sgn imm times 4 */
+  { "s9x4", ARC_OPERAND_S9X4, HW_H_UINT, 7, 9,
+    { 0, { (const PTR) &arc_cgen_ifld_table[ARC_F_S9X4] } }, 
+    { 0, { { { (1<<MACH_BASE), 0 } } } }  },
+/* sc_s9_: 8 bit uns imm times 4 */
+  { "sc_s9_", ARC_OPERAND_SC_S9_, HW_H_UINT, 7, 9,
+    { 0, { (const PTR) &arc_cgen_ifld_table[ARC_F_S9X4] } }, 
+    { 0, { { { (1<<MACH_BASE), 0 } } } }  },
+/* sc_s9w: 8 bit uns imm times 2 */
+  { "sc_s9w", ARC_OPERAND_SC_S9W, HW_H_UINT, 7, 9,
+    { 0, { (const PTR) &arc_cgen_ifld_table[ARC_F_S9X2] } }, 
+    { 0, { { { (1<<MACH_BASE), 0 } } } }  },
+/* sc_s9b: 8 bit uns imm times 1 */
+  { "sc_s9b", ARC_OPERAND_SC_S9B, HW_H_UINT, 7, 9,
+    { 0, { (const PTR) &arc_cgen_ifld_table[ARC_F_S9X1] } }, 
+    { 0, { { { (1<<MACH_BASE), 0 } } } }  },
+/* label7: 7 bit pc relative address */
+  { "label7", ARC_OPERAND_LABEL7, HW_H_IADDR, 10, 6,
+    { 0, { (const PTR) &arc_cgen_ifld_table[ARC_F_REL7] } }, 
+    { 0|A(PCREL_ADDR), { { { (1<<MACH_BASE), 0 } } } }  },
+/* label8: 8 bit pc relative address */
+  { "label8", ARC_OPERAND_LABEL8, HW_H_IADDR, 9, 7,
+    { 0, { (const PTR) &arc_cgen_ifld_table[ARC_F_REL8] } }, 
+    { 0|A(PCREL_ADDR), { { { (1<<MACH_BASE), 0 } } } }  },
+/* label9: 9 bit pc relative address */
+  { "label9", ARC_OPERAND_LABEL9, HW_H_IADDR, 8, 8,
+    { 2, { (const PTR) &ARC_F_REL9_MULTI_IFIELD[0] } }, 
+    { 0|A(PCREL_ADDR)|A(VIRTUAL), { { { (1<<MACH_BASE), 0 } } } }  },
+/* label10: 10 bit pc relative address */
+  { "label10", ARC_OPERAND_LABEL10, HW_H_IADDR, 7, 9,
+    { 0, { (const PTR) &arc_cgen_ifld_table[ARC_F_REL10] } }, 
+    { 0|A(PCREL_ADDR), { { { (1<<MACH_BASE), 0 } } } }  },
+/* label13a: 13 bit bl pc rel address */
+  { "label13a", ARC_OPERAND_LABEL13A, HW_H_IADDR, 5, 11,
+    { 0, { (const PTR) &arc_cgen_ifld_table[ARC_F_REL13BL] } }, 
+    { 0|A(PCREL_ADDR), { { { (1<<MACH_BASE), 0 } } } }  },
+/* label21: 21 bit pc relative address */
+  { "label21", ARC_OPERAND_LABEL21, HW_H_IADDR, 5, 20,
+    { 2, { (const PTR) &ARC_F_REL21_MULTI_IFIELD[0] } }, 
+    { 0|A(PCREL_ADDR)|A(VIRTUAL), { { { (1<<MACH_BASE), 0 } } } }  },
+/* label21a: 21 bit bl pc rel address */
+  { "label21a", ARC_OPERAND_LABEL21A, HW_H_IADDR, 5, 19,
+    { 2, { (const PTR) &ARC_F_REL21BL_MULTI_IFIELD[0] } }, 
+    { 0|A(PCREL_ADDR)|A(VIRTUAL), { { { (1<<MACH_BASE), 0 } } } }  },
+/* label25: 25 bit pc relative address */
+  { "label25", ARC_OPERAND_LABEL25, HW_H_IADDR, 5, 24,
+    { 3, { (const PTR) &ARC_F_REL25_MULTI_IFIELD[0] } }, 
+    { 0|A(PCREL_ADDR)|A(VIRTUAL), { { { (1<<MACH_BASE), 0 } } } }  },
+/* label25a: 25 bit bl pc rel address */
+  { "label25a", ARC_OPERAND_LABEL25A, HW_H_IADDR, 5, 23,
+    { 3, { (const PTR) &ARC_F_REL25BL_MULTI_IFIELD[0] } }, 
+    { 0|A(PCREL_ADDR)|A(VIRTUAL), { { { (1<<MACH_BASE), 0 } } } }  },
+/* dummy-op: (first 16 bit of) next insn */
+  { "dummy-op", ARC_OPERAND_DUMMY_OP, HW_H_UINT, 16, 16,
+    { 0, { (const PTR) &arc_cgen_ifld_table[ARC_F_DUMMY] } }, 
+    { 0, { { { (1<<MACH_BASE), 0 } } } }  },
+/* RccS: BRcc_s */
+  { "RccS", ARC_OPERAND_RCCS, HW_H_RCCS, 8, 1,
+    { 0, { (const PTR) &arc_cgen_ifld_table[ARC_F_BRSCOND] } }, 
+    { 0, { { { (1<<MACH_BASE), 0 } } } }  },
+/* Rcc: BRcc / BBIT Condition */
+  { "Rcc", ARC_OPERAND_RCC, HW_H_RCC, 28, 4,
+    { 0, { (const PTR) &arc_cgen_ifld_table[ARC_F_BRCOND] } }, 
+    { 0, { { { (1<<MACH_BASE), 0 } } } }  },
+/* LDODi: ld /w offs Direct mem access */
+  { "LDODi", ARC_OPERAND_LDODI, HW_H_DI, 20, 1,
+    { 0, { (const PTR) &arc_cgen_ifld_table[ARC_F_LDODI] } }, 
+    { 0, { { { (1<<MACH_BASE), 0 } } } }  },
+/* LDRDi: ld reg-reg Direct mem access */
+  { "LDRDi", ARC_OPERAND_LDRDI, HW_H_DI, 16, 1,
+    { 0, { (const PTR) &arc_cgen_ifld_table[ARC_F_LDRDI] } }, 
+    { 0, { { { (1<<MACH_BASE), 0 } } } }  },
+/* STODi: ld w/ offs Direct mem access */
+  { "STODi", ARC_OPERAND_STODI, HW_H_DI, 26, 1,
+    { 0, { (const PTR) &arc_cgen_ifld_table[ARC_F_STODI] } }, 
+    { 0, { { { (1<<MACH_BASE), 0 } } } }  },
+/* EXDi: ex Direct memory access */
+  { "EXDi", ARC_OPERAND_EXDI, HW_H_DI, 16, 1,
+    { 0, { (const PTR) &arc_cgen_ifld_table[ARC_F_F] } }, 
+    { 0, { { { (1<<MACH_BASE), 0 } } } }  },
+/* _AW: .AW suffix */
+  { "_AW", ARC_OPERAND__AW, HW_H__AW, 0, 0,
+    { 0, { (const PTR) 0 } }, 
+    { 0, { { { (1<<MACH_BASE), 0 } } } }  },
+/* trapnum: 6 bit trap number */
+  { "trapnum", ARC_OPERAND_TRAPNUM, HW_H_UINT, 5, 6,
+    { 0, { (const PTR) &arc_cgen_ifld_table[ARC_F_TRAPNUM] } }, 
+    { 0, { { { (1<<MACH_BASE), 0 } } } }  },
+/* sentinel */
+  { 0, 0, 0, 0, 0,
+    { 0, { (const PTR) 0 } },
+    { 0, { { { (1<<MACH_BASE), 0 } } } } }
+};
+
+#undef A
+
+
+/* The instruction table.  */
+
+#define OP(field) CGEN_SYNTAX_MAKE_FIELD (OPERAND (field))
+#if defined (__STDC__) || defined (ALMOST_STDC) || defined (HAVE_STRINGIZE)
+#define A(a) (1 << CGEN_INSN_##a)
+#else
+#define A(a) (1 << CGEN_INSN_/**/a)
+#endif
+
+static const CGEN_IBASE arc_cgen_insn_table[MAX_INSNS] =
+{
+  /* Special null first entry.
+     A `num' value of zero is thus invalid.
+     Also, the special `invalid' insn resides here.  */
+  { 0, 0, 0, 0, { 0, { { { (1<<MACH_BASE), 0 } }, { { LIMM_NONE, 0 } } } } },
+/* b$i2cond $label10 */
+  {
+    ARC_INSN_B_S, "b_s", "b", 32,
+    { 0|A(SHORT_P)|A(RELAXABLE)|A(COND_CTI), { { { (1<<MACH_BASE), 0 } }, { { LIMM_NONE, 0 } } } }
+  },
+/* b$i3cond$_S $label7 */
+  {
+    ARC_INSN_BCC_S, "bcc_s", "b", 32,
+    { 0|A(SHORT_P)|A(RELAXABLE)|A(COND_CTI), { { { (1<<MACH_BASE), 0 } }, { { LIMM_NONE, 0 } } } }
+  },
+/* br$RccS$_S $R_b,0,$label8 */
+  {
+    ARC_INSN_BRCC_S, "brcc_s", "br", 32,
+    { 0|A(SHORT_P)|A(RELAXABLE)|A(COND_CTI), { { { (1<<MACH_BASE), 0 } }, { { LIMM_NONE, 0 } } } }
+  },
+/* b$Qcondb$_L $label21 */
+  {
+    ARC_INSN_BCC_L, "bcc_l", "b", 32,
+    { 0|A(RELAXED)|A(COND_CTI), { { { (1<<MACH_BASE), 0 } }, { { LIMM_NONE, 0 } } } }
+  },
+/* b$Qcondb$_L.d $label21 */
+  {
+    ARC_INSN_BCC_L_D, "bcc_l.d", "b", 32,
+    { 0|A(RELAXED)|A(COND_CTI)|A(DELAY_SLOT), { { { (1<<MACH_BASE), 0 } }, { { LIMM_NONE, 0 } } } }
+  },
+/* b$uncondb$_L $label25 */
+  {
+    ARC_INSN_B_L, "b_l", "b", 32,
+    { 0|A(RELAXED)|A(COND_CTI), { { { (1<<MACH_BASE), 0 } }, { { LIMM_NONE, 0 } } } }
+  },
+/* b$uncondb$_L.d $label25 */
+  {
+    ARC_INSN_B_L_D, "b_l.d", "b", 32,
+    { 0|A(RELAXED)|A(COND_CTI)|A(DELAY_SLOT), { { { (1<<MACH_BASE), 0 } }, { { LIMM_NONE, 0 } } } }
+  },
+/* b$Rcc $RB,$RC,$label9 */
+  {
+    ARC_INSN_BRCC_RC, "brcc_RC", "b", 32,
+    { 0|A(COND_CTI), { { { (1<<MACH_BASE), 0 } }, { { LIMM_BC, 0 } } } }
+  },
+/* b$Rcc.d $RB,$RC,$label9 */
+  {
+    ARC_INSN_BRCC_RC_D, "brcc_RC.d", "b", 32,
+    { 0|A(COND_CTI)|A(DELAY_SLOT), { { { (1<<MACH_BASE), 0 } }, { { LIMM_BC, 0 } } } }
+  },
+/* b$Rcc $RB,$U6,$label9 */
+  {
+    ARC_INSN_BRCC_U6, "brcc_U6", "b", 32,
+    { 0|A(COND_CTI), { { { (1<<MACH_BASE), 0 } }, { { LIMM_NONE, 0 } } } }
+  },
+/* b$Rcc.d $RB,$U6,$label9 */
+  {
+    ARC_INSN_BRCC_U6_D, "brcc_U6.d", "b", 32,
+    { 0|A(COND_CTI)|A(DELAY_SLOT), { { { (1<<MACH_BASE), 0 } }, { { LIMM_NONE, 0 } } } }
+  },
+/* bl$uncondj$_S $label13a */
+  {
+    ARC_INSN_BL_S, "bl_s", "bl", 32,
+    { 0|A(SHORT_P)|A(RELAXABLE)|A(COND_CTI), { { { (1<<MACH_BASE), 0 } }, { { LIMM_NONE, 0 } } } }
+  },
+/* bl$Qcondj$_L $label21 */
+  {
+    ARC_INSN_BLCC, "blcc", "bl", 32,
+    { 0|A(RELAXED)|A(COND_CTI), { { { (1<<MACH_BASE), 0 } }, { { LIMM_NONE, 0 } } } }
+  },
+/* bl$Qcondj$_L.d $label21 */
+  {
+    ARC_INSN_BLCC_D, "blcc.d", "bl", 32,
+    { 0|A(RELAXED)|A(COND_CTI)|A(DELAY_SLOT), { { { (1<<MACH_BASE), 0 } }, { { LIMM_NONE, 0 } } } }
+  },
+/* bl$uncondj$_L $label25a */
+  {
+    ARC_INSN_BL, "bl", "bl", 32,
+    { 0|A(RELAXED)|A(COND_CTI), { { { (1<<MACH_BASE), 0 } }, { { LIMM_NONE, 0 } } } }
+  },
+/* bl$uncondj$_L.d $label25a */
+  {
+    ARC_INSN_BL_D, "bl.d", "bl", 32,
+    { 0|A(RELAXED)|A(COND_CTI)|A(DELAY_SLOT), { { { (1<<MACH_BASE), 0 } }, { { LIMM_NONE, 0 } } } }
+  },
+/* ld$LDODi $RA,[$RB,$s9] */
+  {
+    ARC_INSN_LD_ABS, "ld_abs", "ld", 32,
+    { 0|A(RELAXED), { { { (1<<MACH_BASE), 0 } }, { { LIMM_B, 0 } } } }
+  },
+/* ld$_AW$LDODi $RA,[$RB,$s9] */
+  {
+    ARC_INSN_LD__AW_ABS, "ld$_AW_abs", "ld", 32,
+    { 0|A(RELAXED), { { { (1<<MACH_BASE), 0 } }, { { LIMM_B, 0 } } } }
+  },
+/* ld.ab$LDODi $RA,[$RB,$s9] */
+  {
+    ARC_INSN_LD_AB_ABS, "ld.ab_abs", "ld.ab", 32,
+    { 0|A(RELAXED), { { { (1<<MACH_BASE), 0 } }, { { LIMM_B, 0 } } } }
+  },
+/* ld.as$LDODi $RA,[$RB,$s9] */
+  {
+    ARC_INSN_LD_AS_ABS, "ld.as_abs", "ld.as", 32,
+    { 0|A(RELAXED), { { { (1<<MACH_BASE), 0 } }, { { LIMM_B, 0 } } } }
+  },
+/* ld$LDRDi $RA,[$RB,$RC] */
+  {
+    ARC_INSN_LD_ABC, "ld_abc", "ld", 32,
+    { 0|A(RELAXED), { { { (1<<MACH_BASE), 0 } }, { { LIMM_BC, 0 } } } }
+  },
+/* ld$_AW$LDRDi $RA,[$RB,$RC] */
+  {
+    ARC_INSN_LD__AW_ABC, "ld$_AW_abc", "ld", 32,
+    { 0|A(RELAXED), { { { (1<<MACH_BASE), 0 } }, { { LIMM_BC, 0 } } } }
+  },
+/* ld.ab$LDRDi $RA,[$RB,$RC] */
+  {
+    ARC_INSN_LD_AB_ABC, "ld.ab_abc", "ld.ab", 32,
+    { 0|A(RELAXED), { { { (1<<MACH_BASE), 0 } }, { { LIMM_BC, 0 } } } }
+  },
+/* ld.as$LDRDi $RA,[$RB,$RC] */
+  {
+    ARC_INSN_LD_AS_ABC, "ld.as_abc", "ld.as", 32,
+    { 0|A(RELAXED), { { { (1<<MACH_BASE), 0 } }, { { LIMM_BC, 0 } } } }
+  },
+/* ld$_S $R_a,[$R_b,$R_c] */
+  {
+    ARC_INSN_LD_S_ABC, "ld_s_abc", "ld", 32,
+    { 0|A(SHORT_P)|A(RELAXABLE), { { { (1<<MACH_BASE), 0 } }, { { LIMM_NONE, 0 } } } }
+  },
+/* ld$_S $R_c,[$R_b,$sc_u5_] */
+  {
+    ARC_INSN_LD_S_ABU, "ld_s_abu", "ld", 32,
+    { 0|A(SHORT_P)|A(RELAXABLE), { { { (1<<MACH_BASE), 0 } }, { { LIMM_NONE, 0 } } } }
+  },
+/* ld$_S $R_b,[$SP,$u5x4] */
+  {
+    ARC_INSN_LD_S_ABSP, "ld_s_absp", "ld", 32,
+    { 0|A(SHORT_P)|A(RELAXABLE), { { { (1<<MACH_BASE), 0 } }, { { LIMM_NONE, 0 } } } }
+  },
+/* ld$_S $R_b,[$GP,$sc_s9_] */
+  {
+    ARC_INSN_LD_S_GPREL, "ld_s_gprel", "ld", 32,
+    { 0|A(SHORT_P)|A(RELAXABLE), { { { (1<<MACH_BASE), 0 } }, { { LIMM_NONE, 0 } } } }
+  },
+/* ld$_S $R_b,[$PCL,$u8x4] */
+  {
+    ARC_INSN_LD_S_PCREL, "ld_s_pcrel", "ld", 32,
+    { 0|A(SHORT_P)|A(RELAXABLE), { { { (1<<MACH_BASE), 0 } }, { { LIMM_NONE, 0 } } } }
+  },
+/* ldb$LDODi $RA,[$RB,$s9] */
+  {
+    ARC_INSN_LDB_ABS, "ldb_abs", "ldb", 32,
+    { 0|A(RELAXED), { { { (1<<MACH_BASE), 0 } }, { { LIMM_B, 0 } } } }
+  },
+/* ldb$_AW$LDODi $RA,[$RB,$s9] */
+  {
+    ARC_INSN_LDB__AW_ABS, "ldb$_AW_abs", "ldb", 32,
+    { 0|A(RELAXED), { { { (1<<MACH_BASE), 0 } }, { { LIMM_B, 0 } } } }
+  },
+/* ldb.ab$LDODi $RA,[$RB,$s9] */
+  {
+    ARC_INSN_LDB_AB_ABS, "ldb.ab_abs", "ldb.ab", 32,
+    { 0|A(RELAXED), { { { (1<<MACH_BASE), 0 } }, { { LIMM_B, 0 } } } }
+  },
+/* ldb.as$LDODi $RA,[$RB,$s9] */
+  {
+    ARC_INSN_LDB_AS_ABS, "ldb.as_abs", "ldb.as", 32,
+    { 0|A(RELAXED), { { { (1<<MACH_BASE), 0 } }, { { LIMM_B, 0 } } } }
+  },
+/* ldb$LDRDi $RA,[$RB,$RC] */
+  {
+    ARC_INSN_LDB_ABC, "ldb_abc", "ldb", 32,
+    { 0|A(RELAXED), { { { (1<<MACH_BASE), 0 } }, { { LIMM_BC, 0 } } } }
+  },
+/* ldb$_AW$LDRDi $RA,[$RB,$RC] */
+  {
+    ARC_INSN_LDB__AW_ABC, "ldb$_AW_abc", "ldb", 32,
+    { 0|A(RELAXED), { { { (1<<MACH_BASE), 0 } }, { { LIMM_BC, 0 } } } }
+  },
+/* ldb.ab$LDRDi $RA,[$RB,$RC] */
+  {
+    ARC_INSN_LDB_AB_ABC, "ldb.ab_abc", "ldb.ab", 32,
+    { 0|A(RELAXED), { { { (1<<MACH_BASE), 0 } }, { { LIMM_BC, 0 } } } }
+  },
+/* ldb.as$LDRDi $RA,[$RB,$RC] */
+  {
+    ARC_INSN_LDB_AS_ABC, "ldb.as_abc", "ldb.as", 32,
+    { 0|A(RELAXED), { { { (1<<MACH_BASE), 0 } }, { { LIMM_BC, 0 } } } }
+  },
+/* ldb$_S $R_a,[$R_b,$R_c] */
+  {
+    ARC_INSN_LDB_S_ABC, "ldb_s_abc", "ldb", 32,
+    { 0|A(SHORT_P)|A(RELAXABLE), { { { (1<<MACH_BASE), 0 } }, { { LIMM_NONE, 0 } } } }
+  },
+/* ldb$_S $R_c,[$R_b,$sc_u5b] */
+  {
+    ARC_INSN_LDB_S_ABU, "ldb_s_abu", "ldb", 32,
+    { 0|A(SHORT_P)|A(RELAXABLE), { { { (1<<MACH_BASE), 0 } }, { { LIMM_NONE, 0 } } } }
+  },
+/* ldb$_S $R_b,[$SP,$u5x4] */
+  {
+    ARC_INSN_LDB_S_ABSP, "ldb_s_absp", "ldb", 32,
+    { 0|A(SHORT_P)|A(RELAXABLE), { { { (1<<MACH_BASE), 0 } }, { { LIMM_NONE, 0 } } } }
+  },
+/* ldb$_S $R_b,[$GP,$sc_s9b] */
+  {
+    ARC_INSN_LDB_S_GPREL, "ldb_s_gprel", "ldb", 32,
+    { 0|A(SHORT_P)|A(RELAXABLE), { { { (1<<MACH_BASE), 0 } }, { { LIMM_NONE, 0 } } } }
+  },
+/* ldb.x$LDODi $RA,[$RB,$s9] */
+  {
+    ARC_INSN_LDB_X_ABS, "ldb.x_abs", "ldb.x", 32,
+    { 0|A(RELAXED), { { { (1<<MACH_BASE), 0 } }, { { LIMM_B, 0 } } } }
+  },
+/* ldb$_AW.x$LDODi $RA,[$RB,$s9] */
+  {
+    ARC_INSN_LDB__AW_X_ABS, "ldb$_AW.x_abs", "ldb", 32,
+    { 0|A(RELAXED), { { { (1<<MACH_BASE), 0 } }, { { LIMM_B, 0 } } } }
+  },
+/* ldb.ab.x$LDODi $RA,[$RB,$s9] */
+  {
+    ARC_INSN_LDB_AB_X_ABS, "ldb.ab.x_abs", "ldb.ab.x", 32,
+    { 0|A(RELAXED), { { { (1<<MACH_BASE), 0 } }, { { LIMM_B, 0 } } } }
+  },
+/* ldb.as.x$LDODi $RA,[$RB,$s9] */
+  {
+    ARC_INSN_LDB_AS_X_ABS, "ldb.as.x_abs", "ldb.as.x", 32,
+    { 0|A(RELAXED), { { { (1<<MACH_BASE), 0 } }, { { LIMM_B, 0 } } } }
+  },
+/* ldb.x$LDRDi $RA,[$RB,$RC] */
+  {
+    ARC_INSN_LDB_X_ABC, "ldb.x_abc", "ldb.x", 32,
+    { 0|A(RELAXED), { { { (1<<MACH_BASE), 0 } }, { { LIMM_BC, 0 } } } }
+  },
+/* ldb$_AW.x$LDRDi $RA,[$RB,$RC] */
+  {
+    ARC_INSN_LDB__AW_X_ABC, "ldb$_AW.x_abc", "ldb", 32,
+    { 0|A(RELAXED), { { { (1<<MACH_BASE), 0 } }, { { LIMM_BC, 0 } } } }
+  },
+/* ldb.ab.x$LDRDi $RA,[$RB,$RC] */
+  {
+    ARC_INSN_LDB_AB_X_ABC, "ldb.ab.x_abc", "ldb.ab.x", 32,
+    { 0|A(RELAXED), { { { (1<<MACH_BASE), 0 } }, { { LIMM_BC, 0 } } } }
+  },
+/* ldb.as.x$LDRDi $RA,[$RB,$RC] */
+  {
+    ARC_INSN_LDB_AS_X_ABC, "ldb.as.x_abc", "ldb.as.x", 32,
+    { 0|A(RELAXED), { { { (1<<MACH_BASE), 0 } }, { { LIMM_BC, 0 } } } }
+  },
+/* ldw$LDODi $RA,[$RB,$s9] */
+  {
+    ARC_INSN_LDW_ABS, "ldw_abs", "ldw", 32,
+    { 0|A(RELAXED), { { { (1<<MACH_BASE), 0 } }, { { LIMM_B, 0 } } } }
+  },
+/* ldw$_AW$LDODi $RA,[$RB,$s9] */
+  {
+    ARC_INSN_LDW__AW_ABS, "ldw$_AW_abs", "ldw", 32,
+    { 0|A(RELAXED), { { { (1<<MACH_BASE), 0 } }, { { LIMM_B, 0 } } } }
+  },
+/* ldw.ab$LDODi $RA,[$RB,$s9] */
+  {
+    ARC_INSN_LDW_AB_ABS, "ldw.ab_abs", "ldw.ab", 32,
+    { 0|A(RELAXED), { { { (1<<MACH_BASE), 0 } }, { { LIMM_B, 0 } } } }
+  },
+/* ldw.as$LDODi $RA,[$RB,$s9] */
+  {
+    ARC_INSN_LDW_AS_ABS, "ldw.as_abs", "ldw.as", 32,
+    { 0|A(RELAXED), { { { (1<<MACH_BASE), 0 } }, { { LIMM_B, 0 } } } }
+  },
+/* ldw$LDRDi $RA,[$RB,$RC] */
+  {
+    ARC_INSN_LDW_ABC, "ldw_abc", "ldw", 32,
+    { 0|A(RELAXED), { { { (1<<MACH_BASE), 0 } }, { { LIMM_BC, 0 } } } }
+  },
+/* ldw$_AW$LDRDi $RA,[$RB,$RC] */
+  {
+    ARC_INSN_LDW__AW_ABC, "ldw$_AW_abc", "ldw", 32,
+    { 0|A(RELAXED), { { { (1<<MACH_BASE), 0 } }, { { LIMM_BC, 0 } } } }
+  },
+/* ldw.ab$LDRDi $RA,[$RB,$RC] */
+  {
+    ARC_INSN_LDW_AB_ABC, "ldw.ab_abc", "ldw.ab", 32,
+    { 0|A(RELAXED), { { { (1<<MACH_BASE), 0 } }, { { LIMM_BC, 0 } } } }
+  },
+/* ldw.as$LDRDi $RA,[$RB,$RC] */
+  {
+    ARC_INSN_LDW_AS_ABC, "ldw.as_abc", "ldw.as", 32,
+    { 0|A(RELAXED), { { { (1<<MACH_BASE), 0 } }, { { LIMM_BC, 0 } } } }
+  },
+/* ldw$_S $R_a,[$R_b,$R_c] */
+  {
+    ARC_INSN_LDW_S_ABC, "ldw_s_abc", "ldw", 32,
+    { 0|A(SHORT_P)|A(RELAXABLE), { { { (1<<MACH_BASE), 0 } }, { { LIMM_NONE, 0 } } } }
+  },
+/* ldw$_S $R_c,[$R_b,$sc_u5w] */
+  {
+    ARC_INSN_LDW_S_ABU, "ldw_s_abu", "ldw", 32,
+    { 0|A(SHORT_P)|A(RELAXABLE), { { { (1<<MACH_BASE), 0 } }, { { LIMM_NONE, 0 } } } }
+  },
+/* ldw$_S $R_b,[$GP,$sc_s9w] */
+  {
+    ARC_INSN_LDW_S_GPREL, "ldw_s_gprel", "ldw", 32,
+    { 0|A(SHORT_P)|A(RELAXABLE), { { { (1<<MACH_BASE), 0 } }, { { LIMM_NONE, 0 } } } }
+  },
+/* ldw.x$LDODi $RA,[$RB,$s9] */
+  {
+    ARC_INSN_LDW_X_ABS, "ldw.x_abs", "ldw.x", 32,
+    { 0|A(RELAXED), { { { (1<<MACH_BASE), 0 } }, { { LIMM_B, 0 } } } }
+  },
+/* ldw$_AW.x$LDODi $RA,[$RB,$s9] */
+  {
+    ARC_INSN_LDW__AW_X_ABS, "ldw$_AW.x_abs", "ldw", 32,
+    { 0|A(RELAXED), { { { (1<<MACH_BASE), 0 } }, { { LIMM_B, 0 } } } }
+  },
+/* ldw.ab.x$LDODi $RA,[$RB,$s9] */
+  {
+    ARC_INSN_LDW_AB_X_ABS, "ldw.ab.x_abs", "ldw.ab.x", 32,
+    { 0|A(RELAXED), { { { (1<<MACH_BASE), 0 } }, { { LIMM_B, 0 } } } }
+  },
+/* ldw.as.x$LDODi $RA,[$RB,$s9] */
+  {
+    ARC_INSN_LDW_AS_X_ABS, "ldw.as.x_abs", "ldw.as.x", 32,
+    { 0|A(RELAXED), { { { (1<<MACH_BASE), 0 } }, { { LIMM_B, 0 } } } }
+  },
+/* ldw.x$LDRDi $RA,[$RB,$RC] */
+  {
+    ARC_INSN_LDW_X_ABC, "ldw.x_abc", "ldw.x", 32,
+    { 0|A(RELAXED), { { { (1<<MACH_BASE), 0 } }, { { LIMM_BC, 0 } } } }
+  },
+/* ldw$_AW.x$LDRDi $RA,[$RB,$RC] */
+  {
+    ARC_INSN_LDW__AW_X_ABC, "ldw$_AW.x_abc", "ldw", 32,
+    { 0|A(RELAXED), { { { (1<<MACH_BASE), 0 } }, { { LIMM_BC, 0 } } } }
+  },
+/* ldw.ab.x$LDRDi $RA,[$RB,$RC] */
+  {
+    ARC_INSN_LDW_AB_X_ABC, "ldw.ab.x_abc", "ldw.ab.x", 32,
+    { 0|A(RELAXED), { { { (1<<MACH_BASE), 0 } }, { { LIMM_BC, 0 } } } }
+  },
+/* ldw.as.x$LDRDi $RA,[$RB,$RC] */
+  {
+    ARC_INSN_LDW_AS_X_ABC, "ldw.as.x_abc", "ldw.as.x", 32,
+    { 0|A(RELAXED), { { { (1<<MACH_BASE), 0 } }, { { LIMM_BC, 0 } } } }
+  },
+/* ldw$_S.x $R_c,[$R_b,$sc_u5w] */
+  {
+    ARC_INSN_LDW_S_X_ABU, "ldw_s.x_abu", "ldw", 32,
+    { 0|A(SHORT_P)|A(RELAXABLE), { { { (1<<MACH_BASE), 0 } }, { { LIMM_NONE, 0 } } } }
+  },
+/* st$STODi $RC,[$RB,$s9] */
+  {
+    ARC_INSN_ST_ABS, "st_abs", "st", 32,
+    { 0|A(RELAXED), { { { (1<<MACH_BASE), 0 } }, { { LIMM_BC, 0 } } } }
+  },
+/* st$_AW$STODi $RC,[$RB,$s9] */
+  {
+    ARC_INSN_ST__AW_ABS, "st$_AW_abs", "st", 32,
+    { 0|A(RELAXED), { { { (1<<MACH_BASE), 0 } }, { { LIMM_BC, 0 } } } }
+  },
+/* st.ab$STODi $RC,[$RB,$s9] */
+  {
+    ARC_INSN_ST_AB_ABS, "st.ab_abs", "st.ab", 32,
+    { 0|A(RELAXED), { { { (1<<MACH_BASE), 0 } }, { { LIMM_BC, 0 } } } }
+  },
+/* st.as$STODi $RC,[$RB,$s9] */
+  {
+    ARC_INSN_ST_AS_ABS, "st.as_abs", "st.as", 32,
+    { 0|A(RELAXED), { { { (1<<MACH_BASE), 0 } }, { { LIMM_BC, 0 } } } }
+  },
+/* st$_S $R_c,[$R_b,$sc_u5_] */
+  {
+    ARC_INSN_ST_S_ABU, "st_s_abu", "st", 32,
+    { 0|A(SHORT_P)|A(RELAXABLE), { { { (1<<MACH_BASE), 0 } }, { { LIMM_NONE, 0 } } } }
+  },
+/* st$_S $R_b,[$SP,$u5x4] */
+  {
+    ARC_INSN_ST_S_ABSP, "st_s_absp", "st", 32,
+    { 0|A(SHORT_P)|A(RELAXABLE), { { { (1<<MACH_BASE), 0 } }, { { LIMM_NONE, 0 } } } }
+  },
+/* stb$STODi $RC,[$RB,$s9] */
+  {
+    ARC_INSN_STB_ABS, "stb_abs", "stb", 32,
+    { 0|A(RELAXED), { { { (1<<MACH_BASE), 0 } }, { { LIMM_BC, 0 } } } }
+  },
+/* stb$_AW$STODi $RC,[$RB,$s9] */
+  {
+    ARC_INSN_STB__AW_ABS, "stb$_AW_abs", "stb", 32,
+    { 0|A(RELAXED), { { { (1<<MACH_BASE), 0 } }, { { LIMM_BC, 0 } } } }
+  },
+/* stb.ab$STODi $RC,[$RB,$s9] */
+  {
+    ARC_INSN_STB_AB_ABS, "stb.ab_abs", "stb.ab", 32,
+    { 0|A(RELAXED), { { { (1<<MACH_BASE), 0 } }, { { LIMM_BC, 0 } } } }
+  },
+/* stb.as$STODi $RC,[$RB,$s9] */
+  {
+    ARC_INSN_STB_AS_ABS, "stb.as_abs", "stb.as", 32,
+    { 0|A(RELAXED), { { { (1<<MACH_BASE), 0 } }, { { LIMM_BC, 0 } } } }
+  },
+/* stb$_S $R_c,[$R_b,$sc_u5b] */
+  {
+    ARC_INSN_STB_S_ABU, "stb_s_abu", "stb", 32,
+    { 0|A(SHORT_P)|A(RELAXABLE), { { { (1<<MACH_BASE), 0 } }, { { LIMM_NONE, 0 } } } }
+  },
+/* stb$_S $R_b,[$SP,$u5x4] */
+  {
+    ARC_INSN_STB_S_ABSP, "stb_s_absp", "stb", 32,
+    { 0|A(SHORT_P)|A(RELAXABLE), { { { (1<<MACH_BASE), 0 } }, { { LIMM_NONE, 0 } } } }
+  },
+/* stw$STODi $RC,[$RB,$s9] */
+  {
+    ARC_INSN_STW_ABS, "stw_abs", "stw", 32,
+    { 0|A(RELAXED), { { { (1<<MACH_BASE), 0 } }, { { LIMM_BC, 0 } } } }
+  },
+/* stw$_AW$STODi $RC,[$RB,$s9] */
+  {
+    ARC_INSN_STW__AW_ABS, "stw$_AW_abs", "stw", 32,
+    { 0|A(RELAXED), { { { (1<<MACH_BASE), 0 } }, { { LIMM_BC, 0 } } } }
+  },
+/* stw.ab$STODi $RC,[$RB,$s9] */
+  {
+    ARC_INSN_STW_AB_ABS, "stw.ab_abs", "stw.ab", 32,
+    { 0|A(RELAXED), { { { (1<<MACH_BASE), 0 } }, { { LIMM_BC, 0 } } } }
+  },
+/* stw.as$STODi $RC,[$RB,$s9] */
+  {
+    ARC_INSN_STW_AS_ABS, "stw.as_abs", "stw.as", 32,
+    { 0|A(RELAXED), { { { (1<<MACH_BASE), 0 } }, { { LIMM_BC, 0 } } } }
+  },
+/* stw$_S $R_c,[$R_b,$sc_u5w] */
+  {
+    ARC_INSN_STW_S_ABU, "stw_s_abu", "stw", 32,
+    { 0|A(SHORT_P)|A(RELAXABLE), { { { (1<<MACH_BASE), 0 } }, { { LIMM_NONE, 0 } } } }
+  },
+/* add$_L$F $RB,$RB,$s12 */
+  {
+    ARC_INSN_ADD_L_S12__RA_, "add_L_s12 $RA,", "add", 32,
+    { 0|A(RELAXED), { { { (1<<MACH_BASE), 0 } }, { { LIMM_B, 0 } } } }
+  },
+/* add$Qcondi$F $RB,$RB,$U6 */
+  {
+    ARC_INSN_ADD_CCU6__RA_, "add_ccu6 $RA,", "add", 32,
+    { 0|A(RELAXED), { { { (1<<MACH_BASE), 0 } }, { { LIMM_B, 0 } } } }
+  },
+/* add$_L$F $RA,$RB,$U6 */
+  {
+    ARC_INSN_ADD_L_U6__RA_, "add_L_u6 $RA,", "add", 32,
+    { 0|A(RELAXED), { { { (1<<MACH_BASE), 0 } }, { { LIMM_B, 0 } } } }
+  },
+/* add$_L$F $RA,$RB,$RC */
+  {
+    ARC_INSN_ADD_L_R_R__RA__RC, "add_L_r_r $RA,$RC", "add", 32,
+    { 0|A(RELAXED), { { { (1<<MACH_BASE), 0 } }, { { LIMM_BC, 0 } } } }
+  },
+/* add$Qcondi$F $RB,$RB,$RC */
+  {
+    ARC_INSN_ADD_CC__RA__RC, "add_cc $RA,$RC", "add", 32,
+    { 0|A(RELAXED), { { { (1<<MACH_BASE), 0 } }, { { LIMM_BC, 0 } } } }
+  },
+/* add$_S $R_a,$R_b,$R_c */
+  {
+    ARC_INSN_ADD_S_ABC, "add_s_abc", "add", 32,
+    { 0|A(SHORT_P)|A(RELAXABLE), { { { (1<<MACH_BASE), 0 } }, { { LIMM_NONE, 0 } } } }
+  },
+/* add$_S $R_c,$R_b,$u3 */
+  {
+    ARC_INSN_ADD_S_CBU3, "add_s_cbu3", "add", 32,
+    { 0|A(SHORT_P)|A(RELAXABLE), { { { (1<<MACH_BASE), 0 } }, { { LIMM_NONE, 0 } } } }
+  },
+/* add$_S $R_b,$R_b,$Rh */
+  {
+    ARC_INSN_ADD_S_MCAH, "add_s_mcah", "add", 32,
+    { 0|A(SHORT_P)|A(RELAXABLE), { { { (1<<MACH_BASE), 0 } }, { { LIMM_H, 0 } } } }
+  },
+/* add$_S $R_b,$SP,$u5x4 */
+  {
+    ARC_INSN_ADD_S_ABSP, "add_s_absp", "add", 32,
+    { 0|A(SHORT_P)|A(RELAXABLE), { { { (1<<MACH_BASE), 0 } }, { { LIMM_NONE, 0 } } } }
+  },
+/* add$_S $SP,$SP,$u5x4 */
+  {
+    ARC_INSN_ADD_S_ASSPSP, "add_s_asspsp", "add", 32,
+    { 0|A(SHORT_P)|A(RELAXABLE), { { { (1<<MACH_BASE), 0 } }, { { LIMM_NONE, 0 } } } }
+  },
+/* add$_S $R0,$GP,$s9x4 */
+  {
+    ARC_INSN_ADD_S_GP, "add_s_gp", "add", 32,
+    { 0|A(SHORT_P)|A(RELAXABLE), { { { (1<<MACH_BASE), 0 } }, { { LIMM_NONE, 0 } } } }
+  },
+/* add$_S $R_b,$R_b,$u7 */
+  {
+    ARC_INSN_ADD_S_R_U7, "add_s_r_u7", "add", 32,
+    { 0|A(SHORT_P)|A(RELAXABLE), { { { (1<<MACH_BASE), 0 } }, { { LIMM_NONE, 0 } } } }
+  },
+/* adc$_L$F $RB,$RB,$s12 */
+  {
+    ARC_INSN_ADC_L_S12__RA_, "adc_L_s12 $RA,", "adc", 32,
+    { 0, { { { (1<<MACH_BASE), 0 } }, { { LIMM_B, 0 } } } }
+  },
+/* adc$Qcondi$F $RB,$RB,$U6 */
+  {
+    ARC_INSN_ADC_CCU6__RA_, "adc_ccu6 $RA,", "adc", 32,
+    { 0, { { { (1<<MACH_BASE), 0 } }, { { LIMM_B, 0 } } } }
+  },
+/* adc$_L$F $RA,$RB,$U6 */
+  {
+    ARC_INSN_ADC_L_U6__RA_, "adc_L_u6 $RA,", "adc", 32,
+    { 0, { { { (1<<MACH_BASE), 0 } }, { { LIMM_B, 0 } } } }
+  },
+/* adc$_L$F $RA,$RB,$RC */
+  {
+    ARC_INSN_ADC_L_R_R__RA__RC, "adc_L_r_r $RA,$RC", "adc", 32,
+    { 0, { { { (1<<MACH_BASE), 0 } }, { { LIMM_BC, 0 } } } }
+  },
+/* adc$Qcondi$F $RB,$RB,$RC */
+  {
+    ARC_INSN_ADC_CC__RA__RC, "adc_cc $RA,$RC", "adc", 32,
+    { 0, { { { (1<<MACH_BASE), 0 } }, { { LIMM_BC, 0 } } } }
+  },
+/* sub$_L$F $RB,$RB,$s12 */
+  {
+    ARC_INSN_SUB_L_S12__RA_, "sub_L_s12 $RA,", "sub", 32,
+    { 0|A(RELAXED), { { { (1<<MACH_BASE), 0 } }, { { LIMM_B, 0 } } } }
+  },
+/* sub$Qcondi$F $RB,$RB,$U6 */
+  {
+    ARC_INSN_SUB_CCU6__RA_, "sub_ccu6 $RA,", "sub", 32,
+    { 0|A(RELAXED), { { { (1<<MACH_BASE), 0 } }, { { LIMM_B, 0 } } } }
+  },
+/* sub$_L$F $RA,$RB,$U6 */
+  {
+    ARC_INSN_SUB_L_U6__RA_, "sub_L_u6 $RA,", "sub", 32,
+    { 0|A(RELAXED), { { { (1<<MACH_BASE), 0 } }, { { LIMM_B, 0 } } } }
+  },
+/* sub$_L$F $RA,$RB,$RC */
+  {
+    ARC_INSN_SUB_L_R_R__RA__RC, "sub_L_r_r $RA,$RC", "sub", 32,
+    { 0|A(RELAXED), { { { (1<<MACH_BASE), 0 } }, { { LIMM_BC, 0 } } } }
+  },
+/* sub$Qcondi$F $RB,$RB,$RC */
+  {
+    ARC_INSN_SUB_CC__RA__RC, "sub_cc $RA,$RC", "sub", 32,
+    { 0|A(RELAXED), { { { (1<<MACH_BASE), 0 } }, { { LIMM_BC, 0 } } } }
+  },
+/* sub$_S $R_c,$R_b,$u3 */
+  {
+    ARC_INSN_SUB_S_CBU3, "sub_s_cbu3", "sub", 32,
+    { 0|A(SHORT_P)|A(RELAXABLE), { { { (1<<MACH_BASE), 0 } }, { { LIMM_NONE, 0 } } } }
+  },
+/* sub$_S $R_b,$R_b,$R_c */
+  {
+    ARC_INSN_I16_GO_SUB_S_GO, "I16_GO_SUB_s_go", "sub", 32,
+    { 0|A(SHORT_P)|A(RELAXABLE), { { { (1<<MACH_BASE), 0 } }, { { LIMM_NONE, 0 } } } }
+  },
+/* sub$_S $NE$R_b,$R_b,$R_b */
+  {
+    ARC_INSN_SUB_S_GO_SUB_NE, "sub_s_go_sub_ne", "sub", 32,
+    { 0|A(SHORT_P)|A(RELAXABLE), { { { (1<<MACH_BASE), 0 } }, { { LIMM_NONE, 0 } } } }
+  },
+/* sub$_S $R_b,$R_b,$u5 */
+  {
+    ARC_INSN_SUB_S_SSB, "sub_s_ssb", "sub", 32,
+    { 0|A(SHORT_P)|A(RELAXABLE), { { { (1<<MACH_BASE), 0 } }, { { LIMM_NONE, 0 } } } }
+  },
+/* sub$_S $SP,$SP,$u5x4 */
+  {
+    ARC_INSN_SUB_S_ASSPSP, "sub_s_asspsp", "sub", 32,
+    { 0|A(SHORT_P)|A(RELAXABLE), { { { (1<<MACH_BASE), 0 } }, { { LIMM_NONE, 0 } } } }
+  },
+/* sbc$_L$F $RB,$RB,$s12 */
+  {
+    ARC_INSN_SBC_L_S12__RA_, "sbc_L_s12 $RA,", "sbc", 32,
+    { 0, { { { (1<<MACH_BASE), 0 } }, { { LIMM_B, 0 } } } }
+  },
+/* sbc$Qcondi$F $RB,$RB,$U6 */
+  {
+    ARC_INSN_SBC_CCU6__RA_, "sbc_ccu6 $RA,", "sbc", 32,
+    { 0, { { { (1<<MACH_BASE), 0 } }, { { LIMM_B, 0 } } } }
+  },
+/* sbc$_L$F $RA,$RB,$U6 */
+  {
+    ARC_INSN_SBC_L_U6__RA_, "sbc_L_u6 $RA,", "sbc", 32,
+    { 0, { { { (1<<MACH_BASE), 0 } }, { { LIMM_B, 0 } } } }
+  },
+/* sbc$_L$F $RA,$RB,$RC */
+  {
+    ARC_INSN_SBC_L_R_R__RA__RC, "sbc_L_r_r $RA,$RC", "sbc", 32,
+    { 0, { { { (1<<MACH_BASE), 0 } }, { { LIMM_BC, 0 } } } }
+  },
+/* sbc$Qcondi$F $RB,$RB,$RC */
+  {
+    ARC_INSN_SBC_CC__RA__RC, "sbc_cc $RA,$RC", "sbc", 32,
+    { 0, { { { (1<<MACH_BASE), 0 } }, { { LIMM_BC, 0 } } } }
+  },
+/* and$_L$F $RB,$RB,$s12 */
+  {
+    ARC_INSN_AND_L_S12__RA_, "and_L_s12 $RA,", "and", 32,
+    { 0|A(RELAXED), { { { (1<<MACH_BASE), 0 } }, { { LIMM_B, 0 } } } }
+  },
+/* and$Qcondi$F $RB,$RB,$U6 */
+  {
+    ARC_INSN_AND_CCU6__RA_, "and_ccu6 $RA,", "and", 32,
+    { 0|A(RELAXED), { { { (1<<MACH_BASE), 0 } }, { { LIMM_B, 0 } } } }
+  },
+/* and$_L$F $RA,$RB,$U6 */
+  {
+    ARC_INSN_AND_L_U6__RA_, "and_L_u6 $RA,", "and", 32,
+    { 0|A(RELAXED), { { { (1<<MACH_BASE), 0 } }, { { LIMM_B, 0 } } } }
+  },
+/* and$_L$F $RA,$RB,$RC */
+  {
+    ARC_INSN_AND_L_R_R__RA__RC, "and_L_r_r $RA,$RC", "and", 32,
+    { 0|A(RELAXED), { { { (1<<MACH_BASE), 0 } }, { { LIMM_BC, 0 } } } }
+  },
+/* and$Qcondi$F $RB,$RB,$RC */
+  {
+    ARC_INSN_AND_CC__RA__RC, "and_cc $RA,$RC", "and", 32,
+    { 0|A(RELAXED), { { { (1<<MACH_BASE), 0 } }, { { LIMM_BC, 0 } } } }
+  },
+/* and$_S $R_b,$R_b,$R_c */
+  {
+    ARC_INSN_I16_GO_AND_S_GO, "I16_GO_AND_s_go", "and", 32,
+    { 0|A(SHORT_P)|A(RELAXABLE), { { { (1<<MACH_BASE), 0 } }, { { LIMM_NONE, 0 } } } }
+  },
+/* or$_L$F $RB,$RB,$s12 */
+  {
+    ARC_INSN_OR_L_S12__RA_, "or_L_s12 $RA,", "or", 32,
+    { 0|A(RELAXED), { { { (1<<MACH_BASE), 0 } }, { { LIMM_B, 0 } } } }
+  },
+/* or$Qcondi$F $RB,$RB,$U6 */
+  {
+    ARC_INSN_OR_CCU6__RA_, "or_ccu6 $RA,", "or", 32,
+    { 0|A(RELAXED), { { { (1<<MACH_BASE), 0 } }, { { LIMM_B, 0 } } } }
+  },
+/* or$_L$F $RA,$RB,$U6 */
+  {
+    ARC_INSN_OR_L_U6__RA_, "or_L_u6 $RA,", "or", 32,
+    { 0|A(RELAXED), { { { (1<<MACH_BASE), 0 } }, { { LIMM_B, 0 } } } }
+  },
+/* or$_L$F $RA,$RB,$RC */
+  {
+    ARC_INSN_OR_L_R_R__RA__RC, "or_L_r_r $RA,$RC", "or", 32,
+    { 0|A(RELAXED), { { { (1<<MACH_BASE), 0 } }, { { LIMM_BC, 0 } } } }
+  },
+/* or$Qcondi$F $RB,$RB,$RC */
+  {
+    ARC_INSN_OR_CC__RA__RC, "or_cc $RA,$RC", "or", 32,
+    { 0|A(RELAXED), { { { (1<<MACH_BASE), 0 } }, { { LIMM_BC, 0 } } } }
+  },
+/* or$_S $R_b,$R_b,$R_c */
+  {
+    ARC_INSN_I16_GO_OR_S_GO, "I16_GO_OR_s_go", "or", 32,
+    { 0|A(SHORT_P)|A(RELAXABLE), { { { (1<<MACH_BASE), 0 } }, { { LIMM_NONE, 0 } } } }
+  },
+/* bic$_L$F $RB,$RB,$s12 */
+  {
+    ARC_INSN_BIC_L_S12__RA_, "bic_L_s12 $RA,", "bic", 32,
+    { 0|A(RELAXED), { { { (1<<MACH_BASE), 0 } }, { { LIMM_B, 0 } } } }
+  },
+/* bic$Qcondi$F $RB,$RB,$U6 */
+  {
+    ARC_INSN_BIC_CCU6__RA_, "bic_ccu6 $RA,", "bic", 32,
+    { 0|A(RELAXED), { { { (1<<MACH_BASE), 0 } }, { { LIMM_B, 0 } } } }
+  },
+/* bic$_L$F $RA,$RB,$U6 */
+  {
+    ARC_INSN_BIC_L_U6__RA_, "bic_L_u6 $RA,", "bic", 32,
+    { 0|A(RELAXED), { { { (1<<MACH_BASE), 0 } }, { { LIMM_B, 0 } } } }
+  },
+/* bic$_L$F $RA,$RB,$RC */
+  {
+    ARC_INSN_BIC_L_R_R__RA__RC, "bic_L_r_r $RA,$RC", "bic", 32,
+    { 0|A(RELAXED), { { { (1<<MACH_BASE), 0 } }, { { LIMM_BC, 0 } } } }
+  },
+/* bic$Qcondi$F $RB,$RB,$RC */
+  {
+    ARC_INSN_BIC_CC__RA__RC, "bic_cc $RA,$RC", "bic", 32,
+    { 0|A(RELAXED), { { { (1<<MACH_BASE), 0 } }, { { LIMM_BC, 0 } } } }
+  },
+/* bic$_S $R_b,$R_b,$R_c */
+  {
+    ARC_INSN_I16_GO_BIC_S_GO, "I16_GO_BIC_s_go", "bic", 32,
+    { 0|A(SHORT_P)|A(RELAXABLE), { { { (1<<MACH_BASE), 0 } }, { { LIMM_NONE, 0 } } } }
+  },
+/* xor$_L$F $RB,$RB,$s12 */
+  {
+    ARC_INSN_XOR_L_S12__RA_, "xor_L_s12 $RA,", "xor", 32,
+    { 0|A(RELAXED), { { { (1<<MACH_BASE), 0 } }, { { LIMM_B, 0 } } } }
+  },
+/* xor$Qcondi$F $RB,$RB,$U6 */
+  {
+    ARC_INSN_XOR_CCU6__RA_, "xor_ccu6 $RA,", "xor", 32,
+    { 0|A(RELAXED), { { { (1<<MACH_BASE), 0 } }, { { LIMM_B, 0 } } } }
+  },
+/* xor$_L$F $RA,$RB,$U6 */
+  {
+    ARC_INSN_XOR_L_U6__RA_, "xor_L_u6 $RA,", "xor", 32,
+    { 0|A(RELAXED), { { { (1<<MACH_BASE), 0 } }, { { LIMM_B, 0 } } } }
+  },
+/* xor$_L$F $RA,$RB,$RC */
+  {
+    ARC_INSN_XOR_L_R_R__RA__RC, "xor_L_r_r $RA,$RC", "xor", 32,
+    { 0|A(RELAXED), { { { (1<<MACH_BASE), 0 } }, { { LIMM_BC, 0 } } } }
+  },
+/* xor$Qcondi$F $RB,$RB,$RC */
+  {
+    ARC_INSN_XOR_CC__RA__RC, "xor_cc $RA,$RC", "xor", 32,
+    { 0|A(RELAXED), { { { (1<<MACH_BASE), 0 } }, { { LIMM_BC, 0 } } } }
+  },
+/* xor$_S $R_b,$R_b,$R_c */
+  {
+    ARC_INSN_I16_GO_XOR_S_GO, "I16_GO_XOR_s_go", "xor", 32,
+    { 0|A(SHORT_P)|A(RELAXABLE), { { { (1<<MACH_BASE), 0 } }, { { LIMM_NONE, 0 } } } }
+  },
+/* max$_L$F $RB,$RB,$s12 */
+  {
+    ARC_INSN_MAX_L_S12__RA_, "max_L_s12 $RA,", "max", 32,
+    { 0, { { { (1<<MACH_BASE), 0 } }, { { LIMM_B, 0 } } } }
+  },
+/* max$Qcondi$F $RB,$RB,$U6 */
+  {
+    ARC_INSN_MAX_CCU6__RA_, "max_ccu6 $RA,", "max", 32,
+    { 0, { { { (1<<MACH_BASE), 0 } }, { { LIMM_B, 0 } } } }
+  },
+/* max$_L$F $RA,$RB,$U6 */
+  {
+    ARC_INSN_MAX_L_U6__RA_, "max_L_u6 $RA,", "max", 32,
+    { 0, { { { (1<<MACH_BASE), 0 } }, { { LIMM_B, 0 } } } }
+  },
+/* max$_L$F $RA,$RB,$RC */
+  {
+    ARC_INSN_MAX_L_R_R__RA__RC, "max_L_r_r $RA,$RC", "max", 32,
+    { 0, { { { (1<<MACH_BASE), 0 } }, { { LIMM_BC, 0 } } } }
+  },
+/* max$Qcondi$F $RB,$RB,$RC */
+  {
+    ARC_INSN_MAX_CC__RA__RC, "max_cc $RA,$RC", "max", 32,
+    { 0, { { { (1<<MACH_BASE), 0 } }, { { LIMM_BC, 0 } } } }
+  },
+/* min$_L$F $RB,$RB,$s12 */
+  {
+    ARC_INSN_MIN_L_S12__RA_, "min_L_s12 $RA,", "min", 32,
+    { 0, { { { (1<<MACH_BASE), 0 } }, { { LIMM_B, 0 } } } }
+  },
+/* min$Qcondi$F $RB,$RB,$U6 */
+  {
+    ARC_INSN_MIN_CCU6__RA_, "min_ccu6 $RA,", "min", 32,
+    { 0, { { { (1<<MACH_BASE), 0 } }, { { LIMM_B, 0 } } } }
+  },
+/* min$_L$F $RA,$RB,$U6 */
+  {
+    ARC_INSN_MIN_L_U6__RA_, "min_L_u6 $RA,", "min", 32,
+    { 0, { { { (1<<MACH_BASE), 0 } }, { { LIMM_B, 0 } } } }
+  },
+/* min$_L$F $RA,$RB,$RC */
+  {
+    ARC_INSN_MIN_L_R_R__RA__RC, "min_L_r_r $RA,$RC", "min", 32,
+    { 0, { { { (1<<MACH_BASE), 0 } }, { { LIMM_BC, 0 } } } }
+  },
+/* min$Qcondi$F $RB,$RB,$RC */
+  {
+    ARC_INSN_MIN_CC__RA__RC, "min_cc $RA,$RC", "min", 32,
+    { 0, { { { (1<<MACH_BASE), 0 } }, { { LIMM_BC, 0 } } } }
+  },
+/* mov$_L$F $RB,$s12 */
+  {
+    ARC_INSN_MOV_L_S12_, "mov_L_s12 ", "mov", 32,
+    { 0|A(RELAXED), { { { (1<<MACH_BASE), 0 } }, { { LIMM_NONE, 0 } } } }
+  },
+/* mov$Qcondi$F $RB,$U6 */
+  {
+    ARC_INSN_MOV_CCU6_, "mov_ccu6 ", "mov", 32,
+    { 0|A(RELAXED), { { { (1<<MACH_BASE), 0 } }, { { LIMM_NONE, 0 } } } }
+  },
+/* mov$_L$F $RB,$U6 */
+  {
+    ARC_INSN_MOV_L_U6_, "mov_L_u6 ", "mov", 32,
+    { 0|A(RELAXED), { { { (1<<MACH_BASE), 0 } }, { { LIMM_NONE, 0 } } } }
+  },
+/* mov$_L$F $RB,$RC */
+  {
+    ARC_INSN_MOV_L_R_R__RC, "mov_L_r_r $RC", "mov", 32,
+    { 0|A(RELAXED), { { { (1<<MACH_BASE), 0 } }, { { LIMM_C, 0 } } } }
+  },
+/* mov$Qcondi$F $RB,$RC */
+  {
+    ARC_INSN_MOV_CC__RC, "mov_cc $RC", "mov", 32,
+    { 0|A(RELAXED), { { { (1<<MACH_BASE), 0 } }, { { LIMM_C, 0 } } } }
+  },
+/* mov$_S $R_b,$Rh */
+  {
+    ARC_INSN_MOV_S_MCAH, "mov_s_mcah", "mov", 32,
+    { 0|A(SHORT_P)|A(RELAXABLE), { { { (1<<MACH_BASE), 0 } }, { { LIMM_H, 0 } } } }
+  },
+/* mov$_S $Rh,$R_b */
+  {
+    ARC_INSN_MOV_S_MCAHB, "mov_s_mcahb", "mov", 32,
+    { 0|A(SHORT_P)|A(RELAXABLE), { { { (1<<MACH_BASE), 0 } }, { { LIMM_NONE, 0 } } } }
+  },
+/* mov$_S $R_b,$u7 */
+  {
+    ARC_INSN_MOV_S_R_U7, "mov_s_r_u7", "mov", 32,
+    { 0|A(SHORT_P)|A(RELAXABLE), { { { (1<<MACH_BASE), 0 } }, { { LIMM_NONE, 0 } } } }
+  },
+/* tst$_L$F1 $RB,$s12 */
+  {
+    ARC_INSN_TST_L_S12_, "tst_L_s12 ", "tst", 32,
+    { 0|A(RELAXED), { { { (1<<MACH_BASE), 0 } }, { { LIMM_B, 0 } } } }
+  },
+/* tst$Qcondi$F1 $RB,$U6 */
+  {
+    ARC_INSN_TST_CCU6_, "tst_ccu6 ", "tst", 32,
+    { 0|A(RELAXED), { { { (1<<MACH_BASE), 0 } }, { { LIMM_B, 0 } } } }
+  },
+/* tst$_L$F1 $RB,$U6 */
+  {
+    ARC_INSN_TST_L_U6_, "tst_L_u6 ", "tst", 32,
+    { 0|A(RELAXED), { { { (1<<MACH_BASE), 0 } }, { { LIMM_B, 0 } } } }
+  },
+/* tst$_L$F1 $RB,$RC */
+  {
+    ARC_INSN_TST_L_R_R__RC, "tst_L_r_r $RC", "tst", 32,
+    { 0|A(RELAXED), { { { (1<<MACH_BASE), 0 } }, { { LIMM_BC, 0 } } } }
+  },
+/* tst$Qcondi$F1 $RB,$RC */
+  {
+    ARC_INSN_TST_CC__RC, "tst_cc $RC", "tst", 32,
+    { 0|A(RELAXED), { { { (1<<MACH_BASE), 0 } }, { { LIMM_BC, 0 } } } }
+  },
+/* tst$_S $R_b,$R_c */
+  {
+    ARC_INSN_TST_S_GO, "tst_s_go", "tst", 32,
+    { 0|A(SHORT_P)|A(RELAXABLE), { { { (1<<MACH_BASE), 0 } }, { { LIMM_NONE, 0 } } } }
+  },
+/* cmp$_L$F1 $RB,$s12 */
+  {
+    ARC_INSN_CMP_L_S12_, "cmp_L_s12 ", "cmp", 32,
+    { 0|A(RELAXED), { { { (1<<MACH_BASE), 0 } }, { { LIMM_B, 0 } } } }
+  },
+/* cmp$Qcondi$F1 $RB,$U6 */
+  {
+    ARC_INSN_CMP_CCU6_, "cmp_ccu6 ", "cmp", 32,
+    { 0|A(RELAXED), { { { (1<<MACH_BASE), 0 } }, { { LIMM_B, 0 } } } }
+  },
+/* cmp$_L$F1 $RB,$U6 */
+  {
+    ARC_INSN_CMP_L_U6_, "cmp_L_u6 ", "cmp", 32,
+    { 0|A(RELAXED), { { { (1<<MACH_BASE), 0 } }, { { LIMM_B, 0 } } } }
+  },
+/* cmp$_L$F1 $RB,$RC */
+  {
+    ARC_INSN_CMP_L_R_R__RC, "cmp_L_r_r $RC", "cmp", 32,
+    { 0|A(RELAXED), { { { (1<<MACH_BASE), 0 } }, { { LIMM_BC, 0 } } } }
+  },
+/* cmp$Qcondi$F1 $RB,$RC */
+  {
+    ARC_INSN_CMP_CC__RC, "cmp_cc $RC", "cmp", 32,
+    { 0|A(RELAXED), { { { (1<<MACH_BASE), 0 } }, { { LIMM_BC, 0 } } } }
+  },
+/* cmp$_S $R_b,$Rh */
+  {
+    ARC_INSN_CMP_S_MCAH, "cmp_s_mcah", "cmp", 32,
+    { 0|A(SHORT_P)|A(RELAXABLE), { { { (1<<MACH_BASE), 0 } }, { { LIMM_H, 0 } } } }
+  },
+/* cmp$_S $R_b,$u7 */
+  {
+    ARC_INSN_CMP_S_R_U7, "cmp_s_r_u7", "cmp", 32,
+    { 0|A(SHORT_P)|A(RELAXABLE), { { { (1<<MACH_BASE), 0 } }, { { LIMM_NONE, 0 } } } }
+  },
+/* rcmp$_L$F1 $RB,$s12 */
+  {
+    ARC_INSN_RCMP_L_S12_, "rcmp_L_s12 ", "rcmp", 32,
+    { 0|A(RELAXED), { { { (1<<MACH_BASE), 0 } }, { { LIMM_B, 0 } } } }
+  },
+/* rcmp$Qcondi$F1 $RB,$U6 */
+  {
+    ARC_INSN_RCMP_CCU6_, "rcmp_ccu6 ", "rcmp", 32,
+    { 0|A(RELAXED), { { { (1<<MACH_BASE), 0 } }, { { LIMM_B, 0 } } } }
+  },
+/* rcmp$_L$F1 $RB,$U6 */
+  {
+    ARC_INSN_RCMP_L_U6_, "rcmp_L_u6 ", "rcmp", 32,
+    { 0|A(RELAXED), { { { (1<<MACH_BASE), 0 } }, { { LIMM_B, 0 } } } }
+  },
+/* rcmp$_L$F1 $RB,$RC */
+  {
+    ARC_INSN_RCMP_L_R_R__RC, "rcmp_L_r_r $RC", "rcmp", 32,
+    { 0|A(RELAXED), { { { (1<<MACH_BASE), 0 } }, { { LIMM_BC, 0 } } } }
+  },
+/* rcmp$Qcondi$F1 $RB,$RC */
+  {
+    ARC_INSN_RCMP_CC__RC, "rcmp_cc $RC", "rcmp", 32,
+    { 0|A(RELAXED), { { { (1<<MACH_BASE), 0 } }, { { LIMM_BC, 0 } } } }
+  },
+/* rsub$_L$F $RB,$RB,$s12 */
+  {
+    ARC_INSN_RSUB_L_S12__RA_, "rsub_L_s12 $RA,", "rsub", 32,
+    { 0, { { { (1<<MACH_BASE), 0 } }, { { LIMM_B, 0 } } } }
+  },
+/* rsub$Qcondi$F $RB,$RB,$U6 */
+  {
+    ARC_INSN_RSUB_CCU6__RA_, "rsub_ccu6 $RA,", "rsub", 32,
+    { 0, { { { (1<<MACH_BASE), 0 } }, { { LIMM_B, 0 } } } }
+  },
+/* rsub$_L$F $RA,$RB,$U6 */
+  {
+    ARC_INSN_RSUB_L_U6__RA_, "rsub_L_u6 $RA,", "rsub", 32,
+    { 0, { { { (1<<MACH_BASE), 0 } }, { { LIMM_B, 0 } } } }
+  },
+/* rsub$_L$F $RA,$RB,$RC */
+  {
+    ARC_INSN_RSUB_L_R_R__RA__RC, "rsub_L_r_r $RA,$RC", "rsub", 32,
+    { 0, { { { (1<<MACH_BASE), 0 } }, { { LIMM_BC, 0 } } } }
+  },
+/* rsub$Qcondi$F $RB,$RB,$RC */
+  {
+    ARC_INSN_RSUB_CC__RA__RC, "rsub_cc $RA,$RC", "rsub", 32,
+    { 0, { { { (1<<MACH_BASE), 0 } }, { { LIMM_BC, 0 } } } }
+  },
+/* bset$_L$F $RB,$RB,$s12 */
+  {
+    ARC_INSN_BSET_L_S12__RA_, "bset_L_s12 $RA,", "bset", 32,
+    { 0|A(RELAXED), { { { (1<<MACH_BASE), 0 } }, { { LIMM_B, 0 } } } }
+  },
+/* bset$Qcondi$F $RB,$RB,$U6 */
+  {
+    ARC_INSN_BSET_CCU6__RA_, "bset_ccu6 $RA,", "bset", 32,
+    { 0|A(RELAXED), { { { (1<<MACH_BASE), 0 } }, { { LIMM_B, 0 } } } }
+  },
+/* bset$_L$F $RA,$RB,$U6 */
+  {
+    ARC_INSN_BSET_L_U6__RA_, "bset_L_u6 $RA,", "bset", 32,
+    { 0|A(RELAXED), { { { (1<<MACH_BASE), 0 } }, { { LIMM_B, 0 } } } }
+  },
+/* bset$_L$F $RA,$RB,$RC */
+  {
+    ARC_INSN_BSET_L_R_R__RA__RC, "bset_L_r_r $RA,$RC", "bset", 32,
+    { 0|A(RELAXED), { { { (1<<MACH_BASE), 0 } }, { { LIMM_BC, 0 } } } }
+  },
+/* bset$Qcondi$F $RB,$RB,$RC */
+  {
+    ARC_INSN_BSET_CC__RA__RC, "bset_cc $RA,$RC", "bset", 32,
+    { 0|A(RELAXED), { { { (1<<MACH_BASE), 0 } }, { { LIMM_BC, 0 } } } }
+  },
+/* bset$_S $R_b,$R_b,$u5 */
+  {
+    ARC_INSN_BSET_S_SSB, "bset_s_ssb", "bset", 32,
+    { 0|A(SHORT_P)|A(RELAXABLE), { { { (1<<MACH_BASE), 0 } }, { { LIMM_NONE, 0 } } } }
+  },
+/* bclr$_L$F $RB,$RB,$s12 */
+  {
+    ARC_INSN_BCLR_L_S12__RA_, "bclr_L_s12 $RA,", "bclr", 32,
+    { 0|A(RELAXED), { { { (1<<MACH_BASE), 0 } }, { { LIMM_B, 0 } } } }
+  },
+/* bclr$Qcondi$F $RB,$RB,$U6 */
+  {
+    ARC_INSN_BCLR_CCU6__RA_, "bclr_ccu6 $RA,", "bclr", 32,
+    { 0|A(RELAXED), { { { (1<<MACH_BASE), 0 } }, { { LIMM_B, 0 } } } }
+  },
+/* bclr$_L$F $RA,$RB,$U6 */
+  {
+    ARC_INSN_BCLR_L_U6__RA_, "bclr_L_u6 $RA,", "bclr", 32,
+    { 0|A(RELAXED), { { { (1<<MACH_BASE), 0 } }, { { LIMM_B, 0 } } } }
+  },
+/* bclr$_L$F $RA,$RB,$RC */
+  {
+    ARC_INSN_BCLR_L_R_R__RA__RC, "bclr_L_r_r $RA,$RC", "bclr", 32,
+    { 0|A(RELAXED), { { { (1<<MACH_BASE), 0 } }, { { LIMM_BC, 0 } } } }
+  },
+/* bclr$Qcondi$F $RB,$RB,$RC */
+  {
+    ARC_INSN_BCLR_CC__RA__RC, "bclr_cc $RA,$RC", "bclr", 32,
+    { 0|A(RELAXED), { { { (1<<MACH_BASE), 0 } }, { { LIMM_BC, 0 } } } }
+  },
+/* bclr$_S $R_b,$R_b,$u5 */
+  {
+    ARC_INSN_BCLR_S_SSB, "bclr_s_ssb", "bclr", 32,
+    { 0|A(SHORT_P)|A(RELAXABLE), { { { (1<<MACH_BASE), 0 } }, { { LIMM_NONE, 0 } } } }
+  },
+/* btst$_L$F1 $RB,$s12 */
+  {
+    ARC_INSN_BTST_L_S12_, "btst_L_s12 ", "btst", 32,
+    { 0|A(RELAXED), { { { (1<<MACH_BASE), 0 } }, { { LIMM_B, 0 } } } }
+  },
+/* btst$Qcondi$F1 $RB,$U6 */
+  {
+    ARC_INSN_BTST_CCU6_, "btst_ccu6 ", "btst", 32,
+    { 0|A(RELAXED), { { { (1<<MACH_BASE), 0 } }, { { LIMM_B, 0 } } } }
+  },
+/* btst$_L$F1 $RB,$U6 */
+  {
+    ARC_INSN_BTST_L_U6_, "btst_L_u6 ", "btst", 32,
+    { 0|A(RELAXED), { { { (1<<MACH_BASE), 0 } }, { { LIMM_B, 0 } } } }
+  },
+/* btst$_L$F1 $RB,$RC */
+  {
+    ARC_INSN_BTST_L_R_R__RC, "btst_L_r_r $RC", "btst", 32,
+    { 0|A(RELAXED), { { { (1<<MACH_BASE), 0 } }, { { LIMM_BC, 0 } } } }
+  },
+/* btst$Qcondi$F1 $RB,$RC */
+  {
+    ARC_INSN_BTST_CC__RC, "btst_cc $RC", "btst", 32,
+    { 0|A(RELAXED), { { { (1<<MACH_BASE), 0 } }, { { LIMM_BC, 0 } } } }
+  },
+/* btst$_S $R_b,$u5 */
+  {
+    ARC_INSN_BTST_S_SSB, "btst_s_ssb", "btst", 32,
+    { 0|A(SHORT_P)|A(RELAXABLE), { { { (1<<MACH_BASE), 0 } }, { { LIMM_NONE, 0 } } } }
+  },
+/* bxor$_L$F $RB,$RB,$s12 */
+  {
+    ARC_INSN_BXOR_L_S12__RA_, "bxor_L_s12 $RA,", "bxor", 32,
+    { 0, { { { (1<<MACH_BASE), 0 } }, { { LIMM_B, 0 } } } }
+  },
+/* bxor$Qcondi$F $RB,$RB,$U6 */
+  {
+    ARC_INSN_BXOR_CCU6__RA_, "bxor_ccu6 $RA,", "bxor", 32,
+    { 0, { { { (1<<MACH_BASE), 0 } }, { { LIMM_B, 0 } } } }
+  },
+/* bxor$_L$F $RA,$RB,$U6 */
+  {
+    ARC_INSN_BXOR_L_U6__RA_, "bxor_L_u6 $RA,", "bxor", 32,
+    { 0, { { { (1<<MACH_BASE), 0 } }, { { LIMM_B, 0 } } } }
+  },
+/* bxor$_L$F $RA,$RB,$RC */
+  {
+    ARC_INSN_BXOR_L_R_R__RA__RC, "bxor_L_r_r $RA,$RC", "bxor", 32,
+    { 0, { { { (1<<MACH_BASE), 0 } }, { { LIMM_BC, 0 } } } }
+  },
+/* bxor$Qcondi$F $RB,$RB,$RC */
+  {
+    ARC_INSN_BXOR_CC__RA__RC, "bxor_cc $RA,$RC", "bxor", 32,
+    { 0, { { { (1<<MACH_BASE), 0 } }, { { LIMM_BC, 0 } } } }
+  },
+/* bmsk$_L$F $RB,$RB,$s12 */
+  {
+    ARC_INSN_BMSK_L_S12__RA_, "bmsk_L_s12 $RA,", "bmsk", 32,
+    { 0|A(RELAXED), { { { (1<<MACH_BASE), 0 } }, { { LIMM_B, 0 } } } }
+  },
+/* bmsk$Qcondi$F $RB,$RB,$U6 */
+  {
+    ARC_INSN_BMSK_CCU6__RA_, "bmsk_ccu6 $RA,", "bmsk", 32,
+    { 0|A(RELAXED), { { { (1<<MACH_BASE), 0 } }, { { LIMM_B, 0 } } } }
+  },
+/* bmsk$_L$F $RA,$RB,$U6 */
+  {
+    ARC_INSN_BMSK_L_U6__RA_, "bmsk_L_u6 $RA,", "bmsk", 32,
+    { 0|A(RELAXED), { { { (1<<MACH_BASE), 0 } }, { { LIMM_B, 0 } } } }
+  },
+/* bmsk$_L$F $RA,$RB,$RC */
+  {
+    ARC_INSN_BMSK_L_R_R__RA__RC, "bmsk_L_r_r $RA,$RC", "bmsk", 32,
+    { 0|A(RELAXED), { { { (1<<MACH_BASE), 0 } }, { { LIMM_BC, 0 } } } }
+  },
+/* bmsk$Qcondi$F $RB,$RB,$RC */
+  {
+    ARC_INSN_BMSK_CC__RA__RC, "bmsk_cc $RA,$RC", "bmsk", 32,
+    { 0|A(RELAXED), { { { (1<<MACH_BASE), 0 } }, { { LIMM_BC, 0 } } } }
+  },
+/* bmsk$_S $R_b,$R_b,$u5 */
+  {
+    ARC_INSN_BMSK_S_SSB, "bmsk_s_ssb", "bmsk", 32,
+    { 0|A(SHORT_P)|A(RELAXABLE), { { { (1<<MACH_BASE), 0 } }, { { LIMM_NONE, 0 } } } }
+  },
+/* add1$_L$F $RB,$RB,$s12 */
+  {
+    ARC_INSN_ADD1_L_S12__RA_, "add1_L_s12 $RA,", "add1", 32,
+    { 0|A(RELAXED), { { { (1<<MACH_BASE), 0 } }, { { LIMM_B, 0 } } } }
+  },
+/* add1$Qcondi$F $RB,$RB,$U6 */
+  {
+    ARC_INSN_ADD1_CCU6__RA_, "add1_ccu6 $RA,", "add1", 32,
+    { 0|A(RELAXED), { { { (1<<MACH_BASE), 0 } }, { { LIMM_B, 0 } } } }
+  },
+/* add1$_L$F $RA,$RB,$U6 */
+  {
+    ARC_INSN_ADD1_L_U6__RA_, "add1_L_u6 $RA,", "add1", 32,
+    { 0|A(RELAXED), { { { (1<<MACH_BASE), 0 } }, { { LIMM_B, 0 } } } }
+  },
+/* add1$_L$F $RA,$RB,$RC */
+  {
+    ARC_INSN_ADD1_L_R_R__RA__RC, "add1_L_r_r $RA,$RC", "add1", 32,
+    { 0|A(RELAXED), { { { (1<<MACH_BASE), 0 } }, { { LIMM_BC, 0 } } } }
+  },
+/* add1$Qcondi$F $RB,$RB,$RC */
+  {
+    ARC_INSN_ADD1_CC__RA__RC, "add1_cc $RA,$RC", "add1", 32,
+    { 0|A(RELAXED), { { { (1<<MACH_BASE), 0 } }, { { LIMM_BC, 0 } } } }
+  },
+/* add1$_S $R_b,$R_b,$R_c */
+  {
+    ARC_INSN_I16_GO_ADD1_S_GO, "I16_GO_ADD1_s_go", "add1", 32,
+    { 0|A(SHORT_P)|A(RELAXABLE), { { { (1<<MACH_BASE), 0 } }, { { LIMM_NONE, 0 } } } }
+  },
+/* add2$_L$F $RB,$RB,$s12 */
+  {
+    ARC_INSN_ADD2_L_S12__RA_, "add2_L_s12 $RA,", "add2", 32,
+    { 0|A(RELAXED), { { { (1<<MACH_BASE), 0 } }, { { LIMM_B, 0 } } } }
+  },
+/* add2$Qcondi$F $RB,$RB,$U6 */
+  {
+    ARC_INSN_ADD2_CCU6__RA_, "add2_ccu6 $RA,", "add2", 32,
+    { 0|A(RELAXED), { { { (1<<MACH_BASE), 0 } }, { { LIMM_B, 0 } } } }
+  },
+/* add2$_L$F $RA,$RB,$U6 */
+  {
+    ARC_INSN_ADD2_L_U6__RA_, "add2_L_u6 $RA,", "add2", 32,
+    { 0|A(RELAXED), { { { (1<<MACH_BASE), 0 } }, { { LIMM_B, 0 } } } }
+  },
+/* add2$_L$F $RA,$RB,$RC */
+  {
+    ARC_INSN_ADD2_L_R_R__RA__RC, "add2_L_r_r $RA,$RC", "add2", 32,
+    { 0|A(RELAXED), { { { (1<<MACH_BASE), 0 } }, { { LIMM_BC, 0 } } } }
+  },
+/* add2$Qcondi$F $RB,$RB,$RC */
+  {
+    ARC_INSN_ADD2_CC__RA__RC, "add2_cc $RA,$RC", "add2", 32,
+    { 0|A(RELAXED), { { { (1<<MACH_BASE), 0 } }, { { LIMM_BC, 0 } } } }
+  },
+/* add2$_S $R_b,$R_b,$R_c */
+  {
+    ARC_INSN_I16_GO_ADD2_S_GO, "I16_GO_ADD2_s_go", "add2", 32,
+    { 0|A(SHORT_P)|A(RELAXABLE), { { { (1<<MACH_BASE), 0 } }, { { LIMM_NONE, 0 } } } }
+  },
+/* add3$_L$F $RB,$RB,$s12 */
+  {
+    ARC_INSN_ADD3_L_S12__RA_, "add3_L_s12 $RA,", "add3", 32,
+    { 0|A(RELAXED), { { { (1<<MACH_BASE), 0 } }, { { LIMM_B, 0 } } } }
+  },
+/* add3$Qcondi$F $RB,$RB,$U6 */
+  {
+    ARC_INSN_ADD3_CCU6__RA_, "add3_ccu6 $RA,", "add3", 32,
+    { 0|A(RELAXED), { { { (1<<MACH_BASE), 0 } }, { { LIMM_B, 0 } } } }
+  },
+/* add3$_L$F $RA,$RB,$U6 */
+  {
+    ARC_INSN_ADD3_L_U6__RA_, "add3_L_u6 $RA,", "add3", 32,
+    { 0|A(RELAXED), { { { (1<<MACH_BASE), 0 } }, { { LIMM_B, 0 } } } }
+  },
+/* add3$_L$F $RA,$RB,$RC */
+  {
+    ARC_INSN_ADD3_L_R_R__RA__RC, "add3_L_r_r $RA,$RC", "add3", 32,
+    { 0|A(RELAXED), { { { (1<<MACH_BASE), 0 } }, { { LIMM_BC, 0 } } } }
+  },
+/* add3$Qcondi$F $RB,$RB,$RC */
+  {
+    ARC_INSN_ADD3_CC__RA__RC, "add3_cc $RA,$RC", "add3", 32,
+    { 0|A(RELAXED), { { { (1<<MACH_BASE), 0 } }, { { LIMM_BC, 0 } } } }
+  },
+/* add3$_S $R_b,$R_b,$R_c */
+  {
+    ARC_INSN_I16_GO_ADD3_S_GO, "I16_GO_ADD3_s_go", "add3", 32,
+    { 0|A(SHORT_P)|A(RELAXABLE), { { { (1<<MACH_BASE), 0 } }, { { LIMM_NONE, 0 } } } }
+  },
+/* sub1$_L$F $RB,$RB,$s12 */
+  {
+    ARC_INSN_SUB1_L_S12__RA_, "sub1_L_s12 $RA,", "sub1", 32,
+    { 0|A(RELAXED), { { { (1<<MACH_BASE), 0 } }, { { LIMM_B, 0 } } } }
+  },
+/* sub1$Qcondi$F $RB,$RB,$U6 */
+  {
+    ARC_INSN_SUB1_CCU6__RA_, "sub1_ccu6 $RA,", "sub1", 32,
+    { 0|A(RELAXED), { { { (1<<MACH_BASE), 0 } }, { { LIMM_B, 0 } } } }
+  },
+/* sub1$_L$F $RA,$RB,$U6 */
+  {
+    ARC_INSN_SUB1_L_U6__RA_, "sub1_L_u6 $RA,", "sub1", 32,
+    { 0|A(RELAXED), { { { (1<<MACH_BASE), 0 } }, { { LIMM_B, 0 } } } }
+  },
+/* sub1$_L$F $RA,$RB,$RC */
+  {
+    ARC_INSN_SUB1_L_R_R__RA__RC, "sub1_L_r_r $RA,$RC", "sub1", 32,
+    { 0|A(RELAXED), { { { (1<<MACH_BASE), 0 } }, { { LIMM_BC, 0 } } } }
+  },
+/* sub1$Qcondi$F $RB,$RB,$RC */
+  {
+    ARC_INSN_SUB1_CC__RA__RC, "sub1_cc $RA,$RC", "sub1", 32,
+    { 0|A(RELAXED), { { { (1<<MACH_BASE), 0 } }, { { LIMM_BC, 0 } } } }
+  },
+/* sub2$_L$F $RB,$RB,$s12 */
+  {
+    ARC_INSN_SUB2_L_S12__RA_, "sub2_L_s12 $RA,", "sub2", 32,
+    { 0|A(RELAXED), { { { (1<<MACH_BASE), 0 } }, { { LIMM_B, 0 } } } }
+  },
+/* sub2$Qcondi$F $RB,$RB,$U6 */
+  {
+    ARC_INSN_SUB2_CCU6__RA_, "sub2_ccu6 $RA,", "sub2", 32,
+    { 0|A(RELAXED), { { { (1<<MACH_BASE), 0 } }, { { LIMM_B, 0 } } } }
+  },
+/* sub2$_L$F $RA,$RB,$U6 */
+  {
+    ARC_INSN_SUB2_L_U6__RA_, "sub2_L_u6 $RA,", "sub2", 32,
+    { 0|A(RELAXED), { { { (1<<MACH_BASE), 0 } }, { { LIMM_B, 0 } } } }
+  },
+/* sub2$_L$F $RA,$RB,$RC */
+  {
+    ARC_INSN_SUB2_L_R_R__RA__RC, "sub2_L_r_r $RA,$RC", "sub2", 32,
+    { 0|A(RELAXED), { { { (1<<MACH_BASE), 0 } }, { { LIMM_BC, 0 } } } }
+  },
+/* sub2$Qcondi$F $RB,$RB,$RC */
+  {
+    ARC_INSN_SUB2_CC__RA__RC, "sub2_cc $RA,$RC", "sub2", 32,
+    { 0|A(RELAXED), { { { (1<<MACH_BASE), 0 } }, { { LIMM_BC, 0 } } } }
+  },
+/* sub3$_L$F $RB,$RB,$s12 */
+  {
+    ARC_INSN_SUB3_L_S12__RA_, "sub3_L_s12 $RA,", "sub3", 32,
+    { 0|A(RELAXED), { { { (1<<MACH_BASE), 0 } }, { { LIMM_B, 0 } } } }
+  },
+/* sub3$Qcondi$F $RB,$RB,$U6 */
+  {
+    ARC_INSN_SUB3_CCU6__RA_, "sub3_ccu6 $RA,", "sub3", 32,
+    { 0|A(RELAXED), { { { (1<<MACH_BASE), 0 } }, { { LIMM_B, 0 } } } }
+  },
+/* sub3$_L$F $RA,$RB,$U6 */
+  {
+    ARC_INSN_SUB3_L_U6__RA_, "sub3_L_u6 $RA,", "sub3", 32,
+    { 0|A(RELAXED), { { { (1<<MACH_BASE), 0 } }, { { LIMM_B, 0 } } } }
+  },
+/* sub3$_L$F $RA,$RB,$RC */
+  {
+    ARC_INSN_SUB3_L_R_R__RA__RC, "sub3_L_r_r $RA,$RC", "sub3", 32,
+    { 0|A(RELAXED), { { { (1<<MACH_BASE), 0 } }, { { LIMM_BC, 0 } } } }
+  },
+/* sub3$Qcondi$F $RB,$RB,$RC */
+  {
+    ARC_INSN_SUB3_CC__RA__RC, "sub3_cc $RA,$RC", "sub3", 32,
+    { 0|A(RELAXED), { { { (1<<MACH_BASE), 0 } }, { { LIMM_BC, 0 } } } }
+  },
+/* mpy$_L$F $RB,$RB,$s12 */
+  {
+    ARC_INSN_MPY_L_S12__RA_, "mpy_L_s12 $RA,", "mpy", 32,
+    { 0, { { { (1<<MACH_BASE), 0 } }, { { LIMM_B, 0 } } } }
+  },
+/* mpy$Qcondi$F $RB,$RB,$U6 */
+  {
+    ARC_INSN_MPY_CCU6__RA_, "mpy_ccu6 $RA,", "mpy", 32,
+    { 0, { { { (1<<MACH_BASE), 0 } }, { { LIMM_B, 0 } } } }
+  },
+/* mpy$_L$F $RA,$RB,$U6 */
+  {
+    ARC_INSN_MPY_L_U6__RA_, "mpy_L_u6 $RA,", "mpy", 32,
+    { 0, { { { (1<<MACH_BASE), 0 } }, { { LIMM_B, 0 } } } }
+  },
+/* mpy$_L$F $RA,$RB,$RC */
+  {
+    ARC_INSN_MPY_L_R_R__RA__RC, "mpy_L_r_r $RA,$RC", "mpy", 32,
+    { 0, { { { (1<<MACH_BASE), 0 } }, { { LIMM_BC, 0 } } } }
+  },
+/* mpy$Qcondi$F $RB,$RB,$RC */
+  {
+    ARC_INSN_MPY_CC__RA__RC, "mpy_cc $RA,$RC", "mpy", 32,
+    { 0, { { { (1<<MACH_BASE), 0 } }, { { LIMM_BC, 0 } } } }
+  },
+/* mpyh$_L$F $RB,$RB,$s12 */
+  {
+    ARC_INSN_MPYH_L_S12__RA_, "mpyh_L_s12 $RA,", "mpyh", 32,
+    { 0, { { { (1<<MACH_BASE), 0 } }, { { LIMM_B, 0 } } } }
+  },
+/* mpyh$Qcondi$F $RB,$RB,$U6 */
+  {
+    ARC_INSN_MPYH_CCU6__RA_, "mpyh_ccu6 $RA,", "mpyh", 32,
+    { 0, { { { (1<<MACH_BASE), 0 } }, { { LIMM_B, 0 } } } }
+  },
+/* mpyh$_L$F $RA,$RB,$U6 */
+  {
+    ARC_INSN_MPYH_L_U6__RA_, "mpyh_L_u6 $RA,", "mpyh", 32,
+    { 0, { { { (1<<MACH_BASE), 0 } }, { { LIMM_B, 0 } } } }
+  },
+/* mpyh$_L$F $RA,$RB,$RC */
+  {
+    ARC_INSN_MPYH_L_R_R__RA__RC, "mpyh_L_r_r $RA,$RC", "mpyh", 32,
+    { 0, { { { (1<<MACH_BASE), 0 } }, { { LIMM_BC, 0 } } } }
+  },
+/* mpyh$Qcondi$F $RB,$RB,$RC */
+  {
+    ARC_INSN_MPYH_CC__RA__RC, "mpyh_cc $RA,$RC", "mpyh", 32,
+    { 0, { { { (1<<MACH_BASE), 0 } }, { { LIMM_BC, 0 } } } }
+  },
+/* mpyhu$_L$F $RB,$RB,$s12 */
+  {
+    ARC_INSN_MPYHU_L_S12__RA_, "mpyhu_L_s12 $RA,", "mpyhu", 32,
+    { 0, { { { (1<<MACH_BASE), 0 } }, { { LIMM_B, 0 } } } }
+  },
+/* mpyhu$Qcondi$F $RB,$RB,$U6 */
+  {
+    ARC_INSN_MPYHU_CCU6__RA_, "mpyhu_ccu6 $RA,", "mpyhu", 32,
+    { 0, { { { (1<<MACH_BASE), 0 } }, { { LIMM_B, 0 } } } }
+  },
+/* mpyhu$_L$F $RA,$RB,$U6 */
+  {
+    ARC_INSN_MPYHU_L_U6__RA_, "mpyhu_L_u6 $RA,", "mpyhu", 32,
+    { 0, { { { (1<<MACH_BASE), 0 } }, { { LIMM_B, 0 } } } }
+  },
+/* mpyhu$_L$F $RA,$RB,$RC */
+  {
+    ARC_INSN_MPYHU_L_R_R__RA__RC, "mpyhu_L_r_r $RA,$RC", "mpyhu", 32,
+    { 0, { { { (1<<MACH_BASE), 0 } }, { { LIMM_BC, 0 } } } }
+  },
+/* mpyhu$Qcondi$F $RB,$RB,$RC */
+  {
+    ARC_INSN_MPYHU_CC__RA__RC, "mpyhu_cc $RA,$RC", "mpyhu", 32,
+    { 0, { { { (1<<MACH_BASE), 0 } }, { { LIMM_BC, 0 } } } }
+  },
+/* mpyu$_L$F $RB,$RB,$s12 */
+  {
+    ARC_INSN_MPYU_L_S12__RA_, "mpyu_L_s12 $RA,", "mpyu", 32,
+    { 0, { { { (1<<MACH_BASE), 0 } }, { { LIMM_B, 0 } } } }
+  },
+/* mpyu$Qcondi$F $RB,$RB,$U6 */
+  {
+    ARC_INSN_MPYU_CCU6__RA_, "mpyu_ccu6 $RA,", "mpyu", 32,
+    { 0, { { { (1<<MACH_BASE), 0 } }, { { LIMM_B, 0 } } } }
+  },
+/* mpyu$_L$F $RA,$RB,$U6 */
+  {
+    ARC_INSN_MPYU_L_U6__RA_, "mpyu_L_u6 $RA,", "mpyu", 32,
+    { 0, { { { (1<<MACH_BASE), 0 } }, { { LIMM_B, 0 } } } }
+  },
+/* mpyu$_L$F $RA,$RB,$RC */
+  {
+    ARC_INSN_MPYU_L_R_R__RA__RC, "mpyu_L_r_r $RA,$RC", "mpyu", 32,
+    { 0, { { { (1<<MACH_BASE), 0 } }, { { LIMM_BC, 0 } } } }
+  },
+/* mpyu$Qcondi$F $RB,$RB,$RC */
+  {
+    ARC_INSN_MPYU_CC__RA__RC, "mpyu_cc $RA,$RC", "mpyu", 32,
+    { 0, { { { (1<<MACH_BASE), 0 } }, { { LIMM_BC, 0 } } } }
+  },
+/* j$_L$F0 [$RC_noilink] */
+  {
+    ARC_INSN_J_L_R_R___RC_NOILINK_, "j_L_r_r [$RC_noilink]", "j", 32,
+    { 0|A(RELAXED)|A(COND_CTI), { { { (1<<MACH_BASE), 0 } }, { { LIMM_BC, 0 } } } }
+  },
+/* j$Qcondi$F0 [$RC_noilink] */
+  {
+    ARC_INSN_J_CC___RC_NOILINK_, "j_cc [$RC_noilink]", "j", 32,
+    { 0|A(RELAXED)|A(COND_CTI), { { { (1<<MACH_BASE), 0 } }, { { LIMM_BC, 0 } } } }
+  },
+/* j$_L$F1F [$RC_ilink] */
+  {
+    ARC_INSN_J_L_R_R___RC_ILINK_, "j_L_r_r [$RC_ilink]", "j", 32,
+    { 0|A(RELAXED)|A(COND_CTI), { { { (1<<MACH_BASE), 0 } }, { { LIMM_BC, 0 } } } }
+  },
+/* j$Qcondi$F1F [$RC_ilink] */
+  {
+    ARC_INSN_J_CC___RC_ILINK_, "j_cc [$RC_ilink]", "j", 32,
+    { 0|A(RELAXED)|A(COND_CTI), { { { (1<<MACH_BASE), 0 } }, { { LIMM_BC, 0 } } } }
+  },
+/* j$_L$F0 $s12 */
+  {
+    ARC_INSN_J_L_S12_, "j_L_s12 ", "j", 32,
+    { 0|A(RELAXED)|A(COND_CTI), { { { (1<<MACH_BASE), 0 } }, { { LIMM_B, 0 } } } }
+  },
+/* j$Qcondi$F0 $U6 */
+  {
+    ARC_INSN_J_CCU6_, "j_ccu6 ", "j", 32,
+    { 0|A(RELAXED)|A(COND_CTI), { { { (1<<MACH_BASE), 0 } }, { { LIMM_B, 0 } } } }
+  },
+/* j$_L$F0 $U6 */
+  {
+    ARC_INSN_J_L_U6_, "j_L_u6 ", "j", 32,
+    { 0|A(RELAXED)|A(COND_CTI), { { { (1<<MACH_BASE), 0 } }, { { LIMM_B, 0 } } } }
+  },
+/* j$_S [$R_b] */
+  {
+    ARC_INSN_J_S, "j_s", "j", 32,
+    { 0|A(SHORT_P)|A(RELAXABLE)|A(COND_CTI), { { { (1<<MACH_BASE), 0 } }, { { LIMM_NONE, 0 } } } }
+  },
+/* j$_S [$R31] */
+  {
+    ARC_INSN_J_S__S, "j_s$_S", "j", 32,
+    { 0|A(SHORT_P)|A(RELAXABLE)|A(COND_CTI), { { { (1<<MACH_BASE), 0 } }, { { LIMM_NONE, 0 } } } }
+  },
+/* jeq$_S [$R31] */
+  {
+    ARC_INSN_J_SEQ__S, "j_seq$_S", "jeq", 32,
+    { 0|A(SHORT_P)|A(RELAXABLE)|A(COND_CTI), { { { (1<<MACH_BASE), 0 } }, { { LIMM_NONE, 0 } } } }
+  },
+/* jne$_S [$R31] */
+  {
+    ARC_INSN_J_SNE__S, "j_sne$_S", "jne", 32,
+    { 0|A(SHORT_P)|A(RELAXABLE)|A(COND_CTI), { { { (1<<MACH_BASE), 0 } }, { { LIMM_NONE, 0 } } } }
+  },
+/* j$_L$F0.d $s12 */
+  {
+    ARC_INSN_J_L_S12_D_, "j_L_s12.d ", "j", 32,
+    { 0|A(RELAXED)|A(COND_CTI)|A(DELAY_SLOT), { { { (1<<MACH_BASE), 0 } }, { { LIMM_B, 0 } } } }
+  },
+/* j$Qcondi$F0.d $U6 */
+  {
+    ARC_INSN_J_CCU6_D_, "j_ccu6.d ", "j", 32,
+    { 0|A(RELAXED)|A(COND_CTI)|A(DELAY_SLOT), { { { (1<<MACH_BASE), 0 } }, { { LIMM_B, 0 } } } }
+  },
+/* j$_L$F0.d $U6 */
+  {
+    ARC_INSN_J_L_U6_D_, "j_L_u6.d ", "j", 32,
+    { 0|A(RELAXED)|A(COND_CTI)|A(DELAY_SLOT), { { { (1<<MACH_BASE), 0 } }, { { LIMM_B, 0 } } } }
+  },
+/* j$_L$F0.d [$RC] */
+  {
+    ARC_INSN_J_L_R_R_D___RC_, "j_L_r_r.d [$RC]", "j", 32,
+    { 0|A(RELAXED)|A(COND_CTI)|A(DELAY_SLOT), { { { (1<<MACH_BASE), 0 } }, { { LIMM_BC, 0 } } } }
+  },
+/* j$Qcondi$F0.d [$RC] */
+  {
+    ARC_INSN_J_CC_D___RC_, "j_cc.d [$RC]", "j", 32,
+    { 0|A(RELAXED)|A(COND_CTI)|A(DELAY_SLOT), { { { (1<<MACH_BASE), 0 } }, { { LIMM_BC, 0 } } } }
+  },
+/* j$_S.d [$R_b] */
+  {
+    ARC_INSN_J_S_D, "j_s.d", "j", 32,
+    { 0|A(SHORT_P)|A(RELAXABLE)|A(COND_CTI)|A(DELAY_SLOT), { { { (1<<MACH_BASE), 0 } }, { { LIMM_NONE, 0 } } } }
+  },
+/* j$_S.d [$R31] */
+  {
+    ARC_INSN_J_S__S_D, "j_s$_S.d", "j", 32,
+    { 0|A(SHORT_P)|A(RELAXABLE)|A(COND_CTI)|A(DELAY_SLOT), { { { (1<<MACH_BASE), 0 } }, { { LIMM_NONE, 0 } } } }
+  },
+/* jl$_L$F0 $s12 */
+  {
+    ARC_INSN_JL_L_S12_, "jl_L_s12 ", "jl", 32,
+    { 0|A(RELAXED)|A(COND_CTI), { { { (1<<MACH_BASE), 0 } }, { { LIMM_B, 0 } } } }
+  },
+/* jl$Qcondi$F0 $U6 */
+  {
+    ARC_INSN_JL_CCU6_, "jl_ccu6 ", "jl", 32,
+    { 0|A(RELAXED)|A(COND_CTI), { { { (1<<MACH_BASE), 0 } }, { { LIMM_B, 0 } } } }
+  },
+/* jl$_L$F0 $U6 */
+  {
+    ARC_INSN_JL_L_U6_, "jl_L_u6 ", "jl", 32,
+    { 0|A(RELAXED)|A(COND_CTI), { { { (1<<MACH_BASE), 0 } }, { { LIMM_B, 0 } } } }
+  },
+/* jl$_S [$R_b] */
+  {
+    ARC_INSN_JL_S, "jl_s", "jl", 32,
+    { 0|A(SHORT_P)|A(RELAXABLE)|A(COND_CTI), { { { (1<<MACH_BASE), 0 } }, { { LIMM_NONE, 0 } } } }
+  },
+/* jl$_L$F0 [$RC_noilink] */
+  {
+    ARC_INSN_JL_L_R_R___RC_NOILINK_, "jl_L_r_r [$RC_noilink]", "jl", 32,
+    { 0|A(RELAXED)|A(COND_CTI), { { { (1<<MACH_BASE), 0 } }, { { LIMM_BC, 0 } } } }
+  },
+/* jl$Qcondi$F0 [$RC_noilink] */
+  {
+    ARC_INSN_JL_CC___RC_NOILINK_, "jl_cc [$RC_noilink]", "jl", 32,
+    { 0|A(RELAXED)|A(COND_CTI), { { { (1<<MACH_BASE), 0 } }, { { LIMM_BC, 0 } } } }
+  },
+/* jl$_L$F0.d $s12 */
+  {
+    ARC_INSN_JL_L_S12_D_, "jl_L_s12.d ", "jl", 32,
+    { 0|A(RELAXED)|A(COND_CTI)|A(DELAY_SLOT), { { { (1<<MACH_BASE), 0 } }, { { LIMM_B, 0 } } } }
+  },
+/* jl$Qcondi$F0.d $U6 */
+  {
+    ARC_INSN_JL_CCU6_D_, "jl_ccu6.d ", "jl", 32,
+    { 0|A(RELAXED)|A(COND_CTI)|A(DELAY_SLOT), { { { (1<<MACH_BASE), 0 } }, { { LIMM_B, 0 } } } }
+  },
+/* jl$_L$F0.d $U6 */
+  {
+    ARC_INSN_JL_L_U6_D_, "jl_L_u6.d ", "jl", 32,
+    { 0|A(RELAXED)|A(COND_CTI)|A(DELAY_SLOT), { { { (1<<MACH_BASE), 0 } }, { { LIMM_B, 0 } } } }
+  },
+/* jl$_L$F0.d [$RC] */
+  {
+    ARC_INSN_JL_L_R_R_D___RC_, "jl_L_r_r.d [$RC]", "jl", 32,
+    { 0|A(RELAXED)|A(COND_CTI)|A(DELAY_SLOT), { { { (1<<MACH_BASE), 0 } }, { { LIMM_BC, 0 } } } }
+  },
+/* jl$Qcondi$F0.d [$RC] */
+  {
+    ARC_INSN_JL_CC_D___RC_, "jl_cc.d [$RC]", "jl", 32,
+    { 0|A(RELAXED)|A(COND_CTI)|A(DELAY_SLOT), { { { (1<<MACH_BASE), 0 } }, { { LIMM_BC, 0 } } } }
+  },
+/* jl$_S.d [$R_b] */
+  {
+    ARC_INSN_JL_S_D, "jl_s.d", "jl", 32,
+    { 0|A(SHORT_P)|A(RELAXABLE)|A(COND_CTI)|A(DELAY_SLOT), { { { (1<<MACH_BASE), 0 } }, { { LIMM_NONE, 0 } } } }
+  },
+/* lp$_L$F0 $s12x2 */
+  {
+    ARC_INSN_LP_L_S12_, "lp_L_s12 ", "lp", 32,
+    { 0|A(COND_CTI), { { { (1<<MACH_BASE), 0 } }, { { LIMM_B, 0 } } } }
+  },
+/* lp$Qcondi$F0 $U6x2 */
+  {
+    ARC_INSN_LPCC_CCU6, "lpcc_ccu6", "lp", 32,
+    { 0|A(COND_CTI), { { { (1<<MACH_BASE), 0 } }, { { LIMM_B, 0 } } } }
+  },
+/* flag$_L$F0 $s12 */
+  {
+    ARC_INSN_FLAG_L_S12_, "flag_L_s12 ", "flag", 32,
+    { 0, { { { (1<<MACH_BASE), 0 } }, { { LIMM_B, 0 } } } }
+  },
+/* flag$Qcondi$F0 $U6 */
+  {
+    ARC_INSN_FLAG_CCU6_, "flag_ccu6 ", "flag", 32,
+    { 0, { { { (1<<MACH_BASE), 0 } }, { { LIMM_B, 0 } } } }
+  },
+/* flag$_L$F0 $U6 */
+  {
+    ARC_INSN_FLAG_L_U6_, "flag_L_u6 ", "flag", 32,
+    { 0, { { { (1<<MACH_BASE), 0 } }, { { LIMM_B, 0 } } } }
+  },
+/* flag$_L$F0 $RC */
+  {
+    ARC_INSN_FLAG_L_R_R__RC, "flag_L_r_r $RC", "flag", 32,
+    { 0, { { { (1<<MACH_BASE), 0 } }, { { LIMM_BC, 0 } } } }
+  },
+/* flag$Qcondi$F0 $RC */
+  {
+    ARC_INSN_FLAG_CC__RC, "flag_cc $RC", "flag", 32,
+    { 0, { { { (1<<MACH_BASE), 0 } }, { { LIMM_BC, 0 } } } }
+  },
+/* lr$_L$F0 $RB,[$RC] */
+  {
+    ARC_INSN_LR_L_R_R___RC_, "lr_L_r_r [$RC]", "lr", 32,
+    { 0, { { { (1<<MACH_BASE), 0 } }, { { LIMM_BC, 0 } } } }
+  },
+/* lr$_L$F0 $RB,[$s12] */
+  {
+    ARC_INSN_LR_L_S12_, "lr_L_s12 ", "lr", 32,
+    { 0, { { { (1<<MACH_BASE), 0 } }, { { LIMM_B, 0 } } } }
+  },
+/* lr$_L$F0 $RB,[$U6] */
+  {
+    ARC_INSN_LR_L_U6_, "lr_L_u6 ", "lr", 32,
+    { 0, { { { (1<<MACH_BASE), 0 } }, { { LIMM_B, 0 } } } }
+  },
+/* sr$_L$F0 $RB,[$RC] */
+  {
+    ARC_INSN_SR_L_R_R___RC_, "sr_L_r_r [$RC]", "sr", 32,
+    { 0|A(COND_CTI), { { { (1<<MACH_BASE), 0 } }, { { LIMM_BC, 0 } } } }
+  },
+/* sr$_L$F0 $RB,[$s12] */
+  {
+    ARC_INSN_SR_L_S12_, "sr_L_s12 ", "sr", 32,
+    { 0|A(COND_CTI), { { { (1<<MACH_BASE), 0 } }, { { LIMM_B, 0 } } } }
+  },
+/* sr$_L$F0 $RB,[$U6] */
+  {
+    ARC_INSN_SR_L_U6_, "sr_L_u6 ", "sr", 32,
+    { 0|A(COND_CTI), { { { (1<<MACH_BASE), 0 } }, { { LIMM_B, 0 } } } }
+  },
+/* asl$_L$F $RB,$RC */
+  {
+    ARC_INSN_ASL_L_R_R__RC, "asl_L_r_r $RC", "asl", 32,
+    { 0|A(RELAXED), { { { (1<<MACH_BASE), 0 } }, { { LIMM_C, 0 } } } }
+  },
+/* asl$_L$F $RB,$U6 */
+  {
+    ARC_INSN_ASL_L_U6_, "asl_L_u6 ", "asl", 32,
+    { 0|A(RELAXED), { { { (1<<MACH_BASE), 0 } }, { { LIMM_B, 0 } } } }
+  },
+/* asl$_S $R_b,$R_b,$R_c */
+  {
+    ARC_INSN_I16_GO_ASL_S_GO, "I16_GO_ASL_s_go", "asl", 32,
+    { 0|A(SHORT_P)|A(RELAXABLE), { { { (1<<MACH_BASE), 0 } }, { { LIMM_NONE, 0 } } } }
+  },
+/* asr$_L$F $RB,$RC */
+  {
+    ARC_INSN_ASR_L_R_R__RC, "asr_L_r_r $RC", "asr", 32,
+    { 0|A(RELAXED), { { { (1<<MACH_BASE), 0 } }, { { LIMM_C, 0 } } } }
+  },
+/* asr$_L$F $RB,$U6 */
+  {
+    ARC_INSN_ASR_L_U6_, "asr_L_u6 ", "asr", 32,
+    { 0|A(RELAXED), { { { (1<<MACH_BASE), 0 } }, { { LIMM_B, 0 } } } }
+  },
+/* asr$_S $R_b,$R_b,$R_c */
+  {
+    ARC_INSN_I16_GO_ASR_S_GO, "I16_GO_ASR_s_go", "asr", 32,
+    { 0|A(SHORT_P)|A(RELAXABLE), { { { (1<<MACH_BASE), 0 } }, { { LIMM_NONE, 0 } } } }
+  },
+/* lsr$_L$F $RB,$RC */
+  {
+    ARC_INSN_LSR_L_R_R__RC, "lsr_L_r_r $RC", "lsr", 32,
+    { 0|A(RELAXED), { { { (1<<MACH_BASE), 0 } }, { { LIMM_C, 0 } } } }
+  },
+/* lsr$_L$F $RB,$U6 */
+  {
+    ARC_INSN_LSR_L_U6_, "lsr_L_u6 ", "lsr", 32,
+    { 0|A(RELAXED), { { { (1<<MACH_BASE), 0 } }, { { LIMM_B, 0 } } } }
+  },
+/* lsr$_S $R_b,$R_b,$R_c */
+  {
+    ARC_INSN_I16_GO_LSR_S_GO, "I16_GO_LSR_s_go", "lsr", 32,
+    { 0|A(SHORT_P)|A(RELAXABLE), { { { (1<<MACH_BASE), 0 } }, { { LIMM_NONE, 0 } } } }
+  },
+/* ror$_L$F $RB,$RC */
+  {
+    ARC_INSN_ROR_L_R_R__RC, "ror_L_r_r $RC", "ror", 32,
+    { 0, { { { (1<<MACH_BASE), 0 } }, { { LIMM_C, 0 } } } }
+  },
+/* ror$_L$F $RB,$U6 */
+  {
+    ARC_INSN_ROR_L_U6_, "ror_L_u6 ", "ror", 32,
+    { 0, { { { (1<<MACH_BASE), 0 } }, { { LIMM_B, 0 } } } }
+  },
+/* rrc$_L$F $RB,$RC */
+  {
+    ARC_INSN_RRC_L_R_R__RC, "rrc_L_r_r $RC", "rrc", 32,
+    { 0, { { { (1<<MACH_BASE), 0 } }, { { LIMM_C, 0 } } } }
+  },
+/* rrc$_L$F $RB,$U6 */
+  {
+    ARC_INSN_RRC_L_U6_, "rrc_L_u6 ", "rrc", 32,
+    { 0, { { { (1<<MACH_BASE), 0 } }, { { LIMM_B, 0 } } } }
+  },
+/* sexb$_L$F $RB,$RC */
+  {
+    ARC_INSN_SEXB_L_R_R__RC, "sexb_L_r_r $RC", "sexb", 32,
+    { 0|A(RELAXED), { { { (1<<MACH_BASE), 0 } }, { { LIMM_C, 0 } } } }
+  },
+/* sexb$_L$F $RB,$U6 */
+  {
+    ARC_INSN_SEXB_L_U6_, "sexb_L_u6 ", "sexb", 32,
+    { 0|A(RELAXED), { { { (1<<MACH_BASE), 0 } }, { { LIMM_B, 0 } } } }
+  },
+/* sexb$_S $R_b,$R_b,$R_c */
+  {
+    ARC_INSN_I16_GO_SEXB_S_GO, "I16_GO_SEXB_s_go", "sexb", 32,
+    { 0|A(SHORT_P)|A(RELAXABLE), { { { (1<<MACH_BASE), 0 } }, { { LIMM_NONE, 0 } } } }
+  },
+/* sexw$_L$F $RB,$RC */
+  {
+    ARC_INSN_SEXW_L_R_R__RC, "sexw_L_r_r $RC", "sexw", 32,
+    { 0|A(RELAXED), { { { (1<<MACH_BASE), 0 } }, { { LIMM_C, 0 } } } }
+  },
+/* sexw$_L$F $RB,$U6 */
+  {
+    ARC_INSN_SEXW_L_U6_, "sexw_L_u6 ", "sexw", 32,
+    { 0|A(RELAXED), { { { (1<<MACH_BASE), 0 } }, { { LIMM_B, 0 } } } }
+  },
+/* sexw$_S $R_b,$R_b,$R_c */
+  {
+    ARC_INSN_I16_GO_SEXW_S_GO, "I16_GO_SEXW_s_go", "sexw", 32,
+    { 0|A(SHORT_P)|A(RELAXABLE), { { { (1<<MACH_BASE), 0 } }, { { LIMM_NONE, 0 } } } }
+  },
+/* extb$_L$F $RB,$RC */
+  {
+    ARC_INSN_EXTB_L_R_R__RC, "extb_L_r_r $RC", "extb", 32,
+    { 0|A(RELAXED), { { { (1<<MACH_BASE), 0 } }, { { LIMM_C, 0 } } } }
+  },
+/* extb$_L$F $RB,$U6 */
+  {
+    ARC_INSN_EXTB_L_U6_, "extb_L_u6 ", "extb", 32,
+    { 0|A(RELAXED), { { { (1<<MACH_BASE), 0 } }, { { LIMM_B, 0 } } } }
+  },
+/* extb$_S $R_b,$R_b,$R_c */
+  {
+    ARC_INSN_I16_GO_EXTB_S_GO, "I16_GO_EXTB_s_go", "extb", 32,
+    { 0|A(SHORT_P)|A(RELAXABLE), { { { (1<<MACH_BASE), 0 } }, { { LIMM_NONE, 0 } } } }
+  },
+/* extw$_L$F $RB,$RC */
+  {
+    ARC_INSN_EXTW_L_R_R__RC, "extw_L_r_r $RC", "extw", 32,
+    { 0|A(RELAXED), { { { (1<<MACH_BASE), 0 } }, { { LIMM_C, 0 } } } }
+  },
+/* extw$_L$F $RB,$U6 */
+  {
+    ARC_INSN_EXTW_L_U6_, "extw_L_u6 ", "extw", 32,
+    { 0|A(RELAXED), { { { (1<<MACH_BASE), 0 } }, { { LIMM_B, 0 } } } }
+  },
+/* extw$_S $R_b,$R_b,$R_c */
+  {
+    ARC_INSN_I16_GO_EXTW_S_GO, "I16_GO_EXTW_s_go", "extw", 32,
+    { 0|A(SHORT_P)|A(RELAXABLE), { { { (1<<MACH_BASE), 0 } }, { { LIMM_NONE, 0 } } } }
+  },
+/* abs$_L$F $RB,$RC */
+  {
+    ARC_INSN_ABS_L_R_R__RC, "abs_L_r_r $RC", "abs", 32,
+    { 0|A(RELAXED), { { { (1<<MACH_BASE), 0 } }, { { LIMM_C, 0 } } } }
+  },
+/* abs$_L$F $RB,$U6 */
+  {
+    ARC_INSN_ABS_L_U6_, "abs_L_u6 ", "abs", 32,
+    { 0|A(RELAXED), { { { (1<<MACH_BASE), 0 } }, { { LIMM_B, 0 } } } }
+  },
+/* abs$_S $R_b,$R_b,$R_c */
+  {
+    ARC_INSN_I16_GO_ABS_S_GO, "I16_GO_ABS_s_go", "abs", 32,
+    { 0|A(SHORT_P)|A(RELAXABLE), { { { (1<<MACH_BASE), 0 } }, { { LIMM_NONE, 0 } } } }
+  },
+/* not$_L$F $RB,$RC */
+  {
+    ARC_INSN_NOT_L_R_R__RC, "not_L_r_r $RC", "not", 32,
+    { 0|A(RELAXED), { { { (1<<MACH_BASE), 0 } }, { { LIMM_C, 0 } } } }
+  },
+/* not$_L$F $RB,$U6 */
+  {
+    ARC_INSN_NOT_L_U6_, "not_L_u6 ", "not", 32,
+    { 0|A(RELAXED), { { { (1<<MACH_BASE), 0 } }, { { LIMM_B, 0 } } } }
+  },
+/* not$_S $R_b,$R_b,$R_c */
+  {
+    ARC_INSN_I16_GO_NOT_S_GO, "I16_GO_NOT_s_go", "not", 32,
+    { 0|A(SHORT_P)|A(RELAXABLE), { { { (1<<MACH_BASE), 0 } }, { { LIMM_NONE, 0 } } } }
+  },
+/* rlc$_L$F $RB,$RC */
+  {
+    ARC_INSN_RLC_L_R_R__RC, "rlc_L_r_r $RC", "rlc", 32,
+    { 0, { { { (1<<MACH_BASE), 0 } }, { { LIMM_C, 0 } } } }
+  },
+/* rlc$_L$F $RB,$U6 */
+  {
+    ARC_INSN_RLC_L_U6_, "rlc_L_u6 ", "rlc", 32,
+    { 0, { { { (1<<MACH_BASE), 0 } }, { { LIMM_B, 0 } } } }
+  },
+/* ex$_L$EXDi $RB,$RC */
+  {
+    ARC_INSN_EX_L_R_R__RC, "ex_L_r_r $RC", "ex", 32,
+    { 0, { { { (1<<MACH_ARC700), 0 } }, { { LIMM_BC, 0 } } } }
+  },
+/* ex$_L$EXDi $RB,$U6 */
+  {
+    ARC_INSN_EX_L_U6_, "ex_L_u6 ", "ex", 32,
+    { 0, { { { (1<<MACH_ARC700), 0 } }, { { LIMM_B, 0 } } } }
+  },
+/* neg$_S $R_b,$R_b,$R_c */
+  {
+    ARC_INSN_I16_GO_NEG_S_GO, "I16_GO_NEG_s_go", "neg", 32,
+    { 0|A(SHORT_P), { { { (1<<MACH_BASE), 0 } }, { { LIMM_NONE, 0 } } } }
+  },
+/* swi */
+  {
+    ARC_INSN_SWI, "swi", "swi", 32,
+    { 0|A(COND_CTI), { { { (1<<MACH_BASE), 0 } }, { { LIMM_NONE, 0 } } } }
+  },
+/* trap$_S $trapnum */
+  {
+    ARC_INSN_TRAP_S, "trap_s", "trap", 32,
+    { 0|A(SHORT_P)|A(COND_CTI), { { { (1<<MACH_BASE), 0 } }, { { LIMM_NONE, 0 } } } }
+  },
+/* brk */
+  {
+    ARC_INSN_BRK, "brk", "brk", 32,
+    { 0, { { { (1<<MACH_BASE), 0 } }, { { LIMM_NONE, 0 } } } }
+  },
+/* brk_s */
+  {
+    ARC_INSN_BRK_S, "brk_s", "brk_s", 32,
+    { 0|A(SHORT_P), { { { (1<<MACH_BASE), 0 } }, { { LIMM_NONE, 0 } } } }
+  },
+/* asl$_L$F $RB,$RB,$s12 */
+  {
+    ARC_INSN_ASL_L_S12__RA_, "asl_L_s12 $RA,", "asl", 32,
+    { 0|A(RELAXED), { { { (1<<MACH_BASE), 0 } }, { { LIMM_B, 0 } } } }
+  },
+/* asl$Qcondi$F $RB,$RB,$U6 */
+  {
+    ARC_INSN_ASL_CCU6__RA_, "asl_ccu6 $RA,", "asl", 32,
+    { 0|A(RELAXED), { { { (1<<MACH_BASE), 0 } }, { { LIMM_B, 0 } } } }
+  },
+/* asl$_L$F $RA,$RB,$U6 */
+  {
+    ARC_INSN_ASL_L_U6__RA_, "asl_L_u6 $RA,", "asl", 32,
+    { 0|A(RELAXED), { { { (1<<MACH_BASE), 0 } }, { { LIMM_B, 0 } } } }
+  },
+/* asl$_L$F $RA,$RB,$RC */
+  {
+    ARC_INSN_ASL_L_R_R__RA__RC, "asl_L_r_r $RA,$RC", "asl", 32,
+    { 0|A(RELAXED), { { { (1<<MACH_BASE), 0 } }, { { LIMM_BC, 0 } } } }
+  },
+/* asl$Qcondi$F $RB,$RB,$RC */
+  {
+    ARC_INSN_ASL_CC__RA__RC, "asl_cc $RA,$RC", "asl", 32,
+    { 0|A(RELAXED), { { { (1<<MACH_BASE), 0 } }, { { LIMM_BC, 0 } } } }
+  },
+/* asl$_S $R_c,$R_b,$u3 */
+  {
+    ARC_INSN_ASL_S_CBU3, "asl_s_cbu3", "asl", 32,
+    { 0|A(SHORT_P)|A(RELAXABLE), { { { (1<<MACH_BASE), 0 } }, { { LIMM_NONE, 0 } } } }
+  },
+/* asl$_S $R_b,$R_b,$u5 */
+  {
+    ARC_INSN_ASL_S_SSB, "asl_s_ssb", "asl", 32,
+    { 0|A(SHORT_P)|A(RELAXABLE), { { { (1<<MACH_BASE), 0 } }, { { LIMM_NONE, 0 } } } }
+  },
+/* asl$_S $R_b,$R_b,$R_c */
+  {
+    ARC_INSN_I16_GO_ASLM_S_GO, "I16_GO_ASLM_s_go", "asl", 32,
+    { 0|A(SHORT_P)|A(RELAXABLE), { { { (1<<MACH_BASE), 0 } }, { { LIMM_NONE, 0 } } } }
+  },
+/* lsr$_L$F $RB,$RB,$s12 */
+  {
+    ARC_INSN_LSR_L_S12__RA_, "lsr_L_s12 $RA,", "lsr", 32,
+    { 0|A(RELAXED), { { { (1<<MACH_BASE), 0 } }, { { LIMM_B, 0 } } } }
+  },
+/* lsr$Qcondi$F $RB,$RB,$U6 */
+  {
+    ARC_INSN_LSR_CCU6__RA_, "lsr_ccu6 $RA,", "lsr", 32,
+    { 0|A(RELAXED), { { { (1<<MACH_BASE), 0 } }, { { LIMM_B, 0 } } } }
+  },
+/* lsr$_L$F $RA,$RB,$U6 */
+  {
+    ARC_INSN_LSR_L_U6__RA_, "lsr_L_u6 $RA,", "lsr", 32,
+    { 0|A(RELAXED), { { { (1<<MACH_BASE), 0 } }, { { LIMM_B, 0 } } } }
+  },
+/* lsr$_L$F $RA,$RB,$RC */
+  {
+    ARC_INSN_LSR_L_R_R__RA__RC, "lsr_L_r_r $RA,$RC", "lsr", 32,
+    { 0|A(RELAXED), { { { (1<<MACH_BASE), 0 } }, { { LIMM_BC, 0 } } } }
+  },
+/* lsr$Qcondi$F $RB,$RB,$RC */
+  {
+    ARC_INSN_LSR_CC__RA__RC, "lsr_cc $RA,$RC", "lsr", 32,
+    { 0|A(RELAXED), { { { (1<<MACH_BASE), 0 } }, { { LIMM_BC, 0 } } } }
+  },
+/* lsr$_S $R_b,$R_b,$u5 */
+  {
+    ARC_INSN_LSR_S_SSB, "lsr_s_ssb", "lsr", 32,
+    { 0|A(SHORT_P)|A(RELAXABLE), { { { (1<<MACH_BASE), 0 } }, { { LIMM_NONE, 0 } } } }
+  },
+/* lsr$_S $R_b,$R_b,$R_c */
+  {
+    ARC_INSN_I16_GO_LSRM_S_GO, "I16_GO_LSRM_s_go", "lsr", 32,
+    { 0|A(SHORT_P)|A(RELAXABLE), { { { (1<<MACH_BASE), 0 } }, { { LIMM_NONE, 0 } } } }
+  },
+/* asr$_L$F $RB,$RB,$s12 */
+  {
+    ARC_INSN_ASR_L_S12__RA_, "asr_L_s12 $RA,", "asr", 32,
+    { 0|A(RELAXED), { { { (1<<MACH_BASE), 0 } }, { { LIMM_B, 0 } } } }
+  },
+/* asr$Qcondi$F $RB,$RB,$U6 */
+  {
+    ARC_INSN_ASR_CCU6__RA_, "asr_ccu6 $RA,", "asr", 32,
+    { 0|A(RELAXED), { { { (1<<MACH_BASE), 0 } }, { { LIMM_B, 0 } } } }
+  },
+/* asr$_L$F $RA,$RB,$U6 */
+  {
+    ARC_INSN_ASR_L_U6__RA_, "asr_L_u6 $RA,", "asr", 32,
+    { 0|A(RELAXED), { { { (1<<MACH_BASE), 0 } }, { { LIMM_B, 0 } } } }
+  },
+/* asr$_L$F $RA,$RB,$RC */
+  {
+    ARC_INSN_ASR_L_R_R__RA__RC, "asr_L_r_r $RA,$RC", "asr", 32,
+    { 0|A(RELAXED), { { { (1<<MACH_BASE), 0 } }, { { LIMM_BC, 0 } } } }
+  },
+/* asr$Qcondi$F $RB,$RB,$RC */
+  {
+    ARC_INSN_ASR_CC__RA__RC, "asr_cc $RA,$RC", "asr", 32,
+    { 0|A(RELAXED), { { { (1<<MACH_BASE), 0 } }, { { LIMM_BC, 0 } } } }
+  },
+/* asr$_S $R_c,$R_b,$u3 */
+  {
+    ARC_INSN_ASR_S_CBU3, "asr_s_cbu3", "asr", 32,
+    { 0|A(SHORT_P)|A(RELAXABLE), { { { (1<<MACH_BASE), 0 } }, { { LIMM_NONE, 0 } } } }
+  },
+/* asr$_S $R_b,$R_b,$u5 */
+  {
+    ARC_INSN_ASR_S_SSB, "asr_s_ssb", "asr", 32,
+    { 0|A(SHORT_P)|A(RELAXABLE), { { { (1<<MACH_BASE), 0 } }, { { LIMM_NONE, 0 } } } }
+  },
+/* asr$_S $R_b,$R_b,$R_c */
+  {
+    ARC_INSN_I16_GO_ASRM_S_GO, "I16_GO_ASRM_s_go", "asr", 32,
+    { 0|A(SHORT_P)|A(RELAXABLE), { { { (1<<MACH_BASE), 0 } }, { { LIMM_NONE, 0 } } } }
+  },
+/* ror$_L$F $RB,$RB,$s12 */
+  {
+    ARC_INSN_ROR_L_S12__RA_, "ror_L_s12 $RA,", "ror", 32,
+    { 0, { { { (1<<MACH_BASE), 0 } }, { { LIMM_B, 0 } } } }
+  },
+/* ror$Qcondi$F $RB,$RB,$U6 */
+  {
+    ARC_INSN_ROR_CCU6__RA_, "ror_ccu6 $RA,", "ror", 32,
+    { 0, { { { (1<<MACH_BASE), 0 } }, { { LIMM_B, 0 } } } }
+  },
+/* ror$_L$F $RA,$RB,$U6 */
+  {
+    ARC_INSN_ROR_L_U6__RA_, "ror_L_u6 $RA,", "ror", 32,
+    { 0, { { { (1<<MACH_BASE), 0 } }, { { LIMM_B, 0 } } } }
+  },
+/* ror$_L$F $RA,$RB,$RC */
+  {
+    ARC_INSN_ROR_L_R_R__RA__RC, "ror_L_r_r $RA,$RC", "ror", 32,
+    { 0, { { { (1<<MACH_BASE), 0 } }, { { LIMM_BC, 0 } } } }
+  },
+/* ror$Qcondi$F $RB,$RB,$RC */
+  {
+    ARC_INSN_ROR_CC__RA__RC, "ror_cc $RA,$RC", "ror", 32,
+    { 0, { { { (1<<MACH_BASE), 0 } }, { { LIMM_BC, 0 } } } }
+  },
+/* mul64$_L$F1 $RB,$s12 */
+  {
+    ARC_INSN_MUL64_L_S12_, "mul64_L_s12 ", "mul64", 32,
+    { 0|A(RELAXED), { { { (1<<MACH_BASE), 0 } }, { { LIMM_B, 0 } } } }
+  },
+/* mul64$Qcondi$F1 $RB,$U6 */
+  {
+    ARC_INSN_MUL64_CCU6_, "mul64_ccu6 ", "mul64", 32,
+    { 0|A(RELAXED), { { { (1<<MACH_BASE), 0 } }, { { LIMM_B, 0 } } } }
+  },
+/* mul64$_L$F1 $RB,$U6 */
+  {
+    ARC_INSN_MUL64_L_U6_, "mul64_L_u6 ", "mul64", 32,
+    { 0|A(RELAXED), { { { (1<<MACH_BASE), 0 } }, { { LIMM_B, 0 } } } }
+  },
+/* mul64$_L$F1 $RB,$RC */
+  {
+    ARC_INSN_MUL64_L_R_R__RC, "mul64_L_r_r $RC", "mul64", 32,
+    { 0|A(RELAXED), { { { (1<<MACH_BASE), 0 } }, { { LIMM_BC, 0 } } } }
+  },
+/* mul64$Qcondi$F1 $RB,$RC */
+  {
+    ARC_INSN_MUL64_CC__RC, "mul64_cc $RC", "mul64", 32,
+    { 0|A(RELAXED), { { { (1<<MACH_BASE), 0 } }, { { LIMM_BC, 0 } } } }
+  },
+/* mul64$_S $R_b,$R_c */
+  {
+    ARC_INSN_MUL64_S_GO, "mul64_s_go", "mul64", 32,
+    { 0|A(SHORT_P)|A(RELAXABLE), { { { (1<<MACH_BASE), 0 } }, { { LIMM_NONE, 0 } } } }
+  },
+/* mulu64$_L$F1 $RB,$s12 */
+  {
+    ARC_INSN_MULU64_L_S12_, "mulu64_L_s12 ", "mulu64", 32,
+    { 0, { { { (1<<MACH_BASE), 0 } }, { { LIMM_B, 0 } } } }
+  },
+/* mulu64$Qcondi$F1 $RB,$U6 */
+  {
+    ARC_INSN_MULU64_CCU6_, "mulu64_ccu6 ", "mulu64", 32,
+    { 0, { { { (1<<MACH_BASE), 0 } }, { { LIMM_B, 0 } } } }
+  },
+/* mulu64$_L$F1 $RB,$U6 */
+  {
+    ARC_INSN_MULU64_L_U6_, "mulu64_L_u6 ", "mulu64", 32,
+    { 0, { { { (1<<MACH_BASE), 0 } }, { { LIMM_B, 0 } } } }
+  },
+/* mulu64$_L$F1 $RB,$RC */
+  {
+    ARC_INSN_MULU64_L_R_R__RC, "mulu64_L_r_r $RC", "mulu64", 32,
+    { 0, { { { (1<<MACH_BASE), 0 } }, { { LIMM_BC, 0 } } } }
+  },
+/* mulu64$Qcondi$F1 $RB,$RC */
+  {
+    ARC_INSN_MULU64_CC__RC, "mulu64_cc $RC", "mulu64", 32,
+    { 0, { { { (1<<MACH_BASE), 0 } }, { { LIMM_BC, 0 } } } }
+  },
+/* adds$_L$F $RB,$RB,$s12 */
+  {
+    ARC_INSN_ADDS_L_S12__RA_, "adds_L_s12 $RA,", "adds", 32,
+    { 0, { { { (1<<MACH_BASE), 0 } }, { { LIMM_B, 0 } } } }
+  },
+/* adds$Qcondi$F $RB,$RB,$U6 */
+  {
+    ARC_INSN_ADDS_CCU6__RA_, "adds_ccu6 $RA,", "adds", 32,
+    { 0, { { { (1<<MACH_BASE), 0 } }, { { LIMM_B, 0 } } } }
+  },
+/* adds$_L$F $RA,$RB,$U6 */
+  {
+    ARC_INSN_ADDS_L_U6__RA_, "adds_L_u6 $RA,", "adds", 32,
+    { 0, { { { (1<<MACH_BASE), 0 } }, { { LIMM_B, 0 } } } }
+  },
+/* adds$_L$F $RA,$RB,$RC */
+  {
+    ARC_INSN_ADDS_L_R_R__RA__RC, "adds_L_r_r $RA,$RC", "adds", 32,
+    { 0, { { { (1<<MACH_BASE), 0 } }, { { LIMM_BC, 0 } } } }
+  },
+/* adds$Qcondi$F $RB,$RB,$RC */
+  {
+    ARC_INSN_ADDS_CC__RA__RC, "adds_cc $RA,$RC", "adds", 32,
+    { 0, { { { (1<<MACH_BASE), 0 } }, { { LIMM_BC, 0 } } } }
+  },
+/* subs$_L$F $RB,$RB,$s12 */
+  {
+    ARC_INSN_SUBS_L_S12__RA_, "subs_L_s12 $RA,", "subs", 32,
+    { 0, { { { (1<<MACH_BASE), 0 } }, { { LIMM_B, 0 } } } }
+  },
+/* subs$Qcondi$F $RB,$RB,$U6 */
+  {
+    ARC_INSN_SUBS_CCU6__RA_, "subs_ccu6 $RA,", "subs", 32,
+    { 0, { { { (1<<MACH_BASE), 0 } }, { { LIMM_B, 0 } } } }
+  },
+/* subs$_L$F $RA,$RB,$U6 */
+  {
+    ARC_INSN_SUBS_L_U6__RA_, "subs_L_u6 $RA,", "subs", 32,
+    { 0, { { { (1<<MACH_BASE), 0 } }, { { LIMM_B, 0 } } } }
+  },
+/* subs$_L$F $RA,$RB,$RC */
+  {
+    ARC_INSN_SUBS_L_R_R__RA__RC, "subs_L_r_r $RA,$RC", "subs", 32,
+    { 0, { { { (1<<MACH_BASE), 0 } }, { { LIMM_BC, 0 } } } }
+  },
+/* subs$Qcondi$F $RB,$RB,$RC */
+  {
+    ARC_INSN_SUBS_CC__RA__RC, "subs_cc $RA,$RC", "subs", 32,
+    { 0, { { { (1<<MACH_BASE), 0 } }, { { LIMM_BC, 0 } } } }
+  },
+/* divaw$_L$F0 $RB,$RB,$s12 */
+  {
+    ARC_INSN_DIVAW_L_S12__RA_, "divaw_L_s12 $RA,", "divaw", 32,
+    { 0, { { { (1<<MACH_BASE), 0 } }, { { LIMM_B, 0 } } } }
+  },
+/* divaw$Qcondi$F0 $RB,$RB,$U6 */
+  {
+    ARC_INSN_DIVAW_CCU6__RA_, "divaw_ccu6 $RA,", "divaw", 32,
+    { 0, { { { (1<<MACH_BASE), 0 } }, { { LIMM_B, 0 } } } }
+  },
+/* divaw$_L$F0 $RA,$RB,$U6 */
+  {
+    ARC_INSN_DIVAW_L_U6__RA_, "divaw_L_u6 $RA,", "divaw", 32,
+    { 0, { { { (1<<MACH_BASE), 0 } }, { { LIMM_B, 0 } } } }
+  },
+/* divaw$_L$F0 $RA,$RB,$RC */
+  {
+    ARC_INSN_DIVAW_L_R_R__RA__RC, "divaw_L_r_r $RA,$RC", "divaw", 32,
+    { 0, { { { (1<<MACH_BASE), 0 } }, { { LIMM_BC, 0 } } } }
+  },
+/* divaw$Qcondi$F0 $RB,$RB,$RC */
+  {
+    ARC_INSN_DIVAW_CC__RA__RC, "divaw_cc $RA,$RC", "divaw", 32,
+    { 0, { { { (1<<MACH_BASE), 0 } }, { { LIMM_BC, 0 } } } }
+  },
+/* asls$_L$F $RB,$RB,$s12 */
+  {
+    ARC_INSN_ASLS_L_S12__RA_, "asls_L_s12 $RA,", "asls", 32,
+    { 0, { { { (1<<MACH_BASE), 0 } }, { { LIMM_B, 0 } } } }
+  },
+/* asls$Qcondi$F $RB,$RB,$U6 */
+  {
+    ARC_INSN_ASLS_CCU6__RA_, "asls_ccu6 $RA,", "asls", 32,
+    { 0, { { { (1<<MACH_BASE), 0 } }, { { LIMM_B, 0 } } } }
+  },
+/* asls$_L$F $RA,$RB,$U6 */
+  {
+    ARC_INSN_ASLS_L_U6__RA_, "asls_L_u6 $RA,", "asls", 32,
+    { 0, { { { (1<<MACH_BASE), 0 } }, { { LIMM_B, 0 } } } }
+  },
+/* asls$_L$F $RA,$RB,$RC */
+  {
+    ARC_INSN_ASLS_L_R_R__RA__RC, "asls_L_r_r $RA,$RC", "asls", 32,
+    { 0, { { { (1<<MACH_BASE), 0 } }, { { LIMM_BC, 0 } } } }
+  },
+/* asls$Qcondi$F $RB,$RB,$RC */
+  {
+    ARC_INSN_ASLS_CC__RA__RC, "asls_cc $RA,$RC", "asls", 32,
+    { 0, { { { (1<<MACH_BASE), 0 } }, { { LIMM_BC, 0 } } } }
+  },
+/* asrs$_L$F $RB,$RB,$s12 */
+  {
+    ARC_INSN_ASRS_L_S12__RA_, "asrs_L_s12 $RA,", "asrs", 32,
+    { 0, { { { (1<<MACH_BASE), 0 } }, { { LIMM_B, 0 } } } }
+  },
+/* asrs$Qcondi$F $RB,$RB,$U6 */
+  {
+    ARC_INSN_ASRS_CCU6__RA_, "asrs_ccu6 $RA,", "asrs", 32,
+    { 0, { { { (1<<MACH_BASE), 0 } }, { { LIMM_B, 0 } } } }
+  },
+/* asrs$_L$F $RA,$RB,$U6 */
+  {
+    ARC_INSN_ASRS_L_U6__RA_, "asrs_L_u6 $RA,", "asrs", 32,
+    { 0, { { { (1<<MACH_BASE), 0 } }, { { LIMM_B, 0 } } } }
+  },
+/* asrs$_L$F $RA,$RB,$RC */
+  {
+    ARC_INSN_ASRS_L_R_R__RA__RC, "asrs_L_r_r $RA,$RC", "asrs", 32,
+    { 0, { { { (1<<MACH_BASE), 0 } }, { { LIMM_BC, 0 } } } }
+  },
+/* asrs$Qcondi$F $RB,$RB,$RC */
+  {
+    ARC_INSN_ASRS_CC__RA__RC, "asrs_cc $RA,$RC", "asrs", 32,
+    { 0, { { { (1<<MACH_BASE), 0 } }, { { LIMM_BC, 0 } } } }
+  },
+/* addsdw$_L$F $RB,$RB,$s12 */
+  {
+    ARC_INSN_ADDSDW_L_S12__RA_, "addsdw_L_s12 $RA,", "addsdw", 32,
+    { 0, { { { (1<<MACH_BASE), 0 } }, { { LIMM_B, 0 } } } }
+  },
+/* addsdw$Qcondi$F $RB,$RB,$U6 */
+  {
+    ARC_INSN_ADDSDW_CCU6__RA_, "addsdw_ccu6 $RA,", "addsdw", 32,
+    { 0, { { { (1<<MACH_BASE), 0 } }, { { LIMM_B, 0 } } } }
+  },
+/* addsdw$_L$F $RA,$RB,$U6 */
+  {
+    ARC_INSN_ADDSDW_L_U6__RA_, "addsdw_L_u6 $RA,", "addsdw", 32,
+    { 0, { { { (1<<MACH_BASE), 0 } }, { { LIMM_B, 0 } } } }
+  },
+/* addsdw$_L$F $RA,$RB,$RC */
+  {
+    ARC_INSN_ADDSDW_L_R_R__RA__RC, "addsdw_L_r_r $RA,$RC", "addsdw", 32,
+    { 0, { { { (1<<MACH_BASE), 0 } }, { { LIMM_BC, 0 } } } }
+  },
+/* addsdw$Qcondi$F $RB,$RB,$RC */
+  {
+    ARC_INSN_ADDSDW_CC__RA__RC, "addsdw_cc $RA,$RC", "addsdw", 32,
+    { 0, { { { (1<<MACH_BASE), 0 } }, { { LIMM_BC, 0 } } } }
+  },
+/* subsdw$_L$F $RB,$RB,$s12 */
+  {
+    ARC_INSN_SUBSDW_L_S12__RA_, "subsdw_L_s12 $RA,", "subsdw", 32,
+    { 0, { { { (1<<MACH_BASE), 0 } }, { { LIMM_B, 0 } } } }
+  },
+/* subsdw$Qcondi$F $RB,$RB,$U6 */
+  {
+    ARC_INSN_SUBSDW_CCU6__RA_, "subsdw_ccu6 $RA,", "subsdw", 32,
+    { 0, { { { (1<<MACH_BASE), 0 } }, { { LIMM_B, 0 } } } }
+  },
+/* subsdw$_L$F $RA,$RB,$U6 */
+  {
+    ARC_INSN_SUBSDW_L_U6__RA_, "subsdw_L_u6 $RA,", "subsdw", 32,
+    { 0, { { { (1<<MACH_BASE), 0 } }, { { LIMM_B, 0 } } } }
+  },
+/* subsdw$_L$F $RA,$RB,$RC */
+  {
+    ARC_INSN_SUBSDW_L_R_R__RA__RC, "subsdw_L_r_r $RA,$RC", "subsdw", 32,
+    { 0, { { { (1<<MACH_BASE), 0 } }, { { LIMM_BC, 0 } } } }
+  },
+/* subsdw$Qcondi$F $RB,$RB,$RC */
+  {
+    ARC_INSN_SUBSDW_CC__RA__RC, "subsdw_cc $RA,$RC", "subsdw", 32,
+    { 0, { { { (1<<MACH_BASE), 0 } }, { { LIMM_BC, 0 } } } }
+  },
+/* swap$_L$F $RB,$RC */
+  {
+    ARC_INSN_SWAP_L_R_R__RC, "swap_L_r_r $RC", "swap", 32,
+    { 0, { { { (1<<MACH_BASE), 0 } }, { { LIMM_C, 0 } } } }
+  },
+/* swap$_L$F $RB,$U6 */
+  {
+    ARC_INSN_SWAP_L_U6_, "swap_L_u6 ", "swap", 32,
+    { 0, { { { (1<<MACH_BASE), 0 } }, { { LIMM_B, 0 } } } }
+  },
+/* norm$_L$F $RB,$RC */
+  {
+    ARC_INSN_NORM_L_R_R__RC, "norm_L_r_r $RC", "norm", 32,
+    { 0, { { { (1<<MACH_BASE), 0 } }, { { LIMM_C, 0 } } } }
+  },
+/* norm$_L$F $RB,$U6 */
+  {
+    ARC_INSN_NORM_L_U6_, "norm_L_u6 ", "norm", 32,
+    { 0, { { { (1<<MACH_BASE), 0 } }, { { LIMM_B, 0 } } } }
+  },
+/* rnd16$_L$F $RB,$RC */
+  {
+    ARC_INSN_RND16_L_R_R__RC, "rnd16_L_r_r $RC", "rnd16", 32,
+    { 0, { { { (1<<MACH_BASE), 0 } }, { { LIMM_C, 0 } } } }
+  },
+/* rnd16$_L$F $RB,$U6 */
+  {
+    ARC_INSN_RND16_L_U6_, "rnd16_L_u6 ", "rnd16", 32,
+    { 0, { { { (1<<MACH_BASE), 0 } }, { { LIMM_B, 0 } } } }
+  },
+/* abssw$_L$F $RB,$RC */
+  {
+    ARC_INSN_ABSSW_L_R_R__RC, "abssw_L_r_r $RC", "abssw", 32,
+    { 0, { { { (1<<MACH_BASE), 0 } }, { { LIMM_C, 0 } } } }
+  },
+/* abssw$_L$F $RB,$U6 */
+  {
+    ARC_INSN_ABSSW_L_U6_, "abssw_L_u6 ", "abssw", 32,
+    { 0, { { { (1<<MACH_BASE), 0 } }, { { LIMM_B, 0 } } } }
+  },
+/* abss$_L$F $RB,$RC */
+  {
+    ARC_INSN_ABSS_L_R_R__RC, "abss_L_r_r $RC", "abss", 32,
+    { 0, { { { (1<<MACH_BASE), 0 } }, { { LIMM_C, 0 } } } }
+  },
+/* abss$_L$F $RB,$U6 */
+  {
+    ARC_INSN_ABSS_L_U6_, "abss_L_u6 ", "abss", 32,
+    { 0, { { { (1<<MACH_BASE), 0 } }, { { LIMM_B, 0 } } } }
+  },
+/* negsw$_L$F $RB,$RC */
+  {
+    ARC_INSN_NEGSW_L_R_R__RC, "negsw_L_r_r $RC", "negsw", 32,
+    { 0, { { { (1<<MACH_BASE), 0 } }, { { LIMM_C, 0 } } } }
+  },
+/* negsw$_L$F $RB,$U6 */
+  {
+    ARC_INSN_NEGSW_L_U6_, "negsw_L_u6 ", "negsw", 32,
+    { 0, { { { (1<<MACH_BASE), 0 } }, { { LIMM_B, 0 } } } }
+  },
+/* negs$_L$F $RB,$RC */
+  {
+    ARC_INSN_NEGS_L_R_R__RC, "negs_L_r_r $RC", "negs", 32,
+    { 0, { { { (1<<MACH_BASE), 0 } }, { { LIMM_C, 0 } } } }
+  },
+/* negs$_L$F $RB,$U6 */
+  {
+    ARC_INSN_NEGS_L_U6_, "negs_L_u6 ", "negs", 32,
+    { 0, { { { (1<<MACH_BASE), 0 } }, { { LIMM_B, 0 } } } }
+  },
+/* normw$_L$F $RB,$RC */
+  {
+    ARC_INSN_NORMW_L_R_R__RC, "normw_L_r_r $RC", "normw", 32,
+    { 0, { { { (1<<MACH_BASE), 0 } }, { { LIMM_C, 0 } } } }
+  },
+/* normw$_L$F $RB,$U6 */
+  {
+    ARC_INSN_NORMW_L_U6_, "normw_L_u6 ", "normw", 32,
+    { 0, { { { (1<<MACH_BASE), 0 } }, { { LIMM_B, 0 } } } }
+  },
+/* nop_s */
+  {
+    ARC_INSN_NOP_S, "nop_s", "nop_s", 32,
+    { 0|A(SHORT_P), { { { (1<<MACH_BASE), 0 } }, { { LIMM_NONE, 0 } } } }
+  },
+/* unimp_s */
+  {
+    ARC_INSN_UNIMP_S, "unimp_s", "unimp_s", 32,
+    { 0|A(SHORT_P), { { { (1<<MACH_BASE), 0 } }, { { LIMM_NONE, 0 } } } }
+  },
+/* pop$_S $R_b */
+  {
+    ARC_INSN_POP_S_B, "pop_s_b", "pop", 32,
+    { 0|A(SHORT_P), { { { (1<<MACH_BASE), 0 } }, { { LIMM_NONE, 0 } } } }
+  },
+/* pop$_S $R31 */
+  {
+    ARC_INSN_POP_S_BLINK, "pop_s_blink", "pop", 32,
+    { 0|A(SHORT_P), { { { (1<<MACH_BASE), 0 } }, { { LIMM_NONE, 0 } } } }
+  },
+/* push$_S $R_b */
+  {
+    ARC_INSN_PUSH_S_B, "push_s_b", "push", 32,
+    { 0|A(SHORT_P), { { { (1<<MACH_BASE), 0 } }, { { LIMM_NONE, 0 } } } }
+  },
+/* push$_S $R31 */
+  {
+    ARC_INSN_PUSH_S_BLINK, "push_s_blink", "push", 32,
+    { 0|A(SHORT_P), { { { (1<<MACH_BASE), 0 } }, { { LIMM_NONE, 0 } } } }
+  },
+/* mullw$_L$F $RB,$RB,$s12 */
+  {
+    ARC_INSN_MULLW_L_S12__RA_, "mullw_L_s12 $RA,", "mullw", 32,
+    { 0, { { { (1<<MACH_BASE), 0 } }, { { LIMM_B, 0 } } } }
+  },
+/* mullw$Qcondi$F $RB,$RB,$U6 */
+  {
+    ARC_INSN_MULLW_CCU6__RA_, "mullw_ccu6 $RA,", "mullw", 32,
+    { 0, { { { (1<<MACH_BASE), 0 } }, { { LIMM_B, 0 } } } }
+  },
+/* mullw$_L$F $RA,$RB,$U6 */
+  {
+    ARC_INSN_MULLW_L_U6__RA_, "mullw_L_u6 $RA,", "mullw", 32,
+    { 0, { { { (1<<MACH_BASE), 0 } }, { { LIMM_B, 0 } } } }
+  },
+/* mullw$_L$F $RA,$RB,$RC */
+  {
+    ARC_INSN_MULLW_L_R_R__RA__RC, "mullw_L_r_r $RA,$RC", "mullw", 32,
+    { 0, { { { (1<<MACH_BASE), 0 } }, { { LIMM_BC, 0 } } } }
+  },
+/* mullw$Qcondi$F $RB,$RB,$RC */
+  {
+    ARC_INSN_MULLW_CC__RA__RC, "mullw_cc $RA,$RC", "mullw", 32,
+    { 0, { { { (1<<MACH_BASE), 0 } }, { { LIMM_BC, 0 } } } }
+  },
+/* maclw$_L$F $RB,$RB,$s12 */
+  {
+    ARC_INSN_MACLW_L_S12__RA_, "maclw_L_s12 $RA,", "maclw", 32,
+    { 0, { { { (1<<MACH_BASE), 0 } }, { { LIMM_B, 0 } } } }
+  },
+/* maclw$Qcondi$F $RB,$RB,$U6 */
+  {
+    ARC_INSN_MACLW_CCU6__RA_, "maclw_ccu6 $RA,", "maclw", 32,
+    { 0, { { { (1<<MACH_BASE), 0 } }, { { LIMM_B, 0 } } } }
+  },
+/* maclw$_L$F $RA,$RB,$U6 */
+  {
+    ARC_INSN_MACLW_L_U6__RA_, "maclw_L_u6 $RA,", "maclw", 32,
+    { 0, { { { (1<<MACH_BASE), 0 } }, { { LIMM_B, 0 } } } }
+  },
+/* maclw$_L$F $RA,$RB,$RC */
+  {
+    ARC_INSN_MACLW_L_R_R__RA__RC, "maclw_L_r_r $RA,$RC", "maclw", 32,
+    { 0, { { { (1<<MACH_BASE), 0 } }, { { LIMM_BC, 0 } } } }
+  },
+/* maclw$Qcondi$F $RB,$RB,$RC */
+  {
+    ARC_INSN_MACLW_CC__RA__RC, "maclw_cc $RA,$RC", "maclw", 32,
+    { 0, { { { (1<<MACH_BASE), 0 } }, { { LIMM_BC, 0 } } } }
+  },
+/* machlw$_L$F $RB,$RB,$s12 */
+  {
+    ARC_INSN_MACHLW_L_S12__RA_, "machlw_L_s12 $RA,", "machlw", 32,
+    { 0, { { { (1<<MACH_BASE), 0 } }, { { LIMM_B, 0 } } } }
+  },
+/* machlw$Qcondi$F $RB,$RB,$U6 */
+  {
+    ARC_INSN_MACHLW_CCU6__RA_, "machlw_ccu6 $RA,", "machlw", 32,
+    { 0, { { { (1<<MACH_BASE), 0 } }, { { LIMM_B, 0 } } } }
+  },
+/* machlw$_L$F $RA,$RB,$U6 */
+  {
+    ARC_INSN_MACHLW_L_U6__RA_, "machlw_L_u6 $RA,", "machlw", 32,
+    { 0, { { { (1<<MACH_BASE), 0 } }, { { LIMM_B, 0 } } } }
+  },
+/* machlw$_L$F $RA,$RB,$RC */
+  {
+    ARC_INSN_MACHLW_L_R_R__RA__RC, "machlw_L_r_r $RA,$RC", "machlw", 32,
+    { 0, { { { (1<<MACH_BASE), 0 } }, { { LIMM_BC, 0 } } } }
+  },
+/* machlw$Qcondi$F $RB,$RB,$RC */
+  {
+    ARC_INSN_MACHLW_CC__RA__RC, "machlw_cc $RA,$RC", "machlw", 32,
+    { 0, { { { (1<<MACH_BASE), 0 } }, { { LIMM_BC, 0 } } } }
+  },
+/* mululw$_L$F $RB,$RB,$s12 */
+  {
+    ARC_INSN_MULULW_L_S12__RA_, "mululw_L_s12 $RA,", "mululw", 32,
+    { 0, { { { (1<<MACH_BASE), 0 } }, { { LIMM_B, 0 } } } }
+  },
+/* mululw$Qcondi$F $RB,$RB,$U6 */
+  {
+    ARC_INSN_MULULW_CCU6__RA_, "mululw_ccu6 $RA,", "mululw", 32,
+    { 0, { { { (1<<MACH_BASE), 0 } }, { { LIMM_B, 0 } } } }
+  },
+/* mululw$_L$F $RA,$RB,$U6 */
+  {
+    ARC_INSN_MULULW_L_U6__RA_, "mululw_L_u6 $RA,", "mululw", 32,
+    { 0, { { { (1<<MACH_BASE), 0 } }, { { LIMM_B, 0 } } } }
+  },
+/* mululw$_L$F $RA,$RB,$RC */
+  {
+    ARC_INSN_MULULW_L_R_R__RA__RC, "mululw_L_r_r $RA,$RC", "mululw", 32,
+    { 0, { { { (1<<MACH_BASE), 0 } }, { { LIMM_BC, 0 } } } }
+  },
+/* mululw$Qcondi$F $RB,$RB,$RC */
+  {
+    ARC_INSN_MULULW_CC__RA__RC, "mululw_cc $RA,$RC", "mululw", 32,
+    { 0, { { { (1<<MACH_BASE), 0 } }, { { LIMM_BC, 0 } } } }
+  },
+/* machulw$_L$F $RB,$RB,$s12 */
+  {
+    ARC_INSN_MACHULW_L_S12__RA_, "machulw_L_s12 $RA,", "machulw", 32,
+    { 0, { { { (1<<MACH_BASE), 0 } }, { { LIMM_B, 0 } } } }
+  },
+/* machulw$Qcondi$F $RB,$RB,$U6 */
+  {
+    ARC_INSN_MACHULW_CCU6__RA_, "machulw_ccu6 $RA,", "machulw", 32,
+    { 0, { { { (1<<MACH_BASE), 0 } }, { { LIMM_B, 0 } } } }
+  },
+/* machulw$_L$F $RA,$RB,$U6 */
+  {
+    ARC_INSN_MACHULW_L_U6__RA_, "machulw_L_u6 $RA,", "machulw", 32,
+    { 0, { { { (1<<MACH_BASE), 0 } }, { { LIMM_B, 0 } } } }
+  },
+/* machulw$_L$F $RA,$RB,$RC */
+  {
+    ARC_INSN_MACHULW_L_R_R__RA__RC, "machulw_L_r_r $RA,$RC", "machulw", 32,
+    { 0, { { { (1<<MACH_BASE), 0 } }, { { LIMM_BC, 0 } } } }
+  },
+/* machulw$Qcondi$F $RB,$RB,$RC */
+  {
+    ARC_INSN_MACHULW_CC__RA__RC, "machulw_cc $RA,$RC", "machulw", 32,
+    { 0, { { { (1<<MACH_BASE), 0 } }, { { LIMM_BC, 0 } } } }
+  },
+/*  */
+  {
+    ARC_INSN_CURRENT_LOOP_END, "current_loop_end", "", 32,
+    { 0|A(COND_CTI), { { { (1<<MACH_BASE), 0 } }, { { LIMM_NONE, 0 } } } }
+  },
+/*  */
+  {
+    ARC_INSN_CURRENT_LOOP_END_AFTER_BRANCH, "current_loop_end_after_branch", "", 32,
+    { 0|A(COND_CTI), { { { (1<<MACH_BASE), 0 } }, { { LIMM_NONE, 0 } } } }
+  },
+/*  */
+  {
+    ARC_INSN_ARC600_CURRENT_LOOP_END_AFTER_BRANCH, "arc600_current_loop_end_after_branch", "", 32,
+    { 0|A(COND_CTI), { { { (1<<MACH_BASE), 0 } }, { { LIMM_NONE, 0 } } } }
+  },
+};
+
+#undef OP
+#undef A
+
+/* Initialize anything needed to be done once, before any cpu_open call.  */
+
+static void
+init_tables (void)
+{
+}
+
+static const CGEN_MACH * lookup_mach_via_bfd_name (const CGEN_MACH *, const char *);
+static void build_hw_table      (CGEN_CPU_TABLE *);
+static void build_ifield_table  (CGEN_CPU_TABLE *);
+static void build_operand_table (CGEN_CPU_TABLE *);
+static void build_insn_table    (CGEN_CPU_TABLE *);
+static void arc_cgen_rebuild_tables (CGEN_CPU_TABLE *);
+
+/* Subroutine of arc_cgen_cpu_open to look up a mach via its bfd name.  */
+
+static const CGEN_MACH *
+lookup_mach_via_bfd_name (const CGEN_MACH *table, const char *name)
+{
+  while (table->name)
+    {
+      if (strcmp (name, table->bfd_name) == 0)
+	return table;
+      ++table;
+    }
+  abort ();
+}
+
+/* Subroutine of arc_cgen_cpu_open to build the hardware table.  */
+
+static void
+build_hw_table (CGEN_CPU_TABLE *cd)
+{
+  int i;
+  int machs = cd->machs;
+  const CGEN_HW_ENTRY *init = & arc_cgen_hw_table[0];
+  /* MAX_HW is only an upper bound on the number of selected entries.
+     However each entry is indexed by it's enum so there can be holes in
+     the table.  */
+  const CGEN_HW_ENTRY **selected =
+    (const CGEN_HW_ENTRY **) xmalloc (MAX_HW * sizeof (CGEN_HW_ENTRY *));
+
+  cd->hw_table.init_entries = init;
+  cd->hw_table.entry_size = sizeof (CGEN_HW_ENTRY);
+  memset (selected, 0, MAX_HW * sizeof (CGEN_HW_ENTRY *));
+  /* ??? For now we just use machs to determine which ones we want.  */
+  for (i = 0; init[i].name != NULL; ++i)
+    if (CGEN_HW_ATTR_VALUE (&init[i], CGEN_HW_MACH)
+	& machs)
+      selected[init[i].type] = &init[i];
+  cd->hw_table.entries = selected;
+  cd->hw_table.num_entries = MAX_HW;
+}
+
+/* Subroutine of arc_cgen_cpu_open to build the hardware table.  */
+
+static void
+build_ifield_table (CGEN_CPU_TABLE *cd)
+{
+  cd->ifld_table = & arc_cgen_ifld_table[0];
+}
+
+/* Subroutine of arc_cgen_cpu_open to build the hardware table.  */
+
+static void
+build_operand_table (CGEN_CPU_TABLE *cd)
+{
+  int i;
+  int machs = cd->machs;
+  const CGEN_OPERAND *init = & arc_cgen_operand_table[0];
+  /* MAX_OPERANDS is only an upper bound on the number of selected entries.
+     However each entry is indexed by it's enum so there can be holes in
+     the table.  */
+  const CGEN_OPERAND **selected = xmalloc (MAX_OPERANDS * sizeof (* selected));
+
+  cd->operand_table.init_entries = init;
+  cd->operand_table.entry_size = sizeof (CGEN_OPERAND);
+  memset (selected, 0, MAX_OPERANDS * sizeof (CGEN_OPERAND *));
+  /* ??? For now we just use mach to determine which ones we want.  */
+  for (i = 0; init[i].name != NULL; ++i)
+    if (CGEN_OPERAND_ATTR_VALUE (&init[i], CGEN_OPERAND_MACH)
+	& machs)
+      selected[init[i].type] = &init[i];
+  cd->operand_table.entries = selected;
+  cd->operand_table.num_entries = MAX_OPERANDS;
+}
+
+/* Subroutine of arc_cgen_cpu_open to build the hardware table.
+   ??? This could leave out insns not supported by the specified mach/isa,
+   but that would cause errors like "foo only supported by bar" to become
+   "unknown insn", so for now we include all insns and require the app to
+   do the checking later.
+   ??? On the other hand, parsing of such insns may require their hardware or
+   operand elements to be in the table [which they mightn't be].  */
+
+static void
+build_insn_table (CGEN_CPU_TABLE *cd)
+{
+  int i;
+  const CGEN_IBASE *ib = & arc_cgen_insn_table[0];
+  CGEN_INSN *insns = xmalloc (MAX_INSNS * sizeof (CGEN_INSN));
+
+  memset (insns, 0, MAX_INSNS * sizeof (CGEN_INSN));
+  for (i = 0; i < MAX_INSNS; ++i)
+    insns[i].base = &ib[i];
+  cd->insn_table.init_entries = insns;
+  cd->insn_table.entry_size = sizeof (CGEN_IBASE);
+  cd->insn_table.num_init_entries = MAX_INSNS;
+}
+
+/* Subroutine of arc_cgen_cpu_open to rebuild the tables.  */
+
+static void
+arc_cgen_rebuild_tables (CGEN_CPU_TABLE *cd)
+{
+  int i;
+  CGEN_BITSET *isas = cd->isas;
+  unsigned int machs = cd->machs;
+
+  cd->int_insn_p = CGEN_INT_INSN_P;
+
+  /* Data derived from the isa spec.  */
+#define UNSET (CGEN_SIZE_UNKNOWN + 1)
+  cd->default_insn_bitsize = UNSET;
+  cd->base_insn_bitsize = UNSET;
+  cd->min_insn_bitsize = 65535; /* Some ridiculously big number.  */
+  cd->max_insn_bitsize = 0;
+  for (i = 0; i < MAX_ISAS; ++i)
+    if (cgen_bitset_contains (isas, i))
+      {
+	const CGEN_ISA *isa = & arc_cgen_isa_table[i];
+
+	/* Default insn sizes of all selected isas must be
+	   equal or we set the result to 0, meaning "unknown".  */
+	if (cd->default_insn_bitsize == UNSET)
+	  cd->default_insn_bitsize = isa->default_insn_bitsize;
+	else if (isa->default_insn_bitsize == cd->default_insn_bitsize)
+	  ; /* This is ok.  */
+	else
+	  cd->default_insn_bitsize = CGEN_SIZE_UNKNOWN;
+
+	/* Base insn sizes of all selected isas must be equal
+	   or we set the result to 0, meaning "unknown".  */
+	if (cd->base_insn_bitsize == UNSET)
+	  cd->base_insn_bitsize = isa->base_insn_bitsize;
+	else if (isa->base_insn_bitsize == cd->base_insn_bitsize)
+	  ; /* This is ok.  */
+	else
+	  cd->base_insn_bitsize = CGEN_SIZE_UNKNOWN;
+
+	/* Set min,max insn sizes.  */
+	if (isa->min_insn_bitsize < cd->min_insn_bitsize)
+	  cd->min_insn_bitsize = isa->min_insn_bitsize;
+	if (isa->max_insn_bitsize > cd->max_insn_bitsize)
+	  cd->max_insn_bitsize = isa->max_insn_bitsize;
+      }
+
+  /* Data derived from the mach spec.  */
+  for (i = 0; i < MAX_MACHS; ++i)
+    if (((1 << i) & machs) != 0)
+      {
+	const CGEN_MACH *mach = & arc_cgen_mach_table[i];
+
+	if (mach->insn_chunk_bitsize != 0)
+	{
+	  if (cd->insn_chunk_bitsize != 0 && cd->insn_chunk_bitsize != mach->insn_chunk_bitsize)
+	    {
+	      fprintf (stderr, "arc_cgen_rebuild_tables: conflicting insn-chunk-bitsize values: `%d' vs. `%d'\n",
+		       cd->insn_chunk_bitsize, mach->insn_chunk_bitsize);
+	      abort ();
+	    }
+
+ 	  cd->insn_chunk_bitsize = mach->insn_chunk_bitsize;
+	}
+      }
+
+  /* Determine which hw elements are used by MACH.  */
+  build_hw_table (cd);
+
+  /* Build the ifield table.  */
+  build_ifield_table (cd);
+
+  /* Determine which operands are used by MACH/ISA.  */
+  build_operand_table (cd);
+
+  /* Build the instruction table.  */
+  build_insn_table (cd);
+}
+
+/* Initialize a cpu table and return a descriptor.
+   It's much like opening a file, and must be the first function called.
+   The arguments are a set of (type/value) pairs, terminated with
+   CGEN_CPU_OPEN_END.
+
+   Currently supported values:
+   CGEN_CPU_OPEN_ISAS:    bitmap of values in enum isa_attr
+   CGEN_CPU_OPEN_MACHS:   bitmap of values in enum mach_attr
+   CGEN_CPU_OPEN_BFDMACH: specify 1 mach using bfd name
+   CGEN_CPU_OPEN_ENDIAN:  specify endian choice
+   CGEN_CPU_OPEN_END:     terminates arguments
+
+   ??? Simultaneous multiple isas might not make sense, but it's not (yet)
+   precluded.
+
+   ??? We only support ISO C stdargs here, not K&R.
+   Laziness, plus experiment to see if anything requires K&R - eventually
+   K&R will no longer be supported - e.g. GDB is currently trying this.  */
+
+CGEN_CPU_DESC
+arc_cgen_cpu_open (enum cgen_cpu_open_arg arg_type, ...)
+{
+  CGEN_CPU_TABLE *cd = (CGEN_CPU_TABLE *) xmalloc (sizeof (CGEN_CPU_TABLE));
+  static int init_p;
+  CGEN_BITSET *isas = 0;  /* 0 = "unspecified" */
+  unsigned int machs = 0; /* 0 = "unspecified" */
+  enum cgen_endian endian = CGEN_ENDIAN_UNKNOWN;
+  va_list ap;
+
+  if (! init_p)
+    {
+      init_tables ();
+      init_p = 1;
+    }
+
+  memset (cd, 0, sizeof (*cd));
+
+  va_start (ap, arg_type);
+  while (arg_type != CGEN_CPU_OPEN_END)
+    {
+      switch (arg_type)
+	{
+	case CGEN_CPU_OPEN_ISAS :
+	  isas = va_arg (ap, CGEN_BITSET *);
+	  break;
+	case CGEN_CPU_OPEN_MACHS :
+	  machs = va_arg (ap, unsigned int);
+	  break;
+	case CGEN_CPU_OPEN_BFDMACH :
+	  {
+	    const char *name = va_arg (ap, const char *);
+	    const CGEN_MACH *mach =
+	      lookup_mach_via_bfd_name (arc_cgen_mach_table, name);
+
+	    machs |= 1 << mach->num;
+	    break;
+	  }
+	case CGEN_CPU_OPEN_ENDIAN :
+	  endian = va_arg (ap, enum cgen_endian);
+	  break;
+	default :
+	  fprintf (stderr, "arc_cgen_cpu_open: unsupported argument `%d'\n",
+		   arg_type);
+	  abort (); /* ??? return NULL? */
+	}
+      arg_type = va_arg (ap, enum cgen_cpu_open_arg);
+    }
+  va_end (ap);
+
+  /* Mach unspecified means "all".  */
+  if (machs == 0)
+    machs = (1 << MAX_MACHS) - 1;
+  /* Base mach is always selected.  */
+  machs |= 1;
+  if (endian == CGEN_ENDIAN_UNKNOWN)
+    {
+      /* ??? If target has only one, could have a default.  */
+      fprintf (stderr, "arc_cgen_cpu_open: no endianness specified\n");
+      abort ();
+    }
+
+  cd->isas = cgen_bitset_copy (isas);
+  cd->machs = machs;
+  cd->endian = endian;
+  /* FIXME: for the sparc case we can determine insn-endianness statically.
+     The worry here is where both data and insn endian can be independently
+     chosen, in which case this function will need another argument.
+     Actually, will want to allow for more arguments in the future anyway.  */
+  cd->insn_endian = endian;
+
+  /* Table (re)builder.  */
+  cd->rebuild_tables = arc_cgen_rebuild_tables;
+  arc_cgen_rebuild_tables (cd);
+
+  /* Default to not allowing signed overflow.  */
+  cd->signed_overflow_ok_p = 0;
+  
+  return (CGEN_CPU_DESC) cd;
+}
+
+/* Cover fn to arc_cgen_cpu_open to handle the simple case of 1 isa, 1 mach.
+   MACH_NAME is the bfd name of the mach.  */
+
+CGEN_CPU_DESC
+arc_cgen_cpu_open_1 (const char *mach_name, enum cgen_endian endian)
+{
+  return arc_cgen_cpu_open (CGEN_CPU_OPEN_BFDMACH, mach_name,
+			       CGEN_CPU_OPEN_ENDIAN, endian,
+			       CGEN_CPU_OPEN_END);
+}
+
+/* Close a cpu table.
+   ??? This can live in a machine independent file, but there's currently
+   no place to put this file (there's no libcgen).  libopcodes is the wrong
+   place as some simulator ports use this but they don't use libopcodes.  */
+
+void
+arc_cgen_cpu_close (CGEN_CPU_DESC cd)
+{
+  unsigned int i;
+  const CGEN_INSN *insns;
+
+  if (cd->macro_insn_table.init_entries)
+    {
+      insns = cd->macro_insn_table.init_entries;
+      for (i = 0; i < cd->macro_insn_table.num_init_entries; ++i, ++insns)
+	if (CGEN_INSN_RX ((insns)))
+	  regfree (CGEN_INSN_RX (insns));
+    }
+
+  if (cd->insn_table.init_entries)
+    {
+      insns = cd->insn_table.init_entries;
+      for (i = 0; i < cd->insn_table.num_init_entries; ++i, ++insns)
+	if (CGEN_INSN_RX (insns))
+	  regfree (CGEN_INSN_RX (insns));
+    }  
+
+  if (cd->macro_insn_table.init_entries)
+    free ((CGEN_INSN *) cd->macro_insn_table.init_entries);
+
+  if (cd->insn_table.init_entries)
+    free ((CGEN_INSN *) cd->insn_table.init_entries);
+
+  if (cd->hw_table.entries)
+    free ((CGEN_HW_ENTRY *) cd->hw_table.entries);
+
+  if (cd->operand_table.entries)
+    free ((CGEN_HW_ENTRY *) cd->operand_table.entries);
+
+  free (cd);
+}
+
diff --git a/opcodes/arc-desc.h b/opcodes/arc-desc.h
new file mode 100644
index 0000000..85d8564
--- /dev/null
+++ b/opcodes/arc-desc.h
@@ -0,0 +1,575 @@
+/* CPU data header for arc.
+
+THIS FILE IS MACHINE GENERATED WITH CGEN.
+
+Copyright 1996-2007 Free Software Foundation, Inc.
+
+This file is part of the GNU Binutils and/or GDB, the GNU debugger.
+
+   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
+   the Free Software Foundation; either version 3, or (at your option)
+   any later version.
+
+   It 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 this program; if not, write to the Free Software Foundation, Inc.,
+   51 Franklin Street - Fifth Floor, Boston, MA 02110-1301, USA.
+
+*/
+
+#ifndef ARC_CPU_H
+#define ARC_CPU_H
+
+#include "opcode/cgen-bitset.h"
+
+#define CGEN_ARCH arc
+
+/* Given symbol S, return arc_cgen_<S>.  */
+#if defined (__STDC__) || defined (ALMOST_STDC) || defined (HAVE_STRINGIZE)
+#define CGEN_SYM(s) arc##_cgen_##s
+#else
+#define CGEN_SYM(s) arc/**/_cgen_/**/s
+#endif
+
+
+/* Selected cpu families.  */
+#define HAVE_CPU_A5F
+#define HAVE_CPU_ARC600F
+#define HAVE_CPU_ARC700F
+
+#define CGEN_INSN_LSB0_P 0
+
+/* Minimum size of any insn (in bytes).  */
+#define CGEN_MIN_INSN_SIZE 4
+
+/* Maximum size of any insn (in bytes).  */
+#define CGEN_MAX_INSN_SIZE 4
+
+#define CGEN_INT_INSN_P 1
+
+/* Maximum number of syntax elements in an instruction.  */
+#define CGEN_ACTUAL_MAX_SYNTAX_ELEMENTS 19
+
+/* CGEN_MNEMONIC_OPERANDS is defined if mnemonics have operands.
+   e.g. In "b,a foo" the ",a" is an operand.  If mnemonics have operands
+   we can't hash on everything up to the space.  */
+#define CGEN_MNEMONIC_OPERANDS
+
+/* Maximum number of fields in an instruction.  */
+#define CGEN_ACTUAL_MAX_IFMT_OPERANDS 8
+
+/* Enums.  */
+
+/* Enum declaration for enum values for Qcond to be used in case form.  */
+typedef enum e_qvalues {
+  COND_AL = 0, COND_EQ = 1, COND_Z = 1, COND_NE = 2
+ , COND_NZ = 2, COND_PL = 3, COND_P = 3, COND_MI = 4
+ , COND_N = 4, COND_CS = 5, COND_C = 5, COND_LO = 5
+ , COND_CC = 6, COND_NC = 6, COND_HS = 6, COND_VS = 7
+ , COND_V = 7, COND_VC = 8, COND_NV = 8, COND_GT = 9
+ , COND_GE = 10, COND_LT = 11, COND_LE = 12, COND_HI = 13
+ , COND_LS = 14, COND_PNZ = 15
+} E_QVALUES;
+
+/* Enum declaration for enum values for i3cond to be used in case form.  */
+typedef enum e_i3cond {
+  COND3_GT = 0, COND3_GE = 1, COND3_LT = 2, COND3_LE = 3
+ , COND3_HI = 4, COND3_CC = 5, COND3_NC = 5, COND3_HS = 5
+ , COND3_CS = 6, COND3_C = 6, COND3_LO = 6, COND3_LS = 7
+} E_I3COND;
+
+/* Enum declaration for enum values for brcond to be used in case form.  */
+typedef enum e_brcond {
+  CONDBR_REQ = 0, CONDBR_RNE = 1, CONDBR_RLT = 2, CONDBR_RGE = 3
+ , CONDBR_RLO = 4, CONDBR_RHS = 5, CONDBR_BIT0 = 14, CONDBR_BIT1 = 15
+} E_BRCOND;
+
+/* Enum declaration for .  */
+typedef enum cr_names {
+  H_CR_GP = 26, H_CR_FP = 27, H_CR_SP = 28, H_CR_BLINK = 31
+ , H_CR_MLO = 57, H_CR_MMID = 58, H_CR_MHI = 59, H_CR_LP_COUNT = 60
+ , H_CR_PCL = 63, H_CR_ILINK1 = 29, H_CR_ILINK2 = 30, H_CR_R29 = 29
+ , H_CR_R30 = 30, H_CR_R0 = 0, H_CR_R1 = 1, H_CR_R2 = 2
+ , H_CR_R3 = 3, H_CR_R4 = 4, H_CR_R5 = 5, H_CR_R6 = 6
+ , H_CR_R7 = 7, H_CR_R8 = 8, H_CR_R9 = 9, H_CR_R10 = 10
+ , H_CR_R11 = 11, H_CR_R12 = 12, H_CR_R13 = 13, H_CR_R14 = 14
+ , H_CR_R15 = 15, H_CR_R16 = 16, H_CR_R17 = 17, H_CR_R18 = 18
+ , H_CR_R19 = 19, H_CR_R20 = 20, H_CR_R21 = 21, H_CR_R22 = 22
+ , H_CR_R23 = 23, H_CR_R24 = 24, H_CR_R25 = 25, H_CR_R26 = 26
+ , H_CR_R27 = 27, H_CR_R28 = 28, H_CR_R31 = 31, H_CR_R32 = 32
+ , H_CR_R33 = 33, H_CR_R34 = 34, H_CR_R35 = 35, H_CR_R36 = 36
+ , H_CR_R37 = 37, H_CR_R38 = 38, H_CR_R39 = 39, H_CR_R40 = 40
+ , H_CR_R41 = 41, H_CR_R42 = 42, H_CR_R43 = 43, H_CR_R44 = 44
+ , H_CR_R45 = 45, H_CR_R46 = 46, H_CR_R47 = 47, H_CR_R48 = 48
+ , H_CR_R49 = 49, H_CR_R50 = 50, H_CR_R51 = 51, H_CR_R52 = 52
+ , H_CR_R53 = 53, H_CR_R54 = 54, H_CR_R55 = 55, H_CR_R56 = 56
+ , H_CR_R57 = 57, H_CR_R58 = 58, H_CR_R59 = 59, H_CR_R60 = 60
+} CR_NAMES;
+
+/* Enum declaration for Core Register A encodings.  */
+typedef enum e_ra_rn {
+  RA_R0, RA_R1, RA_R2, RA_R3
+ , RA_R4, RA_R5, RA_R6, RA_R7
+ , RA_R8, RA_R9, RA_R10, RA_R11
+ , RA_R12, RA_R13, RA_R14, RA_R15
+ , RA_R16, RA_R17, RA_R18, RA_R19
+ , RA_R20, RA_R21, RA_R22, RA_R23
+ , RA_R24, RA_R25, RA_R26, RA_R27
+ , RA_R28, RA_R29, RA_R30, RA_R31
+ , RA_R32, RA_R33, RA_R34, RA_R35
+ , RA_R36, RA_R37, RA_R38, RA_R39
+ , RA_R40, RA_R41, RA_R42, RA_R43
+ , RA_R44, RA_R45, RA_R46, RA_R47
+ , RA_R48, RA_R49, RA_R50, RA_R51
+ , RA_R52, RA_R53, RA_R54, RA_R55
+ , RA_R56, RA_R57, RA_R58, RA_R59
+ , RA_R60, RA_R61, RA_R62, RA_R63
+} E_RA_RN;
+
+/* Enum declaration for major opcode.  */
+typedef enum op_maj {
+  OPM_B = 0, OPM_BLR = 1, OPM_LD_S9 = 2, OPM_ST_S9 = 3
+ , OPM_GO = 4, OPM_X05 = 5, OPM_X06 = 6, OPM_X07 = 7
+ , OPM_SLDADDR = 12, OPM_SADDSUBSHI = 13, OPM_SMOVCMPADDH = 14, OPM_SGO = 15
+ , OPM_LDO_S = 16, OPM_LDOB_S = 17, OPM_LDOW_S = 18, OPM_LDOWX_S = 19
+ , OPM_STO_S = 20, OPM_STOB_S = 21, OPM_STOW_S = 22, OPM_SSHSUBBIMM = 23
+ , OPM_SP = 24, OPM_GP = 25, OPM_LDPCREL = 26, OPM_SMOVU8 = 27
+ , OPM_SADDCMPU7 = 28, OPM_BR_S = 29, OPM_B_S = 30, OPM_BL_S = 31
+ , OPM_PSEUDO = 32
+} OP_MAJ;
+
+/* Enum declaration for general operations type.  */
+typedef enum go_type {
+  GO_TYPE_R_R, GO_TYPE_U6, GO_TYPE_S12, GO_TYPE_CC
+} GO_TYPE;
+
+/* Enum declaration for general operations conditional subtype.  */
+typedef enum go_cc_type {
+  GO_CC_REG, GO_CC_U6
+} GO_CC_TYPE;
+
+/* Enum declaration for general operations type.  */
+typedef enum go_op {
+  GO_OP_ADD = 0, GO_OP_ADC = 1, GO_OP_SUB = 2, GO_OP_SBC = 3
+ , GO_OP_AND = 4, GO_OP_OR = 5, GO_OP_BIC = 6, GO_OP_XOR = 7
+ , GO_OP_MAX = 8, GO_OP_MIN = 9, GO_OP_MOV = 10, GO_OP_TST = 11
+ , GO_OP_CMP = 12, GO_OP_RCMP = 13, GO_OP_RSUB = 14, GO_OP_BSET = 15
+ , GO_OP_BCLR = 16, GO_OP_BTST = 17, GO_OP_BXOR = 18, GO_OP_BMSK = 19
+ , GO_OP_ADD1 = 20, GO_OP_ADD2 = 21, GO_OP_ADD3 = 22, GO_OP_SUB1 = 23
+ , GO_OP_SUB2 = 24, GO_OP_SUB3 = 25, GO_OP_MPY = 26, GO_OP_MPYH = 27
+ , GO_OP_MPYHU = 28, GO_OP_MPYU = 29, GO_OP_RES30 = 30, GO_OP_RES31 = 31
+ , GO_OP_J = 32, GO_OP_J_D = 33, GO_OP_JL = 34, GO_OP_JL_D = 35
+ , GO_OP_LP = 40, GO_OP_FLAG = 41, GO_OP_LR = 42, GO_OP_SR = 43
+ , GO_OP_SOP = 47
+} GO_OP;
+
+/* Enum declaration for general single-operand operations type.  */
+typedef enum go_sop {
+  GO_OP_SOP_ASL = 0, GO_OP_SOP_ASR = 1, GO_OP_SOP_LSR = 2, GO_OP_SOP_ROR = 3
+ , GO_OP_SOP_RRC = 4, GO_OP_SOP_SEXB = 5, GO_OP_SOP_SEXW = 6, GO_OP_SOP_EXTB = 7
+ , GO_OP_SOP_EXTW = 8, GO_OP_SOP_ABS = 9, GO_OP_SOP_NOT = 10, GO_OP_SOP_RLC = 11
+ , GO_OP_SOP_EX = 12, GO_OP_SOP_ZOP = 63, GO_OP_SOP_PSEUDO = 62
+} GO_SOP;
+
+/* Enum declaration for short add / sub immediate type.  */
+typedef enum i16ldaddr_type {
+  I16_LDADDR_LD, I16_LDADDR_LDB, I16_LDADDR_LDW, I16_LDADDR_ADD
+} I16LDADDR_TYPE;
+
+/* Enum declaration for short add / sub immediate type.  */
+typedef enum i16addsubshi_type {
+  I16_ADDSUBSHI_ADD, I16_ADDSUBSHI_SUB, I16_ADDSUBSHI_ASL, I16_ADDSUBSHI_ASR
+} I16ADDSUBSHI_TYPE;
+
+/* Enum declaration for short mov / cmp / add  with high register type.  */
+typedef enum i16movcmpaddh_type {
+  I16_MOVCMPADDH_ADD, I16_MOVCMPADDH_MOVBH, I16_MOVCMPADDH_CMP, I16_MOVCMPADDH_MOVHB
+} I16MOVCMPADDH_TYPE;
+
+/* Enum declaration for short general operations.  */
+typedef enum i16go_type {
+  I16_GO_SOP = 0, I16_GO_SUB = 2, I16_GO_AND = 4, I16_GO_OR = 5
+ , I16_GO_BIC = 6, I16_GO_XOR = 7, I16_GO_TST = 11, I16_GO_MUL64 = 12
+ , I16_GO_SEXB = 13, I16_GO_SEXW = 14, I16_GO_EXTB = 15, I16_GO_EXTW = 16
+ , I16_GO_ABS = 17, I16_GO_NOT = 18, I16_GO_NEG = 19, I16_GO_ADD1 = 20
+ , I16_GO_ADD2 = 21, I16_GO_ADD3 = 22, I16_GO_ASLM = 24, I16_GO_LSRM = 25
+ , I16_GO_ASRM = 26, I16_GO_ASL = 27, I16_GO_ASR = 28, I16_GO_LSR = 29
+ , I16_GO_TRAP = 30, I16_GO_BRK = 31
+} I16GO_TYPE;
+
+/* Enum declaration for short general operations single operand.  */
+typedef enum i16go_sop_type {
+  I16_GO_SOP_J = 0, I16_GO_SOP_J_D = 1, I16_GO_SOP_JL = 2, I16_GO_SOP_JL_D = 3
+ , I16_GO_SOP_SUB_NE = 6, I16_GO_SOP_ZOP = 7
+} I16GO_SOP_TYPE;
+
+/* Enum declaration for short general operations single operand.  */
+typedef enum i16go_zop_type {
+  I16_GO_ZOP_NOP = 0, I16_GO_ZOP_UNIMP = 1, I16_GO_ZOP_JEQ = 4, I16_GO_ZOP_JNE = 5
+ , I16_GO_ZOP_J = 6, I16_GO_ZOP_J_D = 7
+} I16GO_ZOP_TYPE;
+
+/* Enum declaration for sp based insn type.  */
+typedef enum i16sp_type {
+  I16_SP_LD, I16_SP_LDB, I16_SP_ST, I16_SP_STB
+ , I16_SP_ADD, I16_SP_ADDSUB, I16_SP_POP, I16_SP_PUSH
+} I16SP_TYPE;
+
+/* Enum declaration for sp based 1op insn type.  */
+typedef enum i16addsub_spsp_type {
+  I16_SP_ADDSUB_ADD, I16_SP_ADDSUB_SUB
+} I16ADDSUB_SPSP_TYPE;
+
+/* Enum declaration for gp-relative insn type.  */
+typedef enum i16gp_type {
+  I16_GP_LD, I16_GP_LDB, I16_GP_LDW, I16_GP_ADD
+} I16GP_TYPE;
+
+/* Enum declaration for short add / cmp immediate type.  */
+typedef enum i16addcmpu7_type {
+  I16_ADDCMPU7_ADD, I16_ADDCMPU7_CMP
+} I16ADDCMPU7_TYPE;
+
+/* Enum declaration for shift / sub / bit immediate short insn w/ u5 type.  */
+typedef enum i16shsubbimm {
+  I16_SHSUBBIMM_ASL, I16_SHSUBBIMM_LSR, I16_SHSUBBIMM_ASR, I16_SHSUBBIMM_SUB
+ , I16_SHSUBBIMM_BSET, I16_SHSUBBIMM_BCLR, I16_SHSUBBIMM_BMSK, I16_SHSUBBIMM_BTST
+} I16SHSUBBIMM;
+
+/* Enum declaration for .  */
+typedef enum i_buf {
+  B_CC, B_UNCOND_FAR
+} I_BUF;
+
+/* Enum declaration for .  */
+typedef enum i_blr {
+  BLR_BL, BLR_BR
+} I_BLR;
+
+/* Enum declaration for .  */
+typedef enum i_br {
+  BR_RC, BR_U6
+} I_BR;
+
+/* Enum declaration for .  */
+typedef enum op_bl {
+  BL_CC, BL_UNCOND_FAR
+} OP_BL;
+
+/* Enum declaration for .  */
+typedef enum i_bcc_s {
+  B_S_CC = 3
+} I_BCC_S;
+
+/* Enum declaration for .  */
+typedef enum i_ldozz {
+  LDO_LD = 0, LDO_LDB = 2, LDO_LDBX = 3, LDO_LDW = 4
+ , LDO_LDWX = 5
+} I_LDOZZ;
+
+/* Enum declaration for .  */
+typedef enum i_ldr6zzx {
+  LDR_LD = 48, LDR_LDB = 50, LDR_LDBX = 51, LDR_LDW = 52
+ , LDR_LDWX = 53
+} I_LDR6ZZX;
+
+/* Enum declaration for .  */
+typedef enum i_stozzr {
+  STO_ST = 0, STO_STB = 2, STO_STW = 4
+} I_STOZZR;
+
+/* Enum declaration for .  */
+typedef enum i_ldoaa {
+  LDOAA_NO, LDOAA_AW, LDOAA_AB, LDOAA_AS
+} I_LDOAA;
+
+/* Enum declaration for .  */
+typedef enum i_ldraa {
+  LDRAA_NO, LDRAA_AW, LDRAA_AB, LDRAA_AS
+} I_LDRAA;
+
+/* Enum declaration for .  */
+typedef enum i_stoaa {
+  STOAA_NO, STOAA_AW, STOAA_AB, STOAA_AS
+} I_STOAA;
+
+/* Enum declaration for general zero-operand operations type.  */
+typedef enum go_zop {
+  GO_OP_ZOP_SLEEP = 1, GO_OP_ZOP_SWI = 2, GO_OP_ZOP_SYNC = 3, GO_OP_ZOP_RTIE = 4
+ , GO_OP_ZOP_BRK = 5
+} GO_ZOP;
+
+/* Enum declaration for general operations type.  */
+typedef enum x05_go_op {
+  X05_ASL = 0, X05_LSR = 1, X05_ASR = 2, X05_ROR = 3
+ , X05_MUL64 = 4, X05_MULU64 = 5, X05_ADDS = 6, X05_SUBS = 7
+ , X05_DIVAW = 8, X05_ASLS = 10, X05_ASRS = 11, X05_ADDSDW = 40
+ , X05_SUBSDW = 41, X05_SOP = 47, X05_CMACRDW = 38, X05_MACDW = 16
+ , X05_MACFLW = 52, X05_MACHFLW = 55, X05_MACHLW = 54, X05_MACHULW = 53
+ , X05_MACLW = 51, X05_MACRDW = 18, X05_MACUDW = 17, X05_MSUBDW = 20
+ , X05_MULDW = 12, X05_MULFLW = 50, X05_MULHFLW = 57, X05_MULHLW = 56
+ , X05_MULLW = 49, X05_MULRDW = 14, X05_MULUDW = 13, X05_MULULW = 48
+} X05_GO_OP;
+
+/* Enum declaration for x06 extension single-operand operantion.  */
+typedef enum x05_sop_kind {
+  X05_SOP_SWAP = 0, X05_SOP_NORM = 1, X05_SOP_SAT16 = 2, X05_SOP_RND16 = 3
+ , X05_SOP_ABSSW = 4, X05_SOP_ABSS = 5, X05_SOP_NEGSW = 6, X05_SOP_NEGS = 7
+ , X05_SOP_NORMW = 8, X05_SOP_ZOP = 63
+} X05_SOP_KIND;
+
+/* Enum declaration for .  */
+typedef enum pushpop_kind {
+  PUSHPOP_B = 1, PUSHPOP_BLINK = 17
+} PUSHPOP_KIND;
+
+/* Enum declaration for .  */
+typedef enum pushpop_r_b {
+  OP_B_0
+} PUSHPOP_R_B;
+
+/* Attributes.  */
+
+/* Enum declaration for machine type selection.  */
+typedef enum mach_attr {
+  MACH_BASE, MACH_A5, MACH_ARC600, MACH_ARC700
+ , MACH_MAX
+} MACH_ATTR;
+
+/* Enum declaration for instruction set selection.  */
+typedef enum isa_attr {
+  ISA_ARCOMPACT, ISA_MAX
+} ISA_ATTR;
+
+/* Enum declaration for can take long immediate for operand.  */
+typedef enum limm_attr {
+  LIMM_NONE, LIMM_H, LIMM_B, LIMM_BC
+ , LIMM_C
+} LIMM_ATTR;
+
+/* Number of architecture variants.  */
+#define MAX_ISAS  1
+#define MAX_MACHS ((int) MACH_MAX)
+
+/* Ifield support.  */
+
+/* Ifield attribute indices.  */
+
+/* Enum declaration for cgen_ifld attrs.  */
+typedef enum cgen_ifld_attr {
+  CGEN_IFLD_VIRTUAL, CGEN_IFLD_PCREL_ADDR, CGEN_IFLD_ABS_ADDR, CGEN_IFLD_RESERVED
+ , CGEN_IFLD_SIGN_OPT, CGEN_IFLD_SIGNED, CGEN_IFLD_END_BOOLS, CGEN_IFLD_START_NBOOLS = 31
+ , CGEN_IFLD_MACH, CGEN_IFLD_END_NBOOLS
+} CGEN_IFLD_ATTR;
+
+/* Number of non-boolean elements in cgen_ifld_attr.  */
+#define CGEN_IFLD_NBOOL_ATTRS (CGEN_IFLD_END_NBOOLS - CGEN_IFLD_START_NBOOLS - 1)
+
+/* cgen_ifld attribute accessor macros.  */
+#define CGEN_ATTR_CGEN_IFLD_MACH_VALUE(attrs) ((attrs)->nonbool[CGEN_IFLD_MACH-CGEN_IFLD_START_NBOOLS-1].nonbitset)
+#define CGEN_ATTR_CGEN_IFLD_VIRTUAL_VALUE(attrs) (((attrs)->bool & (1 << CGEN_IFLD_VIRTUAL)) != 0)
+#define CGEN_ATTR_CGEN_IFLD_PCREL_ADDR_VALUE(attrs) (((attrs)->bool & (1 << CGEN_IFLD_PCREL_ADDR)) != 0)
+#define CGEN_ATTR_CGEN_IFLD_ABS_ADDR_VALUE(attrs) (((attrs)->bool & (1 << CGEN_IFLD_ABS_ADDR)) != 0)
+#define CGEN_ATTR_CGEN_IFLD_RESERVED_VALUE(attrs) (((attrs)->bool & (1 << CGEN_IFLD_RESERVED)) != 0)
+#define CGEN_ATTR_CGEN_IFLD_SIGN_OPT_VALUE(attrs) (((attrs)->bool & (1 << CGEN_IFLD_SIGN_OPT)) != 0)
+#define CGEN_ATTR_CGEN_IFLD_SIGNED_VALUE(attrs) (((attrs)->bool & (1 << CGEN_IFLD_SIGNED)) != 0)
+
+/* Enum declaration for arc ifield types.  */
+typedef enum ifield_type {
+  ARC_F_NIL, ARC_F_ANYOF, ARC_F_COND_Q, ARC_F_COND_I2
+ , ARC_F_COND_I3, ARC_F_BRCOND, ARC_F_OP__A, ARC_F_OP__B
+ , ARC_F_OP__C, ARC_F_B_5_3, ARC_F_OP_B, ARC_F_OP_C
+ , ARC_F_OP_CJ, ARC_F_H_2_0, ARC_F_H_5_3, ARC_F_OP_H
+ , ARC_F_U6, ARC_F_U6X2, ARC_F_DELAY_N, ARC_F_RES27
+ , ARC_F_F, ARC_F_CBRANCH_IMM, ARC_F_OP_A, ARC_F_S12H
+ , ARC_F_S12, ARC_F_S12X2, ARC_F_REL10, ARC_F_REL7
+ , ARC_F_REL8, ARC_F_REL13BL, ARC_F_D21L, ARC_F_D21BL
+ , ARC_F_D21H, ARC_F_D25M, ARC_F_D25H, ARC_F_REL21
+ , ARC_F_REL21BL, ARC_F_REL25, ARC_F_REL25BL, ARC_F_D9L
+ , ARC_F_D9H, ARC_F_REL9, ARC_F_U3, ARC_F_U5
+ , ARC_F_U7, ARC_F_U8, ARC_F_S9, ARC_F_U5X2
+ , ARC_F_U5X4, ARC_F_U8X4, ARC_F_S9X1, ARC_F_S9X2
+ , ARC_F_S9X4, ARC_F_DUMMY, ARC_F_OPM, ARC_F_GO_TYPE
+ , ARC_F_GO_CC_TYPE, ARC_F_GO_OP, ARC_F_I16_43, ARC_F_I16_GO
+ , ARC_F_I16_GP_TYPE, ARC_F_I16ADDCMPU7_TYPE, ARC_F_BUF, ARC_F_BR
+ , ARC_F_BLUF, ARC_F_BRSCOND, ARC_F_LDOZZX, ARC_F_LDR6ZZX
+ , ARC_F_STOZZR, ARC_F_LDOAA, ARC_F_LDRAA, ARC_F_STOAA
+ , ARC_F_LDODI, ARC_F_LDRDI, ARC_F_STODI, ARC_F_TRAPNUM
+ , ARC_F_MAX
+} IFIELD_TYPE;
+
+#define MAX_IFLD ((int) ARC_F_MAX)
+
+/* Hardware attribute indices.  */
+
+/* Enum declaration for cgen_hw attrs.  */
+typedef enum cgen_hw_attr {
+  CGEN_HW_VIRTUAL, CGEN_HW_CACHE_ADDR, CGEN_HW_PC, CGEN_HW_PROFILE
+ , CGEN_HW_END_BOOLS, CGEN_HW_START_NBOOLS = 31, CGEN_HW_MACH, CGEN_HW_END_NBOOLS
+} CGEN_HW_ATTR;
+
+/* Number of non-boolean elements in cgen_hw_attr.  */
+#define CGEN_HW_NBOOL_ATTRS (CGEN_HW_END_NBOOLS - CGEN_HW_START_NBOOLS - 1)
+
+/* cgen_hw attribute accessor macros.  */
+#define CGEN_ATTR_CGEN_HW_MACH_VALUE(attrs) ((attrs)->nonbool[CGEN_HW_MACH-CGEN_HW_START_NBOOLS-1].nonbitset)
+#define CGEN_ATTR_CGEN_HW_VIRTUAL_VALUE(attrs) (((attrs)->bool & (1 << CGEN_HW_VIRTUAL)) != 0)
+#define CGEN_ATTR_CGEN_HW_CACHE_ADDR_VALUE(attrs) (((attrs)->bool & (1 << CGEN_HW_CACHE_ADDR)) != 0)
+#define CGEN_ATTR_CGEN_HW_PC_VALUE(attrs) (((attrs)->bool & (1 << CGEN_HW_PC)) != 0)
+#define CGEN_ATTR_CGEN_HW_PROFILE_VALUE(attrs) (((attrs)->bool & (1 << CGEN_HW_PROFILE)) != 0)
+
+/* Enum declaration for arc hardware types.  */
+typedef enum cgen_hw_type {
+  HW_H_MEMORY, HW_H_SINT, HW_H_UINT, HW_H_ADDR
+ , HW_H_IADDR, HW_H_LBIT, HW_H_ZBIT, HW_H_NBIT
+ , HW_H_CBIT, HW_H_VBIT, HW_H_UBIT, HW_H_E1
+ , HW_H_E2, HW_H_S1BIT, HW_H_S2BIT, HW_H_QCONDB
+ , HW_H_QCONDJ, HW_H_QCONDI, HW_H_UNCONDB, HW_H_UNCONDJ
+ , HW_H_UNCONDI, HW_H_I2COND, HW_H_I3COND, HW_H_DELAY
+ , HW_H_UFLAGS, HW_H_NIL, HW_H_AUFLAGS, HW_H_AUFFLAGS
+ , HW_H_DI, HW_H_INSN16, HW_H_INSN32, HW_H__AW
+ , HW_H_CR, HW_H_CR16, HW_H_R0, HW_H_GP
+ , HW_H_SP, HW_H_PCL, HW_H_NOILINK, HW_H_ILINKX
+ , HW_H_R31, HW_H_AUXR, HW_H_STATUS32, HW_H_TIMER_EXPIRE
+ , HW_H_PROF_OFFSET, HW_H_NE, HW_H_PC, HW_H_RCCS
+ , HW_H_RCC, HW_MAX
+} CGEN_HW_TYPE;
+
+#define MAX_HW ((int) HW_MAX)
+
+/* Operand attribute indices.  */
+
+/* Enum declaration for cgen_operand attrs.  */
+typedef enum cgen_operand_attr {
+  CGEN_OPERAND_VIRTUAL, CGEN_OPERAND_PCREL_ADDR, CGEN_OPERAND_ABS_ADDR, CGEN_OPERAND_SIGN_OPT
+ , CGEN_OPERAND_SIGNED, CGEN_OPERAND_NEGATIVE, CGEN_OPERAND_RELAX, CGEN_OPERAND_SEM_ONLY
+ , CGEN_OPERAND_END_BOOLS, CGEN_OPERAND_START_NBOOLS = 31, CGEN_OPERAND_MACH, CGEN_OPERAND_END_NBOOLS
+} CGEN_OPERAND_ATTR;
+
+/* Number of non-boolean elements in cgen_operand_attr.  */
+#define CGEN_OPERAND_NBOOL_ATTRS (CGEN_OPERAND_END_NBOOLS - CGEN_OPERAND_START_NBOOLS - 1)
+
+/* cgen_operand attribute accessor macros.  */
+#define CGEN_ATTR_CGEN_OPERAND_MACH_VALUE(attrs) ((attrs)->nonbool[CGEN_OPERAND_MACH-CGEN_OPERAND_START_NBOOLS-1].nonbitset)
+#define CGEN_ATTR_CGEN_OPERAND_VIRTUAL_VALUE(attrs) (((attrs)->bool & (1 << CGEN_OPERAND_VIRTUAL)) != 0)
+#define CGEN_ATTR_CGEN_OPERAND_PCREL_ADDR_VALUE(attrs) (((attrs)->bool & (1 << CGEN_OPERAND_PCREL_ADDR)) != 0)
+#define CGEN_ATTR_CGEN_OPERAND_ABS_ADDR_VALUE(attrs) (((attrs)->bool & (1 << CGEN_OPERAND_ABS_ADDR)) != 0)
+#define CGEN_ATTR_CGEN_OPERAND_SIGN_OPT_VALUE(attrs) (((attrs)->bool & (1 << CGEN_OPERAND_SIGN_OPT)) != 0)
+#define CGEN_ATTR_CGEN_OPERAND_SIGNED_VALUE(attrs) (((attrs)->bool & (1 << CGEN_OPERAND_SIGNED)) != 0)
+#define CGEN_ATTR_CGEN_OPERAND_NEGATIVE_VALUE(attrs) (((attrs)->bool & (1 << CGEN_OPERAND_NEGATIVE)) != 0)
+#define CGEN_ATTR_CGEN_OPERAND_RELAX_VALUE(attrs) (((attrs)->bool & (1 << CGEN_OPERAND_RELAX)) != 0)
+#define CGEN_ATTR_CGEN_OPERAND_SEM_ONLY_VALUE(attrs) (((attrs)->bool & (1 << CGEN_OPERAND_SEM_ONLY)) != 0)
+
+/* Enum declaration for arc operand types.  */
+typedef enum cgen_operand_type {
+  ARC_OPERAND_PC, ARC_OPERAND_LBIT, ARC_OPERAND_ZBIT, ARC_OPERAND_NBIT
+ , ARC_OPERAND_CBIT, ARC_OPERAND_VBIT, ARC_OPERAND_S1BIT, ARC_OPERAND_S2BIT
+ , ARC_OPERAND_QCONDB, ARC_OPERAND_QCONDJ, ARC_OPERAND_QCONDI, ARC_OPERAND_UNCONDB
+ , ARC_OPERAND_UNCONDJ, ARC_OPERAND_UNCONDI, ARC_OPERAND_I2COND, ARC_OPERAND_I3COND
+ , ARC_OPERAND_DELAY_N, ARC_OPERAND__S, ARC_OPERAND__L, ARC_OPERAND_F
+ , ARC_OPERAND_F1, ARC_OPERAND_F1F, ARC_OPERAND_F0, ARC_OPERAND_R_A
+ , ARC_OPERAND_RA, ARC_OPERAND_R_B, ARC_OPERAND_RB, ARC_OPERAND_R_C
+ , ARC_OPERAND_RC, ARC_OPERAND_RH, ARC_OPERAND_R0, ARC_OPERAND_R31
+ , ARC_OPERAND_GP, ARC_OPERAND_SP, ARC_OPERAND_PCL, ARC_OPERAND_RA_0
+ , ARC_OPERAND_RB_0, ARC_OPERAND_RC_ILINK, ARC_OPERAND_RC_NOILINK, ARC_OPERAND_NE
+ , ARC_OPERAND_U6, ARC_OPERAND_U6X2, ARC_OPERAND_U3, ARC_OPERAND_U5
+ , ARC_OPERAND_U7, ARC_OPERAND_U8, ARC_OPERAND_S9, ARC_OPERAND_S12
+ , ARC_OPERAND_S12X2, ARC_OPERAND_U5X4, ARC_OPERAND_SC_U5_, ARC_OPERAND_SC_U5W
+ , ARC_OPERAND_SC_U5B, ARC_OPERAND_U8X4, ARC_OPERAND_S9X4, ARC_OPERAND_SC_S9_
+ , ARC_OPERAND_SC_S9W, ARC_OPERAND_SC_S9B, ARC_OPERAND_LABEL7, ARC_OPERAND_LABEL8
+ , ARC_OPERAND_LABEL9, ARC_OPERAND_LABEL10, ARC_OPERAND_LABEL13A, ARC_OPERAND_LABEL21
+ , ARC_OPERAND_LABEL21A, ARC_OPERAND_LABEL25, ARC_OPERAND_LABEL25A, ARC_OPERAND_DUMMY_OP
+ , ARC_OPERAND_RCCS, ARC_OPERAND_RCC, ARC_OPERAND_LDODI, ARC_OPERAND_LDRDI
+ , ARC_OPERAND_STODI, ARC_OPERAND_EXDI, ARC_OPERAND__AW, ARC_OPERAND_TRAPNUM
+ , ARC_OPERAND_MAX
+} CGEN_OPERAND_TYPE;
+
+/* Number of operands types.  */
+#define MAX_OPERANDS 76
+
+/* Maximum number of operands referenced by any insn.  */
+#define MAX_OPERAND_INSTANCES 26
+
+/* Insn attribute indices.  */
+
+/* Enum declaration for cgen_insn attrs.  */
+typedef enum cgen_insn_attr {
+  CGEN_INSN_ALIAS, CGEN_INSN_VIRTUAL, CGEN_INSN_UNCOND_CTI, CGEN_INSN_COND_CTI
+ , CGEN_INSN_SKIP_CTI, CGEN_INSN_DELAY_SLOT, CGEN_INSN_RELAXABLE, CGEN_INSN_RELAXED
+ , CGEN_INSN_NO_DIS, CGEN_INSN_PBB, CGEN_INSN_SHORT_P, CGEN_INSN_END_BOOLS
+ , CGEN_INSN_START_NBOOLS = 31, CGEN_INSN_MACH, CGEN_INSN_LIMM, CGEN_INSN_END_NBOOLS
+} CGEN_INSN_ATTR;
+
+/* Number of non-boolean elements in cgen_insn_attr.  */
+#define CGEN_INSN_NBOOL_ATTRS (CGEN_INSN_END_NBOOLS - CGEN_INSN_START_NBOOLS - 1)
+
+/* cgen_insn attribute accessor macros.  */
+#define CGEN_ATTR_CGEN_INSN_MACH_VALUE(attrs) ((attrs)->nonbool[CGEN_INSN_MACH-CGEN_INSN_START_NBOOLS-1].nonbitset)
+#define CGEN_ATTR_CGEN_INSN_LIMM_VALUE(attrs) ((attrs)->nonbool[CGEN_INSN_LIMM-CGEN_INSN_START_NBOOLS-1].nonbitset)
+#define CGEN_ATTR_CGEN_INSN_ALIAS_VALUE(attrs) (((attrs)->bool & (1 << CGEN_INSN_ALIAS)) != 0)
+#define CGEN_ATTR_CGEN_INSN_VIRTUAL_VALUE(attrs) (((attrs)->bool & (1 << CGEN_INSN_VIRTUAL)) != 0)
+#define CGEN_ATTR_CGEN_INSN_UNCOND_CTI_VALUE(attrs) (((attrs)->bool & (1 << CGEN_INSN_UNCOND_CTI)) != 0)
+#define CGEN_ATTR_CGEN_INSN_COND_CTI_VALUE(attrs) (((attrs)->bool & (1 << CGEN_INSN_COND_CTI)) != 0)
+#define CGEN_ATTR_CGEN_INSN_SKIP_CTI_VALUE(attrs) (((attrs)->bool & (1 << CGEN_INSN_SKIP_CTI)) != 0)
+#define CGEN_ATTR_CGEN_INSN_DELAY_SLOT_VALUE(attrs) (((attrs)->bool & (1 << CGEN_INSN_DELAY_SLOT)) != 0)
+#define CGEN_ATTR_CGEN_INSN_RELAXABLE_VALUE(attrs) (((attrs)->bool & (1 << CGEN_INSN_RELAXABLE)) != 0)
+#define CGEN_ATTR_CGEN_INSN_RELAXED_VALUE(attrs) (((attrs)->bool & (1 << CGEN_INSN_RELAXED)) != 0)
+#define CGEN_ATTR_CGEN_INSN_NO_DIS_VALUE(attrs) (((attrs)->bool & (1 << CGEN_INSN_NO_DIS)) != 0)
+#define CGEN_ATTR_CGEN_INSN_PBB_VALUE(attrs) (((attrs)->bool & (1 << CGEN_INSN_PBB)) != 0)
+#define CGEN_ATTR_CGEN_INSN_SHORT_P_VALUE(attrs) (((attrs)->bool & (1 << CGEN_INSN_SHORT_P)) != 0)
+
+/* cgen.h uses things we just defined.  */
+#include "opcode/cgen.h"
+
+extern const struct cgen_ifld arc_cgen_ifld_table[];
+
+/* Attributes.  */
+extern const CGEN_ATTR_TABLE arc_cgen_hardware_attr_table[];
+extern const CGEN_ATTR_TABLE arc_cgen_ifield_attr_table[];
+extern const CGEN_ATTR_TABLE arc_cgen_operand_attr_table[];
+extern const CGEN_ATTR_TABLE arc_cgen_insn_attr_table[];
+
+/* Hardware decls.  */
+
+extern CGEN_KEYWORD arc_cgen_opval_h_Qcondb;
+extern CGEN_KEYWORD arc_cgen_opval_h_Qcondj;
+extern CGEN_KEYWORD arc_cgen_opval_h_Qcondi;
+extern CGEN_KEYWORD arc_cgen_opval_h_uncondb;
+extern CGEN_KEYWORD arc_cgen_opval_h_uncondj;
+extern CGEN_KEYWORD arc_cgen_opval_h_uncondi;
+extern CGEN_KEYWORD arc_cgen_opval_h_i2cond;
+extern CGEN_KEYWORD arc_cgen_opval_h_i3cond;
+extern CGEN_KEYWORD arc_cgen_opval_h_delay;
+extern CGEN_KEYWORD arc_cgen_opval_h_uflags;
+extern CGEN_KEYWORD arc_cgen_opval_h_nil;
+extern CGEN_KEYWORD arc_cgen_opval_h_auflags;
+extern CGEN_KEYWORD arc_cgen_opval_h_aufflags;
+extern CGEN_KEYWORD arc_cgen_opval_h_Di;
+extern CGEN_KEYWORD arc_cgen_opval_h_insn16;
+extern CGEN_KEYWORD arc_cgen_opval_h_insn32;
+extern CGEN_KEYWORD arc_cgen_opval_h__aw;
+extern CGEN_KEYWORD arc_cgen_opval_cr_names;
+extern CGEN_KEYWORD arc_cgen_opval_h_cr16;
+extern CGEN_KEYWORD arc_cgen_opval_h_r0;
+extern CGEN_KEYWORD arc_cgen_opval_h_gp;
+extern CGEN_KEYWORD arc_cgen_opval_h_sp;
+extern CGEN_KEYWORD arc_cgen_opval_h_pcl;
+extern CGEN_KEYWORD arc_cgen_opval_h_noilink;
+extern CGEN_KEYWORD arc_cgen_opval_h_ilinkx;
+extern CGEN_KEYWORD arc_cgen_opval_h_r31;
+extern CGEN_KEYWORD arc_cgen_opval_cr_names;
+extern CGEN_KEYWORD arc_cgen_opval_h_status32;
+extern CGEN_KEYWORD arc_cgen_opval_h_ne;
+extern CGEN_KEYWORD arc_cgen_opval_h_RccS;
+extern CGEN_KEYWORD arc_cgen_opval_h_Rcc;
+
+extern const CGEN_HW_ENTRY arc_cgen_hw_table[];
+
+
+
+#endif /* ARC_CPU_H */
diff --git a/opcodes/arc-ibld.c b/opcodes/arc-ibld.c
new file mode 100644
index 0000000..958dde7
--- /dev/null
+++ b/opcodes/arc-ibld.c
@@ -0,0 +1,2340 @@
+/* Instruction building/extraction support for arc. -*- C -*-
+
+   THIS FILE IS MACHINE GENERATED WITH CGEN: Cpu tools GENerator.
+   - the resultant file is machine generated, cgen-ibld.in isn't
+
+   Copyright 1996, 1997, 1998, 1999, 2000, 2001, 2005, 2006, 2007
+   Free Software Foundation, Inc.
+
+   This file is part of libopcodes.
+
+   This library 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 3, or (at your option)
+   any later version.
+
+   It 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 this program; if not, write to the Free Software Foundation, Inc.,
+   51 Franklin Street - Fifth Floor, Boston, MA 02110-1301, USA.  */
+
+/* ??? Eventually more and more of this stuff can go to cpu-independent files.
+   Keep that in mind.  */
+
+#include "sysdep.h"
+#include <stdio.h>
+#include "ansidecl.h"
+#include "dis-asm.h"
+#include "bfd.h"
+#include "symcat.h"
+#include "arc-desc.h"
+#include "arc-opc.h"
+#include "opintl.h"
+#include "safe-ctype.h"
+
+#undef  min
+#define min(a,b) ((a) < (b) ? (a) : (b))
+#undef  max
+#define max(a,b) ((a) > (b) ? (a) : (b))
+
+/* Used by the ifield rtx function.  */
+#define FLD(f) (fields->f)
+
+static const char * insert_normal
+  (CGEN_CPU_DESC, long, unsigned int, unsigned int, unsigned int,
+   unsigned int, unsigned int, unsigned int, CGEN_INSN_BYTES_PTR);
+static const char * insert_insn_normal
+  (CGEN_CPU_DESC, const CGEN_INSN *,
+   CGEN_FIELDS *, CGEN_INSN_BYTES_PTR, bfd_vma);
+static int extract_normal
+  (CGEN_CPU_DESC, CGEN_EXTRACT_INFO *, CGEN_INSN_INT,
+   unsigned int, unsigned int, unsigned int, unsigned int,
+   unsigned int, unsigned int, bfd_vma, long *);
+static int extract_insn_normal
+  (CGEN_CPU_DESC, const CGEN_INSN *, CGEN_EXTRACT_INFO *,
+   CGEN_INSN_INT, CGEN_FIELDS *, bfd_vma);
+#if CGEN_INT_INSN_P
+static void put_insn_int_value
+  (CGEN_CPU_DESC, CGEN_INSN_BYTES_PTR, int, int, CGEN_INSN_INT);
+#endif
+#if ! CGEN_INT_INSN_P
+static CGEN_INLINE void insert_1
+  (CGEN_CPU_DESC, unsigned long, int, int, int, unsigned char *);
+static CGEN_INLINE int fill_cache
+  (CGEN_CPU_DESC, CGEN_EXTRACT_INFO *,  int, int, bfd_vma);
+static CGEN_INLINE long extract_1
+  (CGEN_CPU_DESC, CGEN_EXTRACT_INFO *, int, int, int, unsigned char *, bfd_vma);
+#endif
+
+/* Operand insertion.  */
+
+#if ! CGEN_INT_INSN_P
+
+/* Subroutine of insert_normal.  */
+
+static CGEN_INLINE void
+insert_1 (CGEN_CPU_DESC cd,
+	  unsigned long value,
+	  int start,
+	  int length,
+	  int word_length,
+	  unsigned char *bufp)
+{
+  unsigned long x,mask;
+  int shift;
+
+  x = cgen_get_insn_value (cd, bufp, word_length);
+
+  /* Written this way to avoid undefined behaviour.  */
+  mask = (((1L << (length - 1)) - 1) << 1) | 1;
+  if (CGEN_INSN_LSB0_P)
+    shift = (start + 1) - length;
+  else
+    shift = (word_length - (start + length));
+  x = (x & ~(mask << shift)) | ((value & mask) << shift);
+
+  cgen_put_insn_value (cd, bufp, word_length, (bfd_vma) x);
+}
+
+#endif /* ! CGEN_INT_INSN_P */
+
+/* Default insertion routine.
+
+   ATTRS is a mask of the boolean attributes.
+   WORD_OFFSET is the offset in bits from the start of the insn of the value.
+   WORD_LENGTH is the length of the word in bits in which the value resides.
+   START is the starting bit number in the word, architecture origin.
+   LENGTH is the length of VALUE in bits.
+   TOTAL_LENGTH is the total length of the insn in bits.
+
+   The result is an error message or NULL if success.  */
+
+/* ??? This duplicates functionality with bfd's howto table and
+   bfd_install_relocation.  */
+/* ??? This doesn't handle bfd_vma's.  Create another function when
+   necessary.  */
+
+static const char *
+insert_normal (CGEN_CPU_DESC cd,
+	       long value,
+	       unsigned int attrs,
+	       unsigned int word_offset,
+	       unsigned int start,
+	       unsigned int length,
+	       unsigned int word_length,
+	       unsigned int total_length,
+	       CGEN_INSN_BYTES_PTR buffer)
+{
+  static char errbuf[100];
+  /* Written this way to avoid undefined behaviour.  */
+  unsigned long mask = (((1L << (length - 1)) - 1) << 1) | 1;
+
+  /* If LENGTH is zero, this operand doesn't contribute to the value.  */
+  if (length == 0)
+    return NULL;
+
+  if (word_length > 32)
+    abort ();
+
+  /* For architectures with insns smaller than the base-insn-bitsize,
+     word_length may be too big.  */
+  if (cd->min_insn_bitsize < cd->base_insn_bitsize)
+    {
+      if (word_offset == 0
+	  && word_length > total_length)
+	word_length = total_length;
+    }
+
+  /* Ensure VALUE will fit.  */
+  if (CGEN_BOOL_ATTR (attrs, CGEN_IFLD_SIGN_OPT))
+    {
+      long minval = - (1L << (length - 1));
+      unsigned long maxval = mask;
+      
+      if ((value > 0 && (unsigned long) value > maxval)
+	  || value < minval)
+	{
+	  /* xgettext:c-format */
+	  sprintf (errbuf,
+		   _("operand out of range (%ld not between %ld and %lu)"),
+		   value, minval, maxval);
+	  return errbuf;
+	}
+    }
+  else if (! CGEN_BOOL_ATTR (attrs, CGEN_IFLD_SIGNED))
+    {
+      unsigned long maxval = mask;
+      unsigned long val = (unsigned long) value;
+
+      /* For hosts with a word size > 32 check to see if value has been sign
+	 extended beyond 32 bits.  If so then ignore these higher sign bits
+	 as the user is attempting to store a 32-bit signed value into an
+	 unsigned 32-bit field which is allowed.  */
+      if (sizeof (unsigned long) > 4 && ((value >> 32) == -1))
+	val &= 0xFFFFFFFF;
+
+      if (val > maxval)
+	{
+	  /* xgettext:c-format */
+	  sprintf (errbuf,
+		   _("operand out of range (0x%lx not between 0 and 0x%lx)"),
+		   val, maxval);
+	  return errbuf;
+	}
+    }
+  else
+    {
+      if (! cgen_signed_overflow_ok_p (cd))
+	{
+	  long minval = - (1L << (length - 1));
+	  long maxval =   (1L << (length - 1)) - 1;
+	  
+	  if (value < minval || value > maxval)
+	    {
+	      sprintf
+		/* xgettext:c-format */
+		(errbuf, _("operand out of range (%ld not between %ld and %ld)"),
+		 value, minval, maxval);
+	      return errbuf;
+	    }
+	}
+    }
+
+#if CGEN_INT_INSN_P
+
+  {
+    int shift;
+
+    if (CGEN_INSN_LSB0_P)
+      shift = (word_offset + start + 1) - length;
+    else
+      shift = total_length - (word_offset + start + length);
+    *buffer = (*buffer & ~(mask << shift)) | ((value & mask) << shift);
+  }
+
+#else /* ! CGEN_INT_INSN_P */
+
+  {
+    unsigned char *bufp = (unsigned char *) buffer + word_offset / 8;
+
+    insert_1 (cd, value, start, length, word_length, bufp);
+  }
+
+#endif /* ! CGEN_INT_INSN_P */
+
+  return NULL;
+}
+
+/* Default insn builder (insert handler).
+   The instruction is recorded in CGEN_INT_INSN_P byte order (meaning
+   that if CGEN_INSN_BYTES_PTR is an int * and thus, the value is
+   recorded in host byte order, otherwise BUFFER is an array of bytes
+   and the value is recorded in target byte order).
+   The result is an error message or NULL if success.  */
+
+static const char *
+insert_insn_normal (CGEN_CPU_DESC cd,
+		    const CGEN_INSN * insn,
+		    CGEN_FIELDS * fields,
+		    CGEN_INSN_BYTES_PTR buffer,
+		    bfd_vma pc)
+{
+  const CGEN_SYNTAX *syntax = CGEN_INSN_SYNTAX (insn);
+  unsigned long value;
+  const CGEN_SYNTAX_CHAR_TYPE * syn;
+
+  CGEN_INIT_INSERT (cd);
+  value = CGEN_INSN_BASE_VALUE (insn);
+
+  /* If we're recording insns as numbers (rather than a string of bytes),
+     target byte order handling is deferred until later.  */
+
+#if CGEN_INT_INSN_P
+
+  put_insn_int_value (cd, buffer, cd->base_insn_bitsize,
+		      CGEN_FIELDS_BITSIZE (fields), value);
+
+#else
+
+  cgen_put_insn_value (cd, buffer, min ((unsigned) cd->base_insn_bitsize,
+					(unsigned) CGEN_FIELDS_BITSIZE (fields)),
+		       value);
+
+#endif /* ! CGEN_INT_INSN_P */
+
+  /* ??? It would be better to scan the format's fields.
+     Still need to be able to insert a value based on the operand though;
+     e.g. storing a branch displacement that got resolved later.
+     Needs more thought first.  */
+
+  for (syn = CGEN_SYNTAX_STRING (syntax); * syn; ++ syn)
+    {
+      const char *errmsg;
+
+      if (CGEN_SYNTAX_CHAR_P (* syn))
+	continue;
+
+      errmsg = (* cd->insert_operand) (cd, CGEN_SYNTAX_FIELD (*syn),
+				       fields, buffer, pc);
+      if (errmsg)
+	return errmsg;
+    }
+
+  return NULL;
+}
+
+#if CGEN_INT_INSN_P
+/* Cover function to store an insn value into an integral insn.  Must go here
+   because it needs <prefix>-desc.h for CGEN_INT_INSN_P.  */
+
+static void
+put_insn_int_value (CGEN_CPU_DESC cd ATTRIBUTE_UNUSED,
+		    CGEN_INSN_BYTES_PTR buf,
+		    int length,
+		    int insn_length,
+		    CGEN_INSN_INT value)
+{
+  /* For architectures with insns smaller than the base-insn-bitsize,
+     length may be too big.  */
+  if (length > insn_length)
+    *buf = value;
+  else
+    {
+      int shift = insn_length - length;
+      /* Written this way to avoid undefined behaviour.  */
+      CGEN_INSN_INT mask = (((1L << (length - 1)) - 1) << 1) | 1;
+
+      *buf = (*buf & ~(mask << shift)) | ((value & mask) << shift);
+    }
+}
+#endif
+
+/* Operand extraction.  */
+
+#if ! CGEN_INT_INSN_P
+
+/* Subroutine of extract_normal.
+   Ensure sufficient bytes are cached in EX_INFO.
+   OFFSET is the offset in bytes from the start of the insn of the value.
+   BYTES is the length of the needed value.
+   Returns 1 for success, 0 for failure.  */
+
+static CGEN_INLINE int
+fill_cache (CGEN_CPU_DESC cd ATTRIBUTE_UNUSED,
+	    CGEN_EXTRACT_INFO *ex_info,
+	    int offset,
+	    int bytes,
+	    bfd_vma pc)
+{
+  /* It's doubtful that the middle part has already been fetched so
+     we don't optimize that case.  kiss.  */
+  unsigned int mask;
+  disassemble_info *info = (disassemble_info *) ex_info->dis_info;
+
+  /* First do a quick check.  */
+  mask = (1 << bytes) - 1;
+  if (((ex_info->valid >> offset) & mask) == mask)
+    return 1;
+
+  /* Search for the first byte we need to read.  */
+  for (mask = 1 << offset; bytes > 0; --bytes, ++offset, mask <<= 1)
+    if (! (mask & ex_info->valid))
+      break;
+
+  if (bytes)
+    {
+      int status;
+
+      pc += offset;
+      status = (*info->read_memory_func)
+	(pc, ex_info->insn_bytes + offset, bytes, info);
+
+      if (status != 0)
+	{
+	  (*info->memory_error_func) (status, pc, info);
+	  return 0;
+	}
+
+      ex_info->valid |= ((1 << bytes) - 1) << offset;
+    }
+
+  return 1;
+}
+
+/* Subroutine of extract_normal.  */
+
+static CGEN_INLINE long
+extract_1 (CGEN_CPU_DESC cd,
+	   CGEN_EXTRACT_INFO *ex_info ATTRIBUTE_UNUSED,
+	   int start,
+	   int length,
+	   int word_length,
+	   unsigned char *bufp,
+	   bfd_vma pc ATTRIBUTE_UNUSED)
+{
+  unsigned long x;
+  int shift;
+
+  x = cgen_get_insn_value (cd, bufp, word_length);
+
+  if (CGEN_INSN_LSB0_P)
+    shift = (start + 1) - length;
+  else
+    shift = (word_length - (start + length));
+  return x >> shift;
+}
+
+#endif /* ! CGEN_INT_INSN_P */
+
+/* Default extraction routine.
+
+   INSN_VALUE is the first base_insn_bitsize bits of the insn in host order,
+   or sometimes less for cases like the m32r where the base insn size is 32
+   but some insns are 16 bits.
+   ATTRS is a mask of the boolean attributes.  We only need `SIGNED',
+   but for generality we take a bitmask of all of them.
+   WORD_OFFSET is the offset in bits from the start of the insn of the value.
+   WORD_LENGTH is the length of the word in bits in which the value resides.
+   START is the starting bit number in the word, architecture origin.
+   LENGTH is the length of VALUE in bits.
+   TOTAL_LENGTH is the total length of the insn in bits.
+
+   Returns 1 for success, 0 for failure.  */
+
+/* ??? The return code isn't properly used.  wip.  */
+
+/* ??? This doesn't handle bfd_vma's.  Create another function when
+   necessary.  */
+
+static int
+extract_normal (CGEN_CPU_DESC cd,
+#if ! CGEN_INT_INSN_P
+		CGEN_EXTRACT_INFO *ex_info,
+#else
+		CGEN_EXTRACT_INFO *ex_info ATTRIBUTE_UNUSED,
+#endif
+		CGEN_INSN_INT insn_value,
+		unsigned int attrs,
+		unsigned int word_offset,
+		unsigned int start,
+		unsigned int length,
+		unsigned int word_length,
+		unsigned int total_length,
+#if ! CGEN_INT_INSN_P
+		bfd_vma pc,
+#else
+		bfd_vma pc ATTRIBUTE_UNUSED,
+#endif
+		long *valuep)
+{
+  long value, mask;
+
+  /* If LENGTH is zero, this operand doesn't contribute to the value
+     so give it a standard value of zero.  */
+  if (length == 0)
+    {
+      *valuep = 0;
+      return 1;
+    }
+
+  if (word_length > 32)
+    abort ();
+
+  /* For architectures with insns smaller than the insn-base-bitsize,
+     word_length may be too big.  */
+  if (cd->min_insn_bitsize < cd->base_insn_bitsize)
+    {
+      if (word_offset + word_length > total_length)
+	word_length = total_length - word_offset;
+    }
+
+  /* Does the value reside in INSN_VALUE, and at the right alignment?  */
+
+  if (CGEN_INT_INSN_P || (word_offset == 0 && word_length == total_length))
+    {
+      if (CGEN_INSN_LSB0_P)
+	value = insn_value >> ((word_offset + start + 1) - length);
+      else
+	value = insn_value >> (total_length - ( word_offset + start + length));
+    }
+
+#if ! CGEN_INT_INSN_P
+
+  else
+    {
+      unsigned char *bufp = ex_info->insn_bytes + word_offset / 8;
+
+      if (word_length > 32)
+	abort ();
+
+      if (fill_cache (cd, ex_info, word_offset / 8, word_length / 8, pc) == 0)
+	return 0;
+
+      value = extract_1 (cd, ex_info, start, length, word_length, bufp, pc);
+    }
+
+#endif /* ! CGEN_INT_INSN_P */
+
+  /* Written this way to avoid undefined behaviour.  */
+  mask = (((1L << (length - 1)) - 1) << 1) | 1;
+
+  value &= mask;
+  /* sign extend? */
+  if (CGEN_BOOL_ATTR (attrs, CGEN_IFLD_SIGNED)
+      && (value & (1L << (length - 1))))
+    value |= ~mask;
+
+  *valuep = value;
+
+  return 1;
+}
+
+/* Default insn extractor.
+
+   INSN_VALUE is the first base_insn_bitsize bits, translated to host order.
+   The extracted fields are stored in FIELDS.
+   EX_INFO is used to handle reading variable length insns.
+   Return the length of the insn in bits, or 0 if no match,
+   or -1 if an error occurs fetching data (memory_error_func will have
+   been called).  */
+
+static int
+extract_insn_normal (CGEN_CPU_DESC cd,
+		     const CGEN_INSN *insn,
+		     CGEN_EXTRACT_INFO *ex_info,
+		     CGEN_INSN_INT insn_value,
+		     CGEN_FIELDS *fields,
+		     bfd_vma pc)
+{
+  const CGEN_SYNTAX *syntax = CGEN_INSN_SYNTAX (insn);
+  const CGEN_SYNTAX_CHAR_TYPE *syn;
+
+  CGEN_FIELDS_BITSIZE (fields) = CGEN_INSN_BITSIZE (insn);
+
+  CGEN_INIT_EXTRACT (cd);
+
+  for (syn = CGEN_SYNTAX_STRING (syntax); *syn; ++syn)
+    {
+      int length;
+
+      if (CGEN_SYNTAX_CHAR_P (*syn))
+	continue;
+
+      length = (* cd->extract_operand) (cd, CGEN_SYNTAX_FIELD (*syn),
+					ex_info, insn_value, fields, pc);
+      if (length <= 0)
+	return length;
+    }
+
+  /* We recognized and successfully extracted this insn.  */
+  return CGEN_INSN_BITSIZE (insn);
+}
+
+/* Machine generated code added here.  */
+
+const char * arc_cgen_insert_operand
+  (CGEN_CPU_DESC, int, CGEN_FIELDS *, CGEN_INSN_BYTES_PTR, bfd_vma);
+
+/* Main entry point for operand insertion.
+
+   This function is basically just a big switch statement.  Earlier versions
+   used tables to look up the function to use, but
+   - if the table contains both assembler and disassembler functions then
+     the disassembler contains much of the assembler and vice-versa,
+   - there's a lot of inlining possibilities as things grow,
+   - using a switch statement avoids the function call overhead.
+
+   This function could be moved into `parse_insn_normal', but keeping it
+   separate makes clear the interface between `parse_insn_normal' and each of
+   the handlers.  It's also needed by GAS to insert operands that couldn't be
+   resolved during parsing.  */
+
+const char *
+arc_cgen_insert_operand (CGEN_CPU_DESC cd,
+			     int opindex,
+			     CGEN_FIELDS * fields,
+			     CGEN_INSN_BYTES_PTR buffer,
+			     bfd_vma pc ATTRIBUTE_UNUSED)
+{
+  const char * errmsg = NULL;
+  unsigned int total_length = CGEN_FIELDS_BITSIZE (fields);
+
+  switch (opindex)
+    {
+    case ARC_OPERAND_EXDI :
+      errmsg = insert_normal (cd, fields->f_F, 0, 0, 16, 1, 32, total_length, buffer);
+      break;
+    case ARC_OPERAND_F :
+      errmsg = insert_normal (cd, fields->f_F, 0, 0, 16, 1, 32, total_length, buffer);
+      break;
+    case ARC_OPERAND_F0 :
+      errmsg = insert_normal (cd, fields->f_F, 0, 0, 16, 1, 32, total_length, buffer);
+      break;
+    case ARC_OPERAND_F1 :
+      errmsg = insert_normal (cd, fields->f_F, 0, 0, 16, 1, 32, total_length, buffer);
+      break;
+    case ARC_OPERAND_F1F :
+      errmsg = insert_normal (cd, fields->f_F, 0, 0, 16, 1, 32, total_length, buffer);
+      break;
+    case ARC_OPERAND_GP :
+      break;
+    case ARC_OPERAND_LDODI :
+      errmsg = insert_normal (cd, fields->f_LDODi, 0, 0, 20, 1, 32, total_length, buffer);
+      break;
+    case ARC_OPERAND_LDRDI :
+      errmsg = insert_normal (cd, fields->f_LDRDi, 0, 0, 16, 1, 32, total_length, buffer);
+      break;
+    case ARC_OPERAND_NE :
+      break;
+    case ARC_OPERAND_PCL :
+      break;
+    case ARC_OPERAND_QCONDB :
+      errmsg = insert_normal (cd, fields->f_cond_Q, 0, 0, 27, 5, 32, total_length, buffer);
+      break;
+    case ARC_OPERAND_QCONDI :
+      errmsg = insert_normal (cd, fields->f_cond_Q, 0, 0, 27, 5, 32, total_length, buffer);
+      break;
+    case ARC_OPERAND_QCONDJ :
+      errmsg = insert_normal (cd, fields->f_cond_Q, 0, 0, 27, 5, 32, total_length, buffer);
+      break;
+    case ARC_OPERAND_R0 :
+      break;
+    case ARC_OPERAND_R31 :
+      break;
+    case ARC_OPERAND_RA :
+      errmsg = insert_normal (cd, fields->f_op_A, 0, 0, 26, 6, 32, total_length, buffer);
+      break;
+    case ARC_OPERAND_RA_0 :
+      errmsg = insert_normal (cd, fields->f_op_A, 0, 0, 26, 6, 32, total_length, buffer);
+      break;
+    case ARC_OPERAND_RB :
+      {
+{
+  FLD (f_op__b) = ((FLD (f_op_B)) & (7));
+  FLD (f_B_5_3) = ((unsigned int) (FLD (f_op_B)) >> (3));
+}
+        errmsg = insert_normal (cd, fields->f_op__b, 0, 0, 5, 3, 32, total_length, buffer);
+        if (errmsg)
+          break;
+        errmsg = insert_normal (cd, fields->f_B_5_3, 0, 0, 17, 3, 32, total_length, buffer);
+        if (errmsg)
+          break;
+      }
+      break;
+    case ARC_OPERAND_RB_0 :
+      {
+{
+  FLD (f_op__b) = ((FLD (f_op_B)) & (7));
+  FLD (f_B_5_3) = ((unsigned int) (FLD (f_op_B)) >> (3));
+}
+        errmsg = insert_normal (cd, fields->f_op__b, 0, 0, 5, 3, 32, total_length, buffer);
+        if (errmsg)
+          break;
+        errmsg = insert_normal (cd, fields->f_B_5_3, 0, 0, 17, 3, 32, total_length, buffer);
+        if (errmsg)
+          break;
+      }
+      break;
+    case ARC_OPERAND_RC :
+      errmsg = insert_normal (cd, fields->f_op_C, 0, 0, 20, 6, 32, total_length, buffer);
+      break;
+    case ARC_OPERAND_RC_ILINK :
+      errmsg = insert_normal (cd, fields->f_op_Cj, 0, 0, 20, 6, 32, total_length, buffer);
+      break;
+    case ARC_OPERAND_RC_NOILINK :
+      errmsg = insert_normal (cd, fields->f_op_Cj, 0, 0, 20, 6, 32, total_length, buffer);
+      break;
+    case ARC_OPERAND_R_A :
+      errmsg = insert_normal (cd, fields->f_op__a, 0, 0, 13, 3, 32, total_length, buffer);
+      break;
+    case ARC_OPERAND_R_B :
+      errmsg = insert_normal (cd, fields->f_op__b, 0, 0, 5, 3, 32, total_length, buffer);
+      break;
+    case ARC_OPERAND_R_C :
+      errmsg = insert_normal (cd, fields->f_op__c, 0, 0, 8, 3, 32, total_length, buffer);
+      break;
+    case ARC_OPERAND_RCC :
+      errmsg = insert_normal (cd, fields->f_brcond, 0, 0, 28, 4, 32, total_length, buffer);
+      break;
+    case ARC_OPERAND_RCCS :
+      errmsg = insert_normal (cd, fields->f_brscond, 0, 0, 8, 1, 32, total_length, buffer);
+      break;
+    case ARC_OPERAND_RH :
+      {
+{
+  FLD (f_h_2_0) = ((FLD (f_op_h)) & (7));
+  FLD (f_h_5_3) = ((unsigned int) (FLD (f_op_h)) >> (3));
+}
+        errmsg = insert_normal (cd, fields->f_h_2_0, 0, 0, 8, 3, 32, total_length, buffer);
+        if (errmsg)
+          break;
+        errmsg = insert_normal (cd, fields->f_h_5_3, 0, 0, 13, 3, 32, total_length, buffer);
+        if (errmsg)
+          break;
+      }
+      break;
+    case ARC_OPERAND_SP :
+      break;
+    case ARC_OPERAND_STODI :
+      errmsg = insert_normal (cd, fields->f_STODi, 0, 0, 26, 1, 32, total_length, buffer);
+      break;
+    case ARC_OPERAND_U6 :
+      errmsg = insert_normal (cd, fields->f_u6, 0, 0, 20, 6, 32, total_length, buffer);
+      break;
+    case ARC_OPERAND_U6X2 :
+      {
+        long value = fields->f_u6x2;
+        value = ((unsigned int) (value) >> (1));
+        errmsg = insert_normal (cd, value, 0, 0, 20, 6, 32, total_length, buffer);
+      }
+      break;
+    case ARC_OPERAND__AW :
+      break;
+    case ARC_OPERAND__L :
+      break;
+    case ARC_OPERAND__S :
+      break;
+    case ARC_OPERAND_CBIT :
+      break;
+    case ARC_OPERAND_DELAY_N :
+      errmsg = insert_normal (cd, fields->f_delay_N, 0, 0, 26, 1, 32, total_length, buffer);
+      break;
+    case ARC_OPERAND_DUMMY_OP :
+      errmsg = insert_normal (cd, fields->f_dummy, 0, 0, 16, 16, 32, total_length, buffer);
+      break;
+    case ARC_OPERAND_I2COND :
+      errmsg = insert_normal (cd, fields->f_cond_i2, 0, 0, 5, 2, 32, total_length, buffer);
+      break;
+    case ARC_OPERAND_I3COND :
+      errmsg = insert_normal (cd, fields->f_cond_i3, 0, 0, 7, 3, 32, total_length, buffer);
+      break;
+    case ARC_OPERAND_LABEL10 :
+      {
+        long value = fields->f_rel10;
+        value = ((int) (((value) - (((pc) & (-4))))) >> (1));
+        errmsg = insert_normal (cd, value, 0|(1<<CGEN_IFLD_SIGNED)|(1<<CGEN_IFLD_PCREL_ADDR), 0, 7, 9, 32, total_length, buffer);
+      }
+      break;
+    case ARC_OPERAND_LABEL13A :
+      {
+        long value = fields->f_rel13bl;
+        value = ((int) (((value) - (((pc) & (-4))))) >> (2));
+        errmsg = insert_normal (cd, value, 0|(1<<CGEN_IFLD_SIGNED)|(1<<CGEN_IFLD_PCREL_ADDR), 0, 5, 11, 32, total_length, buffer);
+      }
+      break;
+    case ARC_OPERAND_LABEL21 :
+      {
+{
+  FLD (f_d21l) = ((((unsigned int) (((FLD (f_rel21)) - (((pc) & (-4))))) >> (1))) & (1023));
+  FLD (f_d21h) = ((unsigned int) (((FLD (f_rel21)) - (((pc) & (-4))))) >> (11));
+}
+        errmsg = insert_normal (cd, fields->f_d21l, 0, 0, 5, 10, 32, total_length, buffer);
+        if (errmsg)
+          break;
+        errmsg = insert_normal (cd, fields->f_d21h, 0|(1<<CGEN_IFLD_SIGNED), 0, 16, 10, 32, total_length, buffer);
+        if (errmsg)
+          break;
+      }
+      break;
+    case ARC_OPERAND_LABEL21A :
+      {
+{
+  FLD (f_d21bl) = ((((unsigned int) (((FLD (f_rel21bl)) - (((pc) & (-4))))) >> (2))) & (511));
+  FLD (f_d21h) = ((unsigned int) (((FLD (f_rel21bl)) - (((pc) & (-4))))) >> (11));
+}
+        errmsg = insert_normal (cd, fields->f_d21bl, 0, 0, 5, 9, 32, total_length, buffer);
+        if (errmsg)
+          break;
+        errmsg = insert_normal (cd, fields->f_d21h, 0|(1<<CGEN_IFLD_SIGNED), 0, 16, 10, 32, total_length, buffer);
+        if (errmsg)
+          break;
+      }
+      break;
+    case ARC_OPERAND_LABEL25 :
+      {
+{
+  FLD (f_d21l) = ((((unsigned int) (((FLD (f_rel25)) - (((pc) & (-4))))) >> (1))) & (1023));
+  FLD (f_d25m) = ((unsigned int) (((FLD (f_rel25)) - (((pc) & (-4))))) >> (11));
+  FLD (f_d25h) = ((unsigned int) (((FLD (f_rel25)) - (((pc) & (-4))))) >> (21));
+}
+        errmsg = insert_normal (cd, fields->f_d21l, 0, 0, 5, 10, 32, total_length, buffer);
+        if (errmsg)
+          break;
+        errmsg = insert_normal (cd, fields->f_d25m, 0, 0, 16, 10, 32, total_length, buffer);
+        if (errmsg)
+          break;
+        errmsg = insert_normal (cd, fields->f_d25h, 0|(1<<CGEN_IFLD_SIGNED), 0, 28, 4, 32, total_length, buffer);
+        if (errmsg)
+          break;
+      }
+      break;
+    case ARC_OPERAND_LABEL25A :
+      {
+{
+  FLD (f_d21bl) = ((((unsigned int) (((FLD (f_rel25bl)) - (((pc) & (-4))))) >> (2))) & (511));
+  FLD (f_d25m) = ((unsigned int) (((FLD (f_rel25bl)) - (((pc) & (-4))))) >> (11));
+  FLD (f_d25h) = ((unsigned int) (((FLD (f_rel25bl)) - (((pc) & (-4))))) >> (21));
+}
+        errmsg = insert_normal (cd, fields->f_d21bl, 0, 0, 5, 9, 32, total_length, buffer);
+        if (errmsg)
+          break;
+        errmsg = insert_normal (cd, fields->f_d25m, 0, 0, 16, 10, 32, total_length, buffer);
+        if (errmsg)
+          break;
+        errmsg = insert_normal (cd, fields->f_d25h, 0|(1<<CGEN_IFLD_SIGNED), 0, 28, 4, 32, total_length, buffer);
+        if (errmsg)
+          break;
+      }
+      break;
+    case ARC_OPERAND_LABEL7 :
+      {
+        long value = fields->f_rel7;
+        value = ((int) (((value) - (((pc) & (-4))))) >> (1));
+        errmsg = insert_normal (cd, value, 0|(1<<CGEN_IFLD_SIGNED)|(1<<CGEN_IFLD_PCREL_ADDR), 0, 10, 6, 32, total_length, buffer);
+      }
+      break;
+    case ARC_OPERAND_LABEL8 :
+      {
+        long value = fields->f_rel8;
+        value = ((int) (((value) - (((pc) & (-4))))) >> (1));
+        errmsg = insert_normal (cd, value, 0|(1<<CGEN_IFLD_SIGNED)|(1<<CGEN_IFLD_PCREL_ADDR), 0, 9, 7, 32, total_length, buffer);
+      }
+      break;
+    case ARC_OPERAND_LABEL9 :
+      {
+{
+  FLD (f_d9l) = ((((unsigned int) (((FLD (f_rel9)) - (((pc) & (-4))))) >> (1))) & (127));
+  FLD (f_d9h) = ((unsigned int) (((FLD (f_rel9)) - (((pc) & (-4))))) >> (8));
+}
+        errmsg = insert_normal (cd, fields->f_d9l, 0, 0, 8, 7, 32, total_length, buffer);
+        if (errmsg)
+          break;
+        errmsg = insert_normal (cd, fields->f_d9h, 0|(1<<CGEN_IFLD_SIGNED), 0, 16, 1, 32, total_length, buffer);
+        if (errmsg)
+          break;
+      }
+      break;
+    case ARC_OPERAND_LBIT :
+      break;
+    case ARC_OPERAND_NBIT :
+      break;
+    case ARC_OPERAND_S12 :
+      {
+{
+  FLD (f_u6) = ((FLD (f_s12)) & (63));
+  FLD (f_s12h) = ((unsigned int) (FLD (f_s12)) >> (6));
+}
+        errmsg = insert_normal (cd, fields->f_u6, 0, 0, 20, 6, 32, total_length, buffer);
+        if (errmsg)
+          break;
+        errmsg = insert_normal (cd, fields->f_s12h, 0|(1<<CGEN_IFLD_SIGNED), 0, 26, 6, 32, total_length, buffer);
+        if (errmsg)
+          break;
+      }
+      break;
+    case ARC_OPERAND_S12X2 :
+      {
+{
+  FLD (f_u6) = ((((unsigned int) (FLD (f_s12x2)) >> (1))) & (63));
+  FLD (f_s12h) = ((unsigned int) (FLD (f_s12x2)) >> (7));
+}
+        errmsg = insert_normal (cd, fields->f_u6, 0, 0, 20, 6, 32, total_length, buffer);
+        if (errmsg)
+          break;
+        errmsg = insert_normal (cd, fields->f_s12h, 0|(1<<CGEN_IFLD_SIGNED), 0, 26, 6, 32, total_length, buffer);
+        if (errmsg)
+          break;
+      }
+      break;
+    case ARC_OPERAND_S1BIT :
+      break;
+    case ARC_OPERAND_S2BIT :
+      break;
+    case ARC_OPERAND_S9 :
+      {
+{
+  FLD (f_u8) = ((FLD (f_s9)) & (255));
+  FLD (f_d9h) = ((unsigned int) (FLD (f_s9)) >> (8));
+}
+        errmsg = insert_normal (cd, fields->f_u8, 0, 0, 8, 8, 32, total_length, buffer);
+        if (errmsg)
+          break;
+        errmsg = insert_normal (cd, fields->f_d9h, 0|(1<<CGEN_IFLD_SIGNED), 0, 16, 1, 32, total_length, buffer);
+        if (errmsg)
+          break;
+      }
+      break;
+    case ARC_OPERAND_S9X4 :
+      {
+        long value = fields->f_s9x4;
+        value = ((unsigned int) (value) >> (2));
+        errmsg = insert_normal (cd, value, 0|(1<<CGEN_IFLD_SIGNED), 0, 7, 9, 32, total_length, buffer);
+      }
+      break;
+    case ARC_OPERAND_SC_S9_ :
+      {
+        long value = fields->f_s9x4;
+        value = ((unsigned int) (value) >> (2));
+        errmsg = insert_normal (cd, value, 0|(1<<CGEN_IFLD_SIGNED), 0, 7, 9, 32, total_length, buffer);
+      }
+      break;
+    case ARC_OPERAND_SC_S9B :
+      errmsg = insert_normal (cd, fields->f_s9x1, 0|(1<<CGEN_IFLD_SIGNED), 0, 7, 9, 32, total_length, buffer);
+      break;
+    case ARC_OPERAND_SC_S9W :
+      {
+        long value = fields->f_s9x2;
+        value = ((unsigned int) (value) >> (1));
+        errmsg = insert_normal (cd, value, 0|(1<<CGEN_IFLD_SIGNED), 0, 7, 9, 32, total_length, buffer);
+      }
+      break;
+    case ARC_OPERAND_SC_U5_ :
+      {
+        long value = fields->f_u5x4;
+        value = ((unsigned int) (value) >> (2));
+        errmsg = insert_normal (cd, value, 0, 0, 11, 5, 32, total_length, buffer);
+      }
+      break;
+    case ARC_OPERAND_SC_U5B :
+      errmsg = insert_normal (cd, fields->f_u5, 0, 0, 11, 5, 32, total_length, buffer);
+      break;
+    case ARC_OPERAND_SC_U5W :
+      {
+        long value = fields->f_u5x2;
+        value = ((unsigned int) (value) >> (1));
+        errmsg = insert_normal (cd, value, 0, 0, 11, 5, 32, total_length, buffer);
+      }
+      break;
+    case ARC_OPERAND_TRAPNUM :
+      errmsg = insert_normal (cd, fields->f_trapnum, 0, 0, 5, 6, 32, total_length, buffer);
+      break;
+    case ARC_OPERAND_U3 :
+      errmsg = insert_normal (cd, fields->f_u3, 0, 0, 13, 3, 32, total_length, buffer);
+      break;
+    case ARC_OPERAND_U5 :
+      errmsg = insert_normal (cd, fields->f_u5, 0, 0, 11, 5, 32, total_length, buffer);
+      break;
+    case ARC_OPERAND_U5X4 :
+      {
+        long value = fields->f_u5x4;
+        value = ((unsigned int) (value) >> (2));
+        errmsg = insert_normal (cd, value, 0, 0, 11, 5, 32, total_length, buffer);
+      }
+      break;
+    case ARC_OPERAND_U7 :
+      errmsg = insert_normal (cd, fields->f_u7, 0, 0, 9, 7, 32, total_length, buffer);
+      break;
+    case ARC_OPERAND_U8 :
+      errmsg = insert_normal (cd, fields->f_u8, 0, 0, 8, 8, 32, total_length, buffer);
+      break;
+    case ARC_OPERAND_U8X4 :
+      {
+        long value = fields->f_u8x4;
+        value = ((unsigned int) (value) >> (2));
+        errmsg = insert_normal (cd, value, 0, 0, 8, 8, 32, total_length, buffer);
+      }
+      break;
+    case ARC_OPERAND_UNCONDB :
+      break;
+    case ARC_OPERAND_UNCONDI :
+      break;
+    case ARC_OPERAND_UNCONDJ :
+      break;
+    case ARC_OPERAND_VBIT :
+      break;
+    case ARC_OPERAND_ZBIT :
+      break;
+
+    default :
+      /* xgettext:c-format */
+      fprintf (stderr, _("Unrecognized field %d while building insn.\n"),
+	       opindex);
+      abort ();
+  }
+
+  return errmsg;
+}
+
+int arc_cgen_extract_operand
+  (CGEN_CPU_DESC, int, CGEN_EXTRACT_INFO *, CGEN_INSN_INT, CGEN_FIELDS *, bfd_vma);
+
+/* Main entry point for operand extraction.
+   The result is <= 0 for error, >0 for success.
+   ??? Actual values aren't well defined right now.
+
+   This function is basically just a big switch statement.  Earlier versions
+   used tables to look up the function to use, but
+   - if the table contains both assembler and disassembler functions then
+     the disassembler contains much of the assembler and vice-versa,
+   - there's a lot of inlining possibilities as things grow,
+   - using a switch statement avoids the function call overhead.
+
+   This function could be moved into `print_insn_normal', but keeping it
+   separate makes clear the interface between `print_insn_normal' and each of
+   the handlers.  */
+
+int
+arc_cgen_extract_operand (CGEN_CPU_DESC cd,
+			     int opindex,
+			     CGEN_EXTRACT_INFO *ex_info,
+			     CGEN_INSN_INT insn_value,
+			     CGEN_FIELDS * fields,
+			     bfd_vma pc)
+{
+  /* Assume success (for those operands that are nops).  */
+  int length = 1;
+  unsigned int total_length = CGEN_FIELDS_BITSIZE (fields);
+
+  switch (opindex)
+    {
+    case ARC_OPERAND_EXDI :
+      length = extract_normal (cd, ex_info, insn_value, 0, 0, 16, 1, 32, total_length, pc, & fields->f_F);
+      break;
+    case ARC_OPERAND_F :
+      length = extract_normal (cd, ex_info, insn_value, 0, 0, 16, 1, 32, total_length, pc, & fields->f_F);
+      break;
+    case ARC_OPERAND_F0 :
+      length = extract_normal (cd, ex_info, insn_value, 0, 0, 16, 1, 32, total_length, pc, & fields->f_F);
+      break;
+    case ARC_OPERAND_F1 :
+      length = extract_normal (cd, ex_info, insn_value, 0, 0, 16, 1, 32, total_length, pc, & fields->f_F);
+      break;
+    case ARC_OPERAND_F1F :
+      length = extract_normal (cd, ex_info, insn_value, 0, 0, 16, 1, 32, total_length, pc, & fields->f_F);
+      break;
+    case ARC_OPERAND_GP :
+      break;
+    case ARC_OPERAND_LDODI :
+      length = extract_normal (cd, ex_info, insn_value, 0, 0, 20, 1, 32, total_length, pc, & fields->f_LDODi);
+      break;
+    case ARC_OPERAND_LDRDI :
+      length = extract_normal (cd, ex_info, insn_value, 0, 0, 16, 1, 32, total_length, pc, & fields->f_LDRDi);
+      break;
+    case ARC_OPERAND_NE :
+      break;
+    case ARC_OPERAND_PCL :
+      break;
+    case ARC_OPERAND_QCONDB :
+      length = extract_normal (cd, ex_info, insn_value, 0, 0, 27, 5, 32, total_length, pc, & fields->f_cond_Q);
+      break;
+    case ARC_OPERAND_QCONDI :
+      length = extract_normal (cd, ex_info, insn_value, 0, 0, 27, 5, 32, total_length, pc, & fields->f_cond_Q);
+      break;
+    case ARC_OPERAND_QCONDJ :
+      length = extract_normal (cd, ex_info, insn_value, 0, 0, 27, 5, 32, total_length, pc, & fields->f_cond_Q);
+      break;
+    case ARC_OPERAND_R0 :
+      break;
+    case ARC_OPERAND_R31 :
+      break;
+    case ARC_OPERAND_RA :
+      length = extract_normal (cd, ex_info, insn_value, 0, 0, 26, 6, 32, total_length, pc, & fields->f_op_A);
+      break;
+    case ARC_OPERAND_RA_0 :
+      length = extract_normal (cd, ex_info, insn_value, 0, 0, 26, 6, 32, total_length, pc, & fields->f_op_A);
+      break;
+    case ARC_OPERAND_RB :
+      {
+        length = extract_normal (cd, ex_info, insn_value, 0, 0, 5, 3, 32, total_length, pc, & fields->f_op__b);
+        if (length <= 0) break;
+        length = extract_normal (cd, ex_info, insn_value, 0, 0, 17, 3, 32, total_length, pc, & fields->f_B_5_3);
+        if (length <= 0) break;
+{
+  FLD (f_op_B) = ((FLD (f_op__b)) | (((FLD (f_B_5_3)) << (3))));
+}
+      }
+      break;
+    case ARC_OPERAND_RB_0 :
+      {
+        length = extract_normal (cd, ex_info, insn_value, 0, 0, 5, 3, 32, total_length, pc, & fields->f_op__b);
+        if (length <= 0) break;
+        length = extract_normal (cd, ex_info, insn_value, 0, 0, 17, 3, 32, total_length, pc, & fields->f_B_5_3);
+        if (length <= 0) break;
+{
+  FLD (f_op_B) = ((FLD (f_op__b)) | (((FLD (f_B_5_3)) << (3))));
+}
+      }
+      break;
+    case ARC_OPERAND_RC :
+      length = extract_normal (cd, ex_info, insn_value, 0, 0, 20, 6, 32, total_length, pc, & fields->f_op_C);
+      break;
+    case ARC_OPERAND_RC_ILINK :
+      length = extract_normal (cd, ex_info, insn_value, 0, 0, 20, 6, 32, total_length, pc, & fields->f_op_Cj);
+      break;
+    case ARC_OPERAND_RC_NOILINK :
+      length = extract_normal (cd, ex_info, insn_value, 0, 0, 20, 6, 32, total_length, pc, & fields->f_op_Cj);
+      break;
+    case ARC_OPERAND_R_A :
+      length = extract_normal (cd, ex_info, insn_value, 0, 0, 13, 3, 32, total_length, pc, & fields->f_op__a);
+      break;
+    case ARC_OPERAND_R_B :
+      length = extract_normal (cd, ex_info, insn_value, 0, 0, 5, 3, 32, total_length, pc, & fields->f_op__b);
+      break;
+    case ARC_OPERAND_R_C :
+      length = extract_normal (cd, ex_info, insn_value, 0, 0, 8, 3, 32, total_length, pc, & fields->f_op__c);
+      break;
+    case ARC_OPERAND_RCC :
+      length = extract_normal (cd, ex_info, insn_value, 0, 0, 28, 4, 32, total_length, pc, & fields->f_brcond);
+      break;
+    case ARC_OPERAND_RCCS :
+      length = extract_normal (cd, ex_info, insn_value, 0, 0, 8, 1, 32, total_length, pc, & fields->f_brscond);
+      break;
+    case ARC_OPERAND_RH :
+      {
+        length = extract_normal (cd, ex_info, insn_value, 0, 0, 8, 3, 32, total_length, pc, & fields->f_h_2_0);
+        if (length <= 0) break;
+        length = extract_normal (cd, ex_info, insn_value, 0, 0, 13, 3, 32, total_length, pc, & fields->f_h_5_3);
+        if (length <= 0) break;
+{
+  FLD (f_op_h) = ((FLD (f_h_2_0)) | (((FLD (f_h_5_3)) << (3))));
+}
+      }
+      break;
+    case ARC_OPERAND_SP :
+      break;
+    case ARC_OPERAND_STODI :
+      length = extract_normal (cd, ex_info, insn_value, 0, 0, 26, 1, 32, total_length, pc, & fields->f_STODi);
+      break;
+    case ARC_OPERAND_U6 :
+      length = extract_normal (cd, ex_info, insn_value, 0, 0, 20, 6, 32, total_length, pc, & fields->f_u6);
+      break;
+    case ARC_OPERAND_U6X2 :
+      {
+        long value;
+        length = extract_normal (cd, ex_info, insn_value, 0, 0, 20, 6, 32, total_length, pc, & value);
+        value = ((value) << (1));
+        fields->f_u6x2 = value;
+      }
+      break;
+    case ARC_OPERAND__AW :
+      break;
+    case ARC_OPERAND__L :
+      break;
+    case ARC_OPERAND__S :
+      break;
+    case ARC_OPERAND_CBIT :
+      break;
+    case ARC_OPERAND_DELAY_N :
+      length = extract_normal (cd, ex_info, insn_value, 0, 0, 26, 1, 32, total_length, pc, & fields->f_delay_N);
+      break;
+    case ARC_OPERAND_DUMMY_OP :
+      length = extract_normal (cd, ex_info, insn_value, 0, 0, 16, 16, 32, total_length, pc, & fields->f_dummy);
+      break;
+    case ARC_OPERAND_I2COND :
+      length = extract_normal (cd, ex_info, insn_value, 0, 0, 5, 2, 32, total_length, pc, & fields->f_cond_i2);
+      break;
+    case ARC_OPERAND_I3COND :
+      length = extract_normal (cd, ex_info, insn_value, 0, 0, 7, 3, 32, total_length, pc, & fields->f_cond_i3);
+      break;
+    case ARC_OPERAND_LABEL10 :
+      {
+        long value;
+        length = extract_normal (cd, ex_info, insn_value, 0|(1<<CGEN_IFLD_SIGNED)|(1<<CGEN_IFLD_PCREL_ADDR), 0, 7, 9, 32, total_length, pc, & value);
+        value = ((((value) << (1))) + (((pc) & (-4))));
+        fields->f_rel10 = value;
+      }
+      break;
+    case ARC_OPERAND_LABEL13A :
+      {
+        long value;
+        length = extract_normal (cd, ex_info, insn_value, 0|(1<<CGEN_IFLD_SIGNED)|(1<<CGEN_IFLD_PCREL_ADDR), 0, 5, 11, 32, total_length, pc, & value);
+        value = ((((value) << (2))) + (((pc) & (-4))));
+        fields->f_rel13bl = value;
+      }
+      break;
+    case ARC_OPERAND_LABEL21 :
+      {
+        length = extract_normal (cd, ex_info, insn_value, 0, 0, 5, 10, 32, total_length, pc, & fields->f_d21l);
+        if (length <= 0) break;
+        length = extract_normal (cd, ex_info, insn_value, 0|(1<<CGEN_IFLD_SIGNED), 0, 16, 10, 32, total_length, pc, & fields->f_d21h);
+        if (length <= 0) break;
+{
+  FLD (f_rel21) = ((((((FLD (f_d21l)) << (1))) | (((FLD (f_d21h)) << (11))))) + (((pc) & (-4))));
+}
+      }
+      break;
+    case ARC_OPERAND_LABEL21A :
+      {
+        length = extract_normal (cd, ex_info, insn_value, 0, 0, 5, 9, 32, total_length, pc, & fields->f_d21bl);
+        if (length <= 0) break;
+        length = extract_normal (cd, ex_info, insn_value, 0|(1<<CGEN_IFLD_SIGNED), 0, 16, 10, 32, total_length, pc, & fields->f_d21h);
+        if (length <= 0) break;
+{
+  FLD (f_rel21bl) = ((((((FLD (f_d21bl)) << (2))) | (((FLD (f_d21h)) << (11))))) + (((pc) & (-4))));
+}
+      }
+      break;
+    case ARC_OPERAND_LABEL25 :
+      {
+        length = extract_normal (cd, ex_info, insn_value, 0, 0, 5, 10, 32, total_length, pc, & fields->f_d21l);
+        if (length <= 0) break;
+        length = extract_normal (cd, ex_info, insn_value, 0, 0, 16, 10, 32, total_length, pc, & fields->f_d25m);
+        if (length <= 0) break;
+        length = extract_normal (cd, ex_info, insn_value, 0|(1<<CGEN_IFLD_SIGNED), 0, 28, 4, 32, total_length, pc, & fields->f_d25h);
+        if (length <= 0) break;
+{
+  FLD (f_rel25) = ((((((((FLD (f_d21l)) << (1))) | (((FLD (f_d25m)) << (11))))) | (((FLD (f_d25h)) << (21))))) + (((pc) & (-4))));
+}
+      }
+      break;
+    case ARC_OPERAND_LABEL25A :
+      {
+        length = extract_normal (cd, ex_info, insn_value, 0, 0, 5, 9, 32, total_length, pc, & fields->f_d21bl);
+        if (length <= 0) break;
+        length = extract_normal (cd, ex_info, insn_value, 0, 0, 16, 10, 32, total_length, pc, & fields->f_d25m);
+        if (length <= 0) break;
+        length = extract_normal (cd, ex_info, insn_value, 0|(1<<CGEN_IFLD_SIGNED), 0, 28, 4, 32, total_length, pc, & fields->f_d25h);
+        if (length <= 0) break;
+{
+  FLD (f_rel25bl) = ((((((((FLD (f_d21bl)) << (2))) | (((FLD (f_d25m)) << (11))))) | (((FLD (f_d25h)) << (21))))) + (((pc) & (-4))));
+}
+      }
+      break;
+    case ARC_OPERAND_LABEL7 :
+      {
+        long value;
+        length = extract_normal (cd, ex_info, insn_value, 0|(1<<CGEN_IFLD_SIGNED)|(1<<CGEN_IFLD_PCREL_ADDR), 0, 10, 6, 32, total_length, pc, & value);
+        value = ((((value) << (1))) + (((pc) & (-4))));
+        fields->f_rel7 = value;
+      }
+      break;
+    case ARC_OPERAND_LABEL8 :
+      {
+        long value;
+        length = extract_normal (cd, ex_info, insn_value, 0|(1<<CGEN_IFLD_SIGNED)|(1<<CGEN_IFLD_PCREL_ADDR), 0, 9, 7, 32, total_length, pc, & value);
+        value = ((((value) << (1))) + (((pc) & (-4))));
+        fields->f_rel8 = value;
+      }
+      break;
+    case ARC_OPERAND_LABEL9 :
+      {
+        length = extract_normal (cd, ex_info, insn_value, 0, 0, 8, 7, 32, total_length, pc, & fields->f_d9l);
+        if (length <= 0) break;
+        length = extract_normal (cd, ex_info, insn_value, 0|(1<<CGEN_IFLD_SIGNED), 0, 16, 1, 32, total_length, pc, & fields->f_d9h);
+        if (length <= 0) break;
+{
+  FLD (f_rel9) = ((((((FLD (f_d9l)) << (1))) | (((FLD (f_d9h)) << (8))))) + (((pc) & (-4))));
+}
+      }
+      break;
+    case ARC_OPERAND_LBIT :
+      break;
+    case ARC_OPERAND_NBIT :
+      break;
+    case ARC_OPERAND_S12 :
+      {
+        length = extract_normal (cd, ex_info, insn_value, 0, 0, 20, 6, 32, total_length, pc, & fields->f_u6);
+        if (length <= 0) break;
+        length = extract_normal (cd, ex_info, insn_value, 0|(1<<CGEN_IFLD_SIGNED), 0, 26, 6, 32, total_length, pc, & fields->f_s12h);
+        if (length <= 0) break;
+{
+  FLD (f_s12) = ((FLD (f_u6)) | (((FLD (f_s12h)) << (6))));
+}
+      }
+      break;
+    case ARC_OPERAND_S12X2 :
+      {
+        length = extract_normal (cd, ex_info, insn_value, 0, 0, 20, 6, 32, total_length, pc, & fields->f_u6);
+        if (length <= 0) break;
+        length = extract_normal (cd, ex_info, insn_value, 0|(1<<CGEN_IFLD_SIGNED), 0, 26, 6, 32, total_length, pc, & fields->f_s12h);
+        if (length <= 0) break;
+{
+  FLD (f_s12x2) = ((((FLD (f_u6)) << (1))) | (((FLD (f_s12h)) << (7))));
+}
+      }
+      break;
+    case ARC_OPERAND_S1BIT :
+      break;
+    case ARC_OPERAND_S2BIT :
+      break;
+    case ARC_OPERAND_S9 :
+      {
+        length = extract_normal (cd, ex_info, insn_value, 0, 0, 8, 8, 32, total_length, pc, & fields->f_u8);
+        if (length <= 0) break;
+        length = extract_normal (cd, ex_info, insn_value, 0|(1<<CGEN_IFLD_SIGNED), 0, 16, 1, 32, total_length, pc, & fields->f_d9h);
+        if (length <= 0) break;
+{
+  FLD (f_s9) = ((FLD (f_u8)) | (((FLD (f_d9h)) << (8))));
+}
+      }
+      break;
+    case ARC_OPERAND_S9X4 :
+      {
+        long value;
+        length = extract_normal (cd, ex_info, insn_value, 0|(1<<CGEN_IFLD_SIGNED), 0, 7, 9, 32, total_length, pc, & value);
+        value = ((value) << (2));
+        fields->f_s9x4 = value;
+      }
+      break;
+    case ARC_OPERAND_SC_S9_ :
+      {
+        long value;
+        length = extract_normal (cd, ex_info, insn_value, 0|(1<<CGEN_IFLD_SIGNED), 0, 7, 9, 32, total_length, pc, & value);
+        value = ((value) << (2));
+        fields->f_s9x4 = value;
+      }
+      break;
+    case ARC_OPERAND_SC_S9B :
+      length = extract_normal (cd, ex_info, insn_value, 0|(1<<CGEN_IFLD_SIGNED), 0, 7, 9, 32, total_length, pc, & fields->f_s9x1);
+      break;
+    case ARC_OPERAND_SC_S9W :
+      {
+        long value;
+        length = extract_normal (cd, ex_info, insn_value, 0|(1<<CGEN_IFLD_SIGNED), 0, 7, 9, 32, total_length, pc, & value);
+        value = ((value) << (1));
+        fields->f_s9x2 = value;
+      }
+      break;
+    case ARC_OPERAND_SC_U5_ :
+      {
+        long value;
+        length = extract_normal (cd, ex_info, insn_value, 0, 0, 11, 5, 32, total_length, pc, & value);
+        value = ((value) << (2));
+        fields->f_u5x4 = value;
+      }
+      break;
+    case ARC_OPERAND_SC_U5B :
+      length = extract_normal (cd, ex_info, insn_value, 0, 0, 11, 5, 32, total_length, pc, & fields->f_u5);
+      break;
+    case ARC_OPERAND_SC_U5W :
+      {
+        long value;
+        length = extract_normal (cd, ex_info, insn_value, 0, 0, 11, 5, 32, total_length, pc, & value);
+        value = ((value) << (1));
+        fields->f_u5x2 = value;
+      }
+      break;
+    case ARC_OPERAND_TRAPNUM :
+      length = extract_normal (cd, ex_info, insn_value, 0, 0, 5, 6, 32, total_length, pc, & fields->f_trapnum);
+      break;
+    case ARC_OPERAND_U3 :
+      length = extract_normal (cd, ex_info, insn_value, 0, 0, 13, 3, 32, total_length, pc, & fields->f_u3);
+      break;
+    case ARC_OPERAND_U5 :
+      length = extract_normal (cd, ex_info, insn_value, 0, 0, 11, 5, 32, total_length, pc, & fields->f_u5);
+      break;
+    case ARC_OPERAND_U5X4 :
+      {
+        long value;
+        length = extract_normal (cd, ex_info, insn_value, 0, 0, 11, 5, 32, total_length, pc, & value);
+        value = ((value) << (2));
+        fields->f_u5x4 = value;
+      }
+      break;
+    case ARC_OPERAND_U7 :
+      length = extract_normal (cd, ex_info, insn_value, 0, 0, 9, 7, 32, total_length, pc, & fields->f_u7);
+      break;
+    case ARC_OPERAND_U8 :
+      length = extract_normal (cd, ex_info, insn_value, 0, 0, 8, 8, 32, total_length, pc, & fields->f_u8);
+      break;
+    case ARC_OPERAND_U8X4 :
+      {
+        long value;
+        length = extract_normal (cd, ex_info, insn_value, 0, 0, 8, 8, 32, total_length, pc, & value);
+        value = ((value) << (2));
+        fields->f_u8x4 = value;
+      }
+      break;
+    case ARC_OPERAND_UNCONDB :
+      break;
+    case ARC_OPERAND_UNCONDI :
+      break;
+    case ARC_OPERAND_UNCONDJ :
+      break;
+    case ARC_OPERAND_VBIT :
+      break;
+    case ARC_OPERAND_ZBIT :
+      break;
+
+    default :
+      /* xgettext:c-format */
+      fprintf (stderr, _("Unrecognized field %d while decoding insn.\n"),
+	       opindex);
+      abort ();
+    }
+
+  return length;
+}
+
+cgen_insert_fn * const arc_cgen_insert_handlers[] = 
+{
+  insert_insn_normal,
+};
+
+cgen_extract_fn * const arc_cgen_extract_handlers[] = 
+{
+  extract_insn_normal,
+};
+
+int arc_cgen_get_int_operand     (CGEN_CPU_DESC, int, const CGEN_FIELDS *);
+bfd_vma arc_cgen_get_vma_operand (CGEN_CPU_DESC, int, const CGEN_FIELDS *);
+
+/* Getting values from cgen_fields is handled by a collection of functions.
+   They are distinguished by the type of the VALUE argument they return.
+   TODO: floating point, inlining support, remove cases where result type
+   not appropriate.  */
+
+int
+arc_cgen_get_int_operand (CGEN_CPU_DESC cd ATTRIBUTE_UNUSED,
+			     int opindex,
+			     const CGEN_FIELDS * fields)
+{
+  int value;
+
+  switch (opindex)
+    {
+    case ARC_OPERAND_EXDI :
+      value = fields->f_F;
+      break;
+    case ARC_OPERAND_F :
+      value = fields->f_F;
+      break;
+    case ARC_OPERAND_F0 :
+      value = fields->f_F;
+      break;
+    case ARC_OPERAND_F1 :
+      value = fields->f_F;
+      break;
+    case ARC_OPERAND_F1F :
+      value = fields->f_F;
+      break;
+    case ARC_OPERAND_GP :
+      value = 0;
+      break;
+    case ARC_OPERAND_LDODI :
+      value = fields->f_LDODi;
+      break;
+    case ARC_OPERAND_LDRDI :
+      value = fields->f_LDRDi;
+      break;
+    case ARC_OPERAND_NE :
+      value = 0;
+      break;
+    case ARC_OPERAND_PCL :
+      value = 0;
+      break;
+    case ARC_OPERAND_QCONDB :
+      value = fields->f_cond_Q;
+      break;
+    case ARC_OPERAND_QCONDI :
+      value = fields->f_cond_Q;
+      break;
+    case ARC_OPERAND_QCONDJ :
+      value = fields->f_cond_Q;
+      break;
+    case ARC_OPERAND_R0 :
+      value = 0;
+      break;
+    case ARC_OPERAND_R31 :
+      value = 0;
+      break;
+    case ARC_OPERAND_RA :
+      value = fields->f_op_A;
+      break;
+    case ARC_OPERAND_RA_0 :
+      value = fields->f_op_A;
+      break;
+    case ARC_OPERAND_RB :
+      value = fields->f_op_B;
+      break;
+    case ARC_OPERAND_RB_0 :
+      value = fields->f_op_B;
+      break;
+    case ARC_OPERAND_RC :
+      value = fields->f_op_C;
+      break;
+    case ARC_OPERAND_RC_ILINK :
+      value = fields->f_op_Cj;
+      break;
+    case ARC_OPERAND_RC_NOILINK :
+      value = fields->f_op_Cj;
+      break;
+    case ARC_OPERAND_R_A :
+      value = fields->f_op__a;
+      break;
+    case ARC_OPERAND_R_B :
+      value = fields->f_op__b;
+      break;
+    case ARC_OPERAND_R_C :
+      value = fields->f_op__c;
+      break;
+    case ARC_OPERAND_RCC :
+      value = fields->f_brcond;
+      break;
+    case ARC_OPERAND_RCCS :
+      value = fields->f_brscond;
+      break;
+    case ARC_OPERAND_RH :
+      value = fields->f_op_h;
+      break;
+    case ARC_OPERAND_SP :
+      value = 0;
+      break;
+    case ARC_OPERAND_STODI :
+      value = fields->f_STODi;
+      break;
+    case ARC_OPERAND_U6 :
+      value = fields->f_u6;
+      break;
+    case ARC_OPERAND_U6X2 :
+      value = fields->f_u6x2;
+      break;
+    case ARC_OPERAND__AW :
+      value = 0;
+      break;
+    case ARC_OPERAND__L :
+      value = 0;
+      break;
+    case ARC_OPERAND__S :
+      value = 0;
+      break;
+    case ARC_OPERAND_CBIT :
+      value = 0;
+      break;
+    case ARC_OPERAND_DELAY_N :
+      value = fields->f_delay_N;
+      break;
+    case ARC_OPERAND_DUMMY_OP :
+      value = fields->f_dummy;
+      break;
+    case ARC_OPERAND_I2COND :
+      value = fields->f_cond_i2;
+      break;
+    case ARC_OPERAND_I3COND :
+      value = fields->f_cond_i3;
+      break;
+    case ARC_OPERAND_LABEL10 :
+      value = fields->f_rel10;
+      break;
+    case ARC_OPERAND_LABEL13A :
+      value = fields->f_rel13bl;
+      break;
+    case ARC_OPERAND_LABEL21 :
+      value = fields->f_rel21;
+      break;
+    case ARC_OPERAND_LABEL21A :
+      value = fields->f_rel21bl;
+      break;
+    case ARC_OPERAND_LABEL25 :
+      value = fields->f_rel25;
+      break;
+    case ARC_OPERAND_LABEL25A :
+      value = fields->f_rel25bl;
+      break;
+    case ARC_OPERAND_LABEL7 :
+      value = fields->f_rel7;
+      break;
+    case ARC_OPERAND_LABEL8 :
+      value = fields->f_rel8;
+      break;
+    case ARC_OPERAND_LABEL9 :
+      value = fields->f_rel9;
+      break;
+    case ARC_OPERAND_LBIT :
+      value = 0;
+      break;
+    case ARC_OPERAND_NBIT :
+      value = 0;
+      break;
+    case ARC_OPERAND_S12 :
+      value = fields->f_s12;
+      break;
+    case ARC_OPERAND_S12X2 :
+      value = fields->f_s12x2;
+      break;
+    case ARC_OPERAND_S1BIT :
+      value = 0;
+      break;
+    case ARC_OPERAND_S2BIT :
+      value = 0;
+      break;
+    case ARC_OPERAND_S9 :
+      value = fields->f_s9;
+      break;
+    case ARC_OPERAND_S9X4 :
+      value = fields->f_s9x4;
+      break;
+    case ARC_OPERAND_SC_S9_ :
+      value = fields->f_s9x4;
+      break;
+    case ARC_OPERAND_SC_S9B :
+      value = fields->f_s9x1;
+      break;
+    case ARC_OPERAND_SC_S9W :
+      value = fields->f_s9x2;
+      break;
+    case ARC_OPERAND_SC_U5_ :
+      value = fields->f_u5x4;
+      break;
+    case ARC_OPERAND_SC_U5B :
+      value = fields->f_u5;
+      break;
+    case ARC_OPERAND_SC_U5W :
+      value = fields->f_u5x2;
+      break;
+    case ARC_OPERAND_TRAPNUM :
+      value = fields->f_trapnum;
+      break;
+    case ARC_OPERAND_U3 :
+      value = fields->f_u3;
+      break;
+    case ARC_OPERAND_U5 :
+      value = fields->f_u5;
+      break;
+    case ARC_OPERAND_U5X4 :
+      value = fields->f_u5x4;
+      break;
+    case ARC_OPERAND_U7 :
+      value = fields->f_u7;
+      break;
+    case ARC_OPERAND_U8 :
+      value = fields->f_u8;
+      break;
+    case ARC_OPERAND_U8X4 :
+      value = fields->f_u8x4;
+      break;
+    case ARC_OPERAND_UNCONDB :
+      value = 0;
+      break;
+    case ARC_OPERAND_UNCONDI :
+      value = 0;
+      break;
+    case ARC_OPERAND_UNCONDJ :
+      value = 0;
+      break;
+    case ARC_OPERAND_VBIT :
+      value = 0;
+      break;
+    case ARC_OPERAND_ZBIT :
+      value = 0;
+      break;
+
+    default :
+      /* xgettext:c-format */
+      fprintf (stderr, _("Unrecognized field %d while getting int operand.\n"),
+		       opindex);
+      abort ();
+  }
+
+  return value;
+}
+
+bfd_vma
+arc_cgen_get_vma_operand (CGEN_CPU_DESC cd ATTRIBUTE_UNUSED,
+			     int opindex,
+			     const CGEN_FIELDS * fields)
+{
+  bfd_vma value;
+
+  switch (opindex)
+    {
+    case ARC_OPERAND_EXDI :
+      value = fields->f_F;
+      break;
+    case ARC_OPERAND_F :
+      value = fields->f_F;
+      break;
+    case ARC_OPERAND_F0 :
+      value = fields->f_F;
+      break;
+    case ARC_OPERAND_F1 :
+      value = fields->f_F;
+      break;
+    case ARC_OPERAND_F1F :
+      value = fields->f_F;
+      break;
+    case ARC_OPERAND_GP :
+      value = 0;
+      break;
+    case ARC_OPERAND_LDODI :
+      value = fields->f_LDODi;
+      break;
+    case ARC_OPERAND_LDRDI :
+      value = fields->f_LDRDi;
+      break;
+    case ARC_OPERAND_NE :
+      value = 0;
+      break;
+    case ARC_OPERAND_PCL :
+      value = 0;
+      break;
+    case ARC_OPERAND_QCONDB :
+      value = fields->f_cond_Q;
+      break;
+    case ARC_OPERAND_QCONDI :
+      value = fields->f_cond_Q;
+      break;
+    case ARC_OPERAND_QCONDJ :
+      value = fields->f_cond_Q;
+      break;
+    case ARC_OPERAND_R0 :
+      value = 0;
+      break;
+    case ARC_OPERAND_R31 :
+      value = 0;
+      break;
+    case ARC_OPERAND_RA :
+      value = fields->f_op_A;
+      break;
+    case ARC_OPERAND_RA_0 :
+      value = fields->f_op_A;
+      break;
+    case ARC_OPERAND_RB :
+      value = fields->f_op_B;
+      break;
+    case ARC_OPERAND_RB_0 :
+      value = fields->f_op_B;
+      break;
+    case ARC_OPERAND_RC :
+      value = fields->f_op_C;
+      break;
+    case ARC_OPERAND_RC_ILINK :
+      value = fields->f_op_Cj;
+      break;
+    case ARC_OPERAND_RC_NOILINK :
+      value = fields->f_op_Cj;
+      break;
+    case ARC_OPERAND_R_A :
+      value = fields->f_op__a;
+      break;
+    case ARC_OPERAND_R_B :
+      value = fields->f_op__b;
+      break;
+    case ARC_OPERAND_R_C :
+      value = fields->f_op__c;
+      break;
+    case ARC_OPERAND_RCC :
+      value = fields->f_brcond;
+      break;
+    case ARC_OPERAND_RCCS :
+      value = fields->f_brscond;
+      break;
+    case ARC_OPERAND_RH :
+      value = fields->f_op_h;
+      break;
+    case ARC_OPERAND_SP :
+      value = 0;
+      break;
+    case ARC_OPERAND_STODI :
+      value = fields->f_STODi;
+      break;
+    case ARC_OPERAND_U6 :
+      value = fields->f_u6;
+      break;
+    case ARC_OPERAND_U6X2 :
+      value = fields->f_u6x2;
+      break;
+    case ARC_OPERAND__AW :
+      value = 0;
+      break;
+    case ARC_OPERAND__L :
+      value = 0;
+      break;
+    case ARC_OPERAND__S :
+      value = 0;
+      break;
+    case ARC_OPERAND_CBIT :
+      value = 0;
+      break;
+    case ARC_OPERAND_DELAY_N :
+      value = fields->f_delay_N;
+      break;
+    case ARC_OPERAND_DUMMY_OP :
+      value = fields->f_dummy;
+      break;
+    case ARC_OPERAND_I2COND :
+      value = fields->f_cond_i2;
+      break;
+    case ARC_OPERAND_I3COND :
+      value = fields->f_cond_i3;
+      break;
+    case ARC_OPERAND_LABEL10 :
+      value = fields->f_rel10;
+      break;
+    case ARC_OPERAND_LABEL13A :
+      value = fields->f_rel13bl;
+      break;
+    case ARC_OPERAND_LABEL21 :
+      value = fields->f_rel21;
+      break;
+    case ARC_OPERAND_LABEL21A :
+      value = fields->f_rel21bl;
+      break;
+    case ARC_OPERAND_LABEL25 :
+      value = fields->f_rel25;
+      break;
+    case ARC_OPERAND_LABEL25A :
+      value = fields->f_rel25bl;
+      break;
+    case ARC_OPERAND_LABEL7 :
+      value = fields->f_rel7;
+      break;
+    case ARC_OPERAND_LABEL8 :
+      value = fields->f_rel8;
+      break;
+    case ARC_OPERAND_LABEL9 :
+      value = fields->f_rel9;
+      break;
+    case ARC_OPERAND_LBIT :
+      value = 0;
+      break;
+    case ARC_OPERAND_NBIT :
+      value = 0;
+      break;
+    case ARC_OPERAND_S12 :
+      value = fields->f_s12;
+      break;
+    case ARC_OPERAND_S12X2 :
+      value = fields->f_s12x2;
+      break;
+    case ARC_OPERAND_S1BIT :
+      value = 0;
+      break;
+    case ARC_OPERAND_S2BIT :
+      value = 0;
+      break;
+    case ARC_OPERAND_S9 :
+      value = fields->f_s9;
+      break;
+    case ARC_OPERAND_S9X4 :
+      value = fields->f_s9x4;
+      break;
+    case ARC_OPERAND_SC_S9_ :
+      value = fields->f_s9x4;
+      break;
+    case ARC_OPERAND_SC_S9B :
+      value = fields->f_s9x1;
+      break;
+    case ARC_OPERAND_SC_S9W :
+      value = fields->f_s9x2;
+      break;
+    case ARC_OPERAND_SC_U5_ :
+      value = fields->f_u5x4;
+      break;
+    case ARC_OPERAND_SC_U5B :
+      value = fields->f_u5;
+      break;
+    case ARC_OPERAND_SC_U5W :
+      value = fields->f_u5x2;
+      break;
+    case ARC_OPERAND_TRAPNUM :
+      value = fields->f_trapnum;
+      break;
+    case ARC_OPERAND_U3 :
+      value = fields->f_u3;
+      break;
+    case ARC_OPERAND_U5 :
+      value = fields->f_u5;
+      break;
+    case ARC_OPERAND_U5X4 :
+      value = fields->f_u5x4;
+      break;
+    case ARC_OPERAND_U7 :
+      value = fields->f_u7;
+      break;
+    case ARC_OPERAND_U8 :
+      value = fields->f_u8;
+      break;
+    case ARC_OPERAND_U8X4 :
+      value = fields->f_u8x4;
+      break;
+    case ARC_OPERAND_UNCONDB :
+      value = 0;
+      break;
+    case ARC_OPERAND_UNCONDI :
+      value = 0;
+      break;
+    case ARC_OPERAND_UNCONDJ :
+      value = 0;
+      break;
+    case ARC_OPERAND_VBIT :
+      value = 0;
+      break;
+    case ARC_OPERAND_ZBIT :
+      value = 0;
+      break;
+
+    default :
+      /* xgettext:c-format */
+      fprintf (stderr, _("Unrecognized field %d while getting vma operand.\n"),
+		       opindex);
+      abort ();
+  }
+
+  return value;
+}
+
+void arc_cgen_set_int_operand  (CGEN_CPU_DESC, int, CGEN_FIELDS *, int);
+void arc_cgen_set_vma_operand  (CGEN_CPU_DESC, int, CGEN_FIELDS *, bfd_vma);
+
+/* Stuffing values in cgen_fields is handled by a collection of functions.
+   They are distinguished by the type of the VALUE argument they accept.
+   TODO: floating point, inlining support, remove cases where argument type
+   not appropriate.  */
+
+void
+arc_cgen_set_int_operand (CGEN_CPU_DESC cd ATTRIBUTE_UNUSED,
+			     int opindex,
+			     CGEN_FIELDS * fields,
+			     int value)
+{
+  switch (opindex)
+    {
+    case ARC_OPERAND_EXDI :
+      fields->f_F = value;
+      break;
+    case ARC_OPERAND_F :
+      fields->f_F = value;
+      break;
+    case ARC_OPERAND_F0 :
+      fields->f_F = value;
+      break;
+    case ARC_OPERAND_F1 :
+      fields->f_F = value;
+      break;
+    case ARC_OPERAND_F1F :
+      fields->f_F = value;
+      break;
+    case ARC_OPERAND_GP :
+      break;
+    case ARC_OPERAND_LDODI :
+      fields->f_LDODi = value;
+      break;
+    case ARC_OPERAND_LDRDI :
+      fields->f_LDRDi = value;
+      break;
+    case ARC_OPERAND_NE :
+      break;
+    case ARC_OPERAND_PCL :
+      break;
+    case ARC_OPERAND_QCONDB :
+      fields->f_cond_Q = value;
+      break;
+    case ARC_OPERAND_QCONDI :
+      fields->f_cond_Q = value;
+      break;
+    case ARC_OPERAND_QCONDJ :
+      fields->f_cond_Q = value;
+      break;
+    case ARC_OPERAND_R0 :
+      break;
+    case ARC_OPERAND_R31 :
+      break;
+    case ARC_OPERAND_RA :
+      fields->f_op_A = value;
+      break;
+    case ARC_OPERAND_RA_0 :
+      fields->f_op_A = value;
+      break;
+    case ARC_OPERAND_RB :
+      fields->f_op_B = value;
+      break;
+    case ARC_OPERAND_RB_0 :
+      fields->f_op_B = value;
+      break;
+    case ARC_OPERAND_RC :
+      fields->f_op_C = value;
+      break;
+    case ARC_OPERAND_RC_ILINK :
+      fields->f_op_Cj = value;
+      break;
+    case ARC_OPERAND_RC_NOILINK :
+      fields->f_op_Cj = value;
+      break;
+    case ARC_OPERAND_R_A :
+      fields->f_op__a = value;
+      break;
+    case ARC_OPERAND_R_B :
+      fields->f_op__b = value;
+      break;
+    case ARC_OPERAND_R_C :
+      fields->f_op__c = value;
+      break;
+    case ARC_OPERAND_RCC :
+      fields->f_brcond = value;
+      break;
+    case ARC_OPERAND_RCCS :
+      fields->f_brscond = value;
+      break;
+    case ARC_OPERAND_RH :
+      fields->f_op_h = value;
+      break;
+    case ARC_OPERAND_SP :
+      break;
+    case ARC_OPERAND_STODI :
+      fields->f_STODi = value;
+      break;
+    case ARC_OPERAND_U6 :
+      fields->f_u6 = value;
+      break;
+    case ARC_OPERAND_U6X2 :
+      fields->f_u6x2 = value;
+      break;
+    case ARC_OPERAND__AW :
+      break;
+    case ARC_OPERAND__L :
+      break;
+    case ARC_OPERAND__S :
+      break;
+    case ARC_OPERAND_CBIT :
+      break;
+    case ARC_OPERAND_DELAY_N :
+      fields->f_delay_N = value;
+      break;
+    case ARC_OPERAND_DUMMY_OP :
+      fields->f_dummy = value;
+      break;
+    case ARC_OPERAND_I2COND :
+      fields->f_cond_i2 = value;
+      break;
+    case ARC_OPERAND_I3COND :
+      fields->f_cond_i3 = value;
+      break;
+    case ARC_OPERAND_LABEL10 :
+      fields->f_rel10 = value;
+      break;
+    case ARC_OPERAND_LABEL13A :
+      fields->f_rel13bl = value;
+      break;
+    case ARC_OPERAND_LABEL21 :
+      fields->f_rel21 = value;
+      break;
+    case ARC_OPERAND_LABEL21A :
+      fields->f_rel21bl = value;
+      break;
+    case ARC_OPERAND_LABEL25 :
+      fields->f_rel25 = value;
+      break;
+    case ARC_OPERAND_LABEL25A :
+      fields->f_rel25bl = value;
+      break;
+    case ARC_OPERAND_LABEL7 :
+      fields->f_rel7 = value;
+      break;
+    case ARC_OPERAND_LABEL8 :
+      fields->f_rel8 = value;
+      break;
+    case ARC_OPERAND_LABEL9 :
+      fields->f_rel9 = value;
+      break;
+    case ARC_OPERAND_LBIT :
+      break;
+    case ARC_OPERAND_NBIT :
+      break;
+    case ARC_OPERAND_S12 :
+      fields->f_s12 = value;
+      break;
+    case ARC_OPERAND_S12X2 :
+      fields->f_s12x2 = value;
+      break;
+    case ARC_OPERAND_S1BIT :
+      break;
+    case ARC_OPERAND_S2BIT :
+      break;
+    case ARC_OPERAND_S9 :
+      fields->f_s9 = value;
+      break;
+    case ARC_OPERAND_S9X4 :
+      fields->f_s9x4 = value;
+      break;
+    case ARC_OPERAND_SC_S9_ :
+      fields->f_s9x4 = value;
+      break;
+    case ARC_OPERAND_SC_S9B :
+      fields->f_s9x1 = value;
+      break;
+    case ARC_OPERAND_SC_S9W :
+      fields->f_s9x2 = value;
+      break;
+    case ARC_OPERAND_SC_U5_ :
+      fields->f_u5x4 = value;
+      break;
+    case ARC_OPERAND_SC_U5B :
+      fields->f_u5 = value;
+      break;
+    case ARC_OPERAND_SC_U5W :
+      fields->f_u5x2 = value;
+      break;
+    case ARC_OPERAND_TRAPNUM :
+      fields->f_trapnum = value;
+      break;
+    case ARC_OPERAND_U3 :
+      fields->f_u3 = value;
+      break;
+    case ARC_OPERAND_U5 :
+      fields->f_u5 = value;
+      break;
+    case ARC_OPERAND_U5X4 :
+      fields->f_u5x4 = value;
+      break;
+    case ARC_OPERAND_U7 :
+      fields->f_u7 = value;
+      break;
+    case ARC_OPERAND_U8 :
+      fields->f_u8 = value;
+      break;
+    case ARC_OPERAND_U8X4 :
+      fields->f_u8x4 = value;
+      break;
+    case ARC_OPERAND_UNCONDB :
+      break;
+    case ARC_OPERAND_UNCONDI :
+      break;
+    case ARC_OPERAND_UNCONDJ :
+      break;
+    case ARC_OPERAND_VBIT :
+      break;
+    case ARC_OPERAND_ZBIT :
+      break;
+
+    default :
+      /* xgettext:c-format */
+      fprintf (stderr, _("Unrecognized field %d while setting int operand.\n"),
+		       opindex);
+      abort ();
+  }
+}
+
+void
+arc_cgen_set_vma_operand (CGEN_CPU_DESC cd ATTRIBUTE_UNUSED,
+			     int opindex,
+			     CGEN_FIELDS * fields,
+			     bfd_vma value)
+{
+  switch (opindex)
+    {
+    case ARC_OPERAND_EXDI :
+      fields->f_F = value;
+      break;
+    case ARC_OPERAND_F :
+      fields->f_F = value;
+      break;
+    case ARC_OPERAND_F0 :
+      fields->f_F = value;
+      break;
+    case ARC_OPERAND_F1 :
+      fields->f_F = value;
+      break;
+    case ARC_OPERAND_F1F :
+      fields->f_F = value;
+      break;
+    case ARC_OPERAND_GP :
+      break;
+    case ARC_OPERAND_LDODI :
+      fields->f_LDODi = value;
+      break;
+    case ARC_OPERAND_LDRDI :
+      fields->f_LDRDi = value;
+      break;
+    case ARC_OPERAND_NE :
+      break;
+    case ARC_OPERAND_PCL :
+      break;
+    case ARC_OPERAND_QCONDB :
+      fields->f_cond_Q = value;
+      break;
+    case ARC_OPERAND_QCONDI :
+      fields->f_cond_Q = value;
+      break;
+    case ARC_OPERAND_QCONDJ :
+      fields->f_cond_Q = value;
+      break;
+    case ARC_OPERAND_R0 :
+      break;
+    case ARC_OPERAND_R31 :
+      break;
+    case ARC_OPERAND_RA :
+      fields->f_op_A = value;
+      break;
+    case ARC_OPERAND_RA_0 :
+      fields->f_op_A = value;
+      break;
+    case ARC_OPERAND_RB :
+      fields->f_op_B = value;
+      break;
+    case ARC_OPERAND_RB_0 :
+      fields->f_op_B = value;
+      break;
+    case ARC_OPERAND_RC :
+      fields->f_op_C = value;
+      break;
+    case ARC_OPERAND_RC_ILINK :
+      fields->f_op_Cj = value;
+      break;
+    case ARC_OPERAND_RC_NOILINK :
+      fields->f_op_Cj = value;
+      break;
+    case ARC_OPERAND_R_A :
+      fields->f_op__a = value;
+      break;
+    case ARC_OPERAND_R_B :
+      fields->f_op__b = value;
+      break;
+    case ARC_OPERAND_R_C :
+      fields->f_op__c = value;
+      break;
+    case ARC_OPERAND_RCC :
+      fields->f_brcond = value;
+      break;
+    case ARC_OPERAND_RCCS :
+      fields->f_brscond = value;
+      break;
+    case ARC_OPERAND_RH :
+      fields->f_op_h = value;
+      break;
+    case ARC_OPERAND_SP :
+      break;
+    case ARC_OPERAND_STODI :
+      fields->f_STODi = value;
+      break;
+    case ARC_OPERAND_U6 :
+      fields->f_u6 = value;
+      break;
+    case ARC_OPERAND_U6X2 :
+      fields->f_u6x2 = value;
+      break;
+    case ARC_OPERAND__AW :
+      break;
+    case ARC_OPERAND__L :
+      break;
+    case ARC_OPERAND__S :
+      break;
+    case ARC_OPERAND_CBIT :
+      break;
+    case ARC_OPERAND_DELAY_N :
+      fields->f_delay_N = value;
+      break;
+    case ARC_OPERAND_DUMMY_OP :
+      fields->f_dummy = value;
+      break;
+    case ARC_OPERAND_I2COND :
+      fields->f_cond_i2 = value;
+      break;
+    case ARC_OPERAND_I3COND :
+      fields->f_cond_i3 = value;
+      break;
+    case ARC_OPERAND_LABEL10 :
+      fields->f_rel10 = value;
+      break;
+    case ARC_OPERAND_LABEL13A :
+      fields->f_rel13bl = value;
+      break;
+    case ARC_OPERAND_LABEL21 :
+      fields->f_rel21 = value;
+      break;
+    case ARC_OPERAND_LABEL21A :
+      fields->f_rel21bl = value;
+      break;
+    case ARC_OPERAND_LABEL25 :
+      fields->f_rel25 = value;
+      break;
+    case ARC_OPERAND_LABEL25A :
+      fields->f_rel25bl = value;
+      break;
+    case ARC_OPERAND_LABEL7 :
+      fields->f_rel7 = value;
+      break;
+    case ARC_OPERAND_LABEL8 :
+      fields->f_rel8 = value;
+      break;
+    case ARC_OPERAND_LABEL9 :
+      fields->f_rel9 = value;
+      break;
+    case ARC_OPERAND_LBIT :
+      break;
+    case ARC_OPERAND_NBIT :
+      break;
+    case ARC_OPERAND_S12 :
+      fields->f_s12 = value;
+      break;
+    case ARC_OPERAND_S12X2 :
+      fields->f_s12x2 = value;
+      break;
+    case ARC_OPERAND_S1BIT :
+      break;
+    case ARC_OPERAND_S2BIT :
+      break;
+    case ARC_OPERAND_S9 :
+      fields->f_s9 = value;
+      break;
+    case ARC_OPERAND_S9X4 :
+      fields->f_s9x4 = value;
+      break;
+    case ARC_OPERAND_SC_S9_ :
+      fields->f_s9x4 = value;
+      break;
+    case ARC_OPERAND_SC_S9B :
+      fields->f_s9x1 = value;
+      break;
+    case ARC_OPERAND_SC_S9W :
+      fields->f_s9x2 = value;
+      break;
+    case ARC_OPERAND_SC_U5_ :
+      fields->f_u5x4 = value;
+      break;
+    case ARC_OPERAND_SC_U5B :
+      fields->f_u5 = value;
+      break;
+    case ARC_OPERAND_SC_U5W :
+      fields->f_u5x2 = value;
+      break;
+    case ARC_OPERAND_TRAPNUM :
+      fields->f_trapnum = value;
+      break;
+    case ARC_OPERAND_U3 :
+      fields->f_u3 = value;
+      break;
+    case ARC_OPERAND_U5 :
+      fields->f_u5 = value;
+      break;
+    case ARC_OPERAND_U5X4 :
+      fields->f_u5x4 = value;
+      break;
+    case ARC_OPERAND_U7 :
+      fields->f_u7 = value;
+      break;
+    case ARC_OPERAND_U8 :
+      fields->f_u8 = value;
+      break;
+    case ARC_OPERAND_U8X4 :
+      fields->f_u8x4 = value;
+      break;
+    case ARC_OPERAND_UNCONDB :
+      break;
+    case ARC_OPERAND_UNCONDI :
+      break;
+    case ARC_OPERAND_UNCONDJ :
+      break;
+    case ARC_OPERAND_VBIT :
+      break;
+    case ARC_OPERAND_ZBIT :
+      break;
+
+    default :
+      /* xgettext:c-format */
+      fprintf (stderr, _("Unrecognized field %d while setting vma operand.\n"),
+		       opindex);
+      abort ();
+  }
+}
+
+/* Function to call before using the instruction builder tables.  */
+
+void
+arc_cgen_init_ibld_table (CGEN_CPU_DESC cd)
+{
+  cd->insert_handlers = & arc_cgen_insert_handlers[0];
+  cd->extract_handlers = & arc_cgen_extract_handlers[0];
+
+  cd->insert_operand = arc_cgen_insert_operand;
+  cd->extract_operand = arc_cgen_extract_operand;
+
+  cd->get_int_operand = arc_cgen_get_int_operand;
+  cd->set_int_operand = arc_cgen_set_int_operand;
+  cd->get_vma_operand = arc_cgen_get_vma_operand;
+  cd->set_vma_operand = arc_cgen_set_vma_operand;
+}
diff --git a/opcodes/arc-opc.h b/opcodes/arc-opc.h
new file mode 100644
index 0000000..0a020b2
--- /dev/null
+++ b/opcodes/arc-opc.h
@@ -0,0 +1,313 @@
+/* Instruction opcode header for arc.
+
+THIS FILE IS MACHINE GENERATED WITH CGEN.
+
+Copyright 1996-2007 Free Software Foundation, Inc.
+
+This file is part of the GNU Binutils and/or GDB, the GNU debugger.
+
+   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
+   the Free Software Foundation; either version 3, or (at your option)
+   any later version.
+
+   It 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 this program; if not, write to the Free Software Foundation, Inc.,
+   51 Franklin Street - Fifth Floor, Boston, MA 02110-1301, USA.
+
+*/
+
+#ifndef ARC_OPC_H
+#define ARC_OPC_H
+
+/* -- opc.h */
+
+#undef  CGEN_DIS_HASH_SIZE
+#define CGEN_DIS_HASH_SIZE 1024
+#undef  CGEN_DIS_HASH
+#define CGEN_DIS_HASH(buffer, value, big_p) \
+  arc_cgen_dis_hash (buffer, big_p)
+extern unsigned int arc_cgen_dis_hash (const char *, int);
+/* Override CGEN_INSN_BITSIZE for sim/common/cgen-trace.c .
+   insn extraction for simulation is fine with 32 bits, since we fetch long
+   immediates as part of the semantics if required, but for disassembly
+   we must make sure we read all the bits while we have the information how
+   to read them.  */
+#define CGEN_INSN_DISASM_BITSIZE(insn) 64
+extern char limm_str[];
+
+/* cgen can't generate correct decoders for variable-length insns,
+   so we have it generate a decoder that assumes all insns are 32 bit.
+   And even if the decoder generator bug were fixed, having the decoder
+   understand long immediates would be messy.
+   The simulator calculates instruction sizes as part of the semantics.
+   For disassembly, we redefine CGEN_EXTRACT_FN so that we can correct
+   the calculated instruction length.  */
+#undef CGEN_EXTRACT_FN
+#define CGEN_EXTRACT_FN(cd, insn) ARC_CGEN_EXTRACT_FN
+extern int arc_insn_length (unsigned long insn_value, const CGEN_INSN *insn,
+			   CGEN_EXTRACT_INFO *info, bfd_vma pc);
+static inline int
+ARC_CGEN_EXTRACT_FN (CGEN_CPU_DESC cd, const CGEN_INSN *insn,
+		     CGEN_EXTRACT_INFO *info, CGEN_INSN_INT insn_value,
+		     CGEN_FIELDS *fields, bfd_vma pc)
+{
+  static int initialized = 0;
+  /* ??? There is no suitable hook for one-time initialization.  */
+  if (!initialized)
+    {
+      static CGEN_KEYWORD_ENTRY arc_cgen_opval_limm_entry0 =
+	{ limm_str, 62, {0, {{{0, 0}}}}, 0, 0 };
+      static CGEN_KEYWORD_ENTRY arc_cgen_opval_limm_entry1 =
+	{ limm_str, 62, {0, {{{0, 0}}}}, 0, 0 };
+
+      cgen_keyword_add (&arc_cgen_opval_cr_names, &arc_cgen_opval_limm_entry0);
+      cgen_keyword_add (&arc_cgen_opval_h_noilink, &arc_cgen_opval_limm_entry1);
+      initialized = 1;
+    }
+  /* ??? sim/common/cgen-trace.c:sim_cgen_disassemble_insn uses its own
+     home-brewn instruction target-to-host conversion, which gets the
+     endianness wrong for ARC.  */
+  if (cd->endian == CGEN_ENDIAN_LITTLE)
+    insn_value = ((insn_value >> 16) & 0xffff) | (insn_value << 16);
+
+  /* First, do the normal extract handler call, but ignore its value.  */
+  ((cd)->extract_handlers[(insn)->opcode->handlers.extract]
+    (cd, insn, info, insn_value, fields, pc));
+  /* Now calculate the actual insn length, and extract any long immediate
+     if present.  */
+  return arc_insn_length (insn_value, insn, info, pc);
+}
+
+/* -- */
+/* Enum declaration for arc instruction types.  */
+typedef enum cgen_insn_type {
+  ARC_INSN_INVALID, ARC_INSN_B_S, ARC_INSN_BCC_S, ARC_INSN_BRCC_S
+ , ARC_INSN_BCC_L, ARC_INSN_BCC_L_D, ARC_INSN_B_L, ARC_INSN_B_L_D
+ , ARC_INSN_BRCC_RC, ARC_INSN_BRCC_RC_D, ARC_INSN_BRCC_U6, ARC_INSN_BRCC_U6_D
+ , ARC_INSN_BL_S, ARC_INSN_BLCC, ARC_INSN_BLCC_D, ARC_INSN_BL
+ , ARC_INSN_BL_D, ARC_INSN_LD_ABS, ARC_INSN_LD__AW_ABS, ARC_INSN_LD_AB_ABS
+ , ARC_INSN_LD_AS_ABS, ARC_INSN_LD_ABC, ARC_INSN_LD__AW_ABC, ARC_INSN_LD_AB_ABC
+ , ARC_INSN_LD_AS_ABC, ARC_INSN_LD_S_ABC, ARC_INSN_LD_S_ABU, ARC_INSN_LD_S_ABSP
+ , ARC_INSN_LD_S_GPREL, ARC_INSN_LD_S_PCREL, ARC_INSN_LDB_ABS, ARC_INSN_LDB__AW_ABS
+ , ARC_INSN_LDB_AB_ABS, ARC_INSN_LDB_AS_ABS, ARC_INSN_LDB_ABC, ARC_INSN_LDB__AW_ABC
+ , ARC_INSN_LDB_AB_ABC, ARC_INSN_LDB_AS_ABC, ARC_INSN_LDB_S_ABC, ARC_INSN_LDB_S_ABU
+ , ARC_INSN_LDB_S_ABSP, ARC_INSN_LDB_S_GPREL, ARC_INSN_LDB_X_ABS, ARC_INSN_LDB__AW_X_ABS
+ , ARC_INSN_LDB_AB_X_ABS, ARC_INSN_LDB_AS_X_ABS, ARC_INSN_LDB_X_ABC, ARC_INSN_LDB__AW_X_ABC
+ , ARC_INSN_LDB_AB_X_ABC, ARC_INSN_LDB_AS_X_ABC, ARC_INSN_LDW_ABS, ARC_INSN_LDW__AW_ABS
+ , ARC_INSN_LDW_AB_ABS, ARC_INSN_LDW_AS_ABS, ARC_INSN_LDW_ABC, ARC_INSN_LDW__AW_ABC
+ , ARC_INSN_LDW_AB_ABC, ARC_INSN_LDW_AS_ABC, ARC_INSN_LDW_S_ABC, ARC_INSN_LDW_S_ABU
+ , ARC_INSN_LDW_S_GPREL, ARC_INSN_LDW_X_ABS, ARC_INSN_LDW__AW_X_ABS, ARC_INSN_LDW_AB_X_ABS
+ , ARC_INSN_LDW_AS_X_ABS, ARC_INSN_LDW_X_ABC, ARC_INSN_LDW__AW_X_ABC, ARC_INSN_LDW_AB_X_ABC
+ , ARC_INSN_LDW_AS_X_ABC, ARC_INSN_LDW_S_X_ABU, ARC_INSN_ST_ABS, ARC_INSN_ST__AW_ABS
+ , ARC_INSN_ST_AB_ABS, ARC_INSN_ST_AS_ABS, ARC_INSN_ST_S_ABU, ARC_INSN_ST_S_ABSP
+ , ARC_INSN_STB_ABS, ARC_INSN_STB__AW_ABS, ARC_INSN_STB_AB_ABS, ARC_INSN_STB_AS_ABS
+ , ARC_INSN_STB_S_ABU, ARC_INSN_STB_S_ABSP, ARC_INSN_STW_ABS, ARC_INSN_STW__AW_ABS
+ , ARC_INSN_STW_AB_ABS, ARC_INSN_STW_AS_ABS, ARC_INSN_STW_S_ABU, ARC_INSN_ADD_L_S12__RA_
+ , ARC_INSN_ADD_CCU6__RA_, ARC_INSN_ADD_L_U6__RA_, ARC_INSN_ADD_L_R_R__RA__RC, ARC_INSN_ADD_CC__RA__RC
+ , ARC_INSN_ADD_S_ABC, ARC_INSN_ADD_S_CBU3, ARC_INSN_ADD_S_MCAH, ARC_INSN_ADD_S_ABSP
+ , ARC_INSN_ADD_S_ASSPSP, ARC_INSN_ADD_S_GP, ARC_INSN_ADD_S_R_U7, ARC_INSN_ADC_L_S12__RA_
+ , ARC_INSN_ADC_CCU6__RA_, ARC_INSN_ADC_L_U6__RA_, ARC_INSN_ADC_L_R_R__RA__RC, ARC_INSN_ADC_CC__RA__RC
+ , ARC_INSN_SUB_L_S12__RA_, ARC_INSN_SUB_CCU6__RA_, ARC_INSN_SUB_L_U6__RA_, ARC_INSN_SUB_L_R_R__RA__RC
+ , ARC_INSN_SUB_CC__RA__RC, ARC_INSN_SUB_S_CBU3, ARC_INSN_I16_GO_SUB_S_GO, ARC_INSN_SUB_S_GO_SUB_NE
+ , ARC_INSN_SUB_S_SSB, ARC_INSN_SUB_S_ASSPSP, ARC_INSN_SBC_L_S12__RA_, ARC_INSN_SBC_CCU6__RA_
+ , ARC_INSN_SBC_L_U6__RA_, ARC_INSN_SBC_L_R_R__RA__RC, ARC_INSN_SBC_CC__RA__RC, ARC_INSN_AND_L_S12__RA_
+ , ARC_INSN_AND_CCU6__RA_, ARC_INSN_AND_L_U6__RA_, ARC_INSN_AND_L_R_R__RA__RC, ARC_INSN_AND_CC__RA__RC
+ , ARC_INSN_I16_GO_AND_S_GO, ARC_INSN_OR_L_S12__RA_, ARC_INSN_OR_CCU6__RA_, ARC_INSN_OR_L_U6__RA_
+ , ARC_INSN_OR_L_R_R__RA__RC, ARC_INSN_OR_CC__RA__RC, ARC_INSN_I16_GO_OR_S_GO, ARC_INSN_BIC_L_S12__RA_
+ , ARC_INSN_BIC_CCU6__RA_, ARC_INSN_BIC_L_U6__RA_, ARC_INSN_BIC_L_R_R__RA__RC, ARC_INSN_BIC_CC__RA__RC
+ , ARC_INSN_I16_GO_BIC_S_GO, ARC_INSN_XOR_L_S12__RA_, ARC_INSN_XOR_CCU6__RA_, ARC_INSN_XOR_L_U6__RA_
+ , ARC_INSN_XOR_L_R_R__RA__RC, ARC_INSN_XOR_CC__RA__RC, ARC_INSN_I16_GO_XOR_S_GO, ARC_INSN_MAX_L_S12__RA_
+ , ARC_INSN_MAX_CCU6__RA_, ARC_INSN_MAX_L_U6__RA_, ARC_INSN_MAX_L_R_R__RA__RC, ARC_INSN_MAX_CC__RA__RC
+ , ARC_INSN_MIN_L_S12__RA_, ARC_INSN_MIN_CCU6__RA_, ARC_INSN_MIN_L_U6__RA_, ARC_INSN_MIN_L_R_R__RA__RC
+ , ARC_INSN_MIN_CC__RA__RC, ARC_INSN_MOV_L_S12_, ARC_INSN_MOV_CCU6_, ARC_INSN_MOV_L_U6_
+ , ARC_INSN_MOV_L_R_R__RC, ARC_INSN_MOV_CC__RC, ARC_INSN_MOV_S_MCAH, ARC_INSN_MOV_S_MCAHB
+ , ARC_INSN_MOV_S_R_U7, ARC_INSN_TST_L_S12_, ARC_INSN_TST_CCU6_, ARC_INSN_TST_L_U6_
+ , ARC_INSN_TST_L_R_R__RC, ARC_INSN_TST_CC__RC, ARC_INSN_TST_S_GO, ARC_INSN_CMP_L_S12_
+ , ARC_INSN_CMP_CCU6_, ARC_INSN_CMP_L_U6_, ARC_INSN_CMP_L_R_R__RC, ARC_INSN_CMP_CC__RC
+ , ARC_INSN_CMP_S_MCAH, ARC_INSN_CMP_S_R_U7, ARC_INSN_RCMP_L_S12_, ARC_INSN_RCMP_CCU6_
+ , ARC_INSN_RCMP_L_U6_, ARC_INSN_RCMP_L_R_R__RC, ARC_INSN_RCMP_CC__RC, ARC_INSN_RSUB_L_S12__RA_
+ , ARC_INSN_RSUB_CCU6__RA_, ARC_INSN_RSUB_L_U6__RA_, ARC_INSN_RSUB_L_R_R__RA__RC, ARC_INSN_RSUB_CC__RA__RC
+ , ARC_INSN_BSET_L_S12__RA_, ARC_INSN_BSET_CCU6__RA_, ARC_INSN_BSET_L_U6__RA_, ARC_INSN_BSET_L_R_R__RA__RC
+ , ARC_INSN_BSET_CC__RA__RC, ARC_INSN_BSET_S_SSB, ARC_INSN_BCLR_L_S12__RA_, ARC_INSN_BCLR_CCU6__RA_
+ , ARC_INSN_BCLR_L_U6__RA_, ARC_INSN_BCLR_L_R_R__RA__RC, ARC_INSN_BCLR_CC__RA__RC, ARC_INSN_BCLR_S_SSB
+ , ARC_INSN_BTST_L_S12_, ARC_INSN_BTST_CCU6_, ARC_INSN_BTST_L_U6_, ARC_INSN_BTST_L_R_R__RC
+ , ARC_INSN_BTST_CC__RC, ARC_INSN_BTST_S_SSB, ARC_INSN_BXOR_L_S12__RA_, ARC_INSN_BXOR_CCU6__RA_
+ , ARC_INSN_BXOR_L_U6__RA_, ARC_INSN_BXOR_L_R_R__RA__RC, ARC_INSN_BXOR_CC__RA__RC, ARC_INSN_BMSK_L_S12__RA_
+ , ARC_INSN_BMSK_CCU6__RA_, ARC_INSN_BMSK_L_U6__RA_, ARC_INSN_BMSK_L_R_R__RA__RC, ARC_INSN_BMSK_CC__RA__RC
+ , ARC_INSN_BMSK_S_SSB, ARC_INSN_ADD1_L_S12__RA_, ARC_INSN_ADD1_CCU6__RA_, ARC_INSN_ADD1_L_U6__RA_
+ , ARC_INSN_ADD1_L_R_R__RA__RC, ARC_INSN_ADD1_CC__RA__RC, ARC_INSN_I16_GO_ADD1_S_GO, ARC_INSN_ADD2_L_S12__RA_
+ , ARC_INSN_ADD2_CCU6__RA_, ARC_INSN_ADD2_L_U6__RA_, ARC_INSN_ADD2_L_R_R__RA__RC, ARC_INSN_ADD2_CC__RA__RC
+ , ARC_INSN_I16_GO_ADD2_S_GO, ARC_INSN_ADD3_L_S12__RA_, ARC_INSN_ADD3_CCU6__RA_, ARC_INSN_ADD3_L_U6__RA_
+ , ARC_INSN_ADD3_L_R_R__RA__RC, ARC_INSN_ADD3_CC__RA__RC, ARC_INSN_I16_GO_ADD3_S_GO, ARC_INSN_SUB1_L_S12__RA_
+ , ARC_INSN_SUB1_CCU6__RA_, ARC_INSN_SUB1_L_U6__RA_, ARC_INSN_SUB1_L_R_R__RA__RC, ARC_INSN_SUB1_CC__RA__RC
+ , ARC_INSN_SUB2_L_S12__RA_, ARC_INSN_SUB2_CCU6__RA_, ARC_INSN_SUB2_L_U6__RA_, ARC_INSN_SUB2_L_R_R__RA__RC
+ , ARC_INSN_SUB2_CC__RA__RC, ARC_INSN_SUB3_L_S12__RA_, ARC_INSN_SUB3_CCU6__RA_, ARC_INSN_SUB3_L_U6__RA_
+ , ARC_INSN_SUB3_L_R_R__RA__RC, ARC_INSN_SUB3_CC__RA__RC, ARC_INSN_MPY_L_S12__RA_, ARC_INSN_MPY_CCU6__RA_
+ , ARC_INSN_MPY_L_U6__RA_, ARC_INSN_MPY_L_R_R__RA__RC, ARC_INSN_MPY_CC__RA__RC, ARC_INSN_MPYH_L_S12__RA_
+ , ARC_INSN_MPYH_CCU6__RA_, ARC_INSN_MPYH_L_U6__RA_, ARC_INSN_MPYH_L_R_R__RA__RC, ARC_INSN_MPYH_CC__RA__RC
+ , ARC_INSN_MPYHU_L_S12__RA_, ARC_INSN_MPYHU_CCU6__RA_, ARC_INSN_MPYHU_L_U6__RA_, ARC_INSN_MPYHU_L_R_R__RA__RC
+ , ARC_INSN_MPYHU_CC__RA__RC, ARC_INSN_MPYU_L_S12__RA_, ARC_INSN_MPYU_CCU6__RA_, ARC_INSN_MPYU_L_U6__RA_
+ , ARC_INSN_MPYU_L_R_R__RA__RC, ARC_INSN_MPYU_CC__RA__RC, ARC_INSN_J_L_R_R___RC_NOILINK_, ARC_INSN_J_CC___RC_NOILINK_
+ , ARC_INSN_J_L_R_R___RC_ILINK_, ARC_INSN_J_CC___RC_ILINK_, ARC_INSN_J_L_S12_, ARC_INSN_J_CCU6_
+ , ARC_INSN_J_L_U6_, ARC_INSN_J_S, ARC_INSN_J_S__S, ARC_INSN_J_SEQ__S
+ , ARC_INSN_J_SNE__S, ARC_INSN_J_L_S12_D_, ARC_INSN_J_CCU6_D_, ARC_INSN_J_L_U6_D_
+ , ARC_INSN_J_L_R_R_D___RC_, ARC_INSN_J_CC_D___RC_, ARC_INSN_J_S_D, ARC_INSN_J_S__S_D
+ , ARC_INSN_JL_L_S12_, ARC_INSN_JL_CCU6_, ARC_INSN_JL_L_U6_, ARC_INSN_JL_S
+ , ARC_INSN_JL_L_R_R___RC_NOILINK_, ARC_INSN_JL_CC___RC_NOILINK_, ARC_INSN_JL_L_S12_D_, ARC_INSN_JL_CCU6_D_
+ , ARC_INSN_JL_L_U6_D_, ARC_INSN_JL_L_R_R_D___RC_, ARC_INSN_JL_CC_D___RC_, ARC_INSN_JL_S_D
+ , ARC_INSN_LP_L_S12_, ARC_INSN_LPCC_CCU6, ARC_INSN_FLAG_L_S12_, ARC_INSN_FLAG_CCU6_
+ , ARC_INSN_FLAG_L_U6_, ARC_INSN_FLAG_L_R_R__RC, ARC_INSN_FLAG_CC__RC, ARC_INSN_LR_L_R_R___RC_
+ , ARC_INSN_LR_L_S12_, ARC_INSN_LR_L_U6_, ARC_INSN_SR_L_R_R___RC_, ARC_INSN_SR_L_S12_
+ , ARC_INSN_SR_L_U6_, ARC_INSN_ASL_L_R_R__RC, ARC_INSN_ASL_L_U6_, ARC_INSN_I16_GO_ASL_S_GO
+ , ARC_INSN_ASR_L_R_R__RC, ARC_INSN_ASR_L_U6_, ARC_INSN_I16_GO_ASR_S_GO, ARC_INSN_LSR_L_R_R__RC
+ , ARC_INSN_LSR_L_U6_, ARC_INSN_I16_GO_LSR_S_GO, ARC_INSN_ROR_L_R_R__RC, ARC_INSN_ROR_L_U6_
+ , ARC_INSN_RRC_L_R_R__RC, ARC_INSN_RRC_L_U6_, ARC_INSN_SEXB_L_R_R__RC, ARC_INSN_SEXB_L_U6_
+ , ARC_INSN_I16_GO_SEXB_S_GO, ARC_INSN_SEXW_L_R_R__RC, ARC_INSN_SEXW_L_U6_, ARC_INSN_I16_GO_SEXW_S_GO
+ , ARC_INSN_EXTB_L_R_R__RC, ARC_INSN_EXTB_L_U6_, ARC_INSN_I16_GO_EXTB_S_GO, ARC_INSN_EXTW_L_R_R__RC
+ , ARC_INSN_EXTW_L_U6_, ARC_INSN_I16_GO_EXTW_S_GO, ARC_INSN_ABS_L_R_R__RC, ARC_INSN_ABS_L_U6_
+ , ARC_INSN_I16_GO_ABS_S_GO, ARC_INSN_NOT_L_R_R__RC, ARC_INSN_NOT_L_U6_, ARC_INSN_I16_GO_NOT_S_GO
+ , ARC_INSN_RLC_L_R_R__RC, ARC_INSN_RLC_L_U6_, ARC_INSN_EX_L_R_R__RC, ARC_INSN_EX_L_U6_
+ , ARC_INSN_I16_GO_NEG_S_GO, ARC_INSN_SWI, ARC_INSN_TRAP_S, ARC_INSN_BRK
+ , ARC_INSN_BRK_S, ARC_INSN_ASL_L_S12__RA_, ARC_INSN_ASL_CCU6__RA_, ARC_INSN_ASL_L_U6__RA_
+ , ARC_INSN_ASL_L_R_R__RA__RC, ARC_INSN_ASL_CC__RA__RC, ARC_INSN_ASL_S_CBU3, ARC_INSN_ASL_S_SSB
+ , ARC_INSN_I16_GO_ASLM_S_GO, ARC_INSN_LSR_L_S12__RA_, ARC_INSN_LSR_CCU6__RA_, ARC_INSN_LSR_L_U6__RA_
+ , ARC_INSN_LSR_L_R_R__RA__RC, ARC_INSN_LSR_CC__RA__RC, ARC_INSN_LSR_S_SSB, ARC_INSN_I16_GO_LSRM_S_GO
+ , ARC_INSN_ASR_L_S12__RA_, ARC_INSN_ASR_CCU6__RA_, ARC_INSN_ASR_L_U6__RA_, ARC_INSN_ASR_L_R_R__RA__RC
+ , ARC_INSN_ASR_CC__RA__RC, ARC_INSN_ASR_S_CBU3, ARC_INSN_ASR_S_SSB, ARC_INSN_I16_GO_ASRM_S_GO
+ , ARC_INSN_ROR_L_S12__RA_, ARC_INSN_ROR_CCU6__RA_, ARC_INSN_ROR_L_U6__RA_, ARC_INSN_ROR_L_R_R__RA__RC
+ , ARC_INSN_ROR_CC__RA__RC, ARC_INSN_MUL64_L_S12_, ARC_INSN_MUL64_CCU6_, ARC_INSN_MUL64_L_U6_
+ , ARC_INSN_MUL64_L_R_R__RC, ARC_INSN_MUL64_CC__RC, ARC_INSN_MUL64_S_GO, ARC_INSN_MULU64_L_S12_
+ , ARC_INSN_MULU64_CCU6_, ARC_INSN_MULU64_L_U6_, ARC_INSN_MULU64_L_R_R__RC, ARC_INSN_MULU64_CC__RC
+ , ARC_INSN_ADDS_L_S12__RA_, ARC_INSN_ADDS_CCU6__RA_, ARC_INSN_ADDS_L_U6__RA_, ARC_INSN_ADDS_L_R_R__RA__RC
+ , ARC_INSN_ADDS_CC__RA__RC, ARC_INSN_SUBS_L_S12__RA_, ARC_INSN_SUBS_CCU6__RA_, ARC_INSN_SUBS_L_U6__RA_
+ , ARC_INSN_SUBS_L_R_R__RA__RC, ARC_INSN_SUBS_CC__RA__RC, ARC_INSN_DIVAW_L_S12__RA_, ARC_INSN_DIVAW_CCU6__RA_
+ , ARC_INSN_DIVAW_L_U6__RA_, ARC_INSN_DIVAW_L_R_R__RA__RC, ARC_INSN_DIVAW_CC__RA__RC, ARC_INSN_ASLS_L_S12__RA_
+ , ARC_INSN_ASLS_CCU6__RA_, ARC_INSN_ASLS_L_U6__RA_, ARC_INSN_ASLS_L_R_R__RA__RC, ARC_INSN_ASLS_CC__RA__RC
+ , ARC_INSN_ASRS_L_S12__RA_, ARC_INSN_ASRS_CCU6__RA_, ARC_INSN_ASRS_L_U6__RA_, ARC_INSN_ASRS_L_R_R__RA__RC
+ , ARC_INSN_ASRS_CC__RA__RC, ARC_INSN_ADDSDW_L_S12__RA_, ARC_INSN_ADDSDW_CCU6__RA_, ARC_INSN_ADDSDW_L_U6__RA_
+ , ARC_INSN_ADDSDW_L_R_R__RA__RC, ARC_INSN_ADDSDW_CC__RA__RC, ARC_INSN_SUBSDW_L_S12__RA_, ARC_INSN_SUBSDW_CCU6__RA_
+ , ARC_INSN_SUBSDW_L_U6__RA_, ARC_INSN_SUBSDW_L_R_R__RA__RC, ARC_INSN_SUBSDW_CC__RA__RC, ARC_INSN_SWAP_L_R_R__RC
+ , ARC_INSN_SWAP_L_U6_, ARC_INSN_NORM_L_R_R__RC, ARC_INSN_NORM_L_U6_, ARC_INSN_RND16_L_R_R__RC
+ , ARC_INSN_RND16_L_U6_, ARC_INSN_ABSSW_L_R_R__RC, ARC_INSN_ABSSW_L_U6_, ARC_INSN_ABSS_L_R_R__RC
+ , ARC_INSN_ABSS_L_U6_, ARC_INSN_NEGSW_L_R_R__RC, ARC_INSN_NEGSW_L_U6_, ARC_INSN_NEGS_L_R_R__RC
+ , ARC_INSN_NEGS_L_U6_, ARC_INSN_NORMW_L_R_R__RC, ARC_INSN_NORMW_L_U6_, ARC_INSN_NOP_S
+ , ARC_INSN_UNIMP_S, ARC_INSN_POP_S_B, ARC_INSN_POP_S_BLINK, ARC_INSN_PUSH_S_B
+ , ARC_INSN_PUSH_S_BLINK, ARC_INSN_MULLW_L_S12__RA_, ARC_INSN_MULLW_CCU6__RA_, ARC_INSN_MULLW_L_U6__RA_
+ , ARC_INSN_MULLW_L_R_R__RA__RC, ARC_INSN_MULLW_CC__RA__RC, ARC_INSN_MACLW_L_S12__RA_, ARC_INSN_MACLW_CCU6__RA_
+ , ARC_INSN_MACLW_L_U6__RA_, ARC_INSN_MACLW_L_R_R__RA__RC, ARC_INSN_MACLW_CC__RA__RC, ARC_INSN_MACHLW_L_S12__RA_
+ , ARC_INSN_MACHLW_CCU6__RA_, ARC_INSN_MACHLW_L_U6__RA_, ARC_INSN_MACHLW_L_R_R__RA__RC, ARC_INSN_MACHLW_CC__RA__RC
+ , ARC_INSN_MULULW_L_S12__RA_, ARC_INSN_MULULW_CCU6__RA_, ARC_INSN_MULULW_L_U6__RA_, ARC_INSN_MULULW_L_R_R__RA__RC
+ , ARC_INSN_MULULW_CC__RA__RC, ARC_INSN_MACHULW_L_S12__RA_, ARC_INSN_MACHULW_CCU6__RA_, ARC_INSN_MACHULW_L_U6__RA_
+ , ARC_INSN_MACHULW_L_R_R__RA__RC, ARC_INSN_MACHULW_CC__RA__RC, ARC_INSN_CURRENT_LOOP_END, ARC_INSN_CURRENT_LOOP_END_AFTER_BRANCH
+ , ARC_INSN_ARC600_CURRENT_LOOP_END_AFTER_BRANCH
+} CGEN_INSN_TYPE;
+
+/* Index of `invalid' insn place holder.  */
+#define CGEN_INSN_INVALID ARC_INSN_INVALID
+
+/* Total number of insns in table.  */
+#define MAX_INSNS ((int) ARC_INSN_ARC600_CURRENT_LOOP_END_AFTER_BRANCH + 1)
+
+/* This struct records data prior to insertion or after extraction.  */
+struct cgen_fields
+{
+  int length;
+  long f_nil;
+  long f_anyof;
+  long f_cond_Q;
+  long f_cond_i2;
+  long f_cond_i3;
+  long f_brcond;
+  long f_op__a;
+  long f_op__b;
+  long f_op__c;
+  long f_B_5_3;
+  long f_op_B;
+  long f_op_C;
+  long f_op_Cj;
+  long f_h_2_0;
+  long f_h_5_3;
+  long f_op_h;
+  long f_u6;
+  long f_u6x2;
+  long f_delay_N;
+  long f_res27;
+  long f_F;
+  long f_cbranch_imm;
+  long f_op_A;
+  long f_s12h;
+  long f_s12;
+  long f_s12x2;
+  long f_rel10;
+  long f_rel7;
+  long f_rel8;
+  long f_rel13bl;
+  long f_d21l;
+  long f_d21bl;
+  long f_d21h;
+  long f_d25m;
+  long f_d25h;
+  long f_rel21;
+  long f_rel21bl;
+  long f_rel25;
+  long f_rel25bl;
+  long f_d9l;
+  long f_d9h;
+  long f_rel9;
+  long f_u3;
+  long f_u5;
+  long f_u7;
+  long f_u8;
+  long f_s9;
+  long f_u5x2;
+  long f_u5x4;
+  long f_u8x4;
+  long f_s9x1;
+  long f_s9x2;
+  long f_s9x4;
+  long f_dummy;
+  long f_opm;
+  long f_go_type;
+  long f_go_cc_type;
+  long f_go_op;
+  long f_i16_43;
+  long f_i16_go;
+  long f_i16_gp_type;
+  long f_i16addcmpu7_type;
+  long f_buf;
+  long f_br;
+  long f_bluf;
+  long f_brscond;
+  long f_ldozzx;
+  long f_ldr6zzx;
+  long f_stozzr;
+  long f_ldoaa;
+  long f_ldraa;
+  long f_stoaa;
+  long f_LDODi;
+  long f_LDRDi;
+  long f_STODi;
+  long f_trapnum;
+};
+
+#define CGEN_INIT_PARSE(od) \
+{\
+}
+#define CGEN_INIT_INSERT(od) \
+{\
+}
+#define CGEN_INIT_EXTRACT(od) \
+{\
+}
+#define CGEN_INIT_PRINT(od) \
+{\
+}
+
+
+#endif /* ARC_OPC_H */
diff --git a/opcodes/arc-opinst.c b/opcodes/arc-opinst.c
new file mode 100644
index 0000000..94c814c
--- /dev/null
+++ b/opcodes/arc-opinst.c
@@ -0,0 +1,3816 @@
+/* Semantic operand instances for arc.
+
+THIS FILE IS MACHINE GENERATED WITH CGEN.
+
+Copyright 1996-2007 Free Software Foundation, Inc.
+
+This file is part of the GNU Binutils and/or GDB, the GNU debugger.
+
+   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
+   the Free Software Foundation; either version 3, or (at your option)
+   any later version.
+
+   It 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 this program; if not, write to the Free Software Foundation, Inc.,
+   51 Franklin Street - Fifth Floor, Boston, MA 02110-1301, USA.
+
+*/
+
+#include "sysdep.h"
+#include "ansidecl.h"
+#include "bfd.h"
+#include "symcat.h"
+#include "arc-desc.h"
+#include "arc-opc.h"
+
+/* Operand references.  */
+
+#if defined (__STDC__) || defined (ALMOST_STDC) || defined (HAVE_STRINGIZE)
+#define OP_ENT(op) ARC_OPERAND_##op
+#else
+#define OP_ENT(op) ARC_OPERAND_/**/op
+#endif
+#define INPUT CGEN_OPINST_INPUT
+#define OUTPUT CGEN_OPINST_OUTPUT
+#define END CGEN_OPINST_END
+#define COND_REF CGEN_OPINST_COND_REF
+
+static const CGEN_OPINST sfmt_empty_ops[] ATTRIBUTE_UNUSED = {
+  { END, (const char *)0, (enum cgen_hw_type)0, (enum cgen_mode)0, (enum cgen_operand_type)0, 0, 0 }
+};
+
+static const CGEN_OPINST sfmt_b_s_ops[] ATTRIBUTE_UNUSED = {
+  { INPUT, "h_auxr_SI_34", HW_H_AUXR, CGEN_MODE_SI, 0, 34, COND_REF },
+  { INPUT, "h_auxr_SI_37", HW_H_AUXR, CGEN_MODE_SI, 0, 37, COND_REF },
+  { INPUT, "h_e1_BI", HW_H_E1, CGEN_MODE_BI, 0, 0, COND_REF },
+  { INPUT, "h_memory_UHI_countp", HW_H_MEMORY, CGEN_MODE_UHI, 0, 0, COND_REF },
+  { INPUT, "h_prof_offset_SI_0", HW_H_PROF_OFFSET, CGEN_MODE_SI, 0, 0, COND_REF },
+  { INPUT, "h_status32_SI_0", HW_H_STATUS32, CGEN_MODE_SI, 0, 0, COND_REF },
+  { INPUT, "h_timer_expire_SI_0", HW_H_TIMER_EXPIRE, CGEN_MODE_SI, 0, 0, COND_REF },
+  { INPUT, "h_ubit_BI", HW_H_UBIT, CGEN_MODE_BI, 0, 0, COND_REF },
+  { INPUT, "i2cond", HW_H_I2COND, CGEN_MODE_BI, OP_ENT (I2COND), 0, 0 },
+  { INPUT, "label10", HW_H_IADDR, CGEN_MODE_USI, OP_ENT (LABEL10), 0, COND_REF },
+  { INPUT, "pc", HW_H_PC, CGEN_MODE_USI, 0, 0, COND_REF },
+  { OUTPUT, "h_auxr_SI_11", HW_H_AUXR, CGEN_MODE_SI, 0, 11, COND_REF },
+  { OUTPUT, "h_auxr_SI_33", HW_H_AUXR, CGEN_MODE_SI, 0, 33, COND_REF },
+  { OUTPUT, "h_cr_SI_29", HW_H_CR, CGEN_MODE_SI, 0, 29, COND_REF },
+  { OUTPUT, "h_e1_BI", HW_H_E1, CGEN_MODE_BI, 0, 0, COND_REF },
+  { OUTPUT, "h_memory_UHI_countp", HW_H_MEMORY, CGEN_MODE_UHI, 0, 0, COND_REF },
+  { OUTPUT, "pc", HW_H_PC, CGEN_MODE_USI, 0, 0, COND_REF },
+  { END, (const char *)0, (enum cgen_hw_type)0, (enum cgen_mode)0, (enum cgen_operand_type)0, 0, 0 }
+};
+
+static const CGEN_OPINST sfmt_bcc_s_ops[] ATTRIBUTE_UNUSED = {
+  { INPUT, "h_auxr_SI_34", HW_H_AUXR, CGEN_MODE_SI, 0, 34, COND_REF },
+  { INPUT, "h_auxr_SI_37", HW_H_AUXR, CGEN_MODE_SI, 0, 37, COND_REF },
+  { INPUT, "h_e1_BI", HW_H_E1, CGEN_MODE_BI, 0, 0, COND_REF },
+  { INPUT, "h_memory_UHI_countp", HW_H_MEMORY, CGEN_MODE_UHI, 0, 0, COND_REF },
+  { INPUT, "h_prof_offset_SI_0", HW_H_PROF_OFFSET, CGEN_MODE_SI, 0, 0, COND_REF },
+  { INPUT, "h_status32_SI_0", HW_H_STATUS32, CGEN_MODE_SI, 0, 0, COND_REF },
+  { INPUT, "h_timer_expire_SI_0", HW_H_TIMER_EXPIRE, CGEN_MODE_SI, 0, 0, COND_REF },
+  { INPUT, "h_ubit_BI", HW_H_UBIT, CGEN_MODE_BI, 0, 0, COND_REF },
+  { INPUT, "i3cond", HW_H_I3COND, CGEN_MODE_BI, OP_ENT (I3COND), 0, 0 },
+  { INPUT, "label7", HW_H_IADDR, CGEN_MODE_USI, OP_ENT (LABEL7), 0, COND_REF },
+  { INPUT, "pc", HW_H_PC, CGEN_MODE_USI, 0, 0, COND_REF },
+  { OUTPUT, "h_auxr_SI_11", HW_H_AUXR, CGEN_MODE_SI, 0, 11, COND_REF },
+  { OUTPUT, "h_auxr_SI_33", HW_H_AUXR, CGEN_MODE_SI, 0, 33, COND_REF },
+  { OUTPUT, "h_cr_SI_29", HW_H_CR, CGEN_MODE_SI, 0, 29, COND_REF },
+  { OUTPUT, "h_e1_BI", HW_H_E1, CGEN_MODE_BI, 0, 0, COND_REF },
+  { OUTPUT, "h_memory_UHI_countp", HW_H_MEMORY, CGEN_MODE_UHI, 0, 0, COND_REF },
+  { OUTPUT, "pc", HW_H_PC, CGEN_MODE_USI, 0, 0, COND_REF },
+  { END, (const char *)0, (enum cgen_hw_type)0, (enum cgen_mode)0, (enum cgen_operand_type)0, 0, 0 }
+};
+
+static const CGEN_OPINST sfmt_brcc_s_ops[] ATTRIBUTE_UNUSED = {
+  { INPUT, "R_b", HW_H_CR16, CGEN_MODE_SI, OP_ENT (R_B), 0, COND_REF },
+  { INPUT, "RccS", HW_H_RCCS, CGEN_MODE_BI, OP_ENT (RCCS), 0, 0 },
+  { INPUT, "h_auxr_SI_34", HW_H_AUXR, CGEN_MODE_SI, 0, 34, COND_REF },
+  { INPUT, "h_auxr_SI_37", HW_H_AUXR, CGEN_MODE_SI, 0, 37, COND_REF },
+  { INPUT, "h_e1_BI", HW_H_E1, CGEN_MODE_BI, 0, 0, COND_REF },
+  { INPUT, "h_memory_UHI_countp", HW_H_MEMORY, CGEN_MODE_UHI, 0, 0, COND_REF },
+  { INPUT, "h_prof_offset_SI_0", HW_H_PROF_OFFSET, CGEN_MODE_SI, 0, 0, COND_REF },
+  { INPUT, "h_status32_SI_0", HW_H_STATUS32, CGEN_MODE_SI, 0, 0, COND_REF },
+  { INPUT, "h_timer_expire_SI_0", HW_H_TIMER_EXPIRE, CGEN_MODE_SI, 0, 0, COND_REF },
+  { INPUT, "h_ubit_BI", HW_H_UBIT, CGEN_MODE_BI, 0, 0, COND_REF },
+  { INPUT, "label8", HW_H_IADDR, CGEN_MODE_USI, OP_ENT (LABEL8), 0, COND_REF },
+  { INPUT, "pc", HW_H_PC, CGEN_MODE_USI, 0, 0, COND_REF },
+  { OUTPUT, "h_auxr_SI_11", HW_H_AUXR, CGEN_MODE_SI, 0, 11, COND_REF },
+  { OUTPUT, "h_auxr_SI_33", HW_H_AUXR, CGEN_MODE_SI, 0, 33, COND_REF },
+  { OUTPUT, "h_cr_SI_29", HW_H_CR, CGEN_MODE_SI, 0, 29, COND_REF },
+  { OUTPUT, "h_e1_BI", HW_H_E1, CGEN_MODE_BI, 0, 0, COND_REF },
+  { OUTPUT, "h_memory_UHI_countp", HW_H_MEMORY, CGEN_MODE_UHI, 0, 0, COND_REF },
+  { OUTPUT, "pc", HW_H_PC, CGEN_MODE_USI, 0, 0, COND_REF },
+  { END, (const char *)0, (enum cgen_hw_type)0, (enum cgen_mode)0, (enum cgen_operand_type)0, 0, 0 }
+};
+
+static const CGEN_OPINST sfmt_bcc_l_ops[] ATTRIBUTE_UNUSED = {
+  { INPUT, "Qcondb", HW_H_QCONDB, CGEN_MODE_BI, OP_ENT (QCONDB), 0, 0 },
+  { INPUT, "h_auxr_SI_34", HW_H_AUXR, CGEN_MODE_SI, 0, 34, COND_REF },
+  { INPUT, "h_auxr_SI_37", HW_H_AUXR, CGEN_MODE_SI, 0, 37, COND_REF },
+  { INPUT, "h_e1_BI", HW_H_E1, CGEN_MODE_BI, 0, 0, COND_REF },
+  { INPUT, "h_memory_UHI_countp", HW_H_MEMORY, CGEN_MODE_UHI, 0, 0, COND_REF },
+  { INPUT, "h_prof_offset_SI_0", HW_H_PROF_OFFSET, CGEN_MODE_SI, 0, 0, COND_REF },
+  { INPUT, "h_status32_SI_0", HW_H_STATUS32, CGEN_MODE_SI, 0, 0, COND_REF },
+  { INPUT, "h_timer_expire_SI_0", HW_H_TIMER_EXPIRE, CGEN_MODE_SI, 0, 0, COND_REF },
+  { INPUT, "h_ubit_BI", HW_H_UBIT, CGEN_MODE_BI, 0, 0, COND_REF },
+  { INPUT, "label21", HW_H_IADDR, CGEN_MODE_USI, OP_ENT (LABEL21), 0, COND_REF },
+  { INPUT, "pc", HW_H_PC, CGEN_MODE_USI, 0, 0, COND_REF },
+  { OUTPUT, "h_auxr_SI_11", HW_H_AUXR, CGEN_MODE_SI, 0, 11, COND_REF },
+  { OUTPUT, "h_auxr_SI_33", HW_H_AUXR, CGEN_MODE_SI, 0, 33, COND_REF },
+  { OUTPUT, "h_cr_SI_29", HW_H_CR, CGEN_MODE_SI, 0, 29, COND_REF },
+  { OUTPUT, "h_e1_BI", HW_H_E1, CGEN_MODE_BI, 0, 0, COND_REF },
+  { OUTPUT, "h_memory_UHI_countp", HW_H_MEMORY, CGEN_MODE_UHI, 0, 0, COND_REF },
+  { OUTPUT, "pc", HW_H_PC, CGEN_MODE_USI, 0, 0, COND_REF },
+  { END, (const char *)0, (enum cgen_hw_type)0, (enum cgen_mode)0, (enum cgen_operand_type)0, 0, 0 }
+};
+
+static const CGEN_OPINST sfmt_b_l_ops[] ATTRIBUTE_UNUSED = {
+  { INPUT, "h_auxr_SI_34", HW_H_AUXR, CGEN_MODE_SI, 0, 34, 0 },
+  { INPUT, "h_auxr_SI_37", HW_H_AUXR, CGEN_MODE_SI, 0, 37, COND_REF },
+  { INPUT, "h_e1_BI", HW_H_E1, CGEN_MODE_BI, 0, 0, 0 },
+  { INPUT, "h_memory_UHI_countp", HW_H_MEMORY, CGEN_MODE_UHI, 0, 0, COND_REF },
+  { INPUT, "h_prof_offset_SI_0", HW_H_PROF_OFFSET, CGEN_MODE_SI, 0, 0, COND_REF },
+  { INPUT, "h_status32_SI_0", HW_H_STATUS32, CGEN_MODE_SI, 0, 0, COND_REF },
+  { INPUT, "h_timer_expire_SI_0", HW_H_TIMER_EXPIRE, CGEN_MODE_SI, 0, 0, 0 },
+  { INPUT, "h_ubit_BI", HW_H_UBIT, CGEN_MODE_BI, 0, 0, COND_REF },
+  { INPUT, "label25", HW_H_IADDR, CGEN_MODE_USI, OP_ENT (LABEL25), 0, COND_REF },
+  { INPUT, "pc", HW_H_PC, CGEN_MODE_USI, 0, 0, COND_REF },
+  { OUTPUT, "h_auxr_SI_11", HW_H_AUXR, CGEN_MODE_SI, 0, 11, COND_REF },
+  { OUTPUT, "h_auxr_SI_33", HW_H_AUXR, CGEN_MODE_SI, 0, 33, COND_REF },
+  { OUTPUT, "h_cr_SI_29", HW_H_CR, CGEN_MODE_SI, 0, 29, COND_REF },
+  { OUTPUT, "h_e1_BI", HW_H_E1, CGEN_MODE_BI, 0, 0, COND_REF },
+  { OUTPUT, "h_memory_UHI_countp", HW_H_MEMORY, CGEN_MODE_UHI, 0, 0, COND_REF },
+  { OUTPUT, "pc", HW_H_PC, CGEN_MODE_USI, 0, 0, COND_REF },
+  { END, (const char *)0, (enum cgen_hw_type)0, (enum cgen_mode)0, (enum cgen_operand_type)0, 0, 0 }
+};
+
+static const CGEN_OPINST sfmt_brcc_RC_ops[] ATTRIBUTE_UNUSED = {
+  { INPUT, "RB", HW_H_CR, CGEN_MODE_SI, OP_ENT (RB), 0, COND_REF },
+  { INPUT, "RC", HW_H_CR, CGEN_MODE_SI, OP_ENT (RC), 0, COND_REF },
+  { INPUT, "Rcc", HW_H_RCC, CGEN_MODE_SI, OP_ENT (RCC), 0, COND_REF },
+  { INPUT, "f_op_B", HW_H_UINT, CGEN_MODE_UINT, 0, 0, 0 },
+  { INPUT, "f_op_C", HW_H_UINT, CGEN_MODE_UINT, 0, 0, 0 },
+  { INPUT, "h_auxr_SI_34", HW_H_AUXR, CGEN_MODE_SI, 0, 34, 0 },
+  { INPUT, "h_auxr_SI_37", HW_H_AUXR, CGEN_MODE_SI, 0, 37, COND_REF },
+  { INPUT, "h_e1_BI", HW_H_E1, CGEN_MODE_BI, 0, 0, 0 },
+  { INPUT, "h_memory_HI_add__DFLT_pc_4", HW_H_MEMORY, CGEN_MODE_HI, 0, 0, COND_REF },
+  { INPUT, "h_memory_HI_add__DFLT_pc_add__DFLT_4_2", HW_H_MEMORY, CGEN_MODE_HI, 0, 0, COND_REF },
+  { INPUT, "h_memory_UHI_countp", HW_H_MEMORY, CGEN_MODE_UHI, 0, 0, COND_REF },
+  { INPUT, "h_prof_offset_SI_0", HW_H_PROF_OFFSET, CGEN_MODE_SI, 0, 0, COND_REF },
+  { INPUT, "h_status32_SI_0", HW_H_STATUS32, CGEN_MODE_SI, 0, 0, COND_REF },
+  { INPUT, "h_timer_expire_SI_0", HW_H_TIMER_EXPIRE, CGEN_MODE_SI, 0, 0, 0 },
+  { INPUT, "h_ubit_BI", HW_H_UBIT, CGEN_MODE_BI, 0, 0, COND_REF },
+  { INPUT, "label9", HW_H_IADDR, CGEN_MODE_USI, OP_ENT (LABEL9), 0, COND_REF },
+  { INPUT, "pc", HW_H_PC, CGEN_MODE_USI, 0, 0, COND_REF },
+  { OUTPUT, "h_auxr_SI_11", HW_H_AUXR, CGEN_MODE_SI, 0, 11, COND_REF },
+  { OUTPUT, "h_auxr_SI_33", HW_H_AUXR, CGEN_MODE_SI, 0, 33, COND_REF },
+  { OUTPUT, "h_cr_SI_29", HW_H_CR, CGEN_MODE_SI, 0, 29, COND_REF },
+  { OUTPUT, "h_e1_BI", HW_H_E1, CGEN_MODE_BI, 0, 0, COND_REF },
+  { OUTPUT, "h_memory_UHI_countp", HW_H_MEMORY, CGEN_MODE_UHI, 0, 0, COND_REF },
+  { OUTPUT, "pc", HW_H_PC, CGEN_MODE_USI, 0, 0, COND_REF },
+  { END, (const char *)0, (enum cgen_hw_type)0, (enum cgen_mode)0, (enum cgen_operand_type)0, 0, 0 }
+};
+
+static const CGEN_OPINST sfmt_brcc_U6_ops[] ATTRIBUTE_UNUSED = {
+  { INPUT, "RB", HW_H_CR, CGEN_MODE_SI, OP_ENT (RB), 0, COND_REF },
+  { INPUT, "Rcc", HW_H_RCC, CGEN_MODE_SI, OP_ENT (RCC), 0, COND_REF },
+  { INPUT, "U6", HW_H_UINT, CGEN_MODE_UINT, OP_ENT (U6), 0, COND_REF },
+  { INPUT, "h_auxr_SI_34", HW_H_AUXR, CGEN_MODE_SI, 0, 34, 0 },
+  { INPUT, "h_auxr_SI_37", HW_H_AUXR, CGEN_MODE_SI, 0, 37, COND_REF },
+  { INPUT, "h_e1_BI", HW_H_E1, CGEN_MODE_BI, 0, 0, 0 },
+  { INPUT, "h_memory_UHI_countp", HW_H_MEMORY, CGEN_MODE_UHI, 0, 0, COND_REF },
+  { INPUT, "h_prof_offset_SI_0", HW_H_PROF_OFFSET, CGEN_MODE_SI, 0, 0, COND_REF },
+  { INPUT, "h_status32_SI_0", HW_H_STATUS32, CGEN_MODE_SI, 0, 0, COND_REF },
+  { INPUT, "h_timer_expire_SI_0", HW_H_TIMER_EXPIRE, CGEN_MODE_SI, 0, 0, 0 },
+  { INPUT, "h_ubit_BI", HW_H_UBIT, CGEN_MODE_BI, 0, 0, COND_REF },
+  { INPUT, "label9", HW_H_IADDR, CGEN_MODE_USI, OP_ENT (LABEL9), 0, COND_REF },
+  { INPUT, "pc", HW_H_PC, CGEN_MODE_USI, 0, 0, COND_REF },
+  { OUTPUT, "h_auxr_SI_11", HW_H_AUXR, CGEN_MODE_SI, 0, 11, COND_REF },
+  { OUTPUT, "h_auxr_SI_33", HW_H_AUXR, CGEN_MODE_SI, 0, 33, COND_REF },
+  { OUTPUT, "h_cr_SI_29", HW_H_CR, CGEN_MODE_SI, 0, 29, COND_REF },
+  { OUTPUT, "h_e1_BI", HW_H_E1, CGEN_MODE_BI, 0, 0, COND_REF },
+  { OUTPUT, "h_memory_UHI_countp", HW_H_MEMORY, CGEN_MODE_UHI, 0, 0, COND_REF },
+  { OUTPUT, "pc", HW_H_PC, CGEN_MODE_USI, 0, 0, COND_REF },
+  { END, (const char *)0, (enum cgen_hw_type)0, (enum cgen_mode)0, (enum cgen_operand_type)0, 0, 0 }
+};
+
+static const CGEN_OPINST sfmt_bl_s_ops[] ATTRIBUTE_UNUSED = {
+  { INPUT, "h_auxr_SI_34", HW_H_AUXR, CGEN_MODE_SI, 0, 34, 0 },
+  { INPUT, "h_auxr_SI_37", HW_H_AUXR, CGEN_MODE_SI, 0, 37, COND_REF },
+  { INPUT, "h_e1_BI", HW_H_E1, CGEN_MODE_BI, 0, 0, 0 },
+  { INPUT, "h_memory_UHI_countp", HW_H_MEMORY, CGEN_MODE_UHI, 0, 0, COND_REF },
+  { INPUT, "h_prof_offset_SI_0", HW_H_PROF_OFFSET, CGEN_MODE_SI, 0, 0, COND_REF },
+  { INPUT, "h_status32_SI_0", HW_H_STATUS32, CGEN_MODE_SI, 0, 0, COND_REF },
+  { INPUT, "h_timer_expire_SI_0", HW_H_TIMER_EXPIRE, CGEN_MODE_SI, 0, 0, 0 },
+  { INPUT, "h_ubit_BI", HW_H_UBIT, CGEN_MODE_BI, 0, 0, COND_REF },
+  { INPUT, "label13a", HW_H_IADDR, CGEN_MODE_USI, OP_ENT (LABEL13A), 0, COND_REF },
+  { INPUT, "pc", HW_H_PC, CGEN_MODE_USI, 0, 0, COND_REF },
+  { OUTPUT, "h_auxr_SI_11", HW_H_AUXR, CGEN_MODE_SI, 0, 11, COND_REF },
+  { OUTPUT, "h_auxr_SI_33", HW_H_AUXR, CGEN_MODE_SI, 0, 33, COND_REF },
+  { OUTPUT, "h_cr_SI_29", HW_H_CR, CGEN_MODE_SI, 0, 29, COND_REF },
+  { OUTPUT, "h_cr_SI_31", HW_H_CR, CGEN_MODE_SI, 0, 31, COND_REF },
+  { OUTPUT, "h_e1_BI", HW_H_E1, CGEN_MODE_BI, 0, 0, COND_REF },
+  { OUTPUT, "h_memory_UHI_countp", HW_H_MEMORY, CGEN_MODE_UHI, 0, 0, COND_REF },
+  { OUTPUT, "pc", HW_H_PC, CGEN_MODE_USI, 0, 0, COND_REF },
+  { END, (const char *)0, (enum cgen_hw_type)0, (enum cgen_mode)0, (enum cgen_operand_type)0, 0, 0 }
+};
+
+static const CGEN_OPINST sfmt_blcc_ops[] ATTRIBUTE_UNUSED = {
+  { INPUT, "Qcondb", HW_H_QCONDB, CGEN_MODE_BI, OP_ENT (QCONDB), 0, 0 },
+  { INPUT, "h_auxr_SI_34", HW_H_AUXR, CGEN_MODE_SI, 0, 34, COND_REF },
+  { INPUT, "h_auxr_SI_37", HW_H_AUXR, CGEN_MODE_SI, 0, 37, COND_REF },
+  { INPUT, "h_e1_BI", HW_H_E1, CGEN_MODE_BI, 0, 0, COND_REF },
+  { INPUT, "h_memory_UHI_countp", HW_H_MEMORY, CGEN_MODE_UHI, 0, 0, COND_REF },
+  { INPUT, "h_prof_offset_SI_0", HW_H_PROF_OFFSET, CGEN_MODE_SI, 0, 0, COND_REF },
+  { INPUT, "h_status32_SI_0", HW_H_STATUS32, CGEN_MODE_SI, 0, 0, COND_REF },
+  { INPUT, "h_timer_expire_SI_0", HW_H_TIMER_EXPIRE, CGEN_MODE_SI, 0, 0, COND_REF },
+  { INPUT, "h_ubit_BI", HW_H_UBIT, CGEN_MODE_BI, 0, 0, COND_REF },
+  { INPUT, "label21a", HW_H_IADDR, CGEN_MODE_USI, OP_ENT (LABEL21A), 0, COND_REF },
+  { INPUT, "pc", HW_H_PC, CGEN_MODE_USI, 0, 0, COND_REF },
+  { OUTPUT, "h_auxr_SI_11", HW_H_AUXR, CGEN_MODE_SI, 0, 11, COND_REF },
+  { OUTPUT, "h_auxr_SI_33", HW_H_AUXR, CGEN_MODE_SI, 0, 33, COND_REF },
+  { OUTPUT, "h_cr_SI_29", HW_H_CR, CGEN_MODE_SI, 0, 29, COND_REF },
+  { OUTPUT, "h_cr_SI_31", HW_H_CR, CGEN_MODE_SI, 0, 31, COND_REF },
+  { OUTPUT, "h_e1_BI", HW_H_E1, CGEN_MODE_BI, 0, 0, COND_REF },
+  { OUTPUT, "h_memory_UHI_countp", HW_H_MEMORY, CGEN_MODE_UHI, 0, 0, COND_REF },
+  { OUTPUT, "pc", HW_H_PC, CGEN_MODE_USI, 0, 0, COND_REF },
+  { END, (const char *)0, (enum cgen_hw_type)0, (enum cgen_mode)0, (enum cgen_operand_type)0, 0, 0 }
+};
+
+static const CGEN_OPINST sfmt_bl_ops[] ATTRIBUTE_UNUSED = {
+  { INPUT, "h_auxr_SI_34", HW_H_AUXR, CGEN_MODE_SI, 0, 34, 0 },
+  { INPUT, "h_auxr_SI_37", HW_H_AUXR, CGEN_MODE_SI, 0, 37, COND_REF },
+  { INPUT, "h_e1_BI", HW_H_E1, CGEN_MODE_BI, 0, 0, 0 },
+  { INPUT, "h_memory_UHI_countp", HW_H_MEMORY, CGEN_MODE_UHI, 0, 0, COND_REF },
+  { INPUT, "h_prof_offset_SI_0", HW_H_PROF_OFFSET, CGEN_MODE_SI, 0, 0, COND_REF },
+  { INPUT, "h_status32_SI_0", HW_H_STATUS32, CGEN_MODE_SI, 0, 0, COND_REF },
+  { INPUT, "h_timer_expire_SI_0", HW_H_TIMER_EXPIRE, CGEN_MODE_SI, 0, 0, 0 },
+  { INPUT, "h_ubit_BI", HW_H_UBIT, CGEN_MODE_BI, 0, 0, COND_REF },
+  { INPUT, "label25a", HW_H_IADDR, CGEN_MODE_USI, OP_ENT (LABEL25A), 0, COND_REF },
+  { INPUT, "pc", HW_H_PC, CGEN_MODE_USI, 0, 0, COND_REF },
+  { OUTPUT, "h_auxr_SI_11", HW_H_AUXR, CGEN_MODE_SI, 0, 11, COND_REF },
+  { OUTPUT, "h_auxr_SI_33", HW_H_AUXR, CGEN_MODE_SI, 0, 33, COND_REF },
+  { OUTPUT, "h_cr_SI_29", HW_H_CR, CGEN_MODE_SI, 0, 29, COND_REF },
+  { OUTPUT, "h_cr_SI_31", HW_H_CR, CGEN_MODE_SI, 0, 31, COND_REF },
+  { OUTPUT, "h_e1_BI", HW_H_E1, CGEN_MODE_BI, 0, 0, COND_REF },
+  { OUTPUT, "h_memory_UHI_countp", HW_H_MEMORY, CGEN_MODE_UHI, 0, 0, COND_REF },
+  { OUTPUT, "pc", HW_H_PC, CGEN_MODE_USI, 0, 0, COND_REF },
+  { END, (const char *)0, (enum cgen_hw_type)0, (enum cgen_mode)0, (enum cgen_operand_type)0, 0, 0 }
+};
+
+static const CGEN_OPINST sfmt_bl_d_ops[] ATTRIBUTE_UNUSED = {
+  { INPUT, "h_auxr_SI_34", HW_H_AUXR, CGEN_MODE_SI, 0, 34, 0 },
+  { INPUT, "h_auxr_SI_37", HW_H_AUXR, CGEN_MODE_SI, 0, 37, COND_REF },
+  { INPUT, "h_e1_BI", HW_H_E1, CGEN_MODE_BI, 0, 0, 0 },
+  { INPUT, "h_memory_HI_add__DFLT_pc_4", HW_H_MEMORY, CGEN_MODE_HI, 0, 0, COND_REF },
+  { INPUT, "h_memory_UHI_countp", HW_H_MEMORY, CGEN_MODE_UHI, 0, 0, COND_REF },
+  { INPUT, "h_prof_offset_SI_0", HW_H_PROF_OFFSET, CGEN_MODE_SI, 0, 0, COND_REF },
+  { INPUT, "h_status32_SI_0", HW_H_STATUS32, CGEN_MODE_SI, 0, 0, COND_REF },
+  { INPUT, "h_timer_expire_SI_0", HW_H_TIMER_EXPIRE, CGEN_MODE_SI, 0, 0, 0 },
+  { INPUT, "h_ubit_BI", HW_H_UBIT, CGEN_MODE_BI, 0, 0, COND_REF },
+  { INPUT, "label25a", HW_H_IADDR, CGEN_MODE_USI, OP_ENT (LABEL25A), 0, COND_REF },
+  { INPUT, "pc", HW_H_PC, CGEN_MODE_USI, 0, 0, COND_REF },
+  { OUTPUT, "h_auxr_SI_11", HW_H_AUXR, CGEN_MODE_SI, 0, 11, COND_REF },
+  { OUTPUT, "h_auxr_SI_33", HW_H_AUXR, CGEN_MODE_SI, 0, 33, COND_REF },
+  { OUTPUT, "h_cr_SI_29", HW_H_CR, CGEN_MODE_SI, 0, 29, COND_REF },
+  { OUTPUT, "h_cr_SI_31", HW_H_CR, CGEN_MODE_SI, 0, 31, COND_REF },
+  { OUTPUT, "h_e1_BI", HW_H_E1, CGEN_MODE_BI, 0, 0, COND_REF },
+  { OUTPUT, "h_memory_UHI_countp", HW_H_MEMORY, CGEN_MODE_UHI, 0, 0, COND_REF },
+  { OUTPUT, "pc", HW_H_PC, CGEN_MODE_USI, 0, 0, COND_REF },
+  { END, (const char *)0, (enum cgen_hw_type)0, (enum cgen_mode)0, (enum cgen_operand_type)0, 0, 0 }
+};
+
+static const CGEN_OPINST sfmt_ld_abs_ops[] ATTRIBUTE_UNUSED = {
+  { INPUT, "RB", HW_H_CR, CGEN_MODE_SI, OP_ENT (RB), 0, 0 },
+  { INPUT, "f_op_B", HW_H_UINT, CGEN_MODE_UINT, 0, 0, 0 },
+  { INPUT, "h_memory_HI_add__DFLT_pc_4", HW_H_MEMORY, CGEN_MODE_HI, 0, 0, COND_REF },
+  { INPUT, "h_memory_HI_add__DFLT_pc_add__DFLT_4_2", HW_H_MEMORY, CGEN_MODE_HI, 0, 0, COND_REF },
+  { INPUT, "h_memory_SI_eaddr", HW_H_MEMORY, CGEN_MODE_SI, 0, 0, 0 },
+  { INPUT, "pc", HW_H_PC, CGEN_MODE_USI, 0, 0, COND_REF },
+  { INPUT, "s9", HW_H_SINT, CGEN_MODE_INT, OP_ENT (S9), 0, 0 },
+  { OUTPUT, "RA", HW_H_CR, CGEN_MODE_SI, OP_ENT (RA), 0, 0 },
+  { END, (const char *)0, (enum cgen_hw_type)0, (enum cgen_mode)0, (enum cgen_operand_type)0, 0, 0 }
+};
+
+static const CGEN_OPINST sfmt_ld__AW_abs_ops[] ATTRIBUTE_UNUSED = {
+  { INPUT, "RB", HW_H_CR, CGEN_MODE_SI, OP_ENT (RB), 0, 0 },
+  { INPUT, "f_op_B", HW_H_UINT, CGEN_MODE_UINT, 0, 0, 0 },
+  { INPUT, "h_memory_HI_add__DFLT_pc_4", HW_H_MEMORY, CGEN_MODE_HI, 0, 0, COND_REF },
+  { INPUT, "h_memory_HI_add__DFLT_pc_add__DFLT_4_2", HW_H_MEMORY, CGEN_MODE_HI, 0, 0, COND_REF },
+  { INPUT, "h_memory_SI_eaddr", HW_H_MEMORY, CGEN_MODE_SI, 0, 0, 0 },
+  { INPUT, "pc", HW_H_PC, CGEN_MODE_USI, 0, 0, COND_REF },
+  { INPUT, "s9", HW_H_SINT, CGEN_MODE_INT, OP_ENT (S9), 0, 0 },
+  { OUTPUT, "RA", HW_H_CR, CGEN_MODE_SI, OP_ENT (RA), 0, 0 },
+  { OUTPUT, "RB", HW_H_CR, CGEN_MODE_SI, OP_ENT (RB), 0, 0 },
+  { END, (const char *)0, (enum cgen_hw_type)0, (enum cgen_mode)0, (enum cgen_operand_type)0, 0, 0 }
+};
+
+static const CGEN_OPINST sfmt_ld_abc_ops[] ATTRIBUTE_UNUSED = {
+  { INPUT, "RB", HW_H_CR, CGEN_MODE_SI, OP_ENT (RB), 0, 0 },
+  { INPUT, "RC", HW_H_CR, CGEN_MODE_SI, OP_ENT (RC), 0, 0 },
+  { INPUT, "f_op_B", HW_H_UINT, CGEN_MODE_UINT, 0, 0, 0 },
+  { INPUT, "f_op_C", HW_H_UINT, CGEN_MODE_UINT, 0, 0, 0 },
+  { INPUT, "h_memory_HI_add__DFLT_pc_4", HW_H_MEMORY, CGEN_MODE_HI, 0, 0, COND_REF },
+  { INPUT, "h_memory_HI_add__DFLT_pc_add__DFLT_4_2", HW_H_MEMORY, CGEN_MODE_HI, 0, 0, COND_REF },
+  { INPUT, "h_memory_SI_eaddr", HW_H_MEMORY, CGEN_MODE_SI, 0, 0, 0 },
+  { INPUT, "pc", HW_H_PC, CGEN_MODE_USI, 0, 0, COND_REF },
+  { OUTPUT, "RA", HW_H_CR, CGEN_MODE_SI, OP_ENT (RA), 0, 0 },
+  { END, (const char *)0, (enum cgen_hw_type)0, (enum cgen_mode)0, (enum cgen_operand_type)0, 0, 0 }
+};
+
+static const CGEN_OPINST sfmt_ld__AW_abc_ops[] ATTRIBUTE_UNUSED = {
+  { INPUT, "RB", HW_H_CR, CGEN_MODE_SI, OP_ENT (RB), 0, 0 },
+  { INPUT, "RC", HW_H_CR, CGEN_MODE_SI, OP_ENT (RC), 0, 0 },
+  { INPUT, "f_op_B", HW_H_UINT, CGEN_MODE_UINT, 0, 0, 0 },
+  { INPUT, "f_op_C", HW_H_UINT, CGEN_MODE_UINT, 0, 0, 0 },
+  { INPUT, "h_memory_HI_add__DFLT_pc_4", HW_H_MEMORY, CGEN_MODE_HI, 0, 0, COND_REF },
+  { INPUT, "h_memory_HI_add__DFLT_pc_add__DFLT_4_2", HW_H_MEMORY, CGEN_MODE_HI, 0, 0, COND_REF },
+  { INPUT, "h_memory_SI_eaddr", HW_H_MEMORY, CGEN_MODE_SI, 0, 0, 0 },
+  { INPUT, "pc", HW_H_PC, CGEN_MODE_USI, 0, 0, COND_REF },
+  { OUTPUT, "RA", HW_H_CR, CGEN_MODE_SI, OP_ENT (RA), 0, 0 },
+  { OUTPUT, "RB", HW_H_CR, CGEN_MODE_SI, OP_ENT (RB), 0, 0 },
+  { END, (const char *)0, (enum cgen_hw_type)0, (enum cgen_mode)0, (enum cgen_operand_type)0, 0, 0 }
+};
+
+static const CGEN_OPINST sfmt_ld_s_abc_ops[] ATTRIBUTE_UNUSED = {
+  { INPUT, "R_b", HW_H_CR16, CGEN_MODE_SI, OP_ENT (R_B), 0, 0 },
+  { INPUT, "R_c", HW_H_CR16, CGEN_MODE_SI, OP_ENT (R_C), 0, 0 },
+  { INPUT, "h_memory_SI_eaddr", HW_H_MEMORY, CGEN_MODE_SI, 0, 0, 0 },
+  { OUTPUT, "R_a", HW_H_CR16, CGEN_MODE_SI, OP_ENT (R_A), 0, 0 },
+  { END, (const char *)0, (enum cgen_hw_type)0, (enum cgen_mode)0, (enum cgen_operand_type)0, 0, 0 }
+};
+
+static const CGEN_OPINST sfmt_ld_s_abu_ops[] ATTRIBUTE_UNUSED = {
+  { INPUT, "R_b", HW_H_CR16, CGEN_MODE_SI, OP_ENT (R_B), 0, 0 },
+  { INPUT, "h_memory_SI_eaddr", HW_H_MEMORY, CGEN_MODE_SI, 0, 0, 0 },
+  { INPUT, "sc_u5_", HW_H_UINT, CGEN_MODE_UINT, OP_ENT (SC_U5_), 0, 0 },
+  { OUTPUT, "R_c", HW_H_CR16, CGEN_MODE_SI, OP_ENT (R_C), 0, 0 },
+  { END, (const char *)0, (enum cgen_hw_type)0, (enum cgen_mode)0, (enum cgen_operand_type)0, 0, 0 }
+};
+
+static const CGEN_OPINST sfmt_ld_s_absp_ops[] ATTRIBUTE_UNUSED = {
+  { INPUT, "SP", HW_H_SP, CGEN_MODE_SI, 0, 0, 0 },
+  { INPUT, "h_memory_SI_eaddr", HW_H_MEMORY, CGEN_MODE_SI, 0, 0, 0 },
+  { INPUT, "u5x4", HW_H_UINT, CGEN_MODE_UINT, OP_ENT (U5X4), 0, 0 },
+  { OUTPUT, "R_b", HW_H_CR16, CGEN_MODE_SI, OP_ENT (R_B), 0, 0 },
+  { END, (const char *)0, (enum cgen_hw_type)0, (enum cgen_mode)0, (enum cgen_operand_type)0, 0, 0 }
+};
+
+static const CGEN_OPINST sfmt_ld_s_gprel_ops[] ATTRIBUTE_UNUSED = {
+  { INPUT, "GP", HW_H_GP, CGEN_MODE_SI, 0, 0, 0 },
+  { INPUT, "h_memory_SI_eaddr", HW_H_MEMORY, CGEN_MODE_SI, 0, 0, 0 },
+  { INPUT, "sc_s9_", HW_H_UINT, CGEN_MODE_UINT, OP_ENT (SC_S9_), 0, 0 },
+  { OUTPUT, "R0", HW_H_R0, CGEN_MODE_SI, 0, 0, 0 },
+  { END, (const char *)0, (enum cgen_hw_type)0, (enum cgen_mode)0, (enum cgen_operand_type)0, 0, 0 }
+};
+
+static const CGEN_OPINST sfmt_ld_s_pcrel_ops[] ATTRIBUTE_UNUSED = {
+  { INPUT, "h_memory_SI_eaddr", HW_H_MEMORY, CGEN_MODE_SI, 0, 0, 0 },
+  { INPUT, "pc", HW_H_PC, CGEN_MODE_USI, 0, 0, 0 },
+  { INPUT, "u8x4", HW_H_UINT, CGEN_MODE_UINT, OP_ENT (U8X4), 0, 0 },
+  { OUTPUT, "R_b", HW_H_CR16, CGEN_MODE_SI, OP_ENT (R_B), 0, 0 },
+  { END, (const char *)0, (enum cgen_hw_type)0, (enum cgen_mode)0, (enum cgen_operand_type)0, 0, 0 }
+};
+
+static const CGEN_OPINST sfmt_ldb_abs_ops[] ATTRIBUTE_UNUSED = {
+  { INPUT, "RB", HW_H_CR, CGEN_MODE_SI, OP_ENT (RB), 0, 0 },
+  { INPUT, "f_op_B", HW_H_UINT, CGEN_MODE_UINT, 0, 0, 0 },
+  { INPUT, "h_memory_HI_add__DFLT_pc_4", HW_H_MEMORY, CGEN_MODE_HI, 0, 0, COND_REF },
+  { INPUT, "h_memory_HI_add__DFLT_pc_add__DFLT_4_2", HW_H_MEMORY, CGEN_MODE_HI, 0, 0, COND_REF },
+  { INPUT, "h_memory_QI_eaddr", HW_H_MEMORY, CGEN_MODE_QI, 0, 0, 0 },
+  { INPUT, "pc", HW_H_PC, CGEN_MODE_USI, 0, 0, COND_REF },
+  { INPUT, "s9", HW_H_SINT, CGEN_MODE_INT, OP_ENT (S9), 0, 0 },
+  { OUTPUT, "RA", HW_H_CR, CGEN_MODE_SI, OP_ENT (RA), 0, 0 },
+  { END, (const char *)0, (enum cgen_hw_type)0, (enum cgen_mode)0, (enum cgen_operand_type)0, 0, 0 }
+};
+
+static const CGEN_OPINST sfmt_ldb__AW_abs_ops[] ATTRIBUTE_UNUSED = {
+  { INPUT, "RB", HW_H_CR, CGEN_MODE_SI, OP_ENT (RB), 0, 0 },
+  { INPUT, "f_op_B", HW_H_UINT, CGEN_MODE_UINT, 0, 0, 0 },
+  { INPUT, "h_memory_HI_add__DFLT_pc_4", HW_H_MEMORY, CGEN_MODE_HI, 0, 0, COND_REF },
+  { INPUT, "h_memory_HI_add__DFLT_pc_add__DFLT_4_2", HW_H_MEMORY, CGEN_MODE_HI, 0, 0, COND_REF },
+  { INPUT, "h_memory_QI_eaddr", HW_H_MEMORY, CGEN_MODE_QI, 0, 0, 0 },
+  { INPUT, "pc", HW_H_PC, CGEN_MODE_USI, 0, 0, COND_REF },
+  { INPUT, "s9", HW_H_SINT, CGEN_MODE_INT, OP_ENT (S9), 0, 0 },
+  { OUTPUT, "RA", HW_H_CR, CGEN_MODE_SI, OP_ENT (RA), 0, 0 },
+  { OUTPUT, "RB", HW_H_CR, CGEN_MODE_SI, OP_ENT (RB), 0, 0 },
+  { END, (const char *)0, (enum cgen_hw_type)0, (enum cgen_mode)0, (enum cgen_operand_type)0, 0, 0 }
+};
+
+static const CGEN_OPINST sfmt_ldb_as_abs_ops[] ATTRIBUTE_UNUSED = {
+  { INPUT, "RB", HW_H_CR, CGEN_MODE_SI, OP_ENT (RB), 0, 0 },
+  { INPUT, "f_op_B", HW_H_UINT, CGEN_MODE_UINT, 0, 0, 0 },
+  { INPUT, "h_memory_HI_add__DFLT_pc_4", HW_H_MEMORY, CGEN_MODE_HI, 0, 0, COND_REF },
+  { INPUT, "h_memory_HI_add__DFLT_pc_add__DFLT_4_2", HW_H_MEMORY, CGEN_MODE_HI, 0, 0, COND_REF },
+  { INPUT, "h_memory_QI_eaddr", HW_H_MEMORY, CGEN_MODE_QI, 0, 0, 0 },
+  { INPUT, "pc", HW_H_PC, CGEN_MODE_USI, 0, 0, COND_REF },
+  { OUTPUT, "RA", HW_H_CR, CGEN_MODE_SI, OP_ENT (RA), 0, 0 },
+  { END, (const char *)0, (enum cgen_hw_type)0, (enum cgen_mode)0, (enum cgen_operand_type)0, 0, 0 }
+};
+
+static const CGEN_OPINST sfmt_ldb_abc_ops[] ATTRIBUTE_UNUSED = {
+  { INPUT, "RB", HW_H_CR, CGEN_MODE_SI, OP_ENT (RB), 0, 0 },
+  { INPUT, "RC", HW_H_CR, CGEN_MODE_SI, OP_ENT (RC), 0, 0 },
+  { INPUT, "f_op_B", HW_H_UINT, CGEN_MODE_UINT, 0, 0, 0 },
+  { INPUT, "f_op_C", HW_H_UINT, CGEN_MODE_UINT, 0, 0, 0 },
+  { INPUT, "h_memory_HI_add__DFLT_pc_4", HW_H_MEMORY, CGEN_MODE_HI, 0, 0, COND_REF },
+  { INPUT, "h_memory_HI_add__DFLT_pc_add__DFLT_4_2", HW_H_MEMORY, CGEN_MODE_HI, 0, 0, COND_REF },
+  { INPUT, "h_memory_QI_eaddr", HW_H_MEMORY, CGEN_MODE_QI, 0, 0, 0 },
+  { INPUT, "pc", HW_H_PC, CGEN_MODE_USI, 0, 0, COND_REF },
+  { OUTPUT, "RA", HW_H_CR, CGEN_MODE_SI, OP_ENT (RA), 0, 0 },
+  { END, (const char *)0, (enum cgen_hw_type)0, (enum cgen_mode)0, (enum cgen_operand_type)0, 0, 0 }
+};
+
+static const CGEN_OPINST sfmt_ldb__AW_abc_ops[] ATTRIBUTE_UNUSED = {
+  { INPUT, "RB", HW_H_CR, CGEN_MODE_SI, OP_ENT (RB), 0, 0 },
+  { INPUT, "RC", HW_H_CR, CGEN_MODE_SI, OP_ENT (RC), 0, 0 },
+  { INPUT, "f_op_B", HW_H_UINT, CGEN_MODE_UINT, 0, 0, 0 },
+  { INPUT, "f_op_C", HW_H_UINT, CGEN_MODE_UINT, 0, 0, 0 },
+  { INPUT, "h_memory_HI_add__DFLT_pc_4", HW_H_MEMORY, CGEN_MODE_HI, 0, 0, COND_REF },
+  { INPUT, "h_memory_HI_add__DFLT_pc_add__DFLT_4_2", HW_H_MEMORY, CGEN_MODE_HI, 0, 0, COND_REF },
+  { INPUT, "h_memory_QI_eaddr", HW_H_MEMORY, CGEN_MODE_QI, 0, 0, 0 },
+  { INPUT, "pc", HW_H_PC, CGEN_MODE_USI, 0, 0, COND_REF },
+  { OUTPUT, "RA", HW_H_CR, CGEN_MODE_SI, OP_ENT (RA), 0, 0 },
+  { OUTPUT, "RB", HW_H_CR, CGEN_MODE_SI, OP_ENT (RB), 0, 0 },
+  { END, (const char *)0, (enum cgen_hw_type)0, (enum cgen_mode)0, (enum cgen_operand_type)0, 0, 0 }
+};
+
+static const CGEN_OPINST sfmt_ldb_as_abc_ops[] ATTRIBUTE_UNUSED = {
+  { INPUT, "RB", HW_H_CR, CGEN_MODE_SI, OP_ENT (RB), 0, 0 },
+  { INPUT, "f_op_B", HW_H_UINT, CGEN_MODE_UINT, 0, 0, 0 },
+  { INPUT, "f_op_C", HW_H_UINT, CGEN_MODE_UINT, 0, 0, 0 },
+  { INPUT, "h_memory_HI_add__DFLT_pc_4", HW_H_MEMORY, CGEN_MODE_HI, 0, 0, COND_REF },
+  { INPUT, "h_memory_HI_add__DFLT_pc_add__DFLT_4_2", HW_H_MEMORY, CGEN_MODE_HI, 0, 0, COND_REF },
+  { INPUT, "h_memory_QI_eaddr", HW_H_MEMORY, CGEN_MODE_QI, 0, 0, 0 },
+  { INPUT, "pc", HW_H_PC, CGEN_MODE_USI, 0, 0, COND_REF },
+  { OUTPUT, "RA", HW_H_CR, CGEN_MODE_SI, OP_ENT (RA), 0, 0 },
+  { END, (const char *)0, (enum cgen_hw_type)0, (enum cgen_mode)0, (enum cgen_operand_type)0, 0, 0 }
+};
+
+static const CGEN_OPINST sfmt_ldb_s_abc_ops[] ATTRIBUTE_UNUSED = {
+  { INPUT, "R_b", HW_H_CR16, CGEN_MODE_SI, OP_ENT (R_B), 0, 0 },
+  { INPUT, "R_c", HW_H_CR16, CGEN_MODE_SI, OP_ENT (R_C), 0, 0 },
+  { INPUT, "h_memory_QI_eaddr", HW_H_MEMORY, CGEN_MODE_QI, 0, 0, 0 },
+  { OUTPUT, "R_a", HW_H_CR16, CGEN_MODE_SI, OP_ENT (R_A), 0, 0 },
+  { END, (const char *)0, (enum cgen_hw_type)0, (enum cgen_mode)0, (enum cgen_operand_type)0, 0, 0 }
+};
+
+static const CGEN_OPINST sfmt_ldb_s_abu_ops[] ATTRIBUTE_UNUSED = {
+  { INPUT, "R_b", HW_H_CR16, CGEN_MODE_SI, OP_ENT (R_B), 0, 0 },
+  { INPUT, "h_memory_QI_eaddr", HW_H_MEMORY, CGEN_MODE_QI, 0, 0, 0 },
+  { INPUT, "sc_u5b", HW_H_UINT, CGEN_MODE_UINT, OP_ENT (SC_U5B), 0, 0 },
+  { OUTPUT, "R_c", HW_H_CR16, CGEN_MODE_SI, OP_ENT (R_C), 0, 0 },
+  { END, (const char *)0, (enum cgen_hw_type)0, (enum cgen_mode)0, (enum cgen_operand_type)0, 0, 0 }
+};
+
+static const CGEN_OPINST sfmt_ldb_s_absp_ops[] ATTRIBUTE_UNUSED = {
+  { INPUT, "SP", HW_H_SP, CGEN_MODE_SI, 0, 0, 0 },
+  { INPUT, "h_memory_QI_eaddr", HW_H_MEMORY, CGEN_MODE_QI, 0, 0, 0 },
+  { INPUT, "u5x4", HW_H_UINT, CGEN_MODE_UINT, OP_ENT (U5X4), 0, 0 },
+  { OUTPUT, "R_b", HW_H_CR16, CGEN_MODE_SI, OP_ENT (R_B), 0, 0 },
+  { END, (const char *)0, (enum cgen_hw_type)0, (enum cgen_mode)0, (enum cgen_operand_type)0, 0, 0 }
+};
+
+static const CGEN_OPINST sfmt_ldb_s_gprel_ops[] ATTRIBUTE_UNUSED = {
+  { INPUT, "GP", HW_H_GP, CGEN_MODE_SI, 0, 0, 0 },
+  { INPUT, "h_memory_QI_eaddr", HW_H_MEMORY, CGEN_MODE_QI, 0, 0, 0 },
+  { INPUT, "sc_s9b", HW_H_UINT, CGEN_MODE_UINT, OP_ENT (SC_S9B), 0, 0 },
+  { OUTPUT, "R0", HW_H_R0, CGEN_MODE_SI, 0, 0, 0 },
+  { END, (const char *)0, (enum cgen_hw_type)0, (enum cgen_mode)0, (enum cgen_operand_type)0, 0, 0 }
+};
+
+static const CGEN_OPINST sfmt_ldw_abs_ops[] ATTRIBUTE_UNUSED = {
+  { INPUT, "RB", HW_H_CR, CGEN_MODE_SI, OP_ENT (RB), 0, 0 },
+  { INPUT, "f_op_B", HW_H_UINT, CGEN_MODE_UINT, 0, 0, 0 },
+  { INPUT, "h_memory_HI_add__DFLT_pc_4", HW_H_MEMORY, CGEN_MODE_HI, 0, 0, COND_REF },
+  { INPUT, "h_memory_HI_add__DFLT_pc_add__DFLT_4_2", HW_H_MEMORY, CGEN_MODE_HI, 0, 0, COND_REF },
+  { INPUT, "h_memory_HI_eaddr", HW_H_MEMORY, CGEN_MODE_HI, 0, 0, 0 },
+  { INPUT, "pc", HW_H_PC, CGEN_MODE_USI, 0, 0, COND_REF },
+  { INPUT, "s9", HW_H_SINT, CGEN_MODE_INT, OP_ENT (S9), 0, 0 },
+  { OUTPUT, "RA", HW_H_CR, CGEN_MODE_SI, OP_ENT (RA), 0, 0 },
+  { END, (const char *)0, (enum cgen_hw_type)0, (enum cgen_mode)0, (enum cgen_operand_type)0, 0, 0 }
+};
+
+static const CGEN_OPINST sfmt_ldw__AW_abs_ops[] ATTRIBUTE_UNUSED = {
+  { INPUT, "RB", HW_H_CR, CGEN_MODE_SI, OP_ENT (RB), 0, 0 },
+  { INPUT, "f_op_B", HW_H_UINT, CGEN_MODE_UINT, 0, 0, 0 },
+  { INPUT, "h_memory_HI_add__DFLT_pc_4", HW_H_MEMORY, CGEN_MODE_HI, 0, 0, COND_REF },
+  { INPUT, "h_memory_HI_add__DFLT_pc_add__DFLT_4_2", HW_H_MEMORY, CGEN_MODE_HI, 0, 0, COND_REF },
+  { INPUT, "h_memory_HI_eaddr", HW_H_MEMORY, CGEN_MODE_HI, 0, 0, 0 },
+  { INPUT, "pc", HW_H_PC, CGEN_MODE_USI, 0, 0, COND_REF },
+  { INPUT, "s9", HW_H_SINT, CGEN_MODE_INT, OP_ENT (S9), 0, 0 },
+  { OUTPUT, "RA", HW_H_CR, CGEN_MODE_SI, OP_ENT (RA), 0, 0 },
+  { OUTPUT, "RB", HW_H_CR, CGEN_MODE_SI, OP_ENT (RB), 0, 0 },
+  { END, (const char *)0, (enum cgen_hw_type)0, (enum cgen_mode)0, (enum cgen_operand_type)0, 0, 0 }
+};
+
+static const CGEN_OPINST sfmt_ldw_abc_ops[] ATTRIBUTE_UNUSED = {
+  { INPUT, "RB", HW_H_CR, CGEN_MODE_SI, OP_ENT (RB), 0, 0 },
+  { INPUT, "RC", HW_H_CR, CGEN_MODE_SI, OP_ENT (RC), 0, 0 },
+  { INPUT, "f_op_B", HW_H_UINT, CGEN_MODE_UINT, 0, 0, 0 },
+  { INPUT, "f_op_C", HW_H_UINT, CGEN_MODE_UINT, 0, 0, 0 },
+  { INPUT, "h_memory_HI_add__DFLT_pc_4", HW_H_MEMORY, CGEN_MODE_HI, 0, 0, COND_REF },
+  { INPUT, "h_memory_HI_add__DFLT_pc_add__DFLT_4_2", HW_H_MEMORY, CGEN_MODE_HI, 0, 0, COND_REF },
+  { INPUT, "h_memory_HI_eaddr", HW_H_MEMORY, CGEN_MODE_HI, 0, 0, 0 },
+  { INPUT, "pc", HW_H_PC, CGEN_MODE_USI, 0, 0, COND_REF },
+  { OUTPUT, "RA", HW_H_CR, CGEN_MODE_SI, OP_ENT (RA), 0, 0 },
+  { END, (const char *)0, (enum cgen_hw_type)0, (enum cgen_mode)0, (enum cgen_operand_type)0, 0, 0 }
+};
+
+static const CGEN_OPINST sfmt_ldw__AW_abc_ops[] ATTRIBUTE_UNUSED = {
+  { INPUT, "RB", HW_H_CR, CGEN_MODE_SI, OP_ENT (RB), 0, 0 },
+  { INPUT, "RC", HW_H_CR, CGEN_MODE_SI, OP_ENT (RC), 0, 0 },
+  { INPUT, "f_op_B", HW_H_UINT, CGEN_MODE_UINT, 0, 0, 0 },
+  { INPUT, "f_op_C", HW_H_UINT, CGEN_MODE_UINT, 0, 0, 0 },
+  { INPUT, "h_memory_HI_add__DFLT_pc_4", HW_H_MEMORY, CGEN_MODE_HI, 0, 0, COND_REF },
+  { INPUT, "h_memory_HI_add__DFLT_pc_add__DFLT_4_2", HW_H_MEMORY, CGEN_MODE_HI, 0, 0, COND_REF },
+  { INPUT, "h_memory_HI_eaddr", HW_H_MEMORY, CGEN_MODE_HI, 0, 0, 0 },
+  { INPUT, "pc", HW_H_PC, CGEN_MODE_USI, 0, 0, COND_REF },
+  { OUTPUT, "RA", HW_H_CR, CGEN_MODE_SI, OP_ENT (RA), 0, 0 },
+  { OUTPUT, "RB", HW_H_CR, CGEN_MODE_SI, OP_ENT (RB), 0, 0 },
+  { END, (const char *)0, (enum cgen_hw_type)0, (enum cgen_mode)0, (enum cgen_operand_type)0, 0, 0 }
+};
+
+static const CGEN_OPINST sfmt_ldw_s_abc_ops[] ATTRIBUTE_UNUSED = {
+  { INPUT, "R_b", HW_H_CR16, CGEN_MODE_SI, OP_ENT (R_B), 0, 0 },
+  { INPUT, "R_c", HW_H_CR16, CGEN_MODE_SI, OP_ENT (R_C), 0, 0 },
+  { INPUT, "h_memory_HI_eaddr", HW_H_MEMORY, CGEN_MODE_HI, 0, 0, 0 },
+  { OUTPUT, "R_a", HW_H_CR16, CGEN_MODE_SI, OP_ENT (R_A), 0, 0 },
+  { END, (const char *)0, (enum cgen_hw_type)0, (enum cgen_mode)0, (enum cgen_operand_type)0, 0, 0 }
+};
+
+static const CGEN_OPINST sfmt_ldw_s_abu_ops[] ATTRIBUTE_UNUSED = {
+  { INPUT, "R_b", HW_H_CR16, CGEN_MODE_SI, OP_ENT (R_B), 0, 0 },
+  { INPUT, "h_memory_HI_eaddr", HW_H_MEMORY, CGEN_MODE_HI, 0, 0, 0 },
+  { INPUT, "sc_u5w", HW_H_UINT, CGEN_MODE_UINT, OP_ENT (SC_U5W), 0, 0 },
+  { OUTPUT, "R_c", HW_H_CR16, CGEN_MODE_SI, OP_ENT (R_C), 0, 0 },
+  { END, (const char *)0, (enum cgen_hw_type)0, (enum cgen_mode)0, (enum cgen_operand_type)0, 0, 0 }
+};
+
+static const CGEN_OPINST sfmt_ldw_s_gprel_ops[] ATTRIBUTE_UNUSED = {
+  { INPUT, "GP", HW_H_GP, CGEN_MODE_SI, 0, 0, 0 },
+  { INPUT, "h_memory_HI_eaddr", HW_H_MEMORY, CGEN_MODE_HI, 0, 0, 0 },
+  { INPUT, "sc_s9w", HW_H_UINT, CGEN_MODE_UINT, OP_ENT (SC_S9W), 0, 0 },
+  { OUTPUT, "R0", HW_H_R0, CGEN_MODE_SI, 0, 0, 0 },
+  { END, (const char *)0, (enum cgen_hw_type)0, (enum cgen_mode)0, (enum cgen_operand_type)0, 0, 0 }
+};
+
+static const CGEN_OPINST sfmt_st_abs_ops[] ATTRIBUTE_UNUSED = {
+  { INPUT, "RB", HW_H_CR, CGEN_MODE_SI, OP_ENT (RB), 0, 0 },
+  { INPUT, "RC", HW_H_CR, CGEN_MODE_SI, OP_ENT (RC), 0, 0 },
+  { INPUT, "f_op_B", HW_H_UINT, CGEN_MODE_UINT, 0, 0, 0 },
+  { INPUT, "f_op_C", HW_H_UINT, CGEN_MODE_UINT, 0, 0, 0 },
+  { INPUT, "h_memory_HI_add__DFLT_pc_4", HW_H_MEMORY, CGEN_MODE_HI, 0, 0, COND_REF },
+  { INPUT, "h_memory_HI_add__DFLT_pc_add__DFLT_4_2", HW_H_MEMORY, CGEN_MODE_HI, 0, 0, COND_REF },
+  { INPUT, "pc", HW_H_PC, CGEN_MODE_USI, 0, 0, COND_REF },
+  { INPUT, "s9", HW_H_SINT, CGEN_MODE_INT, OP_ENT (S9), 0, 0 },
+  { OUTPUT, "h_memory_SI_eaddr", HW_H_MEMORY, CGEN_MODE_SI, 0, 0, 0 },
+  { END, (const char *)0, (enum cgen_hw_type)0, (enum cgen_mode)0, (enum cgen_operand_type)0, 0, 0 }
+};
+
+static const CGEN_OPINST sfmt_st__AW_abs_ops[] ATTRIBUTE_UNUSED = {
+  { INPUT, "RB", HW_H_CR, CGEN_MODE_SI, OP_ENT (RB), 0, 0 },
+  { INPUT, "RC", HW_H_CR, CGEN_MODE_SI, OP_ENT (RC), 0, 0 },
+  { INPUT, "f_op_B", HW_H_UINT, CGEN_MODE_UINT, 0, 0, 0 },
+  { INPUT, "f_op_C", HW_H_UINT, CGEN_MODE_UINT, 0, 0, 0 },
+  { INPUT, "h_memory_HI_add__DFLT_pc_4", HW_H_MEMORY, CGEN_MODE_HI, 0, 0, COND_REF },
+  { INPUT, "h_memory_HI_add__DFLT_pc_add__DFLT_4_2", HW_H_MEMORY, CGEN_MODE_HI, 0, 0, COND_REF },
+  { INPUT, "pc", HW_H_PC, CGEN_MODE_USI, 0, 0, COND_REF },
+  { INPUT, "s9", HW_H_SINT, CGEN_MODE_INT, OP_ENT (S9), 0, 0 },
+  { OUTPUT, "RB", HW_H_CR, CGEN_MODE_SI, OP_ENT (RB), 0, 0 },
+  { OUTPUT, "h_memory_SI_eaddr", HW_H_MEMORY, CGEN_MODE_SI, 0, 0, 0 },
+  { END, (const char *)0, (enum cgen_hw_type)0, (enum cgen_mode)0, (enum cgen_operand_type)0, 0, 0 }
+};
+
+static const CGEN_OPINST sfmt_st_s_abu_ops[] ATTRIBUTE_UNUSED = {
+  { INPUT, "R_b", HW_H_CR16, CGEN_MODE_SI, OP_ENT (R_B), 0, 0 },
+  { INPUT, "R_c", HW_H_CR16, CGEN_MODE_SI, OP_ENT (R_C), 0, 0 },
+  { INPUT, "sc_u5_", HW_H_UINT, CGEN_MODE_UINT, OP_ENT (SC_U5_), 0, 0 },
+  { OUTPUT, "h_memory_SI_eaddr", HW_H_MEMORY, CGEN_MODE_SI, 0, 0, 0 },
+  { END, (const char *)0, (enum cgen_hw_type)0, (enum cgen_mode)0, (enum cgen_operand_type)0, 0, 0 }
+};
+
+static const CGEN_OPINST sfmt_st_s_absp_ops[] ATTRIBUTE_UNUSED = {
+  { INPUT, "R_b", HW_H_CR16, CGEN_MODE_SI, OP_ENT (R_B), 0, 0 },
+  { INPUT, "SP", HW_H_SP, CGEN_MODE_SI, 0, 0, 0 },
+  { INPUT, "u5x4", HW_H_UINT, CGEN_MODE_UINT, OP_ENT (U5X4), 0, 0 },
+  { OUTPUT, "h_memory_SI_eaddr", HW_H_MEMORY, CGEN_MODE_SI, 0, 0, 0 },
+  { END, (const char *)0, (enum cgen_hw_type)0, (enum cgen_mode)0, (enum cgen_operand_type)0, 0, 0 }
+};
+
+static const CGEN_OPINST sfmt_stb_abs_ops[] ATTRIBUTE_UNUSED = {
+  { INPUT, "RB", HW_H_CR, CGEN_MODE_SI, OP_ENT (RB), 0, 0 },
+  { INPUT, "RC", HW_H_CR, CGEN_MODE_SI, OP_ENT (RC), 0, 0 },
+  { INPUT, "f_op_B", HW_H_UINT, CGEN_MODE_UINT, 0, 0, 0 },
+  { INPUT, "f_op_C", HW_H_UINT, CGEN_MODE_UINT, 0, 0, 0 },
+  { INPUT, "h_memory_HI_add__DFLT_pc_4", HW_H_MEMORY, CGEN_MODE_HI, 0, 0, COND_REF },
+  { INPUT, "h_memory_HI_add__DFLT_pc_add__DFLT_4_2", HW_H_MEMORY, CGEN_MODE_HI, 0, 0, COND_REF },
+  { INPUT, "pc", HW_H_PC, CGEN_MODE_USI, 0, 0, COND_REF },
+  { INPUT, "s9", HW_H_SINT, CGEN_MODE_INT, OP_ENT (S9), 0, 0 },
+  { OUTPUT, "h_memory_QI_eaddr", HW_H_MEMORY, CGEN_MODE_QI, 0, 0, 0 },
+  { END, (const char *)0, (enum cgen_hw_type)0, (enum cgen_mode)0, (enum cgen_operand_type)0, 0, 0 }
+};
+
+static const CGEN_OPINST sfmt_stb__AW_abs_ops[] ATTRIBUTE_UNUSED = {
+  { INPUT, "RB", HW_H_CR, CGEN_MODE_SI, OP_ENT (RB), 0, 0 },
+  { INPUT, "RC", HW_H_CR, CGEN_MODE_SI, OP_ENT (RC), 0, 0 },
+  { INPUT, "f_op_B", HW_H_UINT, CGEN_MODE_UINT, 0, 0, 0 },
+  { INPUT, "f_op_C", HW_H_UINT, CGEN_MODE_UINT, 0, 0, 0 },
+  { INPUT, "h_memory_HI_add__DFLT_pc_4", HW_H_MEMORY, CGEN_MODE_HI, 0, 0, COND_REF },
+  { INPUT, "h_memory_HI_add__DFLT_pc_add__DFLT_4_2", HW_H_MEMORY, CGEN_MODE_HI, 0, 0, COND_REF },
+  { INPUT, "pc", HW_H_PC, CGEN_MODE_USI, 0, 0, COND_REF },
+  { INPUT, "s9", HW_H_SINT, CGEN_MODE_INT, OP_ENT (S9), 0, 0 },
+  { OUTPUT, "RB", HW_H_CR, CGEN_MODE_SI, OP_ENT (RB), 0, 0 },
+  { OUTPUT, "h_memory_QI_eaddr", HW_H_MEMORY, CGEN_MODE_QI, 0, 0, 0 },
+  { END, (const char *)0, (enum cgen_hw_type)0, (enum cgen_mode)0, (enum cgen_operand_type)0, 0, 0 }
+};
+
+static const CGEN_OPINST sfmt_stb_as_abs_ops[] ATTRIBUTE_UNUSED = {
+  { INPUT, "RB", HW_H_CR, CGEN_MODE_SI, OP_ENT (RB), 0, 0 },
+  { INPUT, "RC", HW_H_CR, CGEN_MODE_SI, OP_ENT (RC), 0, 0 },
+  { INPUT, "f_op_B", HW_H_UINT, CGEN_MODE_UINT, 0, 0, 0 },
+  { INPUT, "f_op_C", HW_H_UINT, CGEN_MODE_UINT, 0, 0, 0 },
+  { INPUT, "h_memory_HI_add__DFLT_pc_4", HW_H_MEMORY, CGEN_MODE_HI, 0, 0, COND_REF },
+  { INPUT, "h_memory_HI_add__DFLT_pc_add__DFLT_4_2", HW_H_MEMORY, CGEN_MODE_HI, 0, 0, COND_REF },
+  { INPUT, "pc", HW_H_PC, CGEN_MODE_USI, 0, 0, COND_REF },
+  { OUTPUT, "h_memory_QI_eaddr", HW_H_MEMORY, CGEN_MODE_QI, 0, 0, 0 },
+  { END, (const char *)0, (enum cgen_hw_type)0, (enum cgen_mode)0, (enum cgen_operand_type)0, 0, 0 }
+};
+
+static const CGEN_OPINST sfmt_stb_s_abu_ops[] ATTRIBUTE_UNUSED = {
+  { INPUT, "R_b", HW_H_CR16, CGEN_MODE_SI, OP_ENT (R_B), 0, 0 },
+  { INPUT, "R_c", HW_H_CR16, CGEN_MODE_SI, OP_ENT (R_C), 0, 0 },
+  { INPUT, "sc_u5b", HW_H_UINT, CGEN_MODE_UINT, OP_ENT (SC_U5B), 0, 0 },
+  { OUTPUT, "h_memory_QI_eaddr", HW_H_MEMORY, CGEN_MODE_QI, 0, 0, 0 },
+  { END, (const char *)0, (enum cgen_hw_type)0, (enum cgen_mode)0, (enum cgen_operand_type)0, 0, 0 }
+};
+
+static const CGEN_OPINST sfmt_stb_s_absp_ops[] ATTRIBUTE_UNUSED = {
+  { INPUT, "R_b", HW_H_CR16, CGEN_MODE_SI, OP_ENT (R_B), 0, 0 },
+  { INPUT, "SP", HW_H_SP, CGEN_MODE_SI, 0, 0, 0 },
+  { INPUT, "u5x4", HW_H_UINT, CGEN_MODE_UINT, OP_ENT (U5X4), 0, 0 },
+  { OUTPUT, "h_memory_QI_eaddr", HW_H_MEMORY, CGEN_MODE_QI, 0, 0, 0 },
+  { END, (const char *)0, (enum cgen_hw_type)0, (enum cgen_mode)0, (enum cgen_operand_type)0, 0, 0 }
+};
+
+static const CGEN_OPINST sfmt_stw_abs_ops[] ATTRIBUTE_UNUSED = {
+  { INPUT, "RB", HW_H_CR, CGEN_MODE_SI, OP_ENT (RB), 0, 0 },
+  { INPUT, "RC", HW_H_CR, CGEN_MODE_SI, OP_ENT (RC), 0, 0 },
+  { INPUT, "f_op_B", HW_H_UINT, CGEN_MODE_UINT, 0, 0, 0 },
+  { INPUT, "f_op_C", HW_H_UINT, CGEN_MODE_UINT, 0, 0, 0 },
+  { INPUT, "h_memory_HI_add__DFLT_pc_4", HW_H_MEMORY, CGEN_MODE_HI, 0, 0, COND_REF },
+  { INPUT, "h_memory_HI_add__DFLT_pc_add__DFLT_4_2", HW_H_MEMORY, CGEN_MODE_HI, 0, 0, COND_REF },
+  { INPUT, "pc", HW_H_PC, CGEN_MODE_USI, 0, 0, COND_REF },
+  { INPUT, "s9", HW_H_SINT, CGEN_MODE_INT, OP_ENT (S9), 0, 0 },
+  { OUTPUT, "h_memory_HI_eaddr", HW_H_MEMORY, CGEN_MODE_HI, 0, 0, 0 },
+  { END, (const char *)0, (enum cgen_hw_type)0, (enum cgen_mode)0, (enum cgen_operand_type)0, 0, 0 }
+};
+
+static const CGEN_OPINST sfmt_stw__AW_abs_ops[] ATTRIBUTE_UNUSED = {
+  { INPUT, "RB", HW_H_CR, CGEN_MODE_SI, OP_ENT (RB), 0, 0 },
+  { INPUT, "RC", HW_H_CR, CGEN_MODE_SI, OP_ENT (RC), 0, 0 },
+  { INPUT, "f_op_B", HW_H_UINT, CGEN_MODE_UINT, 0, 0, 0 },
+  { INPUT, "f_op_C", HW_H_UINT, CGEN_MODE_UINT, 0, 0, 0 },
+  { INPUT, "h_memory_HI_add__DFLT_pc_4", HW_H_MEMORY, CGEN_MODE_HI, 0, 0, COND_REF },
+  { INPUT, "h_memory_HI_add__DFLT_pc_add__DFLT_4_2", HW_H_MEMORY, CGEN_MODE_HI, 0, 0, COND_REF },
+  { INPUT, "pc", HW_H_PC, CGEN_MODE_USI, 0, 0, COND_REF },
+  { INPUT, "s9", HW_H_SINT, CGEN_MODE_INT, OP_ENT (S9), 0, 0 },
+  { OUTPUT, "RB", HW_H_CR, CGEN_MODE_SI, OP_ENT (RB), 0, 0 },
+  { OUTPUT, "h_memory_HI_eaddr", HW_H_MEMORY, CGEN_MODE_HI, 0, 0, 0 },
+  { END, (const char *)0, (enum cgen_hw_type)0, (enum cgen_mode)0, (enum cgen_operand_type)0, 0, 0 }
+};
+
+static const CGEN_OPINST sfmt_stw_s_abu_ops[] ATTRIBUTE_UNUSED = {
+  { INPUT, "R_b", HW_H_CR16, CGEN_MODE_SI, OP_ENT (R_B), 0, 0 },
+  { INPUT, "R_c", HW_H_CR16, CGEN_MODE_SI, OP_ENT (R_C), 0, 0 },
+  { INPUT, "sc_u5w", HW_H_UINT, CGEN_MODE_UINT, OP_ENT (SC_U5W), 0, 0 },
+  { OUTPUT, "h_memory_HI_eaddr", HW_H_MEMORY, CGEN_MODE_HI, 0, 0, 0 },
+  { END, (const char *)0, (enum cgen_hw_type)0, (enum cgen_mode)0, (enum cgen_operand_type)0, 0, 0 }
+};
+
+static const CGEN_OPINST sfmt_add_L_s12__RA__ops[] ATTRIBUTE_UNUSED = {
+  { INPUT, "F", HW_H_UFLAGS, CGEN_MODE_UINT, OP_ENT (F), 0, 0 },
+  { INPUT, "RB", HW_H_CR, CGEN_MODE_SI, OP_ENT (RB), 0, 0 },
+  { INPUT, "f_op_B", HW_H_UINT, CGEN_MODE_UINT, 0, 0, 0 },
+  { INPUT, "h_memory_HI_add__DFLT_pc_4", HW_H_MEMORY, CGEN_MODE_HI, 0, 0, COND_REF },
+  { INPUT, "h_memory_HI_add__DFLT_pc_add__DFLT_4_2", HW_H_MEMORY, CGEN_MODE_HI, 0, 0, COND_REF },
+  { INPUT, "pc", HW_H_PC, CGEN_MODE_USI, 0, 0, COND_REF },
+  { INPUT, "s12", HW_H_SINT, CGEN_MODE_INT, OP_ENT (S12), 0, 0 },
+  { OUTPUT, "RB", HW_H_CR, CGEN_MODE_SI, OP_ENT (RB), 0, 0 },
+  { OUTPUT, "cbit", HW_H_CBIT, CGEN_MODE_BI, 0, 0, COND_REF },
+  { OUTPUT, "nbit", HW_H_NBIT, CGEN_MODE_BI, 0, 0, COND_REF },
+  { OUTPUT, "vbit", HW_H_VBIT, CGEN_MODE_BI, 0, 0, COND_REF },
+  { OUTPUT, "zbit", HW_H_ZBIT, CGEN_MODE_BI, 0, 0, COND_REF },
+  { END, (const char *)0, (enum cgen_hw_type)0, (enum cgen_mode)0, (enum cgen_operand_type)0, 0, 0 }
+};
+
+static const CGEN_OPINST sfmt_add_ccu6__RA__ops[] ATTRIBUTE_UNUSED = {
+  { INPUT, "F", HW_H_UFLAGS, CGEN_MODE_UINT, OP_ENT (F), 0, COND_REF },
+  { INPUT, "Qcondb", HW_H_QCONDB, CGEN_MODE_BI, OP_ENT (QCONDB), 0, 0 },
+  { INPUT, "RB", HW_H_CR, CGEN_MODE_SI, OP_ENT (RB), 0, COND_REF },
+  { INPUT, "U6", HW_H_UINT, CGEN_MODE_UINT, OP_ENT (U6), 0, COND_REF },
+  { INPUT, "f_op_B", HW_H_UINT, CGEN_MODE_UINT, 0, 0, 0 },
+  { INPUT, "h_memory_HI_add__DFLT_pc_4", HW_H_MEMORY, CGEN_MODE_HI, 0, 0, COND_REF },
+  { INPUT, "h_memory_HI_add__DFLT_pc_add__DFLT_4_2", HW_H_MEMORY, CGEN_MODE_HI, 0, 0, COND_REF },
+  { INPUT, "pc", HW_H_PC, CGEN_MODE_USI, 0, 0, COND_REF },
+  { OUTPUT, "RB", HW_H_CR, CGEN_MODE_SI, OP_ENT (RB), 0, COND_REF },
+  { OUTPUT, "cbit", HW_H_CBIT, CGEN_MODE_BI, 0, 0, COND_REF },
+  { OUTPUT, "nbit", HW_H_NBIT, CGEN_MODE_BI, 0, 0, COND_REF },
+  { OUTPUT, "vbit", HW_H_VBIT, CGEN_MODE_BI, 0, 0, COND_REF },
+  { OUTPUT, "zbit", HW_H_ZBIT, CGEN_MODE_BI, 0, 0, COND_REF },
+  { END, (const char *)0, (enum cgen_hw_type)0, (enum cgen_mode)0, (enum cgen_operand_type)0, 0, 0 }
+};
+
+static const CGEN_OPINST sfmt_add_L_u6__RA__ops[] ATTRIBUTE_UNUSED = {
+  { INPUT, "F", HW_H_UFLAGS, CGEN_MODE_UINT, OP_ENT (F), 0, 0 },
+  { INPUT, "RB", HW_H_CR, CGEN_MODE_SI, OP_ENT (RB), 0, 0 },
+  { INPUT, "U6", HW_H_UINT, CGEN_MODE_UINT, OP_ENT (U6), 0, 0 },
+  { INPUT, "f_op_B", HW_H_UINT, CGEN_MODE_UINT, 0, 0, 0 },
+  { INPUT, "h_memory_HI_add__DFLT_pc_4", HW_H_MEMORY, CGEN_MODE_HI, 0, 0, COND_REF },
+  { INPUT, "h_memory_HI_add__DFLT_pc_add__DFLT_4_2", HW_H_MEMORY, CGEN_MODE_HI, 0, 0, COND_REF },
+  { INPUT, "pc", HW_H_PC, CGEN_MODE_USI, 0, 0, COND_REF },
+  { OUTPUT, "RA", HW_H_CR, CGEN_MODE_SI, OP_ENT (RA), 0, 0 },
+  { OUTPUT, "cbit", HW_H_CBIT, CGEN_MODE_BI, 0, 0, COND_REF },
+  { OUTPUT, "nbit", HW_H_NBIT, CGEN_MODE_BI, 0, 0, COND_REF },
+  { OUTPUT, "vbit", HW_H_VBIT, CGEN_MODE_BI, 0, 0, COND_REF },
+  { OUTPUT, "zbit", HW_H_ZBIT, CGEN_MODE_BI, 0, 0, COND_REF },
+  { END, (const char *)0, (enum cgen_hw_type)0, (enum cgen_mode)0, (enum cgen_operand_type)0, 0, 0 }
+};
+
+static const CGEN_OPINST sfmt_add_L_r_r__RA__RC_ops[] ATTRIBUTE_UNUSED = {
+  { INPUT, "F", HW_H_UFLAGS, CGEN_MODE_UINT, OP_ENT (F), 0, 0 },
+  { INPUT, "RB", HW_H_CR, CGEN_MODE_SI, OP_ENT (RB), 0, 0 },
+  { INPUT, "RC", HW_H_CR, CGEN_MODE_SI, OP_ENT (RC), 0, 0 },
+  { INPUT, "f_op_B", HW_H_UINT, CGEN_MODE_UINT, 0, 0, 0 },
+  { INPUT, "f_op_C", HW_H_UINT, CGEN_MODE_UINT, 0, 0, 0 },
+  { INPUT, "h_memory_HI_add__DFLT_pc_4", HW_H_MEMORY, CGEN_MODE_HI, 0, 0, COND_REF },
+  { INPUT, "h_memory_HI_add__DFLT_pc_add__DFLT_4_2", HW_H_MEMORY, CGEN_MODE_HI, 0, 0, COND_REF },
+  { INPUT, "pc", HW_H_PC, CGEN_MODE_USI, 0, 0, COND_REF },
+  { OUTPUT, "RA", HW_H_CR, CGEN_MODE_SI, OP_ENT (RA), 0, 0 },
+  { OUTPUT, "cbit", HW_H_CBIT, CGEN_MODE_BI, 0, 0, COND_REF },
+  { OUTPUT, "nbit", HW_H_NBIT, CGEN_MODE_BI, 0, 0, COND_REF },
+  { OUTPUT, "vbit", HW_H_VBIT, CGEN_MODE_BI, 0, 0, COND_REF },
+  { OUTPUT, "zbit", HW_H_ZBIT, CGEN_MODE_BI, 0, 0, COND_REF },
+  { END, (const char *)0, (enum cgen_hw_type)0, (enum cgen_mode)0, (enum cgen_operand_type)0, 0, 0 }
+};
+
+static const CGEN_OPINST sfmt_add_cc__RA__RC_ops[] ATTRIBUTE_UNUSED = {
+  { INPUT, "F", HW_H_UFLAGS, CGEN_MODE_UINT, OP_ENT (F), 0, COND_REF },
+  { INPUT, "Qcondb", HW_H_QCONDB, CGEN_MODE_BI, OP_ENT (QCONDB), 0, 0 },
+  { INPUT, "RB", HW_H_CR, CGEN_MODE_SI, OP_ENT (RB), 0, COND_REF },
+  { INPUT, "RC", HW_H_CR, CGEN_MODE_SI, OP_ENT (RC), 0, COND_REF },
+  { INPUT, "f_op_B", HW_H_UINT, CGEN_MODE_UINT, 0, 0, 0 },
+  { INPUT, "f_op_C", HW_H_UINT, CGEN_MODE_UINT, 0, 0, 0 },
+  { INPUT, "h_memory_HI_add__DFLT_pc_4", HW_H_MEMORY, CGEN_MODE_HI, 0, 0, COND_REF },
+  { INPUT, "h_memory_HI_add__DFLT_pc_add__DFLT_4_2", HW_H_MEMORY, CGEN_MODE_HI, 0, 0, COND_REF },
+  { INPUT, "pc", HW_H_PC, CGEN_MODE_USI, 0, 0, COND_REF },
+  { OUTPUT, "RB", HW_H_CR, CGEN_MODE_SI, OP_ENT (RB), 0, COND_REF },
+  { OUTPUT, "cbit", HW_H_CBIT, CGEN_MODE_BI, 0, 0, COND_REF },
+  { OUTPUT, "nbit", HW_H_NBIT, CGEN_MODE_BI, 0, 0, COND_REF },
+  { OUTPUT, "vbit", HW_H_VBIT, CGEN_MODE_BI, 0, 0, COND_REF },
+  { OUTPUT, "zbit", HW_H_ZBIT, CGEN_MODE_BI, 0, 0, COND_REF },
+  { END, (const char *)0, (enum cgen_hw_type)0, (enum cgen_mode)0, (enum cgen_operand_type)0, 0, 0 }
+};
+
+static const CGEN_OPINST sfmt_add_s_abc_ops[] ATTRIBUTE_UNUSED = {
+  { INPUT, "R_b", HW_H_CR16, CGEN_MODE_SI, OP_ENT (R_B), 0, 0 },
+  { INPUT, "R_c", HW_H_CR16, CGEN_MODE_SI, OP_ENT (R_C), 0, 0 },
+  { OUTPUT, "R_a", HW_H_CR16, CGEN_MODE_SI, OP_ENT (R_A), 0, 0 },
+  { END, (const char *)0, (enum cgen_hw_type)0, (enum cgen_mode)0, (enum cgen_operand_type)0, 0, 0 }
+};
+
+static const CGEN_OPINST sfmt_add_s_cbu3_ops[] ATTRIBUTE_UNUSED = {
+  { INPUT, "R_b", HW_H_CR16, CGEN_MODE_SI, OP_ENT (R_B), 0, 0 },
+  { INPUT, "u3", HW_H_UINT, CGEN_MODE_UINT, OP_ENT (U3), 0, 0 },
+  { OUTPUT, "R_c", HW_H_CR16, CGEN_MODE_SI, OP_ENT (R_C), 0, 0 },
+  { END, (const char *)0, (enum cgen_hw_type)0, (enum cgen_mode)0, (enum cgen_operand_type)0, 0, 0 }
+};
+
+static const CGEN_OPINST sfmt_add_s_mcah_ops[] ATTRIBUTE_UNUSED = {
+  { INPUT, "R_b", HW_H_CR16, CGEN_MODE_SI, OP_ENT (R_B), 0, 0 },
+  { INPUT, "Rh", HW_H_CR, CGEN_MODE_SI, OP_ENT (RH), 0, 0 },
+  { INPUT, "f_op_h", HW_H_UINT, CGEN_MODE_UINT, 0, 0, 0 },
+  { INPUT, "h_memory_HI_add__DFLT_pc_2", HW_H_MEMORY, CGEN_MODE_HI, 0, 0, COND_REF },
+  { INPUT, "h_memory_HI_add__DFLT_pc_add__DFLT_2_2", HW_H_MEMORY, CGEN_MODE_HI, 0, 0, COND_REF },
+  { INPUT, "pc", HW_H_PC, CGEN_MODE_USI, 0, 0, COND_REF },
+  { OUTPUT, "R_b", HW_H_CR16, CGEN_MODE_SI, OP_ENT (R_B), 0, 0 },
+  { END, (const char *)0, (enum cgen_hw_type)0, (enum cgen_mode)0, (enum cgen_operand_type)0, 0, 0 }
+};
+
+static const CGEN_OPINST sfmt_add_s_absp_ops[] ATTRIBUTE_UNUSED = {
+  { INPUT, "SP", HW_H_SP, CGEN_MODE_SI, 0, 0, 0 },
+  { INPUT, "u5x4", HW_H_UINT, CGEN_MODE_UINT, OP_ENT (U5X4), 0, 0 },
+  { OUTPUT, "R_b", HW_H_CR16, CGEN_MODE_SI, OP_ENT (R_B), 0, 0 },
+  { END, (const char *)0, (enum cgen_hw_type)0, (enum cgen_mode)0, (enum cgen_operand_type)0, 0, 0 }
+};
+
+static const CGEN_OPINST sfmt_add_s_asspsp_ops[] ATTRIBUTE_UNUSED = {
+  { INPUT, "SP", HW_H_SP, CGEN_MODE_SI, 0, 0, 0 },
+  { INPUT, "u5x4", HW_H_UINT, CGEN_MODE_UINT, OP_ENT (U5X4), 0, 0 },
+  { OUTPUT, "SP", HW_H_SP, CGEN_MODE_SI, 0, 0, 0 },
+  { END, (const char *)0, (enum cgen_hw_type)0, (enum cgen_mode)0, (enum cgen_operand_type)0, 0, 0 }
+};
+
+static const CGEN_OPINST sfmt_add_s_gp_ops[] ATTRIBUTE_UNUSED = {
+  { INPUT, "GP", HW_H_GP, CGEN_MODE_SI, 0, 0, 0 },
+  { INPUT, "s9x4", HW_H_UINT, CGEN_MODE_UINT, OP_ENT (S9X4), 0, 0 },
+  { OUTPUT, "R0", HW_H_R0, CGEN_MODE_SI, 0, 0, 0 },
+  { END, (const char *)0, (enum cgen_hw_type)0, (enum cgen_mode)0, (enum cgen_operand_type)0, 0, 0 }
+};
+
+static const CGEN_OPINST sfmt_add_s_r_u7_ops[] ATTRIBUTE_UNUSED = {
+  { INPUT, "R_b", HW_H_CR16, CGEN_MODE_SI, OP_ENT (R_B), 0, 0 },
+  { INPUT, "u7", HW_H_UINT, CGEN_MODE_UINT, OP_ENT (U7), 0, 0 },
+  { OUTPUT, "R_b", HW_H_CR16, CGEN_MODE_SI, OP_ENT (R_B), 0, 0 },
+  { END, (const char *)0, (enum cgen_hw_type)0, (enum cgen_mode)0, (enum cgen_operand_type)0, 0, 0 }
+};
+
+static const CGEN_OPINST sfmt_adc_L_s12__RA__ops[] ATTRIBUTE_UNUSED = {
+  { INPUT, "F", HW_H_UFLAGS, CGEN_MODE_UINT, OP_ENT (F), 0, 0 },
+  { INPUT, "RB", HW_H_CR, CGEN_MODE_SI, OP_ENT (RB), 0, 0 },
+  { INPUT, "cbit", HW_H_CBIT, CGEN_MODE_BI, 0, 0, 0 },
+  { INPUT, "f_op_B", HW_H_UINT, CGEN_MODE_UINT, 0, 0, 0 },
+  { INPUT, "h_memory_HI_add__DFLT_pc_4", HW_H_MEMORY, CGEN_MODE_HI, 0, 0, COND_REF },
+  { INPUT, "h_memory_HI_add__DFLT_pc_add__DFLT_4_2", HW_H_MEMORY, CGEN_MODE_HI, 0, 0, COND_REF },
+  { INPUT, "pc", HW_H_PC, CGEN_MODE_USI, 0, 0, COND_REF },
+  { INPUT, "s12", HW_H_SINT, CGEN_MODE_INT, OP_ENT (S12), 0, 0 },
+  { OUTPUT, "RB", HW_H_CR, CGEN_MODE_SI, OP_ENT (RB), 0, 0 },
+  { OUTPUT, "cbit", HW_H_CBIT, CGEN_MODE_BI, 0, 0, COND_REF },
+  { OUTPUT, "nbit", HW_H_NBIT, CGEN_MODE_BI, 0, 0, COND_REF },
+  { OUTPUT, "vbit", HW_H_VBIT, CGEN_MODE_BI, 0, 0, COND_REF },
+  { OUTPUT, "zbit", HW_H_ZBIT, CGEN_MODE_BI, 0, 0, COND_REF },
+  { END, (const char *)0, (enum cgen_hw_type)0, (enum cgen_mode)0, (enum cgen_operand_type)0, 0, 0 }
+};
+
+static const CGEN_OPINST sfmt_adc_ccu6__RA__ops[] ATTRIBUTE_UNUSED = {
+  { INPUT, "F", HW_H_UFLAGS, CGEN_MODE_UINT, OP_ENT (F), 0, COND_REF },
+  { INPUT, "Qcondb", HW_H_QCONDB, CGEN_MODE_BI, OP_ENT (QCONDB), 0, 0 },
+  { INPUT, "RB", HW_H_CR, CGEN_MODE_SI, OP_ENT (RB), 0, COND_REF },
+  { INPUT, "U6", HW_H_UINT, CGEN_MODE_UINT, OP_ENT (U6), 0, COND_REF },
+  { INPUT, "cbit", HW_H_CBIT, CGEN_MODE_BI, 0, 0, COND_REF },
+  { INPUT, "f_op_B", HW_H_UINT, CGEN_MODE_UINT, 0, 0, 0 },
+  { INPUT, "h_memory_HI_add__DFLT_pc_4", HW_H_MEMORY, CGEN_MODE_HI, 0, 0, COND_REF },
+  { INPUT, "h_memory_HI_add__DFLT_pc_add__DFLT_4_2", HW_H_MEMORY, CGEN_MODE_HI, 0, 0, COND_REF },
+  { INPUT, "pc", HW_H_PC, CGEN_MODE_USI, 0, 0, COND_REF },
+  { OUTPUT, "RB", HW_H_CR, CGEN_MODE_SI, OP_ENT (RB), 0, COND_REF },
+  { OUTPUT, "cbit", HW_H_CBIT, CGEN_MODE_BI, 0, 0, COND_REF },
+  { OUTPUT, "nbit", HW_H_NBIT, CGEN_MODE_BI, 0, 0, COND_REF },
+  { OUTPUT, "vbit", HW_H_VBIT, CGEN_MODE_BI, 0, 0, COND_REF },
+  { OUTPUT, "zbit", HW_H_ZBIT, CGEN_MODE_BI, 0, 0, COND_REF },
+  { END, (const char *)0, (enum cgen_hw_type)0, (enum cgen_mode)0, (enum cgen_operand_type)0, 0, 0 }
+};
+
+static const CGEN_OPINST sfmt_adc_L_u6__RA__ops[] ATTRIBUTE_UNUSED = {
+  { INPUT, "F", HW_H_UFLAGS, CGEN_MODE_UINT, OP_ENT (F), 0, 0 },
+  { INPUT, "RB", HW_H_CR, CGEN_MODE_SI, OP_ENT (RB), 0, 0 },
+  { INPUT, "U6", HW_H_UINT, CGEN_MODE_UINT, OP_ENT (U6), 0, 0 },
+  { INPUT, "cbit", HW_H_CBIT, CGEN_MODE_BI, 0, 0, 0 },
+  { INPUT, "f_op_B", HW_H_UINT, CGEN_MODE_UINT, 0, 0, 0 },
+  { INPUT, "h_memory_HI_add__DFLT_pc_4", HW_H_MEMORY, CGEN_MODE_HI, 0, 0, COND_REF },
+  { INPUT, "h_memory_HI_add__DFLT_pc_add__DFLT_4_2", HW_H_MEMORY, CGEN_MODE_HI, 0, 0, COND_REF },
+  { INPUT, "pc", HW_H_PC, CGEN_MODE_USI, 0, 0, COND_REF },
+  { OUTPUT, "RA", HW_H_CR, CGEN_MODE_SI, OP_ENT (RA), 0, 0 },
+  { OUTPUT, "cbit", HW_H_CBIT, CGEN_MODE_BI, 0, 0, COND_REF },
+  { OUTPUT, "nbit", HW_H_NBIT, CGEN_MODE_BI, 0, 0, COND_REF },
+  { OUTPUT, "vbit", HW_H_VBIT, CGEN_MODE_BI, 0, 0, COND_REF },
+  { OUTPUT, "zbit", HW_H_ZBIT, CGEN_MODE_BI, 0, 0, COND_REF },
+  { END, (const char *)0, (enum cgen_hw_type)0, (enum cgen_mode)0, (enum cgen_operand_type)0, 0, 0 }
+};
+
+static const CGEN_OPINST sfmt_adc_L_r_r__RA__RC_ops[] ATTRIBUTE_UNUSED = {
+  { INPUT, "F", HW_H_UFLAGS, CGEN_MODE_UINT, OP_ENT (F), 0, 0 },
+  { INPUT, "RB", HW_H_CR, CGEN_MODE_SI, OP_ENT (RB), 0, 0 },
+  { INPUT, "RC", HW_H_CR, CGEN_MODE_SI, OP_ENT (RC), 0, 0 },
+  { INPUT, "cbit", HW_H_CBIT, CGEN_MODE_BI, 0, 0, 0 },
+  { INPUT, "f_op_B", HW_H_UINT, CGEN_MODE_UINT, 0, 0, 0 },
+  { INPUT, "f_op_C", HW_H_UINT, CGEN_MODE_UINT, 0, 0, 0 },
+  { INPUT, "h_memory_HI_add__DFLT_pc_4", HW_H_MEMORY, CGEN_MODE_HI, 0, 0, COND_REF },
+  { INPUT, "h_memory_HI_add__DFLT_pc_add__DFLT_4_2", HW_H_MEMORY, CGEN_MODE_HI, 0, 0, COND_REF },
+  { INPUT, "pc", HW_H_PC, CGEN_MODE_USI, 0, 0, COND_REF },
+  { OUTPUT, "RA", HW_H_CR, CGEN_MODE_SI, OP_ENT (RA), 0, 0 },
+  { OUTPUT, "cbit", HW_H_CBIT, CGEN_MODE_BI, 0, 0, COND_REF },
+  { OUTPUT, "nbit", HW_H_NBIT, CGEN_MODE_BI, 0, 0, COND_REF },
+  { OUTPUT, "vbit", HW_H_VBIT, CGEN_MODE_BI, 0, 0, COND_REF },
+  { OUTPUT, "zbit", HW_H_ZBIT, CGEN_MODE_BI, 0, 0, COND_REF },
+  { END, (const char *)0, (enum cgen_hw_type)0, (enum cgen_mode)0, (enum cgen_operand_type)0, 0, 0 }
+};
+
+static const CGEN_OPINST sfmt_adc_cc__RA__RC_ops[] ATTRIBUTE_UNUSED = {
+  { INPUT, "F", HW_H_UFLAGS, CGEN_MODE_UINT, OP_ENT (F), 0, COND_REF },
+  { INPUT, "Qcondb", HW_H_QCONDB, CGEN_MODE_BI, OP_ENT (QCONDB), 0, 0 },
+  { INPUT, "RB", HW_H_CR, CGEN_MODE_SI, OP_ENT (RB), 0, COND_REF },
+  { INPUT, "RC", HW_H_CR, CGEN_MODE_SI, OP_ENT (RC), 0, COND_REF },
+  { INPUT, "cbit", HW_H_CBIT, CGEN_MODE_BI, 0, 0, COND_REF },
+  { INPUT, "f_op_B", HW_H_UINT, CGEN_MODE_UINT, 0, 0, 0 },
+  { INPUT, "f_op_C", HW_H_UINT, CGEN_MODE_UINT, 0, 0, 0 },
+  { INPUT, "h_memory_HI_add__DFLT_pc_4", HW_H_MEMORY, CGEN_MODE_HI, 0, 0, COND_REF },
+  { INPUT, "h_memory_HI_add__DFLT_pc_add__DFLT_4_2", HW_H_MEMORY, CGEN_MODE_HI, 0, 0, COND_REF },
+  { INPUT, "pc", HW_H_PC, CGEN_MODE_USI, 0, 0, COND_REF },
+  { OUTPUT, "RB", HW_H_CR, CGEN_MODE_SI, OP_ENT (RB), 0, COND_REF },
+  { OUTPUT, "cbit", HW_H_CBIT, CGEN_MODE_BI, 0, 0, COND_REF },
+  { OUTPUT, "nbit", HW_H_NBIT, CGEN_MODE_BI, 0, 0, COND_REF },
+  { OUTPUT, "vbit", HW_H_VBIT, CGEN_MODE_BI, 0, 0, COND_REF },
+  { OUTPUT, "zbit", HW_H_ZBIT, CGEN_MODE_BI, 0, 0, COND_REF },
+  { END, (const char *)0, (enum cgen_hw_type)0, (enum cgen_mode)0, (enum cgen_operand_type)0, 0, 0 }
+};
+
+static const CGEN_OPINST sfmt_I16_GO_SUB_s_go_ops[] ATTRIBUTE_UNUSED = {
+  { INPUT, "R_b", HW_H_CR16, CGEN_MODE_SI, OP_ENT (R_B), 0, 0 },
+  { INPUT, "R_c", HW_H_CR16, CGEN_MODE_SI, OP_ENT (R_C), 0, 0 },
+  { OUTPUT, "R_b", HW_H_CR16, CGEN_MODE_SI, OP_ENT (R_B), 0, 0 },
+  { END, (const char *)0, (enum cgen_hw_type)0, (enum cgen_mode)0, (enum cgen_operand_type)0, 0, 0 }
+};
+
+static const CGEN_OPINST sfmt_sub_s_go_sub_ne_ops[] ATTRIBUTE_UNUSED = {
+  { INPUT, "zbit", HW_H_ZBIT, CGEN_MODE_BI, 0, 0, 0 },
+  { OUTPUT, "R_b", HW_H_CR16, CGEN_MODE_SI, OP_ENT (R_B), 0, COND_REF },
+  { END, (const char *)0, (enum cgen_hw_type)0, (enum cgen_mode)0, (enum cgen_operand_type)0, 0, 0 }
+};
+
+static const CGEN_OPINST sfmt_sub_s_ssb_ops[] ATTRIBUTE_UNUSED = {
+  { INPUT, "R_b", HW_H_CR16, CGEN_MODE_SI, OP_ENT (R_B), 0, 0 },
+  { INPUT, "u5", HW_H_UINT, CGEN_MODE_UINT, OP_ENT (U5), 0, 0 },
+  { OUTPUT, "R_b", HW_H_CR16, CGEN_MODE_SI, OP_ENT (R_B), 0, 0 },
+  { END, (const char *)0, (enum cgen_hw_type)0, (enum cgen_mode)0, (enum cgen_operand_type)0, 0, 0 }
+};
+
+static const CGEN_OPINST sfmt_and_L_s12__RA__ops[] ATTRIBUTE_UNUSED = {
+  { INPUT, "F", HW_H_UFLAGS, CGEN_MODE_UINT, OP_ENT (F), 0, 0 },
+  { INPUT, "RB", HW_H_CR, CGEN_MODE_SI, OP_ENT (RB), 0, 0 },
+  { INPUT, "f_op_B", HW_H_UINT, CGEN_MODE_UINT, 0, 0, 0 },
+  { INPUT, "h_memory_HI_add__DFLT_pc_4", HW_H_MEMORY, CGEN_MODE_HI, 0, 0, COND_REF },
+  { INPUT, "h_memory_HI_add__DFLT_pc_add__DFLT_4_2", HW_H_MEMORY, CGEN_MODE_HI, 0, 0, COND_REF },
+  { INPUT, "pc", HW_H_PC, CGEN_MODE_USI, 0, 0, COND_REF },
+  { INPUT, "s12", HW_H_SINT, CGEN_MODE_INT, OP_ENT (S12), 0, 0 },
+  { OUTPUT, "RB", HW_H_CR, CGEN_MODE_SI, OP_ENT (RB), 0, 0 },
+  { OUTPUT, "nbit", HW_H_NBIT, CGEN_MODE_BI, 0, 0, COND_REF },
+  { OUTPUT, "zbit", HW_H_ZBIT, CGEN_MODE_BI, 0, 0, COND_REF },
+  { END, (const char *)0, (enum cgen_hw_type)0, (enum cgen_mode)0, (enum cgen_operand_type)0, 0, 0 }
+};
+
+static const CGEN_OPINST sfmt_and_ccu6__RA__ops[] ATTRIBUTE_UNUSED = {
+  { INPUT, "F", HW_H_UFLAGS, CGEN_MODE_UINT, OP_ENT (F), 0, COND_REF },
+  { INPUT, "Qcondb", HW_H_QCONDB, CGEN_MODE_BI, OP_ENT (QCONDB), 0, 0 },
+  { INPUT, "RB", HW_H_CR, CGEN_MODE_SI, OP_ENT (RB), 0, COND_REF },
+  { INPUT, "U6", HW_H_UINT, CGEN_MODE_UINT, OP_ENT (U6), 0, COND_REF },
+  { INPUT, "f_op_B", HW_H_UINT, CGEN_MODE_UINT, 0, 0, 0 },
+  { INPUT, "h_memory_HI_add__DFLT_pc_4", HW_H_MEMORY, CGEN_MODE_HI, 0, 0, COND_REF },
+  { INPUT, "h_memory_HI_add__DFLT_pc_add__DFLT_4_2", HW_H_MEMORY, CGEN_MODE_HI, 0, 0, COND_REF },
+  { INPUT, "pc", HW_H_PC, CGEN_MODE_USI, 0, 0, COND_REF },
+  { OUTPUT, "RB", HW_H_CR, CGEN_MODE_SI, OP_ENT (RB), 0, COND_REF },
+  { OUTPUT, "nbit", HW_H_NBIT, CGEN_MODE_BI, 0, 0, COND_REF },
+  { OUTPUT, "zbit", HW_H_ZBIT, CGEN_MODE_BI, 0, 0, COND_REF },
+  { END, (const char *)0, (enum cgen_hw_type)0, (enum cgen_mode)0, (enum cgen_operand_type)0, 0, 0 }
+};
+
+static const CGEN_OPINST sfmt_and_L_u6__RA__ops[] ATTRIBUTE_UNUSED = {
+  { INPUT, "F", HW_H_UFLAGS, CGEN_MODE_UINT, OP_ENT (F), 0, 0 },
+  { INPUT, "RB", HW_H_CR, CGEN_MODE_SI, OP_ENT (RB), 0, 0 },
+  { INPUT, "U6", HW_H_UINT, CGEN_MODE_UINT, OP_ENT (U6), 0, 0 },
+  { INPUT, "f_op_B", HW_H_UINT, CGEN_MODE_UINT, 0, 0, 0 },
+  { INPUT, "h_memory_HI_add__DFLT_pc_4", HW_H_MEMORY, CGEN_MODE_HI, 0, 0, COND_REF },
+  { INPUT, "h_memory_HI_add__DFLT_pc_add__DFLT_4_2", HW_H_MEMORY, CGEN_MODE_HI, 0, 0, COND_REF },
+  { INPUT, "pc", HW_H_PC, CGEN_MODE_USI, 0, 0, COND_REF },
+  { OUTPUT, "RA", HW_H_CR, CGEN_MODE_SI, OP_ENT (RA), 0, 0 },
+  { OUTPUT, "nbit", HW_H_NBIT, CGEN_MODE_BI, 0, 0, COND_REF },
+  { OUTPUT, "zbit", HW_H_ZBIT, CGEN_MODE_BI, 0, 0, COND_REF },
+  { END, (const char *)0, (enum cgen_hw_type)0, (enum cgen_mode)0, (enum cgen_operand_type)0, 0, 0 }
+};
+
+static const CGEN_OPINST sfmt_and_L_r_r__RA__RC_ops[] ATTRIBUTE_UNUSED = {
+  { INPUT, "F", HW_H_UFLAGS, CGEN_MODE_UINT, OP_ENT (F), 0, 0 },
+  { INPUT, "RB", HW_H_CR, CGEN_MODE_SI, OP_ENT (RB), 0, 0 },
+  { INPUT, "RC", HW_H_CR, CGEN_MODE_SI, OP_ENT (RC), 0, 0 },
+  { INPUT, "f_op_B", HW_H_UINT, CGEN_MODE_UINT, 0, 0, 0 },
+  { INPUT, "f_op_C", HW_H_UINT, CGEN_MODE_UINT, 0, 0, 0 },
+  { INPUT, "h_memory_HI_add__DFLT_pc_4", HW_H_MEMORY, CGEN_MODE_HI, 0, 0, COND_REF },
+  { INPUT, "h_memory_HI_add__DFLT_pc_add__DFLT_4_2", HW_H_MEMORY, CGEN_MODE_HI, 0, 0, COND_REF },
+  { INPUT, "pc", HW_H_PC, CGEN_MODE_USI, 0, 0, COND_REF },
+  { OUTPUT, "RA", HW_H_CR, CGEN_MODE_SI, OP_ENT (RA), 0, 0 },
+  { OUTPUT, "nbit", HW_H_NBIT, CGEN_MODE_BI, 0, 0, COND_REF },
+  { OUTPUT, "zbit", HW_H_ZBIT, CGEN_MODE_BI, 0, 0, COND_REF },
+  { END, (const char *)0, (enum cgen_hw_type)0, (enum cgen_mode)0, (enum cgen_operand_type)0, 0, 0 }
+};
+
+static const CGEN_OPINST sfmt_and_cc__RA__RC_ops[] ATTRIBUTE_UNUSED = {
+  { INPUT, "F", HW_H_UFLAGS, CGEN_MODE_UINT, OP_ENT (F), 0, COND_REF },
+  { INPUT, "Qcondb", HW_H_QCONDB, CGEN_MODE_BI, OP_ENT (QCONDB), 0, 0 },
+  { INPUT, "RB", HW_H_CR, CGEN_MODE_SI, OP_ENT (RB), 0, COND_REF },
+  { INPUT, "RC", HW_H_CR, CGEN_MODE_SI, OP_ENT (RC), 0, COND_REF },
+  { INPUT, "f_op_B", HW_H_UINT, CGEN_MODE_UINT, 0, 0, 0 },
+  { INPUT, "f_op_C", HW_H_UINT, CGEN_MODE_UINT, 0, 0, 0 },
+  { INPUT, "h_memory_HI_add__DFLT_pc_4", HW_H_MEMORY, CGEN_MODE_HI, 0, 0, COND_REF },
+  { INPUT, "h_memory_HI_add__DFLT_pc_add__DFLT_4_2", HW_H_MEMORY, CGEN_MODE_HI, 0, 0, COND_REF },
+  { INPUT, "pc", HW_H_PC, CGEN_MODE_USI, 0, 0, COND_REF },
+  { OUTPUT, "RB", HW_H_CR, CGEN_MODE_SI, OP_ENT (RB), 0, COND_REF },
+  { OUTPUT, "nbit", HW_H_NBIT, CGEN_MODE_BI, 0, 0, COND_REF },
+  { OUTPUT, "zbit", HW_H_ZBIT, CGEN_MODE_BI, 0, 0, COND_REF },
+  { END, (const char *)0, (enum cgen_hw_type)0, (enum cgen_mode)0, (enum cgen_operand_type)0, 0, 0 }
+};
+
+static const CGEN_OPINST sfmt_mov_L_s12__ops[] ATTRIBUTE_UNUSED = {
+  { INPUT, "F", HW_H_UFLAGS, CGEN_MODE_SI, OP_ENT (F), 0, 0 },
+  { INPUT, "s12", HW_H_SINT, CGEN_MODE_INT, OP_ENT (S12), 0, 0 },
+  { OUTPUT, "RB", HW_H_CR, CGEN_MODE_SI, OP_ENT (RB), 0, 0 },
+  { OUTPUT, "nbit", HW_H_NBIT, CGEN_MODE_BI, 0, 0, COND_REF },
+  { OUTPUT, "zbit", HW_H_ZBIT, CGEN_MODE_BI, 0, 0, COND_REF },
+  { END, (const char *)0, (enum cgen_hw_type)0, (enum cgen_mode)0, (enum cgen_operand_type)0, 0, 0 }
+};
+
+static const CGEN_OPINST sfmt_mov_ccu6__ops[] ATTRIBUTE_UNUSED = {
+  { INPUT, "F", HW_H_UFLAGS, CGEN_MODE_SI, OP_ENT (F), 0, COND_REF },
+  { INPUT, "Qcondb", HW_H_QCONDB, CGEN_MODE_BI, OP_ENT (QCONDB), 0, 0 },
+  { INPUT, "U6", HW_H_UINT, CGEN_MODE_UINT, OP_ENT (U6), 0, COND_REF },
+  { OUTPUT, "RB", HW_H_CR, CGEN_MODE_SI, OP_ENT (RB), 0, COND_REF },
+  { OUTPUT, "nbit", HW_H_NBIT, CGEN_MODE_BI, 0, 0, COND_REF },
+  { OUTPUT, "zbit", HW_H_ZBIT, CGEN_MODE_BI, 0, 0, COND_REF },
+  { END, (const char *)0, (enum cgen_hw_type)0, (enum cgen_mode)0, (enum cgen_operand_type)0, 0, 0 }
+};
+
+static const CGEN_OPINST sfmt_mov_L_u6__ops[] ATTRIBUTE_UNUSED = {
+  { INPUT, "F", HW_H_UFLAGS, CGEN_MODE_SI, OP_ENT (F), 0, 0 },
+  { INPUT, "U6", HW_H_UINT, CGEN_MODE_UINT, OP_ENT (U6), 0, 0 },
+  { OUTPUT, "RB", HW_H_CR, CGEN_MODE_SI, OP_ENT (RB), 0, 0 },
+  { OUTPUT, "nbit", HW_H_NBIT, CGEN_MODE_BI, 0, 0, COND_REF },
+  { OUTPUT, "zbit", HW_H_ZBIT, CGEN_MODE_BI, 0, 0, COND_REF },
+  { END, (const char *)0, (enum cgen_hw_type)0, (enum cgen_mode)0, (enum cgen_operand_type)0, 0, 0 }
+};
+
+static const CGEN_OPINST sfmt_mov_L_r_r__RC_ops[] ATTRIBUTE_UNUSED = {
+  { INPUT, "F", HW_H_UFLAGS, CGEN_MODE_SI, OP_ENT (F), 0, 0 },
+  { INPUT, "RC", HW_H_CR, CGEN_MODE_SI, OP_ENT (RC), 0, 0 },
+  { INPUT, "f_op_C", HW_H_UINT, CGEN_MODE_UINT, 0, 0, 0 },
+  { INPUT, "h_memory_HI_add__DFLT_pc_4", HW_H_MEMORY, CGEN_MODE_HI, 0, 0, COND_REF },
+  { INPUT, "h_memory_HI_add__DFLT_pc_add__DFLT_4_2", HW_H_MEMORY, CGEN_MODE_HI, 0, 0, COND_REF },
+  { INPUT, "pc", HW_H_PC, CGEN_MODE_USI, 0, 0, COND_REF },
+  { OUTPUT, "RB", HW_H_CR, CGEN_MODE_SI, OP_ENT (RB), 0, 0 },
+  { OUTPUT, "nbit", HW_H_NBIT, CGEN_MODE_BI, 0, 0, COND_REF },
+  { OUTPUT, "zbit", HW_H_ZBIT, CGEN_MODE_BI, 0, 0, COND_REF },
+  { END, (const char *)0, (enum cgen_hw_type)0, (enum cgen_mode)0, (enum cgen_operand_type)0, 0, 0 }
+};
+
+static const CGEN_OPINST sfmt_mov_cc__RC_ops[] ATTRIBUTE_UNUSED = {
+  { INPUT, "F", HW_H_UFLAGS, CGEN_MODE_SI, OP_ENT (F), 0, COND_REF },
+  { INPUT, "Qcondb", HW_H_QCONDB, CGEN_MODE_BI, OP_ENT (QCONDB), 0, 0 },
+  { INPUT, "RC", HW_H_CR, CGEN_MODE_SI, OP_ENT (RC), 0, COND_REF },
+  { INPUT, "f_op_C", HW_H_UINT, CGEN_MODE_UINT, 0, 0, 0 },
+  { INPUT, "h_memory_HI_add__DFLT_pc_4", HW_H_MEMORY, CGEN_MODE_HI, 0, 0, COND_REF },
+  { INPUT, "h_memory_HI_add__DFLT_pc_add__DFLT_4_2", HW_H_MEMORY, CGEN_MODE_HI, 0, 0, COND_REF },
+  { INPUT, "pc", HW_H_PC, CGEN_MODE_USI, 0, 0, COND_REF },
+  { OUTPUT, "RB", HW_H_CR, CGEN_MODE_SI, OP_ENT (RB), 0, COND_REF },
+  { OUTPUT, "nbit", HW_H_NBIT, CGEN_MODE_BI, 0, 0, COND_REF },
+  { OUTPUT, "zbit", HW_H_ZBIT, CGEN_MODE_BI, 0, 0, COND_REF },
+  { END, (const char *)0, (enum cgen_hw_type)0, (enum cgen_mode)0, (enum cgen_operand_type)0, 0, 0 }
+};
+
+static const CGEN_OPINST sfmt_mov_s_mcah_ops[] ATTRIBUTE_UNUSED = {
+  { INPUT, "Rh", HW_H_CR, CGEN_MODE_SI, OP_ENT (RH), 0, 0 },
+  { INPUT, "f_op_h", HW_H_UINT, CGEN_MODE_UINT, 0, 0, 0 },
+  { INPUT, "h_memory_HI_add__DFLT_pc_2", HW_H_MEMORY, CGEN_MODE_HI, 0, 0, COND_REF },
+  { INPUT, "h_memory_HI_add__DFLT_pc_add__DFLT_2_2", HW_H_MEMORY, CGEN_MODE_HI, 0, 0, COND_REF },
+  { INPUT, "pc", HW_H_PC, CGEN_MODE_USI, 0, 0, COND_REF },
+  { OUTPUT, "R_b", HW_H_CR16, CGEN_MODE_SI, OP_ENT (R_B), 0, 0 },
+  { OUTPUT, "nbit", HW_H_NBIT, CGEN_MODE_BI, 0, 0, COND_REF },
+  { OUTPUT, "zbit", HW_H_ZBIT, CGEN_MODE_BI, 0, 0, COND_REF },
+  { END, (const char *)0, (enum cgen_hw_type)0, (enum cgen_mode)0, (enum cgen_operand_type)0, 0, 0 }
+};
+
+static const CGEN_OPINST sfmt_mov_s_mcahb_ops[] ATTRIBUTE_UNUSED = {
+  { INPUT, "R_b", HW_H_CR16, CGEN_MODE_SI, OP_ENT (R_B), 0, 0 },
+  { OUTPUT, "Rh", HW_H_CR, CGEN_MODE_SI, OP_ENT (RH), 0, 0 },
+  { OUTPUT, "nbit", HW_H_NBIT, CGEN_MODE_BI, 0, 0, COND_REF },
+  { OUTPUT, "zbit", HW_H_ZBIT, CGEN_MODE_BI, 0, 0, COND_REF },
+  { END, (const char *)0, (enum cgen_hw_type)0, (enum cgen_mode)0, (enum cgen_operand_type)0, 0, 0 }
+};
+
+static const CGEN_OPINST sfmt_mov_s_r_u7_ops[] ATTRIBUTE_UNUSED = {
+  { INPUT, "u8", HW_H_UINT, CGEN_MODE_UINT, OP_ENT (U8), 0, 0 },
+  { OUTPUT, "R_b", HW_H_CR16, CGEN_MODE_SI, OP_ENT (R_B), 0, 0 },
+  { OUTPUT, "nbit", HW_H_NBIT, CGEN_MODE_BI, 0, 0, COND_REF },
+  { OUTPUT, "zbit", HW_H_ZBIT, CGEN_MODE_BI, 0, 0, COND_REF },
+  { END, (const char *)0, (enum cgen_hw_type)0, (enum cgen_mode)0, (enum cgen_operand_type)0, 0, 0 }
+};
+
+static const CGEN_OPINST sfmt_tst_L_s12__ops[] ATTRIBUTE_UNUSED = {
+  { INPUT, "RB", HW_H_CR, CGEN_MODE_SI, OP_ENT (RB), 0, 0 },
+  { INPUT, "f_op_B", HW_H_UINT, CGEN_MODE_UINT, 0, 0, 0 },
+  { INPUT, "h_memory_HI_add__DFLT_pc_4", HW_H_MEMORY, CGEN_MODE_HI, 0, 0, COND_REF },
+  { INPUT, "h_memory_HI_add__DFLT_pc_add__DFLT_4_2", HW_H_MEMORY, CGEN_MODE_HI, 0, 0, COND_REF },
+  { INPUT, "pc", HW_H_PC, CGEN_MODE_USI, 0, 0, COND_REF },
+  { INPUT, "s12", HW_H_SINT, CGEN_MODE_INT, OP_ENT (S12), 0, 0 },
+  { OUTPUT, "nbit", HW_H_NBIT, CGEN_MODE_BI, 0, 0, 0 },
+  { OUTPUT, "zbit", HW_H_ZBIT, CGEN_MODE_BI, 0, 0, 0 },
+  { END, (const char *)0, (enum cgen_hw_type)0, (enum cgen_mode)0, (enum cgen_operand_type)0, 0, 0 }
+};
+
+static const CGEN_OPINST sfmt_tst_ccu6__ops[] ATTRIBUTE_UNUSED = {
+  { INPUT, "Qcondb", HW_H_QCONDB, CGEN_MODE_BI, OP_ENT (QCONDB), 0, 0 },
+  { INPUT, "RB", HW_H_CR, CGEN_MODE_SI, OP_ENT (RB), 0, COND_REF },
+  { INPUT, "U6", HW_H_UINT, CGEN_MODE_UINT, OP_ENT (U6), 0, COND_REF },
+  { INPUT, "f_op_B", HW_H_UINT, CGEN_MODE_UINT, 0, 0, 0 },
+  { INPUT, "h_memory_HI_add__DFLT_pc_4", HW_H_MEMORY, CGEN_MODE_HI, 0, 0, COND_REF },
+  { INPUT, "h_memory_HI_add__DFLT_pc_add__DFLT_4_2", HW_H_MEMORY, CGEN_MODE_HI, 0, 0, COND_REF },
+  { INPUT, "pc", HW_H_PC, CGEN_MODE_USI, 0, 0, COND_REF },
+  { OUTPUT, "nbit", HW_H_NBIT, CGEN_MODE_BI, 0, 0, COND_REF },
+  { OUTPUT, "zbit", HW_H_ZBIT, CGEN_MODE_BI, 0, 0, COND_REF },
+  { END, (const char *)0, (enum cgen_hw_type)0, (enum cgen_mode)0, (enum cgen_operand_type)0, 0, 0 }
+};
+
+static const CGEN_OPINST sfmt_tst_L_u6__ops[] ATTRIBUTE_UNUSED = {
+  { INPUT, "RB", HW_H_CR, CGEN_MODE_SI, OP_ENT (RB), 0, 0 },
+  { INPUT, "U6", HW_H_UINT, CGEN_MODE_UINT, OP_ENT (U6), 0, 0 },
+  { INPUT, "f_op_B", HW_H_UINT, CGEN_MODE_UINT, 0, 0, 0 },
+  { INPUT, "h_memory_HI_add__DFLT_pc_4", HW_H_MEMORY, CGEN_MODE_HI, 0, 0, COND_REF },
+  { INPUT, "h_memory_HI_add__DFLT_pc_add__DFLT_4_2", HW_H_MEMORY, CGEN_MODE_HI, 0, 0, COND_REF },
+  { INPUT, "pc", HW_H_PC, CGEN_MODE_USI, 0, 0, COND_REF },
+  { OUTPUT, "nbit", HW_H_NBIT, CGEN_MODE_BI, 0, 0, 0 },
+  { OUTPUT, "zbit", HW_H_ZBIT, CGEN_MODE_BI, 0, 0, 0 },
+  { END, (const char *)0, (enum cgen_hw_type)0, (enum cgen_mode)0, (enum cgen_operand_type)0, 0, 0 }
+};
+
+static const CGEN_OPINST sfmt_tst_L_r_r__RC_ops[] ATTRIBUTE_UNUSED = {
+  { INPUT, "RB", HW_H_CR, CGEN_MODE_SI, OP_ENT (RB), 0, 0 },
+  { INPUT, "RC", HW_H_CR, CGEN_MODE_SI, OP_ENT (RC), 0, 0 },
+  { INPUT, "f_op_B", HW_H_UINT, CGEN_MODE_UINT, 0, 0, 0 },
+  { INPUT, "f_op_C", HW_H_UINT, CGEN_MODE_UINT, 0, 0, 0 },
+  { INPUT, "h_memory_HI_add__DFLT_pc_4", HW_H_MEMORY, CGEN_MODE_HI, 0, 0, COND_REF },
+  { INPUT, "h_memory_HI_add__DFLT_pc_add__DFLT_4_2", HW_H_MEMORY, CGEN_MODE_HI, 0, 0, COND_REF },
+  { INPUT, "pc", HW_H_PC, CGEN_MODE_USI, 0, 0, COND_REF },
+  { OUTPUT, "nbit", HW_H_NBIT, CGEN_MODE_BI, 0, 0, 0 },
+  { OUTPUT, "zbit", HW_H_ZBIT, CGEN_MODE_BI, 0, 0, 0 },
+  { END, (const char *)0, (enum cgen_hw_type)0, (enum cgen_mode)0, (enum cgen_operand_type)0, 0, 0 }
+};
+
+static const CGEN_OPINST sfmt_tst_cc__RC_ops[] ATTRIBUTE_UNUSED = {
+  { INPUT, "Qcondb", HW_H_QCONDB, CGEN_MODE_BI, OP_ENT (QCONDB), 0, 0 },
+  { INPUT, "RB", HW_H_CR, CGEN_MODE_SI, OP_ENT (RB), 0, COND_REF },
+  { INPUT, "RC", HW_H_CR, CGEN_MODE_SI, OP_ENT (RC), 0, COND_REF },
+  { INPUT, "f_op_B", HW_H_UINT, CGEN_MODE_UINT, 0, 0, 0 },
+  { INPUT, "f_op_C", HW_H_UINT, CGEN_MODE_UINT, 0, 0, 0 },
+  { INPUT, "h_memory_HI_add__DFLT_pc_4", HW_H_MEMORY, CGEN_MODE_HI, 0, 0, COND_REF },
+  { INPUT, "h_memory_HI_add__DFLT_pc_add__DFLT_4_2", HW_H_MEMORY, CGEN_MODE_HI, 0, 0, COND_REF },
+  { INPUT, "pc", HW_H_PC, CGEN_MODE_USI, 0, 0, COND_REF },
+  { OUTPUT, "nbit", HW_H_NBIT, CGEN_MODE_BI, 0, 0, COND_REF },
+  { OUTPUT, "zbit", HW_H_ZBIT, CGEN_MODE_BI, 0, 0, COND_REF },
+  { END, (const char *)0, (enum cgen_hw_type)0, (enum cgen_mode)0, (enum cgen_operand_type)0, 0, 0 }
+};
+
+static const CGEN_OPINST sfmt_tst_s_go_ops[] ATTRIBUTE_UNUSED = {
+  { INPUT, "R_b", HW_H_CR16, CGEN_MODE_SI, OP_ENT (R_B), 0, 0 },
+  { INPUT, "R_c", HW_H_CR16, CGEN_MODE_SI, OP_ENT (R_C), 0, 0 },
+  { OUTPUT, "nbit", HW_H_NBIT, CGEN_MODE_BI, 0, 0, 0 },
+  { OUTPUT, "zbit", HW_H_ZBIT, CGEN_MODE_BI, 0, 0, 0 },
+  { END, (const char *)0, (enum cgen_hw_type)0, (enum cgen_mode)0, (enum cgen_operand_type)0, 0, 0 }
+};
+
+static const CGEN_OPINST sfmt_cmp_L_s12__ops[] ATTRIBUTE_UNUSED = {
+  { INPUT, "RB", HW_H_CR, CGEN_MODE_SI, OP_ENT (RB), 0, 0 },
+  { INPUT, "f_op_B", HW_H_UINT, CGEN_MODE_UINT, 0, 0, 0 },
+  { INPUT, "h_memory_HI_add__DFLT_pc_4", HW_H_MEMORY, CGEN_MODE_HI, 0, 0, COND_REF },
+  { INPUT, "h_memory_HI_add__DFLT_pc_add__DFLT_4_2", HW_H_MEMORY, CGEN_MODE_HI, 0, 0, COND_REF },
+  { INPUT, "pc", HW_H_PC, CGEN_MODE_USI, 0, 0, COND_REF },
+  { INPUT, "s12", HW_H_SINT, CGEN_MODE_INT, OP_ENT (S12), 0, 0 },
+  { OUTPUT, "cbit", HW_H_CBIT, CGEN_MODE_BI, 0, 0, 0 },
+  { OUTPUT, "nbit", HW_H_NBIT, CGEN_MODE_BI, 0, 0, 0 },
+  { OUTPUT, "vbit", HW_H_VBIT, CGEN_MODE_BI, 0, 0, 0 },
+  { OUTPUT, "zbit", HW_H_ZBIT, CGEN_MODE_BI, 0, 0, 0 },
+  { END, (const char *)0, (enum cgen_hw_type)0, (enum cgen_mode)0, (enum cgen_operand_type)0, 0, 0 }
+};
+
+static const CGEN_OPINST sfmt_cmp_ccu6__ops[] ATTRIBUTE_UNUSED = {
+  { INPUT, "Qcondb", HW_H_QCONDB, CGEN_MODE_BI, OP_ENT (QCONDB), 0, 0 },
+  { INPUT, "RB", HW_H_CR, CGEN_MODE_SI, OP_ENT (RB), 0, COND_REF },
+  { INPUT, "U6", HW_H_UINT, CGEN_MODE_UINT, OP_ENT (U6), 0, COND_REF },
+  { INPUT, "f_op_B", HW_H_UINT, CGEN_MODE_UINT, 0, 0, 0 },
+  { INPUT, "h_memory_HI_add__DFLT_pc_4", HW_H_MEMORY, CGEN_MODE_HI, 0, 0, COND_REF },
+  { INPUT, "h_memory_HI_add__DFLT_pc_add__DFLT_4_2", HW_H_MEMORY, CGEN_MODE_HI, 0, 0, COND_REF },
+  { INPUT, "pc", HW_H_PC, CGEN_MODE_USI, 0, 0, COND_REF },
+  { OUTPUT, "cbit", HW_H_CBIT, CGEN_MODE_BI, 0, 0, COND_REF },
+  { OUTPUT, "nbit", HW_H_NBIT, CGEN_MODE_BI, 0, 0, COND_REF },
+  { OUTPUT, "vbit", HW_H_VBIT, CGEN_MODE_BI, 0, 0, COND_REF },
+  { OUTPUT, "zbit", HW_H_ZBIT, CGEN_MODE_BI, 0, 0, COND_REF },
+  { END, (const char *)0, (enum cgen_hw_type)0, (enum cgen_mode)0, (enum cgen_operand_type)0, 0, 0 }
+};
+
+static const CGEN_OPINST sfmt_cmp_L_u6__ops[] ATTRIBUTE_UNUSED = {
+  { INPUT, "RB", HW_H_CR, CGEN_MODE_SI, OP_ENT (RB), 0, 0 },
+  { INPUT, "U6", HW_H_UINT, CGEN_MODE_UINT, OP_ENT (U6), 0, 0 },
+  { INPUT, "f_op_B", HW_H_UINT, CGEN_MODE_UINT, 0, 0, 0 },
+  { INPUT, "h_memory_HI_add__DFLT_pc_4", HW_H_MEMORY, CGEN_MODE_HI, 0, 0, COND_REF },
+  { INPUT, "h_memory_HI_add__DFLT_pc_add__DFLT_4_2", HW_H_MEMORY, CGEN_MODE_HI, 0, 0, COND_REF },
+  { INPUT, "pc", HW_H_PC, CGEN_MODE_USI, 0, 0, COND_REF },
+  { OUTPUT, "cbit", HW_H_CBIT, CGEN_MODE_BI, 0, 0, 0 },
+  { OUTPUT, "nbit", HW_H_NBIT, CGEN_MODE_BI, 0, 0, 0 },
+  { OUTPUT, "vbit", HW_H_VBIT, CGEN_MODE_BI, 0, 0, 0 },
+  { OUTPUT, "zbit", HW_H_ZBIT, CGEN_MODE_BI, 0, 0, 0 },
+  { END, (const char *)0, (enum cgen_hw_type)0, (enum cgen_mode)0, (enum cgen_operand_type)0, 0, 0 }
+};
+
+static const CGEN_OPINST sfmt_cmp_L_r_r__RC_ops[] ATTRIBUTE_UNUSED = {
+  { INPUT, "RB", HW_H_CR, CGEN_MODE_SI, OP_ENT (RB), 0, 0 },
+  { INPUT, "RC", HW_H_CR, CGEN_MODE_SI, OP_ENT (RC), 0, 0 },
+  { INPUT, "f_op_B", HW_H_UINT, CGEN_MODE_UINT, 0, 0, 0 },
+  { INPUT, "f_op_C", HW_H_UINT, CGEN_MODE_UINT, 0, 0, 0 },
+  { INPUT, "h_memory_HI_add__DFLT_pc_4", HW_H_MEMORY, CGEN_MODE_HI, 0, 0, COND_REF },
+  { INPUT, "h_memory_HI_add__DFLT_pc_add__DFLT_4_2", HW_H_MEMORY, CGEN_MODE_HI, 0, 0, COND_REF },
+  { INPUT, "pc", HW_H_PC, CGEN_MODE_USI, 0, 0, COND_REF },
+  { OUTPUT, "cbit", HW_H_CBIT, CGEN_MODE_BI, 0, 0, 0 },
+  { OUTPUT, "nbit", HW_H_NBIT, CGEN_MODE_BI, 0, 0, 0 },
+  { OUTPUT, "vbit", HW_H_VBIT, CGEN_MODE_BI, 0, 0, 0 },
+  { OUTPUT, "zbit", HW_H_ZBIT, CGEN_MODE_BI, 0, 0, 0 },
+  { END, (const char *)0, (enum cgen_hw_type)0, (enum cgen_mode)0, (enum cgen_operand_type)0, 0, 0 }
+};
+
+static const CGEN_OPINST sfmt_cmp_cc__RC_ops[] ATTRIBUTE_UNUSED = {
+  { INPUT, "Qcondb", HW_H_QCONDB, CGEN_MODE_BI, OP_ENT (QCONDB), 0, 0 },
+  { INPUT, "RB", HW_H_CR, CGEN_MODE_SI, OP_ENT (RB), 0, COND_REF },
+  { INPUT, "RC", HW_H_CR, CGEN_MODE_SI, OP_ENT (RC), 0, COND_REF },
+  { INPUT, "f_op_B", HW_H_UINT, CGEN_MODE_UINT, 0, 0, 0 },
+  { INPUT, "f_op_C", HW_H_UINT, CGEN_MODE_UINT, 0, 0, 0 },
+  { INPUT, "h_memory_HI_add__DFLT_pc_4", HW_H_MEMORY, CGEN_MODE_HI, 0, 0, COND_REF },
+  { INPUT, "h_memory_HI_add__DFLT_pc_add__DFLT_4_2", HW_H_MEMORY, CGEN_MODE_HI, 0, 0, COND_REF },
+  { INPUT, "pc", HW_H_PC, CGEN_MODE_USI, 0, 0, COND_REF },
+  { OUTPUT, "cbit", HW_H_CBIT, CGEN_MODE_BI, 0, 0, COND_REF },
+  { OUTPUT, "nbit", HW_H_NBIT, CGEN_MODE_BI, 0, 0, COND_REF },
+  { OUTPUT, "vbit", HW_H_VBIT, CGEN_MODE_BI, 0, 0, COND_REF },
+  { OUTPUT, "zbit", HW_H_ZBIT, CGEN_MODE_BI, 0, 0, COND_REF },
+  { END, (const char *)0, (enum cgen_hw_type)0, (enum cgen_mode)0, (enum cgen_operand_type)0, 0, 0 }
+};
+
+static const CGEN_OPINST sfmt_cmp_s_mcah_ops[] ATTRIBUTE_UNUSED = {
+  { INPUT, "R_b", HW_H_CR16, CGEN_MODE_SI, OP_ENT (R_B), 0, 0 },
+  { INPUT, "Rh", HW_H_CR, CGEN_MODE_SI, OP_ENT (RH), 0, 0 },
+  { INPUT, "f_op_h", HW_H_UINT, CGEN_MODE_UINT, 0, 0, 0 },
+  { INPUT, "h_memory_HI_add__DFLT_pc_2", HW_H_MEMORY, CGEN_MODE_HI, 0, 0, COND_REF },
+  { INPUT, "h_memory_HI_add__DFLT_pc_add__DFLT_2_2", HW_H_MEMORY, CGEN_MODE_HI, 0, 0, COND_REF },
+  { INPUT, "pc", HW_H_PC, CGEN_MODE_USI, 0, 0, COND_REF },
+  { OUTPUT, "cbit", HW_H_CBIT, CGEN_MODE_BI, 0, 0, 0 },
+  { OUTPUT, "nbit", HW_H_NBIT, CGEN_MODE_BI, 0, 0, 0 },
+  { OUTPUT, "vbit", HW_H_VBIT, CGEN_MODE_BI, 0, 0, 0 },
+  { OUTPUT, "zbit", HW_H_ZBIT, CGEN_MODE_BI, 0, 0, 0 },
+  { END, (const char *)0, (enum cgen_hw_type)0, (enum cgen_mode)0, (enum cgen_operand_type)0, 0, 0 }
+};
+
+static const CGEN_OPINST sfmt_cmp_s_r_u7_ops[] ATTRIBUTE_UNUSED = {
+  { INPUT, "R_b", HW_H_CR16, CGEN_MODE_SI, OP_ENT (R_B), 0, 0 },
+  { INPUT, "u7", HW_H_UINT, CGEN_MODE_UINT, OP_ENT (U7), 0, 0 },
+  { OUTPUT, "cbit", HW_H_CBIT, CGEN_MODE_BI, 0, 0, 0 },
+  { OUTPUT, "nbit", HW_H_NBIT, CGEN_MODE_BI, 0, 0, 0 },
+  { OUTPUT, "vbit", HW_H_VBIT, CGEN_MODE_BI, 0, 0, 0 },
+  { OUTPUT, "zbit", HW_H_ZBIT, CGEN_MODE_BI, 0, 0, 0 },
+  { END, (const char *)0, (enum cgen_hw_type)0, (enum cgen_mode)0, (enum cgen_operand_type)0, 0, 0 }
+};
+
+static const CGEN_OPINST sfmt_btst_s_ssb_ops[] ATTRIBUTE_UNUSED = {
+  { INPUT, "R_b", HW_H_CR16, CGEN_MODE_SI, OP_ENT (R_B), 0, 0 },
+  { INPUT, "u5", HW_H_UINT, CGEN_MODE_UINT, OP_ENT (U5), 0, 0 },
+  { OUTPUT, "nbit", HW_H_NBIT, CGEN_MODE_BI, 0, 0, 0 },
+  { OUTPUT, "zbit", HW_H_ZBIT, CGEN_MODE_BI, 0, 0, 0 },
+  { END, (const char *)0, (enum cgen_hw_type)0, (enum cgen_mode)0, (enum cgen_operand_type)0, 0, 0 }
+};
+
+static const CGEN_OPINST sfmt_mpy_L_s12__RA__ops[] ATTRIBUTE_UNUSED = {
+  { INPUT, "F", HW_H_UFLAGS, CGEN_MODE_UINT, OP_ENT (F), 0, 0 },
+  { INPUT, "RB", HW_H_CR, CGEN_MODE_SI, OP_ENT (RB), 0, COND_REF },
+  { INPUT, "f_op_B", HW_H_UINT, CGEN_MODE_UINT, 0, 0, 0 },
+  { INPUT, "h_memory_HI_add__DFLT_pc_4", HW_H_MEMORY, CGEN_MODE_HI, 0, 0, COND_REF },
+  { INPUT, "h_memory_HI_add__DFLT_pc_add__DFLT_4_2", HW_H_MEMORY, CGEN_MODE_HI, 0, 0, COND_REF },
+  { INPUT, "pc", HW_H_PC, CGEN_MODE_USI, 0, 0, COND_REF },
+  { INPUT, "s12", HW_H_SINT, CGEN_MODE_INT, OP_ENT (S12), 0, COND_REF },
+  { OUTPUT, "RB", HW_H_CR, CGEN_MODE_SI, OP_ENT (RB), 0, 0 },
+  { OUTPUT, "nbit", HW_H_NBIT, CGEN_MODE_BI, 0, 0, COND_REF },
+  { OUTPUT, "vbit", HW_H_VBIT, CGEN_MODE_BI, 0, 0, COND_REF },
+  { OUTPUT, "zbit", HW_H_ZBIT, CGEN_MODE_BI, 0, 0, COND_REF },
+  { END, (const char *)0, (enum cgen_hw_type)0, (enum cgen_mode)0, (enum cgen_operand_type)0, 0, 0 }
+};
+
+static const CGEN_OPINST sfmt_mpy_ccu6__RA__ops[] ATTRIBUTE_UNUSED = {
+  { INPUT, "F", HW_H_UFLAGS, CGEN_MODE_UINT, OP_ENT (F), 0, COND_REF },
+  { INPUT, "Qcondb", HW_H_QCONDB, CGEN_MODE_BI, OP_ENT (QCONDB), 0, 0 },
+  { INPUT, "RB", HW_H_CR, CGEN_MODE_SI, OP_ENT (RB), 0, COND_REF },
+  { INPUT, "U6", HW_H_UINT, CGEN_MODE_UINT, OP_ENT (U6), 0, COND_REF },
+  { INPUT, "f_op_B", HW_H_UINT, CGEN_MODE_UINT, 0, 0, 0 },
+  { INPUT, "h_memory_HI_add__DFLT_pc_4", HW_H_MEMORY, CGEN_MODE_HI, 0, 0, COND_REF },
+  { INPUT, "h_memory_HI_add__DFLT_pc_add__DFLT_4_2", HW_H_MEMORY, CGEN_MODE_HI, 0, 0, COND_REF },
+  { INPUT, "pc", HW_H_PC, CGEN_MODE_USI, 0, 0, COND_REF },
+  { OUTPUT, "RB", HW_H_CR, CGEN_MODE_SI, OP_ENT (RB), 0, COND_REF },
+  { OUTPUT, "nbit", HW_H_NBIT, CGEN_MODE_BI, 0, 0, COND_REF },
+  { OUTPUT, "vbit", HW_H_VBIT, CGEN_MODE_BI, 0, 0, COND_REF },
+  { OUTPUT, "zbit", HW_H_ZBIT, CGEN_MODE_BI, 0, 0, COND_REF },
+  { END, (const char *)0, (enum cgen_hw_type)0, (enum cgen_mode)0, (enum cgen_operand_type)0, 0, 0 }
+};
+
+static const CGEN_OPINST sfmt_mpy_L_u6__RA__ops[] ATTRIBUTE_UNUSED = {
+  { INPUT, "F", HW_H_UFLAGS, CGEN_MODE_UINT, OP_ENT (F), 0, 0 },
+  { INPUT, "RB", HW_H_CR, CGEN_MODE_SI, OP_ENT (RB), 0, COND_REF },
+  { INPUT, "U6", HW_H_UINT, CGEN_MODE_UINT, OP_ENT (U6), 0, COND_REF },
+  { INPUT, "f_op_B", HW_H_UINT, CGEN_MODE_UINT, 0, 0, 0 },
+  { INPUT, "h_memory_HI_add__DFLT_pc_4", HW_H_MEMORY, CGEN_MODE_HI, 0, 0, COND_REF },
+  { INPUT, "h_memory_HI_add__DFLT_pc_add__DFLT_4_2", HW_H_MEMORY, CGEN_MODE_HI, 0, 0, COND_REF },
+  { INPUT, "pc", HW_H_PC, CGEN_MODE_USI, 0, 0, COND_REF },
+  { OUTPUT, "RA", HW_H_CR, CGEN_MODE_SI, OP_ENT (RA), 0, 0 },
+  { OUTPUT, "nbit", HW_H_NBIT, CGEN_MODE_BI, 0, 0, COND_REF },
+  { OUTPUT, "vbit", HW_H_VBIT, CGEN_MODE_BI, 0, 0, COND_REF },
+  { OUTPUT, "zbit", HW_H_ZBIT, CGEN_MODE_BI, 0, 0, COND_REF },
+  { END, (const char *)0, (enum cgen_hw_type)0, (enum cgen_mode)0, (enum cgen_operand_type)0, 0, 0 }
+};
+
+static const CGEN_OPINST sfmt_mpy_L_r_r__RA__RC_ops[] ATTRIBUTE_UNUSED = {
+  { INPUT, "F", HW_H_UFLAGS, CGEN_MODE_UINT, OP_ENT (F), 0, 0 },
+  { INPUT, "RB", HW_H_CR, CGEN_MODE_SI, OP_ENT (RB), 0, COND_REF },
+  { INPUT, "RC", HW_H_CR, CGEN_MODE_SI, OP_ENT (RC), 0, COND_REF },
+  { INPUT, "f_op_B", HW_H_UINT, CGEN_MODE_UINT, 0, 0, 0 },
+  { INPUT, "f_op_C", HW_H_UINT, CGEN_MODE_UINT, 0, 0, 0 },
+  { INPUT, "h_memory_HI_add__DFLT_pc_4", HW_H_MEMORY, CGEN_MODE_HI, 0, 0, COND_REF },
+  { INPUT, "h_memory_HI_add__DFLT_pc_add__DFLT_4_2", HW_H_MEMORY, CGEN_MODE_HI, 0, 0, COND_REF },
+  { INPUT, "pc", HW_H_PC, CGEN_MODE_USI, 0, 0, COND_REF },
+  { OUTPUT, "RA", HW_H_CR, CGEN_MODE_SI, OP_ENT (RA), 0, 0 },
+  { OUTPUT, "nbit", HW_H_NBIT, CGEN_MODE_BI, 0, 0, COND_REF },
+  { OUTPUT, "vbit", HW_H_VBIT, CGEN_MODE_BI, 0, 0, COND_REF },
+  { OUTPUT, "zbit", HW_H_ZBIT, CGEN_MODE_BI, 0, 0, COND_REF },
+  { END, (const char *)0, (enum cgen_hw_type)0, (enum cgen_mode)0, (enum cgen_operand_type)0, 0, 0 }
+};
+
+static const CGEN_OPINST sfmt_mpy_cc__RA__RC_ops[] ATTRIBUTE_UNUSED = {
+  { INPUT, "F", HW_H_UFLAGS, CGEN_MODE_UINT, OP_ENT (F), 0, COND_REF },
+  { INPUT, "Qcondb", HW_H_QCONDB, CGEN_MODE_BI, OP_ENT (QCONDB), 0, 0 },
+  { INPUT, "RB", HW_H_CR, CGEN_MODE_SI, OP_ENT (RB), 0, COND_REF },
+  { INPUT, "RC", HW_H_CR, CGEN_MODE_SI, OP_ENT (RC), 0, COND_REF },
+  { INPUT, "f_op_B", HW_H_UINT, CGEN_MODE_UINT, 0, 0, 0 },
+  { INPUT, "f_op_C", HW_H_UINT, CGEN_MODE_UINT, 0, 0, 0 },
+  { INPUT, "h_memory_HI_add__DFLT_pc_4", HW_H_MEMORY, CGEN_MODE_HI, 0, 0, COND_REF },
+  { INPUT, "h_memory_HI_add__DFLT_pc_add__DFLT_4_2", HW_H_MEMORY, CGEN_MODE_HI, 0, 0, COND_REF },
+  { INPUT, "pc", HW_H_PC, CGEN_MODE_USI, 0, 0, COND_REF },
+  { OUTPUT, "RB", HW_H_CR, CGEN_MODE_SI, OP_ENT (RB), 0, COND_REF },
+  { OUTPUT, "nbit", HW_H_NBIT, CGEN_MODE_BI, 0, 0, COND_REF },
+  { OUTPUT, "vbit", HW_H_VBIT, CGEN_MODE_BI, 0, 0, COND_REF },
+  { OUTPUT, "zbit", HW_H_ZBIT, CGEN_MODE_BI, 0, 0, COND_REF },
+  { END, (const char *)0, (enum cgen_hw_type)0, (enum cgen_mode)0, (enum cgen_operand_type)0, 0, 0 }
+};
+
+static const CGEN_OPINST sfmt_j_L_r_r___RC_noilink__ops[] ATTRIBUTE_UNUSED = {
+  { INPUT, "F", HW_H_UFLAGS, CGEN_MODE_UINT, OP_ENT (F), 0, COND_REF },
+  { INPUT, "RC_noilink", HW_H_NOILINK, CGEN_MODE_SI, OP_ENT (RC_NOILINK), 0, COND_REF },
+  { INPUT, "f_op_B", HW_H_UINT, CGEN_MODE_UINT, 0, 0, 0 },
+  { INPUT, "f_op_C", HW_H_UINT, CGEN_MODE_UINT, 0, 0, 0 },
+  { INPUT, "f_op_Cj", HW_H_UINT, CGEN_MODE_UINT, 0, 0, 0 },
+  { INPUT, "h_auxr_SI_11", HW_H_AUXR, CGEN_MODE_SI, 0, 11, COND_REF },
+  { INPUT, "h_auxr_SI_12", HW_H_AUXR, CGEN_MODE_SI, 0, 12, COND_REF },
+  { INPUT, "h_auxr_SI_34", HW_H_AUXR, CGEN_MODE_SI, 0, 34, 0 },
+  { INPUT, "h_auxr_SI_37", HW_H_AUXR, CGEN_MODE_SI, 0, 37, COND_REF },
+  { INPUT, "h_e1_BI", HW_H_E1, CGEN_MODE_BI, 0, 0, 0 },
+  { INPUT, "h_memory_HI_add__DFLT_pc_4", HW_H_MEMORY, CGEN_MODE_HI, 0, 0, COND_REF },
+  { INPUT, "h_memory_HI_add__DFLT_pc_add__DFLT_4_2", HW_H_MEMORY, CGEN_MODE_HI, 0, 0, COND_REF },
+  { INPUT, "h_memory_UHI_countp", HW_H_MEMORY, CGEN_MODE_UHI, 0, 0, COND_REF },
+  { INPUT, "h_prof_offset_SI_0", HW_H_PROF_OFFSET, CGEN_MODE_SI, 0, 0, COND_REF },
+  { INPUT, "h_status32_SI_0", HW_H_STATUS32, CGEN_MODE_SI, 0, 0, COND_REF },
+  { INPUT, "h_timer_expire_SI_0", HW_H_TIMER_EXPIRE, CGEN_MODE_SI, 0, 0, 0 },
+  { INPUT, "h_ubit_BI", HW_H_UBIT, CGEN_MODE_BI, 0, 0, COND_REF },
+  { INPUT, "pc", HW_H_PC, CGEN_MODE_USI, 0, 0, COND_REF },
+  { OUTPUT, "h_auxr_SI_11", HW_H_AUXR, CGEN_MODE_SI, 0, 11, COND_REF },
+  { OUTPUT, "h_auxr_SI_33", HW_H_AUXR, CGEN_MODE_SI, 0, 33, COND_REF },
+  { OUTPUT, "h_cr_SI_29", HW_H_CR, CGEN_MODE_SI, 0, 29, COND_REF },
+  { OUTPUT, "h_e1_BI", HW_H_E1, CGEN_MODE_BI, 0, 0, COND_REF },
+  { OUTPUT, "h_memory_UHI_countp", HW_H_MEMORY, CGEN_MODE_UHI, 0, 0, COND_REF },
+  { OUTPUT, "h_status32_SI_0", HW_H_STATUS32, CGEN_MODE_SI, 0, 0, COND_REF },
+  { OUTPUT, "pc", HW_H_PC, CGEN_MODE_USI, 0, 0, COND_REF },
+  { END, (const char *)0, (enum cgen_hw_type)0, (enum cgen_mode)0, (enum cgen_operand_type)0, 0, 0 }
+};
+
+static const CGEN_OPINST sfmt_j_cc___RC_noilink__ops[] ATTRIBUTE_UNUSED = {
+  { INPUT, "F", HW_H_UFLAGS, CGEN_MODE_UINT, OP_ENT (F), 0, COND_REF },
+  { INPUT, "Qcondb", HW_H_QCONDB, CGEN_MODE_BI, OP_ENT (QCONDB), 0, 0 },
+  { INPUT, "RC_noilink", HW_H_NOILINK, CGEN_MODE_SI, OP_ENT (RC_NOILINK), 0, COND_REF },
+  { INPUT, "f_op_B", HW_H_UINT, CGEN_MODE_UINT, 0, 0, 0 },
+  { INPUT, "f_op_C", HW_H_UINT, CGEN_MODE_UINT, 0, 0, 0 },
+  { INPUT, "f_op_Cj", HW_H_UINT, CGEN_MODE_UINT, 0, 0, 0 },
+  { INPUT, "h_auxr_SI_11", HW_H_AUXR, CGEN_MODE_SI, 0, 11, COND_REF },
+  { INPUT, "h_auxr_SI_12", HW_H_AUXR, CGEN_MODE_SI, 0, 12, COND_REF },
+  { INPUT, "h_auxr_SI_34", HW_H_AUXR, CGEN_MODE_SI, 0, 34, COND_REF },
+  { INPUT, "h_auxr_SI_37", HW_H_AUXR, CGEN_MODE_SI, 0, 37, COND_REF },
+  { INPUT, "h_e1_BI", HW_H_E1, CGEN_MODE_BI, 0, 0, COND_REF },
+  { INPUT, "h_memory_HI_add__DFLT_pc_4", HW_H_MEMORY, CGEN_MODE_HI, 0, 0, COND_REF },
+  { INPUT, "h_memory_HI_add__DFLT_pc_add__DFLT_4_2", HW_H_MEMORY, CGEN_MODE_HI, 0, 0, COND_REF },
+  { INPUT, "h_memory_UHI_countp", HW_H_MEMORY, CGEN_MODE_UHI, 0, 0, COND_REF },
+  { INPUT, "h_prof_offset_SI_0", HW_H_PROF_OFFSET, CGEN_MODE_SI, 0, 0, COND_REF },
+  { INPUT, "h_status32_SI_0", HW_H_STATUS32, CGEN_MODE_SI, 0, 0, COND_REF },
+  { INPUT, "h_timer_expire_SI_0", HW_H_TIMER_EXPIRE, CGEN_MODE_SI, 0, 0, COND_REF },
+  { INPUT, "h_ubit_BI", HW_H_UBIT, CGEN_MODE_BI, 0, 0, COND_REF },
+  { INPUT, "pc", HW_H_PC, CGEN_MODE_USI, 0, 0, COND_REF },
+  { OUTPUT, "h_auxr_SI_11", HW_H_AUXR, CGEN_MODE_SI, 0, 11, COND_REF },
+  { OUTPUT, "h_auxr_SI_33", HW_H_AUXR, CGEN_MODE_SI, 0, 33, COND_REF },
+  { OUTPUT, "h_cr_SI_29", HW_H_CR, CGEN_MODE_SI, 0, 29, COND_REF },
+  { OUTPUT, "h_e1_BI", HW_H_E1, CGEN_MODE_BI, 0, 0, COND_REF },
+  { OUTPUT, "h_memory_UHI_countp", HW_H_MEMORY, CGEN_MODE_UHI, 0, 0, COND_REF },
+  { OUTPUT, "h_status32_SI_0", HW_H_STATUS32, CGEN_MODE_SI, 0, 0, COND_REF },
+  { OUTPUT, "pc", HW_H_PC, CGEN_MODE_USI, 0, 0, COND_REF },
+  { END, (const char *)0, (enum cgen_hw_type)0, (enum cgen_mode)0, (enum cgen_operand_type)0, 0, 0 }
+};
+
+static const CGEN_OPINST sfmt_j_L_r_r___RC_ilink__ops[] ATTRIBUTE_UNUSED = {
+  { INPUT, "F", HW_H_UFLAGS, CGEN_MODE_UINT, OP_ENT (F), 0, COND_REF },
+  { INPUT, "RC_ilink", HW_H_ILINKX, CGEN_MODE_SI, OP_ENT (RC_ILINK), 0, COND_REF },
+  { INPUT, "f_op_B", HW_H_UINT, CGEN_MODE_UINT, 0, 0, 0 },
+  { INPUT, "f_op_C", HW_H_UINT, CGEN_MODE_UINT, 0, 0, 0 },
+  { INPUT, "f_op_Cj", HW_H_UINT, CGEN_MODE_UINT, 0, 0, 0 },
+  { INPUT, "h_auxr_SI_11", HW_H_AUXR, CGEN_MODE_SI, 0, 11, COND_REF },
+  { INPUT, "h_auxr_SI_12", HW_H_AUXR, CGEN_MODE_SI, 0, 12, COND_REF },
+  { INPUT, "h_auxr_SI_34", HW_H_AUXR, CGEN_MODE_SI, 0, 34, 0 },
+  { INPUT, "h_auxr_SI_37", HW_H_AUXR, CGEN_MODE_SI, 0, 37, COND_REF },
+  { INPUT, "h_e1_BI", HW_H_E1, CGEN_MODE_BI, 0, 0, 0 },
+  { INPUT, "h_memory_HI_add__DFLT_pc_4", HW_H_MEMORY, CGEN_MODE_HI, 0, 0, COND_REF },
+  { INPUT, "h_memory_HI_add__DFLT_pc_add__DFLT_4_2", HW_H_MEMORY, CGEN_MODE_HI, 0, 0, COND_REF },
+  { INPUT, "h_memory_UHI_countp", HW_H_MEMORY, CGEN_MODE_UHI, 0, 0, COND_REF },
+  { INPUT, "h_prof_offset_SI_0", HW_H_PROF_OFFSET, CGEN_MODE_SI, 0, 0, COND_REF },
+  { INPUT, "h_status32_SI_0", HW_H_STATUS32, CGEN_MODE_SI, 0, 0, COND_REF },
+  { INPUT, "h_timer_expire_SI_0", HW_H_TIMER_EXPIRE, CGEN_MODE_SI, 0, 0, 0 },
+  { INPUT, "h_ubit_BI", HW_H_UBIT, CGEN_MODE_BI, 0, 0, COND_REF },
+  { INPUT, "pc", HW_H_PC, CGEN_MODE_USI, 0, 0, COND_REF },
+  { OUTPUT, "h_auxr_SI_11", HW_H_AUXR, CGEN_MODE_SI, 0, 11, COND_REF },
+  { OUTPUT, "h_auxr_SI_33", HW_H_AUXR, CGEN_MODE_SI, 0, 33, COND_REF },
+  { OUTPUT, "h_cr_SI_29", HW_H_CR, CGEN_MODE_SI, 0, 29, COND_REF },
+  { OUTPUT, "h_e1_BI", HW_H_E1, CGEN_MODE_BI, 0, 0, COND_REF },
+  { OUTPUT, "h_memory_UHI_countp", HW_H_MEMORY, CGEN_MODE_UHI, 0, 0, COND_REF },
+  { OUTPUT, "h_status32_SI_0", HW_H_STATUS32, CGEN_MODE_SI, 0, 0, COND_REF },
+  { OUTPUT, "pc", HW_H_PC, CGEN_MODE_USI, 0, 0, COND_REF },
+  { END, (const char *)0, (enum cgen_hw_type)0, (enum cgen_mode)0, (enum cgen_operand_type)0, 0, 0 }
+};
+
+static const CGEN_OPINST sfmt_j_cc___RC_ilink__ops[] ATTRIBUTE_UNUSED = {
+  { INPUT, "F", HW_H_UFLAGS, CGEN_MODE_UINT, OP_ENT (F), 0, COND_REF },
+  { INPUT, "Qcondb", HW_H_QCONDB, CGEN_MODE_BI, OP_ENT (QCONDB), 0, 0 },
+  { INPUT, "RC_ilink", HW_H_ILINKX, CGEN_MODE_SI, OP_ENT (RC_ILINK), 0, COND_REF },
+  { INPUT, "f_op_B", HW_H_UINT, CGEN_MODE_UINT, 0, 0, 0 },
+  { INPUT, "f_op_C", HW_H_UINT, CGEN_MODE_UINT, 0, 0, 0 },
+  { INPUT, "f_op_Cj", HW_H_UINT, CGEN_MODE_UINT, 0, 0, 0 },
+  { INPUT, "h_auxr_SI_11", HW_H_AUXR, CGEN_MODE_SI, 0, 11, COND_REF },
+  { INPUT, "h_auxr_SI_12", HW_H_AUXR, CGEN_MODE_SI, 0, 12, COND_REF },
+  { INPUT, "h_auxr_SI_34", HW_H_AUXR, CGEN_MODE_SI, 0, 34, COND_REF },
+  { INPUT, "h_auxr_SI_37", HW_H_AUXR, CGEN_MODE_SI, 0, 37, COND_REF },
+  { INPUT, "h_e1_BI", HW_H_E1, CGEN_MODE_BI, 0, 0, COND_REF },
+  { INPUT, "h_memory_HI_add__DFLT_pc_4", HW_H_MEMORY, CGEN_MODE_HI, 0, 0, COND_REF },
+  { INPUT, "h_memory_HI_add__DFLT_pc_add__DFLT_4_2", HW_H_MEMORY, CGEN_MODE_HI, 0, 0, COND_REF },
+  { INPUT, "h_memory_UHI_countp", HW_H_MEMORY, CGEN_MODE_UHI, 0, 0, COND_REF },
+  { INPUT, "h_prof_offset_SI_0", HW_H_PROF_OFFSET, CGEN_MODE_SI, 0, 0, COND_REF },
+  { INPUT, "h_status32_SI_0", HW_H_STATUS32, CGEN_MODE_SI, 0, 0, COND_REF },
+  { INPUT, "h_timer_expire_SI_0", HW_H_TIMER_EXPIRE, CGEN_MODE_SI, 0, 0, COND_REF },
+  { INPUT, "h_ubit_BI", HW_H_UBIT, CGEN_MODE_BI, 0, 0, COND_REF },
+  { INPUT, "pc", HW_H_PC, CGEN_MODE_USI, 0, 0, COND_REF },
+  { OUTPUT, "h_auxr_SI_11", HW_H_AUXR, CGEN_MODE_SI, 0, 11, COND_REF },
+  { OUTPUT, "h_auxr_SI_33", HW_H_AUXR, CGEN_MODE_SI, 0, 33, COND_REF },
+  { OUTPUT, "h_cr_SI_29", HW_H_CR, CGEN_MODE_SI, 0, 29, COND_REF },
+  { OUTPUT, "h_e1_BI", HW_H_E1, CGEN_MODE_BI, 0, 0, COND_REF },
+  { OUTPUT, "h_memory_UHI_countp", HW_H_MEMORY, CGEN_MODE_UHI, 0, 0, COND_REF },
+  { OUTPUT, "h_status32_SI_0", HW_H_STATUS32, CGEN_MODE_SI, 0, 0, COND_REF },
+  { OUTPUT, "pc", HW_H_PC, CGEN_MODE_USI, 0, 0, COND_REF },
+  { END, (const char *)0, (enum cgen_hw_type)0, (enum cgen_mode)0, (enum cgen_operand_type)0, 0, 0 }
+};
+
+static const CGEN_OPINST sfmt_j_L_s12__ops[] ATTRIBUTE_UNUSED = {
+  { INPUT, "F", HW_H_UFLAGS, CGEN_MODE_UINT, OP_ENT (F), 0, COND_REF },
+  { INPUT, "f_op_B", HW_H_UINT, CGEN_MODE_UINT, 0, 0, 0 },
+  { INPUT, "h_auxr_SI_34", HW_H_AUXR, CGEN_MODE_SI, 0, 34, 0 },
+  { INPUT, "h_auxr_SI_37", HW_H_AUXR, CGEN_MODE_SI, 0, 37, COND_REF },
+  { INPUT, "h_e1_BI", HW_H_E1, CGEN_MODE_BI, 0, 0, 0 },
+  { INPUT, "h_memory_HI_add__DFLT_pc_4", HW_H_MEMORY, CGEN_MODE_HI, 0, 0, COND_REF },
+  { INPUT, "h_memory_HI_add__DFLT_pc_add__DFLT_4_2", HW_H_MEMORY, CGEN_MODE_HI, 0, 0, COND_REF },
+  { INPUT, "h_memory_UHI_countp", HW_H_MEMORY, CGEN_MODE_UHI, 0, 0, COND_REF },
+  { INPUT, "h_prof_offset_SI_0", HW_H_PROF_OFFSET, CGEN_MODE_SI, 0, 0, COND_REF },
+  { INPUT, "h_status32_SI_0", HW_H_STATUS32, CGEN_MODE_SI, 0, 0, COND_REF },
+  { INPUT, "h_timer_expire_SI_0", HW_H_TIMER_EXPIRE, CGEN_MODE_SI, 0, 0, 0 },
+  { INPUT, "h_ubit_BI", HW_H_UBIT, CGEN_MODE_BI, 0, 0, COND_REF },
+  { INPUT, "pc", HW_H_PC, CGEN_MODE_USI, 0, 0, COND_REF },
+  { INPUT, "s12", HW_H_SINT, CGEN_MODE_INT, OP_ENT (S12), 0, COND_REF },
+  { OUTPUT, "h_auxr_SI_11", HW_H_AUXR, CGEN_MODE_SI, 0, 11, COND_REF },
+  { OUTPUT, "h_auxr_SI_33", HW_H_AUXR, CGEN_MODE_SI, 0, 33, COND_REF },
+  { OUTPUT, "h_cr_SI_29", HW_H_CR, CGEN_MODE_SI, 0, 29, COND_REF },
+  { OUTPUT, "h_e1_BI", HW_H_E1, CGEN_MODE_BI, 0, 0, COND_REF },
+  { OUTPUT, "h_memory_UHI_countp", HW_H_MEMORY, CGEN_MODE_UHI, 0, 0, COND_REF },
+  { OUTPUT, "pc", HW_H_PC, CGEN_MODE_USI, 0, 0, COND_REF },
+  { END, (const char *)0, (enum cgen_hw_type)0, (enum cgen_mode)0, (enum cgen_operand_type)0, 0, 0 }
+};
+
+static const CGEN_OPINST sfmt_j_ccu6__ops[] ATTRIBUTE_UNUSED = {
+  { INPUT, "F", HW_H_UFLAGS, CGEN_MODE_UINT, OP_ENT (F), 0, COND_REF },
+  { INPUT, "Qcondb", HW_H_QCONDB, CGEN_MODE_BI, OP_ENT (QCONDB), 0, 0 },
+  { INPUT, "U6", HW_H_UINT, CGEN_MODE_UINT, OP_ENT (U6), 0, COND_REF },
+  { INPUT, "f_op_B", HW_H_UINT, CGEN_MODE_UINT, 0, 0, 0 },
+  { INPUT, "h_auxr_SI_34", HW_H_AUXR, CGEN_MODE_SI, 0, 34, COND_REF },
+  { INPUT, "h_auxr_SI_37", HW_H_AUXR, CGEN_MODE_SI, 0, 37, COND_REF },
+  { INPUT, "h_e1_BI", HW_H_E1, CGEN_MODE_BI, 0, 0, COND_REF },
+  { INPUT, "h_memory_HI_add__DFLT_pc_4", HW_H_MEMORY, CGEN_MODE_HI, 0, 0, COND_REF },
+  { INPUT, "h_memory_HI_add__DFLT_pc_add__DFLT_4_2", HW_H_MEMORY, CGEN_MODE_HI, 0, 0, COND_REF },
+  { INPUT, "h_memory_UHI_countp", HW_H_MEMORY, CGEN_MODE_UHI, 0, 0, COND_REF },
+  { INPUT, "h_prof_offset_SI_0", HW_H_PROF_OFFSET, CGEN_MODE_SI, 0, 0, COND_REF },
+  { INPUT, "h_status32_SI_0", HW_H_STATUS32, CGEN_MODE_SI, 0, 0, COND_REF },
+  { INPUT, "h_timer_expire_SI_0", HW_H_TIMER_EXPIRE, CGEN_MODE_SI, 0, 0, COND_REF },
+  { INPUT, "h_ubit_BI", HW_H_UBIT, CGEN_MODE_BI, 0, 0, COND_REF },
+  { INPUT, "pc", HW_H_PC, CGEN_MODE_USI, 0, 0, COND_REF },
+  { OUTPUT, "h_auxr_SI_11", HW_H_AUXR, CGEN_MODE_SI, 0, 11, COND_REF },
+  { OUTPUT, "h_auxr_SI_33", HW_H_AUXR, CGEN_MODE_SI, 0, 33, COND_REF },
+  { OUTPUT, "h_cr_SI_29", HW_H_CR, CGEN_MODE_SI, 0, 29, COND_REF },
+  { OUTPUT, "h_e1_BI", HW_H_E1, CGEN_MODE_BI, 0, 0, COND_REF },
+  { OUTPUT, "h_memory_UHI_countp", HW_H_MEMORY, CGEN_MODE_UHI, 0, 0, COND_REF },
+  { OUTPUT, "pc", HW_H_PC, CGEN_MODE_USI, 0, 0, COND_REF },
+  { END, (const char *)0, (enum cgen_hw_type)0, (enum cgen_mode)0, (enum cgen_operand_type)0, 0, 0 }
+};
+
+static const CGEN_OPINST sfmt_j_L_u6__ops[] ATTRIBUTE_UNUSED = {
+  { INPUT, "F", HW_H_UFLAGS, CGEN_MODE_UINT, OP_ENT (F), 0, COND_REF },
+  { INPUT, "U6", HW_H_UINT, CGEN_MODE_UINT, OP_ENT (U6), 0, COND_REF },
+  { INPUT, "f_op_B", HW_H_UINT, CGEN_MODE_UINT, 0, 0, 0 },
+  { INPUT, "h_auxr_SI_34", HW_H_AUXR, CGEN_MODE_SI, 0, 34, 0 },
+  { INPUT, "h_auxr_SI_37", HW_H_AUXR, CGEN_MODE_SI, 0, 37, COND_REF },
+  { INPUT, "h_e1_BI", HW_H_E1, CGEN_MODE_BI, 0, 0, 0 },
+  { INPUT, "h_memory_HI_add__DFLT_pc_4", HW_H_MEMORY, CGEN_MODE_HI, 0, 0, COND_REF },
+  { INPUT, "h_memory_HI_add__DFLT_pc_add__DFLT_4_2", HW_H_MEMORY, CGEN_MODE_HI, 0, 0, COND_REF },
+  { INPUT, "h_memory_UHI_countp", HW_H_MEMORY, CGEN_MODE_UHI, 0, 0, COND_REF },
+  { INPUT, "h_prof_offset_SI_0", HW_H_PROF_OFFSET, CGEN_MODE_SI, 0, 0, COND_REF },
+  { INPUT, "h_status32_SI_0", HW_H_STATUS32, CGEN_MODE_SI, 0, 0, COND_REF },
+  { INPUT, "h_timer_expire_SI_0", HW_H_TIMER_EXPIRE, CGEN_MODE_SI, 0, 0, 0 },
+  { INPUT, "h_ubit_BI", HW_H_UBIT, CGEN_MODE_BI, 0, 0, COND_REF },
+  { INPUT, "pc", HW_H_PC, CGEN_MODE_USI, 0, 0, COND_REF },
+  { OUTPUT, "h_auxr_SI_11", HW_H_AUXR, CGEN_MODE_SI, 0, 11, COND_REF },
+  { OUTPUT, "h_auxr_SI_33", HW_H_AUXR, CGEN_MODE_SI, 0, 33, COND_REF },
+  { OUTPUT, "h_cr_SI_29", HW_H_CR, CGEN_MODE_SI, 0, 29, COND_REF },
+  { OUTPUT, "h_e1_BI", HW_H_E1, CGEN_MODE_BI, 0, 0, COND_REF },
+  { OUTPUT, "h_memory_UHI_countp", HW_H_MEMORY, CGEN_MODE_UHI, 0, 0, COND_REF },
+  { OUTPUT, "pc", HW_H_PC, CGEN_MODE_USI, 0, 0, COND_REF },
+  { END, (const char *)0, (enum cgen_hw_type)0, (enum cgen_mode)0, (enum cgen_operand_type)0, 0, 0 }
+};
+
+static const CGEN_OPINST sfmt_j_s_ops[] ATTRIBUTE_UNUSED = {
+  { INPUT, "R_b", HW_H_CR16, CGEN_MODE_SI, OP_ENT (R_B), 0, COND_REF },
+  { INPUT, "h_auxr_SI_34", HW_H_AUXR, CGEN_MODE_SI, 0, 34, 0 },
+  { INPUT, "h_auxr_SI_37", HW_H_AUXR, CGEN_MODE_SI, 0, 37, COND_REF },
+  { INPUT, "h_e1_BI", HW_H_E1, CGEN_MODE_BI, 0, 0, 0 },
+  { INPUT, "h_memory_UHI_countp", HW_H_MEMORY, CGEN_MODE_UHI, 0, 0, COND_REF },
+  { INPUT, "h_prof_offset_SI_0", HW_H_PROF_OFFSET, CGEN_MODE_SI, 0, 0, COND_REF },
+  { INPUT, "h_status32_SI_0", HW_H_STATUS32, CGEN_MODE_SI, 0, 0, COND_REF },
+  { INPUT, "h_timer_expire_SI_0", HW_H_TIMER_EXPIRE, CGEN_MODE_SI, 0, 0, 0 },
+  { INPUT, "h_ubit_BI", HW_H_UBIT, CGEN_MODE_BI, 0, 0, COND_REF },
+  { INPUT, "pc", HW_H_PC, CGEN_MODE_USI, 0, 0, COND_REF },
+  { OUTPUT, "h_auxr_SI_11", HW_H_AUXR, CGEN_MODE_SI, 0, 11, COND_REF },
+  { OUTPUT, "h_auxr_SI_33", HW_H_AUXR, CGEN_MODE_SI, 0, 33, COND_REF },
+  { OUTPUT, "h_cr_SI_29", HW_H_CR, CGEN_MODE_SI, 0, 29, COND_REF },
+  { OUTPUT, "h_e1_BI", HW_H_E1, CGEN_MODE_BI, 0, 0, COND_REF },
+  { OUTPUT, "h_memory_UHI_countp", HW_H_MEMORY, CGEN_MODE_UHI, 0, 0, COND_REF },
+  { OUTPUT, "pc", HW_H_PC, CGEN_MODE_USI, 0, 0, COND_REF },
+  { END, (const char *)0, (enum cgen_hw_type)0, (enum cgen_mode)0, (enum cgen_operand_type)0, 0, 0 }
+};
+
+static const CGEN_OPINST sfmt_j_s__S_ops[] ATTRIBUTE_UNUSED = {
+  { INPUT, "R31", HW_H_R31, CGEN_MODE_SI, 0, 0, COND_REF },
+  { INPUT, "h_auxr_SI_34", HW_H_AUXR, CGEN_MODE_SI, 0, 34, 0 },
+  { INPUT, "h_auxr_SI_37", HW_H_AUXR, CGEN_MODE_SI, 0, 37, COND_REF },
+  { INPUT, "h_e1_BI", HW_H_E1, CGEN_MODE_BI, 0, 0, 0 },
+  { INPUT, "h_memory_UHI_countp", HW_H_MEMORY, CGEN_MODE_UHI, 0, 0, COND_REF },
+  { INPUT, "h_prof_offset_SI_0", HW_H_PROF_OFFSET, CGEN_MODE_SI, 0, 0, COND_REF },
+  { INPUT, "h_status32_SI_0", HW_H_STATUS32, CGEN_MODE_SI, 0, 0, COND_REF },
+  { INPUT, "h_timer_expire_SI_0", HW_H_TIMER_EXPIRE, CGEN_MODE_SI, 0, 0, 0 },
+  { INPUT, "h_ubit_BI", HW_H_UBIT, CGEN_MODE_BI, 0, 0, COND_REF },
+  { INPUT, "pc", HW_H_PC, CGEN_MODE_USI, 0, 0, COND_REF },
+  { OUTPUT, "h_auxr_SI_11", HW_H_AUXR, CGEN_MODE_SI, 0, 11, COND_REF },
+  { OUTPUT, "h_auxr_SI_33", HW_H_AUXR, CGEN_MODE_SI, 0, 33, COND_REF },
+  { OUTPUT, "h_cr_SI_29", HW_H_CR, CGEN_MODE_SI, 0, 29, COND_REF },
+  { OUTPUT, "h_e1_BI", HW_H_E1, CGEN_MODE_BI, 0, 0, COND_REF },
+  { OUTPUT, "h_memory_UHI_countp", HW_H_MEMORY, CGEN_MODE_UHI, 0, 0, COND_REF },
+  { OUTPUT, "pc", HW_H_PC, CGEN_MODE_USI, 0, 0, COND_REF },
+  { END, (const char *)0, (enum cgen_hw_type)0, (enum cgen_mode)0, (enum cgen_operand_type)0, 0, 0 }
+};
+
+static const CGEN_OPINST sfmt_j_seq__S_ops[] ATTRIBUTE_UNUSED = {
+  { INPUT, "R31", HW_H_R31, CGEN_MODE_SI, 0, 0, COND_REF },
+  { INPUT, "h_auxr_SI_34", HW_H_AUXR, CGEN_MODE_SI, 0, 34, 0 },
+  { INPUT, "h_auxr_SI_37", HW_H_AUXR, CGEN_MODE_SI, 0, 37, COND_REF },
+  { INPUT, "h_e1_BI", HW_H_E1, CGEN_MODE_BI, 0, 0, 0 },
+  { INPUT, "h_memory_UHI_countp", HW_H_MEMORY, CGEN_MODE_UHI, 0, 0, COND_REF },
+  { INPUT, "h_prof_offset_SI_0", HW_H_PROF_OFFSET, CGEN_MODE_SI, 0, 0, COND_REF },
+  { INPUT, "h_status32_SI_0", HW_H_STATUS32, CGEN_MODE_SI, 0, 0, COND_REF },
+  { INPUT, "h_timer_expire_SI_0", HW_H_TIMER_EXPIRE, CGEN_MODE_SI, 0, 0, 0 },
+  { INPUT, "h_ubit_BI", HW_H_UBIT, CGEN_MODE_BI, 0, 0, COND_REF },
+  { INPUT, "pc", HW_H_PC, CGEN_MODE_USI, 0, 0, COND_REF },
+  { INPUT, "zbit", HW_H_ZBIT, CGEN_MODE_BI, 0, 0, COND_REF },
+  { OUTPUT, "h_auxr_SI_11", HW_H_AUXR, CGEN_MODE_SI, 0, 11, COND_REF },
+  { OUTPUT, "h_auxr_SI_33", HW_H_AUXR, CGEN_MODE_SI, 0, 33, COND_REF },
+  { OUTPUT, "h_cr_SI_29", HW_H_CR, CGEN_MODE_SI, 0, 29, COND_REF },
+  { OUTPUT, "h_e1_BI", HW_H_E1, CGEN_MODE_BI, 0, 0, COND_REF },
+  { OUTPUT, "h_memory_UHI_countp", HW_H_MEMORY, CGEN_MODE_UHI, 0, 0, COND_REF },
+  { OUTPUT, "pc", HW_H_PC, CGEN_MODE_USI, 0, 0, COND_REF },
+  { END, (const char *)0, (enum cgen_hw_type)0, (enum cgen_mode)0, (enum cgen_operand_type)0, 0, 0 }
+};
+
+static const CGEN_OPINST sfmt_j_L_s12_d__ops[] ATTRIBUTE_UNUSED = {
+  { INPUT, "f_op_B", HW_H_UINT, CGEN_MODE_UINT, 0, 0, 0 },
+  { INPUT, "h_auxr_SI_34", HW_H_AUXR, CGEN_MODE_SI, 0, 34, 0 },
+  { INPUT, "h_auxr_SI_37", HW_H_AUXR, CGEN_MODE_SI, 0, 37, COND_REF },
+  { INPUT, "h_e1_BI", HW_H_E1, CGEN_MODE_BI, 0, 0, 0 },
+  { INPUT, "h_memory_HI_add__DFLT_pc_4", HW_H_MEMORY, CGEN_MODE_HI, 0, 0, COND_REF },
+  { INPUT, "h_memory_HI_add__DFLT_pc_add__DFLT_4_2", HW_H_MEMORY, CGEN_MODE_HI, 0, 0, COND_REF },
+  { INPUT, "h_memory_UHI_countp", HW_H_MEMORY, CGEN_MODE_UHI, 0, 0, COND_REF },
+  { INPUT, "h_prof_offset_SI_0", HW_H_PROF_OFFSET, CGEN_MODE_SI, 0, 0, COND_REF },
+  { INPUT, "h_status32_SI_0", HW_H_STATUS32, CGEN_MODE_SI, 0, 0, COND_REF },
+  { INPUT, "h_timer_expire_SI_0", HW_H_TIMER_EXPIRE, CGEN_MODE_SI, 0, 0, 0 },
+  { INPUT, "h_ubit_BI", HW_H_UBIT, CGEN_MODE_BI, 0, 0, COND_REF },
+  { INPUT, "pc", HW_H_PC, CGEN_MODE_USI, 0, 0, COND_REF },
+  { INPUT, "s12", HW_H_SINT, CGEN_MODE_INT, OP_ENT (S12), 0, COND_REF },
+  { OUTPUT, "h_auxr_SI_11", HW_H_AUXR, CGEN_MODE_SI, 0, 11, COND_REF },
+  { OUTPUT, "h_auxr_SI_33", HW_H_AUXR, CGEN_MODE_SI, 0, 33, COND_REF },
+  { OUTPUT, "h_cr_SI_29", HW_H_CR, CGEN_MODE_SI, 0, 29, COND_REF },
+  { OUTPUT, "h_e1_BI", HW_H_E1, CGEN_MODE_BI, 0, 0, COND_REF },
+  { OUTPUT, "h_memory_UHI_countp", HW_H_MEMORY, CGEN_MODE_UHI, 0, 0, COND_REF },
+  { OUTPUT, "pc", HW_H_PC, CGEN_MODE_USI, 0, 0, COND_REF },
+  { END, (const char *)0, (enum cgen_hw_type)0, (enum cgen_mode)0, (enum cgen_operand_type)0, 0, 0 }
+};
+
+static const CGEN_OPINST sfmt_j_ccu6_d__ops[] ATTRIBUTE_UNUSED = {
+  { INPUT, "Qcondb", HW_H_QCONDB, CGEN_MODE_BI, OP_ENT (QCONDB), 0, 0 },
+  { INPUT, "U6", HW_H_UINT, CGEN_MODE_UINT, OP_ENT (U6), 0, COND_REF },
+  { INPUT, "f_op_B", HW_H_UINT, CGEN_MODE_UINT, 0, 0, 0 },
+  { INPUT, "h_auxr_SI_34", HW_H_AUXR, CGEN_MODE_SI, 0, 34, COND_REF },
+  { INPUT, "h_auxr_SI_37", HW_H_AUXR, CGEN_MODE_SI, 0, 37, COND_REF },
+  { INPUT, "h_e1_BI", HW_H_E1, CGEN_MODE_BI, 0, 0, COND_REF },
+  { INPUT, "h_memory_HI_add__DFLT_pc_4", HW_H_MEMORY, CGEN_MODE_HI, 0, 0, COND_REF },
+  { INPUT, "h_memory_HI_add__DFLT_pc_add__DFLT_4_2", HW_H_MEMORY, CGEN_MODE_HI, 0, 0, COND_REF },
+  { INPUT, "h_memory_UHI_countp", HW_H_MEMORY, CGEN_MODE_UHI, 0, 0, COND_REF },
+  { INPUT, "h_prof_offset_SI_0", HW_H_PROF_OFFSET, CGEN_MODE_SI, 0, 0, COND_REF },
+  { INPUT, "h_status32_SI_0", HW_H_STATUS32, CGEN_MODE_SI, 0, 0, COND_REF },
+  { INPUT, "h_timer_expire_SI_0", HW_H_TIMER_EXPIRE, CGEN_MODE_SI, 0, 0, COND_REF },
+  { INPUT, "h_ubit_BI", HW_H_UBIT, CGEN_MODE_BI, 0, 0, COND_REF },
+  { INPUT, "pc", HW_H_PC, CGEN_MODE_USI, 0, 0, COND_REF },
+  { OUTPUT, "h_auxr_SI_11", HW_H_AUXR, CGEN_MODE_SI, 0, 11, COND_REF },
+  { OUTPUT, "h_auxr_SI_33", HW_H_AUXR, CGEN_MODE_SI, 0, 33, COND_REF },
+  { OUTPUT, "h_cr_SI_29", HW_H_CR, CGEN_MODE_SI, 0, 29, COND_REF },
+  { OUTPUT, "h_e1_BI", HW_H_E1, CGEN_MODE_BI, 0, 0, COND_REF },
+  { OUTPUT, "h_memory_UHI_countp", HW_H_MEMORY, CGEN_MODE_UHI, 0, 0, COND_REF },
+  { OUTPUT, "pc", HW_H_PC, CGEN_MODE_USI, 0, 0, COND_REF },
+  { END, (const char *)0, (enum cgen_hw_type)0, (enum cgen_mode)0, (enum cgen_operand_type)0, 0, 0 }
+};
+
+static const CGEN_OPINST sfmt_j_L_u6_d__ops[] ATTRIBUTE_UNUSED = {
+  { INPUT, "U6", HW_H_UINT, CGEN_MODE_UINT, OP_ENT (U6), 0, COND_REF },
+  { INPUT, "f_op_B", HW_H_UINT, CGEN_MODE_UINT, 0, 0, 0 },
+  { INPUT, "h_auxr_SI_34", HW_H_AUXR, CGEN_MODE_SI, 0, 34, 0 },
+  { INPUT, "h_auxr_SI_37", HW_H_AUXR, CGEN_MODE_SI, 0, 37, COND_REF },
+  { INPUT, "h_e1_BI", HW_H_E1, CGEN_MODE_BI, 0, 0, 0 },
+  { INPUT, "h_memory_HI_add__DFLT_pc_4", HW_H_MEMORY, CGEN_MODE_HI, 0, 0, COND_REF },
+  { INPUT, "h_memory_HI_add__DFLT_pc_add__DFLT_4_2", HW_H_MEMORY, CGEN_MODE_HI, 0, 0, COND_REF },
+  { INPUT, "h_memory_UHI_countp", HW_H_MEMORY, CGEN_MODE_UHI, 0, 0, COND_REF },
+  { INPUT, "h_prof_offset_SI_0", HW_H_PROF_OFFSET, CGEN_MODE_SI, 0, 0, COND_REF },
+  { INPUT, "h_status32_SI_0", HW_H_STATUS32, CGEN_MODE_SI, 0, 0, COND_REF },
+  { INPUT, "h_timer_expire_SI_0", HW_H_TIMER_EXPIRE, CGEN_MODE_SI, 0, 0, 0 },
+  { INPUT, "h_ubit_BI", HW_H_UBIT, CGEN_MODE_BI, 0, 0, COND_REF },
+  { INPUT, "pc", HW_H_PC, CGEN_MODE_USI, 0, 0, COND_REF },
+  { OUTPUT, "h_auxr_SI_11", HW_H_AUXR, CGEN_MODE_SI, 0, 11, COND_REF },
+  { OUTPUT, "h_auxr_SI_33", HW_H_AUXR, CGEN_MODE_SI, 0, 33, COND_REF },
+  { OUTPUT, "h_cr_SI_29", HW_H_CR, CGEN_MODE_SI, 0, 29, COND_REF },
+  { OUTPUT, "h_e1_BI", HW_H_E1, CGEN_MODE_BI, 0, 0, COND_REF },
+  { OUTPUT, "h_memory_UHI_countp", HW_H_MEMORY, CGEN_MODE_UHI, 0, 0, COND_REF },
+  { OUTPUT, "pc", HW_H_PC, CGEN_MODE_USI, 0, 0, COND_REF },
+  { END, (const char *)0, (enum cgen_hw_type)0, (enum cgen_mode)0, (enum cgen_operand_type)0, 0, 0 }
+};
+
+static const CGEN_OPINST sfmt_j_L_r_r_d___RC__ops[] ATTRIBUTE_UNUSED = {
+  { INPUT, "RC", HW_H_CR, CGEN_MODE_SI, OP_ENT (RC), 0, COND_REF },
+  { INPUT, "f_op_B", HW_H_UINT, CGEN_MODE_UINT, 0, 0, 0 },
+  { INPUT, "f_op_C", HW_H_UINT, CGEN_MODE_UINT, 0, 0, 0 },
+  { INPUT, "h_auxr_SI_34", HW_H_AUXR, CGEN_MODE_SI, 0, 34, 0 },
+  { INPUT, "h_auxr_SI_37", HW_H_AUXR, CGEN_MODE_SI, 0, 37, COND_REF },
+  { INPUT, "h_e1_BI", HW_H_E1, CGEN_MODE_BI, 0, 0, 0 },
+  { INPUT, "h_memory_HI_add__DFLT_pc_4", HW_H_MEMORY, CGEN_MODE_HI, 0, 0, COND_REF },
+  { INPUT, "h_memory_HI_add__DFLT_pc_add__DFLT_4_2", HW_H_MEMORY, CGEN_MODE_HI, 0, 0, COND_REF },
+  { INPUT, "h_memory_UHI_countp", HW_H_MEMORY, CGEN_MODE_UHI, 0, 0, COND_REF },
+  { INPUT, "h_prof_offset_SI_0", HW_H_PROF_OFFSET, CGEN_MODE_SI, 0, 0, COND_REF },
+  { INPUT, "h_status32_SI_0", HW_H_STATUS32, CGEN_MODE_SI, 0, 0, COND_REF },
+  { INPUT, "h_timer_expire_SI_0", HW_H_TIMER_EXPIRE, CGEN_MODE_SI, 0, 0, 0 },
+  { INPUT, "h_ubit_BI", HW_H_UBIT, CGEN_MODE_BI, 0, 0, COND_REF },
+  { INPUT, "pc", HW_H_PC, CGEN_MODE_USI, 0, 0, COND_REF },
+  { OUTPUT, "h_auxr_SI_11", HW_H_AUXR, CGEN_MODE_SI, 0, 11, COND_REF },
+  { OUTPUT, "h_auxr_SI_33", HW_H_AUXR, CGEN_MODE_SI, 0, 33, COND_REF },
+  { OUTPUT, "h_cr_SI_29", HW_H_CR, CGEN_MODE_SI, 0, 29, COND_REF },
+  { OUTPUT, "h_e1_BI", HW_H_E1, CGEN_MODE_BI, 0, 0, COND_REF },
+  { OUTPUT, "h_memory_UHI_countp", HW_H_MEMORY, CGEN_MODE_UHI, 0, 0, COND_REF },
+  { OUTPUT, "pc", HW_H_PC, CGEN_MODE_USI, 0, 0, COND_REF },
+  { END, (const char *)0, (enum cgen_hw_type)0, (enum cgen_mode)0, (enum cgen_operand_type)0, 0, 0 }
+};
+
+static const CGEN_OPINST sfmt_j_cc_d___RC__ops[] ATTRIBUTE_UNUSED = {
+  { INPUT, "Qcondb", HW_H_QCONDB, CGEN_MODE_BI, OP_ENT (QCONDB), 0, 0 },
+  { INPUT, "RC", HW_H_CR, CGEN_MODE_SI, OP_ENT (RC), 0, COND_REF },
+  { INPUT, "f_op_B", HW_H_UINT, CGEN_MODE_UINT, 0, 0, 0 },
+  { INPUT, "f_op_C", HW_H_UINT, CGEN_MODE_UINT, 0, 0, 0 },
+  { INPUT, "h_auxr_SI_34", HW_H_AUXR, CGEN_MODE_SI, 0, 34, COND_REF },
+  { INPUT, "h_auxr_SI_37", HW_H_AUXR, CGEN_MODE_SI, 0, 37, COND_REF },
+  { INPUT, "h_e1_BI", HW_H_E1, CGEN_MODE_BI, 0, 0, COND_REF },
+  { INPUT, "h_memory_HI_add__DFLT_pc_4", HW_H_MEMORY, CGEN_MODE_HI, 0, 0, COND_REF },
+  { INPUT, "h_memory_HI_add__DFLT_pc_add__DFLT_4_2", HW_H_MEMORY, CGEN_MODE_HI, 0, 0, COND_REF },
+  { INPUT, "h_memory_UHI_countp", HW_H_MEMORY, CGEN_MODE_UHI, 0, 0, COND_REF },
+  { INPUT, "h_prof_offset_SI_0", HW_H_PROF_OFFSET, CGEN_MODE_SI, 0, 0, COND_REF },
+  { INPUT, "h_status32_SI_0", HW_H_STATUS32, CGEN_MODE_SI, 0, 0, COND_REF },
+  { INPUT, "h_timer_expire_SI_0", HW_H_TIMER_EXPIRE, CGEN_MODE_SI, 0, 0, COND_REF },
+  { INPUT, "h_ubit_BI", HW_H_UBIT, CGEN_MODE_BI, 0, 0, COND_REF },
+  { INPUT, "pc", HW_H_PC, CGEN_MODE_USI, 0, 0, COND_REF },
+  { OUTPUT, "h_auxr_SI_11", HW_H_AUXR, CGEN_MODE_SI, 0, 11, COND_REF },
+  { OUTPUT, "h_auxr_SI_33", HW_H_AUXR, CGEN_MODE_SI, 0, 33, COND_REF },
+  { OUTPUT, "h_cr_SI_29", HW_H_CR, CGEN_MODE_SI, 0, 29, COND_REF },
+  { OUTPUT, "h_e1_BI", HW_H_E1, CGEN_MODE_BI, 0, 0, COND_REF },
+  { OUTPUT, "h_memory_UHI_countp", HW_H_MEMORY, CGEN_MODE_UHI, 0, 0, COND_REF },
+  { OUTPUT, "pc", HW_H_PC, CGEN_MODE_USI, 0, 0, COND_REF },
+  { END, (const char *)0, (enum cgen_hw_type)0, (enum cgen_mode)0, (enum cgen_operand_type)0, 0, 0 }
+};
+
+static const CGEN_OPINST sfmt_jl_L_s12__ops[] ATTRIBUTE_UNUSED = {
+  { INPUT, "f_op_B", HW_H_UINT, CGEN_MODE_UINT, 0, 0, 0 },
+  { INPUT, "h_auxr_SI_34", HW_H_AUXR, CGEN_MODE_SI, 0, 34, 0 },
+  { INPUT, "h_auxr_SI_37", HW_H_AUXR, CGEN_MODE_SI, 0, 37, COND_REF },
+  { INPUT, "h_e1_BI", HW_H_E1, CGEN_MODE_BI, 0, 0, 0 },
+  { INPUT, "h_memory_HI_add__DFLT_pc_4", HW_H_MEMORY, CGEN_MODE_HI, 0, 0, COND_REF },
+  { INPUT, "h_memory_HI_add__DFLT_pc_add__DFLT_4_2", HW_H_MEMORY, CGEN_MODE_HI, 0, 0, COND_REF },
+  { INPUT, "h_memory_UHI_countp", HW_H_MEMORY, CGEN_MODE_UHI, 0, 0, COND_REF },
+  { INPUT, "h_prof_offset_SI_0", HW_H_PROF_OFFSET, CGEN_MODE_SI, 0, 0, COND_REF },
+  { INPUT, "h_status32_SI_0", HW_H_STATUS32, CGEN_MODE_SI, 0, 0, COND_REF },
+  { INPUT, "h_timer_expire_SI_0", HW_H_TIMER_EXPIRE, CGEN_MODE_SI, 0, 0, 0 },
+  { INPUT, "h_ubit_BI", HW_H_UBIT, CGEN_MODE_BI, 0, 0, COND_REF },
+  { INPUT, "pc", HW_H_PC, CGEN_MODE_USI, 0, 0, COND_REF },
+  { INPUT, "s12", HW_H_SINT, CGEN_MODE_INT, OP_ENT (S12), 0, COND_REF },
+  { OUTPUT, "h_auxr_SI_11", HW_H_AUXR, CGEN_MODE_SI, 0, 11, COND_REF },
+  { OUTPUT, "h_auxr_SI_33", HW_H_AUXR, CGEN_MODE_SI, 0, 33, COND_REF },
+  { OUTPUT, "h_cr_SI_29", HW_H_CR, CGEN_MODE_SI, 0, 29, COND_REF },
+  { OUTPUT, "h_cr_SI_31", HW_H_CR, CGEN_MODE_SI, 0, 31, COND_REF },
+  { OUTPUT, "h_e1_BI", HW_H_E1, CGEN_MODE_BI, 0, 0, COND_REF },
+  { OUTPUT, "h_memory_UHI_countp", HW_H_MEMORY, CGEN_MODE_UHI, 0, 0, COND_REF },
+  { OUTPUT, "pc", HW_H_PC, CGEN_MODE_USI, 0, 0, COND_REF },
+  { END, (const char *)0, (enum cgen_hw_type)0, (enum cgen_mode)0, (enum cgen_operand_type)0, 0, 0 }
+};
+
+static const CGEN_OPINST sfmt_jl_ccu6__ops[] ATTRIBUTE_UNUSED = {
+  { INPUT, "Qcondb", HW_H_QCONDB, CGEN_MODE_BI, OP_ENT (QCONDB), 0, 0 },
+  { INPUT, "U6", HW_H_UINT, CGEN_MODE_UINT, OP_ENT (U6), 0, COND_REF },
+  { INPUT, "f_op_B", HW_H_UINT, CGEN_MODE_UINT, 0, 0, 0 },
+  { INPUT, "h_auxr_SI_34", HW_H_AUXR, CGEN_MODE_SI, 0, 34, COND_REF },
+  { INPUT, "h_auxr_SI_37", HW_H_AUXR, CGEN_MODE_SI, 0, 37, COND_REF },
+  { INPUT, "h_e1_BI", HW_H_E1, CGEN_MODE_BI, 0, 0, COND_REF },
+  { INPUT, "h_memory_HI_add__DFLT_pc_4", HW_H_MEMORY, CGEN_MODE_HI, 0, 0, COND_REF },
+  { INPUT, "h_memory_HI_add__DFLT_pc_add__DFLT_4_2", HW_H_MEMORY, CGEN_MODE_HI, 0, 0, COND_REF },
+  { INPUT, "h_memory_UHI_countp", HW_H_MEMORY, CGEN_MODE_UHI, 0, 0, COND_REF },
+  { INPUT, "h_prof_offset_SI_0", HW_H_PROF_OFFSET, CGEN_MODE_SI, 0, 0, COND_REF },
+  { INPUT, "h_status32_SI_0", HW_H_STATUS32, CGEN_MODE_SI, 0, 0, COND_REF },
+  { INPUT, "h_timer_expire_SI_0", HW_H_TIMER_EXPIRE, CGEN_MODE_SI, 0, 0, COND_REF },
+  { INPUT, "h_ubit_BI", HW_H_UBIT, CGEN_MODE_BI, 0, 0, COND_REF },
+  { INPUT, "pc", HW_H_PC, CGEN_MODE_USI, 0, 0, COND_REF },
+  { OUTPUT, "h_auxr_SI_11", HW_H_AUXR, CGEN_MODE_SI, 0, 11, COND_REF },
+  { OUTPUT, "h_auxr_SI_33", HW_H_AUXR, CGEN_MODE_SI, 0, 33, COND_REF },
+  { OUTPUT, "h_cr_SI_29", HW_H_CR, CGEN_MODE_SI, 0, 29, COND_REF },
+  { OUTPUT, "h_cr_SI_31", HW_H_CR, CGEN_MODE_SI, 0, 31, COND_REF },
+  { OUTPUT, "h_e1_BI", HW_H_E1, CGEN_MODE_BI, 0, 0, COND_REF },
+  { OUTPUT, "h_memory_UHI_countp", HW_H_MEMORY, CGEN_MODE_UHI, 0, 0, COND_REF },
+  { OUTPUT, "pc", HW_H_PC, CGEN_MODE_USI, 0, 0, COND_REF },
+  { END, (const char *)0, (enum cgen_hw_type)0, (enum cgen_mode)0, (enum cgen_operand_type)0, 0, 0 }
+};
+
+static const CGEN_OPINST sfmt_jl_L_u6__ops[] ATTRIBUTE_UNUSED = {
+  { INPUT, "U6", HW_H_UINT, CGEN_MODE_UINT, OP_ENT (U6), 0, COND_REF },
+  { INPUT, "f_op_B", HW_H_UINT, CGEN_MODE_UINT, 0, 0, 0 },
+  { INPUT, "h_auxr_SI_34", HW_H_AUXR, CGEN_MODE_SI, 0, 34, 0 },
+  { INPUT, "h_auxr_SI_37", HW_H_AUXR, CGEN_MODE_SI, 0, 37, COND_REF },
+  { INPUT, "h_e1_BI", HW_H_E1, CGEN_MODE_BI, 0, 0, 0 },
+  { INPUT, "h_memory_HI_add__DFLT_pc_4", HW_H_MEMORY, CGEN_MODE_HI, 0, 0, COND_REF },
+  { INPUT, "h_memory_HI_add__DFLT_pc_add__DFLT_4_2", HW_H_MEMORY, CGEN_MODE_HI, 0, 0, COND_REF },
+  { INPUT, "h_memory_UHI_countp", HW_H_MEMORY, CGEN_MODE_UHI, 0, 0, COND_REF },
+  { INPUT, "h_prof_offset_SI_0", HW_H_PROF_OFFSET, CGEN_MODE_SI, 0, 0, COND_REF },
+  { INPUT, "h_status32_SI_0", HW_H_STATUS32, CGEN_MODE_SI, 0, 0, COND_REF },
+  { INPUT, "h_timer_expire_SI_0", HW_H_TIMER_EXPIRE, CGEN_MODE_SI, 0, 0, 0 },
+  { INPUT, "h_ubit_BI", HW_H_UBIT, CGEN_MODE_BI, 0, 0, COND_REF },
+  { INPUT, "pc", HW_H_PC, CGEN_MODE_USI, 0, 0, COND_REF },
+  { OUTPUT, "h_auxr_SI_11", HW_H_AUXR, CGEN_MODE_SI, 0, 11, COND_REF },
+  { OUTPUT, "h_auxr_SI_33", HW_H_AUXR, CGEN_MODE_SI, 0, 33, COND_REF },
+  { OUTPUT, "h_cr_SI_29", HW_H_CR, CGEN_MODE_SI, 0, 29, COND_REF },
+  { OUTPUT, "h_cr_SI_31", HW_H_CR, CGEN_MODE_SI, 0, 31, COND_REF },
+  { OUTPUT, "h_e1_BI", HW_H_E1, CGEN_MODE_BI, 0, 0, COND_REF },
+  { OUTPUT, "h_memory_UHI_countp", HW_H_MEMORY, CGEN_MODE_UHI, 0, 0, COND_REF },
+  { OUTPUT, "pc", HW_H_PC, CGEN_MODE_USI, 0, 0, COND_REF },
+  { END, (const char *)0, (enum cgen_hw_type)0, (enum cgen_mode)0, (enum cgen_operand_type)0, 0, 0 }
+};
+
+static const CGEN_OPINST sfmt_jl_s_ops[] ATTRIBUTE_UNUSED = {
+  { INPUT, "R_b", HW_H_CR16, CGEN_MODE_SI, OP_ENT (R_B), 0, COND_REF },
+  { INPUT, "h_auxr_SI_34", HW_H_AUXR, CGEN_MODE_SI, 0, 34, 0 },
+  { INPUT, "h_auxr_SI_37", HW_H_AUXR, CGEN_MODE_SI, 0, 37, COND_REF },
+  { INPUT, "h_e1_BI", HW_H_E1, CGEN_MODE_BI, 0, 0, 0 },
+  { INPUT, "h_memory_UHI_countp", HW_H_MEMORY, CGEN_MODE_UHI, 0, 0, COND_REF },
+  { INPUT, "h_prof_offset_SI_0", HW_H_PROF_OFFSET, CGEN_MODE_SI, 0, 0, COND_REF },
+  { INPUT, "h_status32_SI_0", HW_H_STATUS32, CGEN_MODE_SI, 0, 0, COND_REF },
+  { INPUT, "h_timer_expire_SI_0", HW_H_TIMER_EXPIRE, CGEN_MODE_SI, 0, 0, 0 },
+  { INPUT, "h_ubit_BI", HW_H_UBIT, CGEN_MODE_BI, 0, 0, COND_REF },
+  { INPUT, "pc", HW_H_PC, CGEN_MODE_USI, 0, 0, COND_REF },
+  { OUTPUT, "h_auxr_SI_11", HW_H_AUXR, CGEN_MODE_SI, 0, 11, COND_REF },
+  { OUTPUT, "h_auxr_SI_33", HW_H_AUXR, CGEN_MODE_SI, 0, 33, COND_REF },
+  { OUTPUT, "h_cr_SI_29", HW_H_CR, CGEN_MODE_SI, 0, 29, COND_REF },
+  { OUTPUT, "h_cr_SI_31", HW_H_CR, CGEN_MODE_SI, 0, 31, COND_REF },
+  { OUTPUT, "h_e1_BI", HW_H_E1, CGEN_MODE_BI, 0, 0, COND_REF },
+  { OUTPUT, "h_memory_UHI_countp", HW_H_MEMORY, CGEN_MODE_UHI, 0, 0, COND_REF },
+  { OUTPUT, "pc", HW_H_PC, CGEN_MODE_USI, 0, 0, COND_REF },
+  { END, (const char *)0, (enum cgen_hw_type)0, (enum cgen_mode)0, (enum cgen_operand_type)0, 0, 0 }
+};
+
+static const CGEN_OPINST sfmt_jl_L_r_r___RC_noilink__ops[] ATTRIBUTE_UNUSED = {
+  { INPUT, "RC_noilink", HW_H_NOILINK, CGEN_MODE_SI, OP_ENT (RC_NOILINK), 0, COND_REF },
+  { INPUT, "f_op_B", HW_H_UINT, CGEN_MODE_UINT, 0, 0, 0 },
+  { INPUT, "f_op_C", HW_H_UINT, CGEN_MODE_UINT, 0, 0, 0 },
+  { INPUT, "h_auxr_SI_34", HW_H_AUXR, CGEN_MODE_SI, 0, 34, 0 },
+  { INPUT, "h_auxr_SI_37", HW_H_AUXR, CGEN_MODE_SI, 0, 37, COND_REF },
+  { INPUT, "h_e1_BI", HW_H_E1, CGEN_MODE_BI, 0, 0, 0 },
+  { INPUT, "h_memory_HI_add__DFLT_pc_4", HW_H_MEMORY, CGEN_MODE_HI, 0, 0, COND_REF },
+  { INPUT, "h_memory_HI_add__DFLT_pc_add__DFLT_4_2", HW_H_MEMORY, CGEN_MODE_HI, 0, 0, COND_REF },
+  { INPUT, "h_memory_UHI_countp", HW_H_MEMORY, CGEN_MODE_UHI, 0, 0, COND_REF },
+  { INPUT, "h_prof_offset_SI_0", HW_H_PROF_OFFSET, CGEN_MODE_SI, 0, 0, COND_REF },
+  { INPUT, "h_status32_SI_0", HW_H_STATUS32, CGEN_MODE_SI, 0, 0, COND_REF },
+  { INPUT, "h_timer_expire_SI_0", HW_H_TIMER_EXPIRE, CGEN_MODE_SI, 0, 0, 0 },
+  { INPUT, "h_ubit_BI", HW_H_UBIT, CGEN_MODE_BI, 0, 0, COND_REF },
+  { INPUT, "pc", HW_H_PC, CGEN_MODE_USI, 0, 0, COND_REF },
+  { OUTPUT, "h_auxr_SI_11", HW_H_AUXR, CGEN_MODE_SI, 0, 11, COND_REF },
+  { OUTPUT, "h_auxr_SI_33", HW_H_AUXR, CGEN_MODE_SI, 0, 33, COND_REF },
+  { OUTPUT, "h_cr_SI_29", HW_H_CR, CGEN_MODE_SI, 0, 29, COND_REF },
+  { OUTPUT, "h_cr_SI_31", HW_H_CR, CGEN_MODE_SI, 0, 31, COND_REF },
+  { OUTPUT, "h_e1_BI", HW_H_E1, CGEN_MODE_BI, 0, 0, COND_REF },
+  { OUTPUT, "h_memory_UHI_countp", HW_H_MEMORY, CGEN_MODE_UHI, 0, 0, COND_REF },
+  { OUTPUT, "pc", HW_H_PC, CGEN_MODE_USI, 0, 0, COND_REF },
+  { END, (const char *)0, (enum cgen_hw_type)0, (enum cgen_mode)0, (enum cgen_operand_type)0, 0, 0 }
+};
+
+static const CGEN_OPINST sfmt_jl_cc___RC_noilink__ops[] ATTRIBUTE_UNUSED = {
+  { INPUT, "Qcondb", HW_H_QCONDB, CGEN_MODE_BI, OP_ENT (QCONDB), 0, 0 },
+  { INPUT, "RC_noilink", HW_H_NOILINK, CGEN_MODE_SI, OP_ENT (RC_NOILINK), 0, COND_REF },
+  { INPUT, "f_op_B", HW_H_UINT, CGEN_MODE_UINT, 0, 0, 0 },
+  { INPUT, "f_op_C", HW_H_UINT, CGEN_MODE_UINT, 0, 0, 0 },
+  { INPUT, "h_auxr_SI_34", HW_H_AUXR, CGEN_MODE_SI, 0, 34, COND_REF },
+  { INPUT, "h_auxr_SI_37", HW_H_AUXR, CGEN_MODE_SI, 0, 37, COND_REF },
+  { INPUT, "h_e1_BI", HW_H_E1, CGEN_MODE_BI, 0, 0, COND_REF },
+  { INPUT, "h_memory_HI_add__DFLT_pc_4", HW_H_MEMORY, CGEN_MODE_HI, 0, 0, COND_REF },
+  { INPUT, "h_memory_HI_add__DFLT_pc_add__DFLT_4_2", HW_H_MEMORY, CGEN_MODE_HI, 0, 0, COND_REF },
+  { INPUT, "h_memory_UHI_countp", HW_H_MEMORY, CGEN_MODE_UHI, 0, 0, COND_REF },
+  { INPUT, "h_prof_offset_SI_0", HW_H_PROF_OFFSET, CGEN_MODE_SI, 0, 0, COND_REF },
+  { INPUT, "h_status32_SI_0", HW_H_STATUS32, CGEN_MODE_SI, 0, 0, COND_REF },
+  { INPUT, "h_timer_expire_SI_0", HW_H_TIMER_EXPIRE, CGEN_MODE_SI, 0, 0, COND_REF },
+  { INPUT, "h_ubit_BI", HW_H_UBIT, CGEN_MODE_BI, 0, 0, COND_REF },
+  { INPUT, "pc", HW_H_PC, CGEN_MODE_USI, 0, 0, COND_REF },
+  { OUTPUT, "h_auxr_SI_11", HW_H_AUXR, CGEN_MODE_SI, 0, 11, COND_REF },
+  { OUTPUT, "h_auxr_SI_33", HW_H_AUXR, CGEN_MODE_SI, 0, 33, COND_REF },
+  { OUTPUT, "h_cr_SI_29", HW_H_CR, CGEN_MODE_SI, 0, 29, COND_REF },
+  { OUTPUT, "h_cr_SI_31", HW_H_CR, CGEN_MODE_SI, 0, 31, COND_REF },
+  { OUTPUT, "h_e1_BI", HW_H_E1, CGEN_MODE_BI, 0, 0, COND_REF },
+  { OUTPUT, "h_memory_UHI_countp", HW_H_MEMORY, CGEN_MODE_UHI, 0, 0, COND_REF },
+  { OUTPUT, "pc", HW_H_PC, CGEN_MODE_USI, 0, 0, COND_REF },
+  { END, (const char *)0, (enum cgen_hw_type)0, (enum cgen_mode)0, (enum cgen_operand_type)0, 0, 0 }
+};
+
+static const CGEN_OPINST sfmt_jl_L_r_r_d___RC__ops[] ATTRIBUTE_UNUSED = {
+  { INPUT, "RC", HW_H_CR, CGEN_MODE_SI, OP_ENT (RC), 0, COND_REF },
+  { INPUT, "f_op_B", HW_H_UINT, CGEN_MODE_UINT, 0, 0, 0 },
+  { INPUT, "f_op_C", HW_H_UINT, CGEN_MODE_UINT, 0, 0, 0 },
+  { INPUT, "h_auxr_SI_34", HW_H_AUXR, CGEN_MODE_SI, 0, 34, 0 },
+  { INPUT, "h_auxr_SI_37", HW_H_AUXR, CGEN_MODE_SI, 0, 37, COND_REF },
+  { INPUT, "h_e1_BI", HW_H_E1, CGEN_MODE_BI, 0, 0, 0 },
+  { INPUT, "h_memory_HI_add__DFLT_pc_4", HW_H_MEMORY, CGEN_MODE_HI, 0, 0, COND_REF },
+  { INPUT, "h_memory_HI_add__DFLT_pc_add__DFLT_4_2", HW_H_MEMORY, CGEN_MODE_HI, 0, 0, COND_REF },
+  { INPUT, "h_memory_UHI_countp", HW_H_MEMORY, CGEN_MODE_UHI, 0, 0, COND_REF },
+  { INPUT, "h_prof_offset_SI_0", HW_H_PROF_OFFSET, CGEN_MODE_SI, 0, 0, COND_REF },
+  { INPUT, "h_status32_SI_0", HW_H_STATUS32, CGEN_MODE_SI, 0, 0, COND_REF },
+  { INPUT, "h_timer_expire_SI_0", HW_H_TIMER_EXPIRE, CGEN_MODE_SI, 0, 0, 0 },
+  { INPUT, "h_ubit_BI", HW_H_UBIT, CGEN_MODE_BI, 0, 0, COND_REF },
+  { INPUT, "pc", HW_H_PC, CGEN_MODE_USI, 0, 0, COND_REF },
+  { OUTPUT, "h_auxr_SI_11", HW_H_AUXR, CGEN_MODE_SI, 0, 11, COND_REF },
+  { OUTPUT, "h_auxr_SI_33", HW_H_AUXR, CGEN_MODE_SI, 0, 33, COND_REF },
+  { OUTPUT, "h_cr_SI_29", HW_H_CR, CGEN_MODE_SI, 0, 29, COND_REF },
+  { OUTPUT, "h_cr_SI_31", HW_H_CR, CGEN_MODE_SI, 0, 31, COND_REF },
+  { OUTPUT, "h_e1_BI", HW_H_E1, CGEN_MODE_BI, 0, 0, COND_REF },
+  { OUTPUT, "h_memory_UHI_countp", HW_H_MEMORY, CGEN_MODE_UHI, 0, 0, COND_REF },
+  { OUTPUT, "pc", HW_H_PC, CGEN_MODE_USI, 0, 0, COND_REF },
+  { END, (const char *)0, (enum cgen_hw_type)0, (enum cgen_mode)0, (enum cgen_operand_type)0, 0, 0 }
+};
+
+static const CGEN_OPINST sfmt_jl_cc_d___RC__ops[] ATTRIBUTE_UNUSED = {
+  { INPUT, "Qcondb", HW_H_QCONDB, CGEN_MODE_BI, OP_ENT (QCONDB), 0, 0 },
+  { INPUT, "RC", HW_H_CR, CGEN_MODE_SI, OP_ENT (RC), 0, COND_REF },
+  { INPUT, "f_op_B", HW_H_UINT, CGEN_MODE_UINT, 0, 0, 0 },
+  { INPUT, "f_op_C", HW_H_UINT, CGEN_MODE_UINT, 0, 0, 0 },
+  { INPUT, "h_auxr_SI_34", HW_H_AUXR, CGEN_MODE_SI, 0, 34, COND_REF },
+  { INPUT, "h_auxr_SI_37", HW_H_AUXR, CGEN_MODE_SI, 0, 37, COND_REF },
+  { INPUT, "h_e1_BI", HW_H_E1, CGEN_MODE_BI, 0, 0, COND_REF },
+  { INPUT, "h_memory_HI_add__DFLT_pc_4", HW_H_MEMORY, CGEN_MODE_HI, 0, 0, COND_REF },
+  { INPUT, "h_memory_HI_add__DFLT_pc_add__DFLT_4_2", HW_H_MEMORY, CGEN_MODE_HI, 0, 0, COND_REF },
+  { INPUT, "h_memory_UHI_countp", HW_H_MEMORY, CGEN_MODE_UHI, 0, 0, COND_REF },
+  { INPUT, "h_prof_offset_SI_0", HW_H_PROF_OFFSET, CGEN_MODE_SI, 0, 0, COND_REF },
+  { INPUT, "h_status32_SI_0", HW_H_STATUS32, CGEN_MODE_SI, 0, 0, COND_REF },
+  { INPUT, "h_timer_expire_SI_0", HW_H_TIMER_EXPIRE, CGEN_MODE_SI, 0, 0, COND_REF },
+  { INPUT, "h_ubit_BI", HW_H_UBIT, CGEN_MODE_BI, 0, 0, COND_REF },
+  { INPUT, "pc", HW_H_PC, CGEN_MODE_USI, 0, 0, COND_REF },
+  { OUTPUT, "h_auxr_SI_11", HW_H_AUXR, CGEN_MODE_SI, 0, 11, COND_REF },
+  { OUTPUT, "h_auxr_SI_33", HW_H_AUXR, CGEN_MODE_SI, 0, 33, COND_REF },
+  { OUTPUT, "h_cr_SI_29", HW_H_CR, CGEN_MODE_SI, 0, 29, COND_REF },
+  { OUTPUT, "h_cr_SI_31", HW_H_CR, CGEN_MODE_SI, 0, 31, COND_REF },
+  { OUTPUT, "h_e1_BI", HW_H_E1, CGEN_MODE_BI, 0, 0, COND_REF },
+  { OUTPUT, "h_memory_UHI_countp", HW_H_MEMORY, CGEN_MODE_UHI, 0, 0, COND_REF },
+  { OUTPUT, "pc", HW_H_PC, CGEN_MODE_USI, 0, 0, COND_REF },
+  { END, (const char *)0, (enum cgen_hw_type)0, (enum cgen_mode)0, (enum cgen_operand_type)0, 0, 0 }
+};
+
+static const CGEN_OPINST sfmt_jl_s_d_ops[] ATTRIBUTE_UNUSED = {
+  { INPUT, "R_b", HW_H_CR16, CGEN_MODE_SI, OP_ENT (R_B), 0, COND_REF },
+  { INPUT, "h_auxr_SI_34", HW_H_AUXR, CGEN_MODE_SI, 0, 34, 0 },
+  { INPUT, "h_auxr_SI_37", HW_H_AUXR, CGEN_MODE_SI, 0, 37, COND_REF },
+  { INPUT, "h_e1_BI", HW_H_E1, CGEN_MODE_BI, 0, 0, 0 },
+  { INPUT, "h_memory_HI_add__DFLT_pc_2", HW_H_MEMORY, CGEN_MODE_HI, 0, 0, COND_REF },
+  { INPUT, "h_memory_UHI_countp", HW_H_MEMORY, CGEN_MODE_UHI, 0, 0, COND_REF },
+  { INPUT, "h_prof_offset_SI_0", HW_H_PROF_OFFSET, CGEN_MODE_SI, 0, 0, COND_REF },
+  { INPUT, "h_status32_SI_0", HW_H_STATUS32, CGEN_MODE_SI, 0, 0, COND_REF },
+  { INPUT, "h_timer_expire_SI_0", HW_H_TIMER_EXPIRE, CGEN_MODE_SI, 0, 0, 0 },
+  { INPUT, "h_ubit_BI", HW_H_UBIT, CGEN_MODE_BI, 0, 0, COND_REF },
+  { INPUT, "pc", HW_H_PC, CGEN_MODE_USI, 0, 0, COND_REF },
+  { OUTPUT, "h_auxr_SI_11", HW_H_AUXR, CGEN_MODE_SI, 0, 11, COND_REF },
+  { OUTPUT, "h_auxr_SI_33", HW_H_AUXR, CGEN_MODE_SI, 0, 33, COND_REF },
+  { OUTPUT, "h_cr_SI_29", HW_H_CR, CGEN_MODE_SI, 0, 29, COND_REF },
+  { OUTPUT, "h_cr_SI_31", HW_H_CR, CGEN_MODE_SI, 0, 31, COND_REF },
+  { OUTPUT, "h_e1_BI", HW_H_E1, CGEN_MODE_BI, 0, 0, COND_REF },
+  { OUTPUT, "h_memory_UHI_countp", HW_H_MEMORY, CGEN_MODE_UHI, 0, 0, COND_REF },
+  { OUTPUT, "pc", HW_H_PC, CGEN_MODE_USI, 0, 0, COND_REF },
+  { END, (const char *)0, (enum cgen_hw_type)0, (enum cgen_mode)0, (enum cgen_operand_type)0, 0, 0 }
+};
+
+static const CGEN_OPINST sfmt_lp_L_s12__ops[] ATTRIBUTE_UNUSED = {
+  { INPUT, "f_op_B", HW_H_UINT, CGEN_MODE_UINT, 0, 0, 0 },
+  { INPUT, "h_auxr_SI_34", HW_H_AUXR, CGEN_MODE_SI, 0, 34, 0 },
+  { INPUT, "h_auxr_SI_37", HW_H_AUXR, CGEN_MODE_SI, 0, 37, COND_REF },
+  { INPUT, "h_e1_BI", HW_H_E1, CGEN_MODE_BI, 0, 0, 0 },
+  { INPUT, "h_memory_HI_add__DFLT_pc_4", HW_H_MEMORY, CGEN_MODE_HI, 0, 0, COND_REF },
+  { INPUT, "h_memory_HI_add__DFLT_pc_add__DFLT_4_2", HW_H_MEMORY, CGEN_MODE_HI, 0, 0, COND_REF },
+  { INPUT, "h_memory_UHI_countp", HW_H_MEMORY, CGEN_MODE_UHI, 0, 0, COND_REF },
+  { INPUT, "h_prof_offset_SI_0", HW_H_PROF_OFFSET, CGEN_MODE_SI, 0, 0, COND_REF },
+  { INPUT, "h_status32_SI_0", HW_H_STATUS32, CGEN_MODE_SI, 0, 0, COND_REF },
+  { INPUT, "h_timer_expire_SI_0", HW_H_TIMER_EXPIRE, CGEN_MODE_SI, 0, 0, 0 },
+  { INPUT, "h_ubit_BI", HW_H_UBIT, CGEN_MODE_BI, 0, 0, COND_REF },
+  { INPUT, "pc", HW_H_PC, CGEN_MODE_USI, 0, 0, COND_REF },
+  { INPUT, "s12x2", HW_H_SINT, CGEN_MODE_INT, OP_ENT (S12X2), 0, COND_REF },
+  { OUTPUT, "h_auxr_SI_11", HW_H_AUXR, CGEN_MODE_SI, 0, 11, COND_REF },
+  { OUTPUT, "h_auxr_SI_2", HW_H_AUXR, CGEN_MODE_SI, 0, 2, COND_REF },
+  { OUTPUT, "h_auxr_SI_3", HW_H_AUXR, CGEN_MODE_SI, 0, 3, COND_REF },
+  { OUTPUT, "h_auxr_SI_33", HW_H_AUXR, CGEN_MODE_SI, 0, 33, COND_REF },
+  { OUTPUT, "h_cr_SI_29", HW_H_CR, CGEN_MODE_SI, 0, 29, COND_REF },
+  { OUTPUT, "h_e1_BI", HW_H_E1, CGEN_MODE_BI, 0, 0, COND_REF },
+  { OUTPUT, "h_memory_UHI_countp", HW_H_MEMORY, CGEN_MODE_UHI, 0, 0, COND_REF },
+  { OUTPUT, "pc", HW_H_PC, CGEN_MODE_USI, 0, 0, COND_REF },
+  { END, (const char *)0, (enum cgen_hw_type)0, (enum cgen_mode)0, (enum cgen_operand_type)0, 0, 0 }
+};
+
+static const CGEN_OPINST sfmt_lpcc_ccu6_ops[] ATTRIBUTE_UNUSED = {
+  { INPUT, "Qcondb", HW_H_QCONDB, CGEN_MODE_BI, OP_ENT (QCONDB), 0, 0 },
+  { INPUT, "U6x2", HW_H_UINT, CGEN_MODE_UINT, OP_ENT (U6X2), 0, COND_REF },
+  { INPUT, "f_op_B", HW_H_UINT, CGEN_MODE_UINT, 0, 0, 0 },
+  { INPUT, "h_auxr_SI_34", HW_H_AUXR, CGEN_MODE_SI, 0, 34, COND_REF },
+  { INPUT, "h_auxr_SI_37", HW_H_AUXR, CGEN_MODE_SI, 0, 37, COND_REF },
+  { INPUT, "h_e1_BI", HW_H_E1, CGEN_MODE_BI, 0, 0, COND_REF },
+  { INPUT, "h_memory_HI_add__DFLT_pc_4", HW_H_MEMORY, CGEN_MODE_HI, 0, 0, COND_REF },
+  { INPUT, "h_memory_HI_add__DFLT_pc_add__DFLT_4_2", HW_H_MEMORY, CGEN_MODE_HI, 0, 0, COND_REF },
+  { INPUT, "h_memory_UHI_countp", HW_H_MEMORY, CGEN_MODE_UHI, 0, 0, COND_REF },
+  { INPUT, "h_prof_offset_SI_0", HW_H_PROF_OFFSET, CGEN_MODE_SI, 0, 0, COND_REF },
+  { INPUT, "h_status32_SI_0", HW_H_STATUS32, CGEN_MODE_SI, 0, 0, COND_REF },
+  { INPUT, "h_timer_expire_SI_0", HW_H_TIMER_EXPIRE, CGEN_MODE_SI, 0, 0, COND_REF },
+  { INPUT, "h_ubit_BI", HW_H_UBIT, CGEN_MODE_BI, 0, 0, COND_REF },
+  { INPUT, "pc", HW_H_PC, CGEN_MODE_USI, 0, 0, COND_REF },
+  { OUTPUT, "h_auxr_SI_11", HW_H_AUXR, CGEN_MODE_SI, 0, 11, COND_REF },
+  { OUTPUT, "h_auxr_SI_2", HW_H_AUXR, CGEN_MODE_SI, 0, 2, COND_REF },
+  { OUTPUT, "h_auxr_SI_3", HW_H_AUXR, CGEN_MODE_SI, 0, 3, COND_REF },
+  { OUTPUT, "h_auxr_SI_33", HW_H_AUXR, CGEN_MODE_SI, 0, 33, COND_REF },
+  { OUTPUT, "h_cr_SI_29", HW_H_CR, CGEN_MODE_SI, 0, 29, COND_REF },
+  { OUTPUT, "h_e1_BI", HW_H_E1, CGEN_MODE_BI, 0, 0, COND_REF },
+  { OUTPUT, "h_memory_UHI_countp", HW_H_MEMORY, CGEN_MODE_UHI, 0, 0, COND_REF },
+  { OUTPUT, "pc", HW_H_PC, CGEN_MODE_USI, 0, 0, COND_REF },
+  { END, (const char *)0, (enum cgen_hw_type)0, (enum cgen_mode)0, (enum cgen_operand_type)0, 0, 0 }
+};
+
+static const CGEN_OPINST sfmt_flag_L_s12__ops[] ATTRIBUTE_UNUSED = {
+  { INPUT, "f_op_B", HW_H_UINT, CGEN_MODE_UINT, 0, 0, 0 },
+  { INPUT, "h_memory_HI_add__DFLT_pc_4", HW_H_MEMORY, CGEN_MODE_HI, 0, 0, COND_REF },
+  { INPUT, "h_memory_HI_add__DFLT_pc_add__DFLT_4_2", HW_H_MEMORY, CGEN_MODE_HI, 0, 0, COND_REF },
+  { INPUT, "pc", HW_H_PC, CGEN_MODE_USI, 0, 0, COND_REF },
+  { INPUT, "s12", HW_H_SINT, CGEN_MODE_INT, OP_ENT (S12), 0, 0 },
+  { OUTPUT, "h_status32_SI_0", HW_H_STATUS32, CGEN_MODE_SI, 0, 0, 0 },
+  { END, (const char *)0, (enum cgen_hw_type)0, (enum cgen_mode)0, (enum cgen_operand_type)0, 0, 0 }
+};
+
+static const CGEN_OPINST sfmt_flag_ccu6__ops[] ATTRIBUTE_UNUSED = {
+  { INPUT, "Qcondb", HW_H_QCONDB, CGEN_MODE_BI, OP_ENT (QCONDB), 0, 0 },
+  { INPUT, "U6", HW_H_UINT, CGEN_MODE_UINT, OP_ENT (U6), 0, COND_REF },
+  { INPUT, "f_op_B", HW_H_UINT, CGEN_MODE_UINT, 0, 0, 0 },
+  { INPUT, "h_memory_HI_add__DFLT_pc_4", HW_H_MEMORY, CGEN_MODE_HI, 0, 0, COND_REF },
+  { INPUT, "h_memory_HI_add__DFLT_pc_add__DFLT_4_2", HW_H_MEMORY, CGEN_MODE_HI, 0, 0, COND_REF },
+  { INPUT, "pc", HW_H_PC, CGEN_MODE_USI, 0, 0, COND_REF },
+  { OUTPUT, "h_status32_SI_0", HW_H_STATUS32, CGEN_MODE_SI, 0, 0, COND_REF },
+  { END, (const char *)0, (enum cgen_hw_type)0, (enum cgen_mode)0, (enum cgen_operand_type)0, 0, 0 }
+};
+
+static const CGEN_OPINST sfmt_flag_L_u6__ops[] ATTRIBUTE_UNUSED = {
+  { INPUT, "U6", HW_H_UINT, CGEN_MODE_UINT, OP_ENT (U6), 0, 0 },
+  { INPUT, "f_op_B", HW_H_UINT, CGEN_MODE_UINT, 0, 0, 0 },
+  { INPUT, "h_memory_HI_add__DFLT_pc_4", HW_H_MEMORY, CGEN_MODE_HI, 0, 0, COND_REF },
+  { INPUT, "h_memory_HI_add__DFLT_pc_add__DFLT_4_2", HW_H_MEMORY, CGEN_MODE_HI, 0, 0, COND_REF },
+  { INPUT, "pc", HW_H_PC, CGEN_MODE_USI, 0, 0, COND_REF },
+  { OUTPUT, "h_status32_SI_0", HW_H_STATUS32, CGEN_MODE_SI, 0, 0, 0 },
+  { END, (const char *)0, (enum cgen_hw_type)0, (enum cgen_mode)0, (enum cgen_operand_type)0, 0, 0 }
+};
+
+static const CGEN_OPINST sfmt_flag_L_r_r__RC_ops[] ATTRIBUTE_UNUSED = {
+  { INPUT, "RC", HW_H_CR, CGEN_MODE_SI, OP_ENT (RC), 0, 0 },
+  { INPUT, "f_op_B", HW_H_UINT, CGEN_MODE_UINT, 0, 0, 0 },
+  { INPUT, "f_op_C", HW_H_UINT, CGEN_MODE_UINT, 0, 0, 0 },
+  { INPUT, "h_memory_HI_add__DFLT_pc_4", HW_H_MEMORY, CGEN_MODE_HI, 0, 0, COND_REF },
+  { INPUT, "h_memory_HI_add__DFLT_pc_add__DFLT_4_2", HW_H_MEMORY, CGEN_MODE_HI, 0, 0, COND_REF },
+  { INPUT, "pc", HW_H_PC, CGEN_MODE_USI, 0, 0, COND_REF },
+  { OUTPUT, "h_status32_SI_0", HW_H_STATUS32, CGEN_MODE_SI, 0, 0, 0 },
+  { END, (const char *)0, (enum cgen_hw_type)0, (enum cgen_mode)0, (enum cgen_operand_type)0, 0, 0 }
+};
+
+static const CGEN_OPINST sfmt_flag_cc__RC_ops[] ATTRIBUTE_UNUSED = {
+  { INPUT, "Qcondb", HW_H_QCONDB, CGEN_MODE_BI, OP_ENT (QCONDB), 0, 0 },
+  { INPUT, "RC", HW_H_CR, CGEN_MODE_SI, OP_ENT (RC), 0, COND_REF },
+  { INPUT, "f_op_B", HW_H_UINT, CGEN_MODE_UINT, 0, 0, 0 },
+  { INPUT, "f_op_C", HW_H_UINT, CGEN_MODE_UINT, 0, 0, 0 },
+  { INPUT, "h_memory_HI_add__DFLT_pc_4", HW_H_MEMORY, CGEN_MODE_HI, 0, 0, COND_REF },
+  { INPUT, "h_memory_HI_add__DFLT_pc_add__DFLT_4_2", HW_H_MEMORY, CGEN_MODE_HI, 0, 0, COND_REF },
+  { INPUT, "pc", HW_H_PC, CGEN_MODE_USI, 0, 0, COND_REF },
+  { OUTPUT, "h_status32_SI_0", HW_H_STATUS32, CGEN_MODE_SI, 0, 0, COND_REF },
+  { END, (const char *)0, (enum cgen_hw_type)0, (enum cgen_mode)0, (enum cgen_operand_type)0, 0, 0 }
+};
+
+static const CGEN_OPINST sfmt_lr_L_r_r___RC__ops[] ATTRIBUTE_UNUSED = {
+  { INPUT, "RC", HW_H_CR, CGEN_MODE_INT, OP_ENT (RC), 0, 0 },
+  { INPUT, "f_op_B", HW_H_UINT, CGEN_MODE_UINT, 0, 0, 0 },
+  { INPUT, "f_op_C", HW_H_UINT, CGEN_MODE_UINT, 0, 0, 0 },
+  { INPUT, "h_auxr_SI_RC", HW_H_AUXR, CGEN_MODE_SI, 0, 0, 0 },
+  { INPUT, "h_memory_HI_add__DFLT_pc_4", HW_H_MEMORY, CGEN_MODE_HI, 0, 0, COND_REF },
+  { INPUT, "h_memory_HI_add__DFLT_pc_add__DFLT_4_2", HW_H_MEMORY, CGEN_MODE_HI, 0, 0, COND_REF },
+  { INPUT, "pc", HW_H_PC, CGEN_MODE_USI, 0, 0, COND_REF },
+  { OUTPUT, "RB", HW_H_CR, CGEN_MODE_SI, OP_ENT (RB), 0, 0 },
+  { END, (const char *)0, (enum cgen_hw_type)0, (enum cgen_mode)0, (enum cgen_operand_type)0, 0, 0 }
+};
+
+static const CGEN_OPINST sfmt_lr_L_s12__ops[] ATTRIBUTE_UNUSED = {
+  { INPUT, "f_op_B", HW_H_UINT, CGEN_MODE_UINT, 0, 0, 0 },
+  { INPUT, "h_auxr_SI_s12", HW_H_AUXR, CGEN_MODE_SI, 0, 0, 0 },
+  { INPUT, "h_memory_HI_add__DFLT_pc_4", HW_H_MEMORY, CGEN_MODE_HI, 0, 0, COND_REF },
+  { INPUT, "h_memory_HI_add__DFLT_pc_add__DFLT_4_2", HW_H_MEMORY, CGEN_MODE_HI, 0, 0, COND_REF },
+  { INPUT, "pc", HW_H_PC, CGEN_MODE_USI, 0, 0, COND_REF },
+  { INPUT, "s12", HW_H_SINT, CGEN_MODE_INT, OP_ENT (S12), 0, 0 },
+  { OUTPUT, "RB", HW_H_CR, CGEN_MODE_SI, OP_ENT (RB), 0, 0 },
+  { END, (const char *)0, (enum cgen_hw_type)0, (enum cgen_mode)0, (enum cgen_operand_type)0, 0, 0 }
+};
+
+static const CGEN_OPINST sfmt_lr_L_u6__ops[] ATTRIBUTE_UNUSED = {
+  { INPUT, "U6", HW_H_UINT, CGEN_MODE_INT, OP_ENT (U6), 0, 0 },
+  { INPUT, "f_op_B", HW_H_UINT, CGEN_MODE_UINT, 0, 0, 0 },
+  { INPUT, "h_auxr_SI_U6", HW_H_AUXR, CGEN_MODE_SI, 0, 0, 0 },
+  { INPUT, "h_memory_HI_add__DFLT_pc_4", HW_H_MEMORY, CGEN_MODE_HI, 0, 0, COND_REF },
+  { INPUT, "h_memory_HI_add__DFLT_pc_add__DFLT_4_2", HW_H_MEMORY, CGEN_MODE_HI, 0, 0, COND_REF },
+  { INPUT, "pc", HW_H_PC, CGEN_MODE_USI, 0, 0, COND_REF },
+  { OUTPUT, "RB", HW_H_CR, CGEN_MODE_SI, OP_ENT (RB), 0, 0 },
+  { END, (const char *)0, (enum cgen_hw_type)0, (enum cgen_mode)0, (enum cgen_operand_type)0, 0, 0 }
+};
+
+static const CGEN_OPINST sfmt_sr_L_r_r___RC__ops[] ATTRIBUTE_UNUSED = {
+  { INPUT, "RB", HW_H_CR, CGEN_MODE_SI, OP_ENT (RB), 0, 0 },
+  { INPUT, "RC", HW_H_CR, CGEN_MODE_INT, OP_ENT (RC), 0, 0 },
+  { INPUT, "f_op_B", HW_H_UINT, CGEN_MODE_UINT, 0, 0, 0 },
+  { INPUT, "f_op_C", HW_H_UINT, CGEN_MODE_UINT, 0, 0, 0 },
+  { INPUT, "h_memory_HI_add__DFLT_pc_4", HW_H_MEMORY, CGEN_MODE_HI, 0, 0, COND_REF },
+  { INPUT, "h_memory_HI_add__DFLT_pc_add__DFLT_4_2", HW_H_MEMORY, CGEN_MODE_HI, 0, 0, COND_REF },
+  { INPUT, "pc", HW_H_PC, CGEN_MODE_USI, 0, 0, COND_REF },
+  { OUTPUT, "h_auxr_SI_RC", HW_H_AUXR, CGEN_MODE_SI, 0, 0, 0 },
+  { END, (const char *)0, (enum cgen_hw_type)0, (enum cgen_mode)0, (enum cgen_operand_type)0, 0, 0 }
+};
+
+static const CGEN_OPINST sfmt_sr_L_s12__ops[] ATTRIBUTE_UNUSED = {
+  { INPUT, "RB", HW_H_CR, CGEN_MODE_SI, OP_ENT (RB), 0, 0 },
+  { INPUT, "f_op_B", HW_H_UINT, CGEN_MODE_UINT, 0, 0, 0 },
+  { INPUT, "h_memory_HI_add__DFLT_pc_4", HW_H_MEMORY, CGEN_MODE_HI, 0, 0, COND_REF },
+  { INPUT, "h_memory_HI_add__DFLT_pc_add__DFLT_4_2", HW_H_MEMORY, CGEN_MODE_HI, 0, 0, COND_REF },
+  { INPUT, "pc", HW_H_PC, CGEN_MODE_USI, 0, 0, COND_REF },
+  { INPUT, "s12", HW_H_SINT, CGEN_MODE_INT, OP_ENT (S12), 0, 0 },
+  { OUTPUT, "h_auxr_SI_s12", HW_H_AUXR, CGEN_MODE_SI, 0, 0, 0 },
+  { END, (const char *)0, (enum cgen_hw_type)0, (enum cgen_mode)0, (enum cgen_operand_type)0, 0, 0 }
+};
+
+static const CGEN_OPINST sfmt_sr_L_u6__ops[] ATTRIBUTE_UNUSED = {
+  { INPUT, "RB", HW_H_CR, CGEN_MODE_SI, OP_ENT (RB), 0, 0 },
+  { INPUT, "U6", HW_H_UINT, CGEN_MODE_INT, OP_ENT (U6), 0, 0 },
+  { INPUT, "f_op_B", HW_H_UINT, CGEN_MODE_UINT, 0, 0, 0 },
+  { INPUT, "h_memory_HI_add__DFLT_pc_4", HW_H_MEMORY, CGEN_MODE_HI, 0, 0, COND_REF },
+  { INPUT, "h_memory_HI_add__DFLT_pc_add__DFLT_4_2", HW_H_MEMORY, CGEN_MODE_HI, 0, 0, COND_REF },
+  { INPUT, "pc", HW_H_PC, CGEN_MODE_USI, 0, 0, COND_REF },
+  { OUTPUT, "h_auxr_SI_U6", HW_H_AUXR, CGEN_MODE_SI, 0, 0, 0 },
+  { END, (const char *)0, (enum cgen_hw_type)0, (enum cgen_mode)0, (enum cgen_operand_type)0, 0, 0 }
+};
+
+static const CGEN_OPINST sfmt_asl_L_r_r__RC_ops[] ATTRIBUTE_UNUSED = {
+  { INPUT, "F", HW_H_UFLAGS, CGEN_MODE_UINT, OP_ENT (F), 0, 0 },
+  { INPUT, "RC", HW_H_CR, CGEN_MODE_SI, OP_ENT (RC), 0, 0 },
+  { INPUT, "f_op_C", HW_H_UINT, CGEN_MODE_UINT, 0, 0, 0 },
+  { INPUT, "h_memory_HI_add__DFLT_pc_4", HW_H_MEMORY, CGEN_MODE_HI, 0, 0, COND_REF },
+  { INPUT, "h_memory_HI_add__DFLT_pc_add__DFLT_4_2", HW_H_MEMORY, CGEN_MODE_HI, 0, 0, COND_REF },
+  { INPUT, "pc", HW_H_PC, CGEN_MODE_USI, 0, 0, COND_REF },
+  { OUTPUT, "RB", HW_H_CR, CGEN_MODE_SI, OP_ENT (RB), 0, 0 },
+  { OUTPUT, "cbit", HW_H_CBIT, CGEN_MODE_BI, 0, 0, COND_REF },
+  { OUTPUT, "nbit", HW_H_NBIT, CGEN_MODE_BI, 0, 0, COND_REF },
+  { OUTPUT, "vbit", HW_H_VBIT, CGEN_MODE_BI, 0, 0, COND_REF },
+  { OUTPUT, "zbit", HW_H_ZBIT, CGEN_MODE_BI, 0, 0, COND_REF },
+  { END, (const char *)0, (enum cgen_hw_type)0, (enum cgen_mode)0, (enum cgen_operand_type)0, 0, 0 }
+};
+
+static const CGEN_OPINST sfmt_asl_L_u6__ops[] ATTRIBUTE_UNUSED = {
+  { INPUT, "F", HW_H_UFLAGS, CGEN_MODE_UINT, OP_ENT (F), 0, 0 },
+  { INPUT, "U6", HW_H_UINT, CGEN_MODE_UINT, OP_ENT (U6), 0, 0 },
+  { INPUT, "f_op_B", HW_H_UINT, CGEN_MODE_UINT, 0, 0, 0 },
+  { INPUT, "h_memory_HI_add__DFLT_pc_4", HW_H_MEMORY, CGEN_MODE_HI, 0, 0, COND_REF },
+  { INPUT, "h_memory_HI_add__DFLT_pc_add__DFLT_4_2", HW_H_MEMORY, CGEN_MODE_HI, 0, 0, COND_REF },
+  { INPUT, "pc", HW_H_PC, CGEN_MODE_USI, 0, 0, COND_REF },
+  { OUTPUT, "RB", HW_H_CR, CGEN_MODE_SI, OP_ENT (RB), 0, 0 },
+  { OUTPUT, "cbit", HW_H_CBIT, CGEN_MODE_BI, 0, 0, COND_REF },
+  { OUTPUT, "nbit", HW_H_NBIT, CGEN_MODE_BI, 0, 0, COND_REF },
+  { OUTPUT, "vbit", HW_H_VBIT, CGEN_MODE_BI, 0, 0, COND_REF },
+  { OUTPUT, "zbit", HW_H_ZBIT, CGEN_MODE_BI, 0, 0, COND_REF },
+  { END, (const char *)0, (enum cgen_hw_type)0, (enum cgen_mode)0, (enum cgen_operand_type)0, 0, 0 }
+};
+
+static const CGEN_OPINST sfmt_asr_L_r_r__RC_ops[] ATTRIBUTE_UNUSED = {
+  { INPUT, "F", HW_H_UFLAGS, CGEN_MODE_UINT, OP_ENT (F), 0, 0 },
+  { INPUT, "RC", HW_H_CR, CGEN_MODE_SI, OP_ENT (RC), 0, 0 },
+  { INPUT, "f_op_C", HW_H_UINT, CGEN_MODE_UINT, 0, 0, 0 },
+  { INPUT, "h_memory_HI_add__DFLT_pc_4", HW_H_MEMORY, CGEN_MODE_HI, 0, 0, COND_REF },
+  { INPUT, "h_memory_HI_add__DFLT_pc_add__DFLT_4_2", HW_H_MEMORY, CGEN_MODE_HI, 0, 0, COND_REF },
+  { INPUT, "pc", HW_H_PC, CGEN_MODE_USI, 0, 0, COND_REF },
+  { OUTPUT, "RB", HW_H_CR, CGEN_MODE_SI, OP_ENT (RB), 0, 0 },
+  { OUTPUT, "cbit", HW_H_CBIT, CGEN_MODE_BI, 0, 0, COND_REF },
+  { OUTPUT, "nbit", HW_H_NBIT, CGEN_MODE_BI, 0, 0, COND_REF },
+  { OUTPUT, "zbit", HW_H_ZBIT, CGEN_MODE_BI, 0, 0, COND_REF },
+  { END, (const char *)0, (enum cgen_hw_type)0, (enum cgen_mode)0, (enum cgen_operand_type)0, 0, 0 }
+};
+
+static const CGEN_OPINST sfmt_asr_L_u6__ops[] ATTRIBUTE_UNUSED = {
+  { INPUT, "F", HW_H_UFLAGS, CGEN_MODE_UINT, OP_ENT (F), 0, 0 },
+  { INPUT, "U6", HW_H_UINT, CGEN_MODE_UINT, OP_ENT (U6), 0, 0 },
+  { INPUT, "f_op_B", HW_H_UINT, CGEN_MODE_UINT, 0, 0, 0 },
+  { INPUT, "h_memory_HI_add__DFLT_pc_4", HW_H_MEMORY, CGEN_MODE_HI, 0, 0, COND_REF },
+  { INPUT, "h_memory_HI_add__DFLT_pc_add__DFLT_4_2", HW_H_MEMORY, CGEN_MODE_HI, 0, 0, COND_REF },
+  { INPUT, "pc", HW_H_PC, CGEN_MODE_USI, 0, 0, COND_REF },
+  { OUTPUT, "RB", HW_H_CR, CGEN_MODE_SI, OP_ENT (RB), 0, 0 },
+  { OUTPUT, "cbit", HW_H_CBIT, CGEN_MODE_BI, 0, 0, COND_REF },
+  { OUTPUT, "nbit", HW_H_NBIT, CGEN_MODE_BI, 0, 0, COND_REF },
+  { OUTPUT, "zbit", HW_H_ZBIT, CGEN_MODE_BI, 0, 0, COND_REF },
+  { END, (const char *)0, (enum cgen_hw_type)0, (enum cgen_mode)0, (enum cgen_operand_type)0, 0, 0 }
+};
+
+static const CGEN_OPINST sfmt_rrc_L_r_r__RC_ops[] ATTRIBUTE_UNUSED = {
+  { INPUT, "F", HW_H_UFLAGS, CGEN_MODE_UINT, OP_ENT (F), 0, 0 },
+  { INPUT, "RC", HW_H_CR, CGEN_MODE_SI, OP_ENT (RC), 0, 0 },
+  { INPUT, "cbit", HW_H_CBIT, CGEN_MODE_BI, 0, 0, 0 },
+  { INPUT, "f_op_C", HW_H_UINT, CGEN_MODE_UINT, 0, 0, 0 },
+  { INPUT, "h_memory_HI_add__DFLT_pc_4", HW_H_MEMORY, CGEN_MODE_HI, 0, 0, COND_REF },
+  { INPUT, "h_memory_HI_add__DFLT_pc_add__DFLT_4_2", HW_H_MEMORY, CGEN_MODE_HI, 0, 0, COND_REF },
+  { INPUT, "pc", HW_H_PC, CGEN_MODE_USI, 0, 0, COND_REF },
+  { OUTPUT, "RB", HW_H_CR, CGEN_MODE_SI, OP_ENT (RB), 0, 0 },
+  { OUTPUT, "cbit", HW_H_CBIT, CGEN_MODE_BI, 0, 0, COND_REF },
+  { OUTPUT, "nbit", HW_H_NBIT, CGEN_MODE_BI, 0, 0, COND_REF },
+  { OUTPUT, "zbit", HW_H_ZBIT, CGEN_MODE_BI, 0, 0, COND_REF },
+  { END, (const char *)0, (enum cgen_hw_type)0, (enum cgen_mode)0, (enum cgen_operand_type)0, 0, 0 }
+};
+
+static const CGEN_OPINST sfmt_rrc_L_u6__ops[] ATTRIBUTE_UNUSED = {
+  { INPUT, "F", HW_H_UFLAGS, CGEN_MODE_UINT, OP_ENT (F), 0, 0 },
+  { INPUT, "U6", HW_H_UINT, CGEN_MODE_UINT, OP_ENT (U6), 0, 0 },
+  { INPUT, "cbit", HW_H_CBIT, CGEN_MODE_BI, 0, 0, 0 },
+  { INPUT, "f_op_B", HW_H_UINT, CGEN_MODE_UINT, 0, 0, 0 },
+  { INPUT, "h_memory_HI_add__DFLT_pc_4", HW_H_MEMORY, CGEN_MODE_HI, 0, 0, COND_REF },
+  { INPUT, "h_memory_HI_add__DFLT_pc_add__DFLT_4_2", HW_H_MEMORY, CGEN_MODE_HI, 0, 0, COND_REF },
+  { INPUT, "pc", HW_H_PC, CGEN_MODE_USI, 0, 0, COND_REF },
+  { OUTPUT, "RB", HW_H_CR, CGEN_MODE_SI, OP_ENT (RB), 0, 0 },
+  { OUTPUT, "cbit", HW_H_CBIT, CGEN_MODE_BI, 0, 0, COND_REF },
+  { OUTPUT, "nbit", HW_H_NBIT, CGEN_MODE_BI, 0, 0, COND_REF },
+  { OUTPUT, "zbit", HW_H_ZBIT, CGEN_MODE_BI, 0, 0, COND_REF },
+  { END, (const char *)0, (enum cgen_hw_type)0, (enum cgen_mode)0, (enum cgen_operand_type)0, 0, 0 }
+};
+
+static const CGEN_OPINST sfmt_sexb_L_r_r__RC_ops[] ATTRIBUTE_UNUSED = {
+  { INPUT, "F", HW_H_UFLAGS, CGEN_MODE_UINT, OP_ENT (F), 0, 0 },
+  { INPUT, "RC", HW_H_CR, CGEN_MODE_QI, OP_ENT (RC), 0, 0 },
+  { INPUT, "f_op_C", HW_H_UINT, CGEN_MODE_UINT, 0, 0, 0 },
+  { INPUT, "h_memory_HI_add__DFLT_pc_4", HW_H_MEMORY, CGEN_MODE_HI, 0, 0, COND_REF },
+  { INPUT, "h_memory_HI_add__DFLT_pc_add__DFLT_4_2", HW_H_MEMORY, CGEN_MODE_HI, 0, 0, COND_REF },
+  { INPUT, "pc", HW_H_PC, CGEN_MODE_USI, 0, 0, COND_REF },
+  { OUTPUT, "RB", HW_H_CR, CGEN_MODE_SI, OP_ENT (RB), 0, 0 },
+  { OUTPUT, "nbit", HW_H_NBIT, CGEN_MODE_BI, 0, 0, COND_REF },
+  { OUTPUT, "zbit", HW_H_ZBIT, CGEN_MODE_BI, 0, 0, COND_REF },
+  { END, (const char *)0, (enum cgen_hw_type)0, (enum cgen_mode)0, (enum cgen_operand_type)0, 0, 0 }
+};
+
+static const CGEN_OPINST sfmt_sexb_L_u6__ops[] ATTRIBUTE_UNUSED = {
+  { INPUT, "F", HW_H_UFLAGS, CGEN_MODE_UINT, OP_ENT (F), 0, 0 },
+  { INPUT, "U6", HW_H_UINT, CGEN_MODE_QI, OP_ENT (U6), 0, 0 },
+  { INPUT, "f_op_B", HW_H_UINT, CGEN_MODE_UINT, 0, 0, 0 },
+  { INPUT, "h_memory_HI_add__DFLT_pc_4", HW_H_MEMORY, CGEN_MODE_HI, 0, 0, COND_REF },
+  { INPUT, "h_memory_HI_add__DFLT_pc_add__DFLT_4_2", HW_H_MEMORY, CGEN_MODE_HI, 0, 0, COND_REF },
+  { INPUT, "pc", HW_H_PC, CGEN_MODE_USI, 0, 0, COND_REF },
+  { OUTPUT, "RB", HW_H_CR, CGEN_MODE_SI, OP_ENT (RB), 0, 0 },
+  { OUTPUT, "nbit", HW_H_NBIT, CGEN_MODE_BI, 0, 0, COND_REF },
+  { OUTPUT, "zbit", HW_H_ZBIT, CGEN_MODE_BI, 0, 0, COND_REF },
+  { END, (const char *)0, (enum cgen_hw_type)0, (enum cgen_mode)0, (enum cgen_operand_type)0, 0, 0 }
+};
+
+static const CGEN_OPINST sfmt_sexw_L_r_r__RC_ops[] ATTRIBUTE_UNUSED = {
+  { INPUT, "F", HW_H_UFLAGS, CGEN_MODE_UINT, OP_ENT (F), 0, 0 },
+  { INPUT, "RC", HW_H_CR, CGEN_MODE_HI, OP_ENT (RC), 0, 0 },
+  { INPUT, "f_op_C", HW_H_UINT, CGEN_MODE_UINT, 0, 0, 0 },
+  { INPUT, "h_memory_HI_add__DFLT_pc_4", HW_H_MEMORY, CGEN_MODE_HI, 0, 0, COND_REF },
+  { INPUT, "h_memory_HI_add__DFLT_pc_add__DFLT_4_2", HW_H_MEMORY, CGEN_MODE_HI, 0, 0, COND_REF },
+  { INPUT, "pc", HW_H_PC, CGEN_MODE_USI, 0, 0, COND_REF },
+  { OUTPUT, "RB", HW_H_CR, CGEN_MODE_SI, OP_ENT (RB), 0, 0 },
+  { OUTPUT, "nbit", HW_H_NBIT, CGEN_MODE_BI, 0, 0, COND_REF },
+  { OUTPUT, "zbit", HW_H_ZBIT, CGEN_MODE_BI, 0, 0, COND_REF },
+  { END, (const char *)0, (enum cgen_hw_type)0, (enum cgen_mode)0, (enum cgen_operand_type)0, 0, 0 }
+};
+
+static const CGEN_OPINST sfmt_sexw_L_u6__ops[] ATTRIBUTE_UNUSED = {
+  { INPUT, "F", HW_H_UFLAGS, CGEN_MODE_UINT, OP_ENT (F), 0, 0 },
+  { INPUT, "U6", HW_H_UINT, CGEN_MODE_HI, OP_ENT (U6), 0, 0 },
+  { INPUT, "f_op_B", HW_H_UINT, CGEN_MODE_UINT, 0, 0, 0 },
+  { INPUT, "h_memory_HI_add__DFLT_pc_4", HW_H_MEMORY, CGEN_MODE_HI, 0, 0, COND_REF },
+  { INPUT, "h_memory_HI_add__DFLT_pc_add__DFLT_4_2", HW_H_MEMORY, CGEN_MODE_HI, 0, 0, COND_REF },
+  { INPUT, "pc", HW_H_PC, CGEN_MODE_USI, 0, 0, COND_REF },
+  { OUTPUT, "RB", HW_H_CR, CGEN_MODE_SI, OP_ENT (RB), 0, 0 },
+  { OUTPUT, "nbit", HW_H_NBIT, CGEN_MODE_BI, 0, 0, COND_REF },
+  { OUTPUT, "zbit", HW_H_ZBIT, CGEN_MODE_BI, 0, 0, COND_REF },
+  { END, (const char *)0, (enum cgen_hw_type)0, (enum cgen_mode)0, (enum cgen_operand_type)0, 0, 0 }
+};
+
+static const CGEN_OPINST sfmt_abs_L_r_r__RC_ops[] ATTRIBUTE_UNUSED = {
+  { INPUT, "F", HW_H_UFLAGS, CGEN_MODE_UINT, OP_ENT (F), 0, 0 },
+  { INPUT, "RC", HW_H_CR, CGEN_MODE_SI, OP_ENT (RC), 0, 0 },
+  { INPUT, "f_op_C", HW_H_UINT, CGEN_MODE_UINT, 0, 0, 0 },
+  { INPUT, "h_memory_HI_add__DFLT_pc_4", HW_H_MEMORY, CGEN_MODE_HI, 0, 0, COND_REF },
+  { INPUT, "h_memory_HI_add__DFLT_pc_add__DFLT_4_2", HW_H_MEMORY, CGEN_MODE_HI, 0, 0, COND_REF },
+  { INPUT, "pc", HW_H_PC, CGEN_MODE_USI, 0, 0, COND_REF },
+  { INPUT, "vbit", HW_H_VBIT, CGEN_MODE_BI, 0, 0, COND_REF },
+  { OUTPUT, "RB", HW_H_CR, CGEN_MODE_SI, OP_ENT (RB), 0, 0 },
+  { OUTPUT, "cbit", HW_H_CBIT, CGEN_MODE_BI, 0, 0, COND_REF },
+  { OUTPUT, "nbit", HW_H_NBIT, CGEN_MODE_BI, 0, 0, COND_REF },
+  { OUTPUT, "vbit", HW_H_VBIT, CGEN_MODE_BI, 0, 0, COND_REF },
+  { OUTPUT, "zbit", HW_H_ZBIT, CGEN_MODE_BI, 0, 0, COND_REF },
+  { END, (const char *)0, (enum cgen_hw_type)0, (enum cgen_mode)0, (enum cgen_operand_type)0, 0, 0 }
+};
+
+static const CGEN_OPINST sfmt_abs_L_u6__ops[] ATTRIBUTE_UNUSED = {
+  { INPUT, "F", HW_H_UFLAGS, CGEN_MODE_UINT, OP_ENT (F), 0, 0 },
+  { INPUT, "U6", HW_H_UINT, CGEN_MODE_UINT, OP_ENT (U6), 0, 0 },
+  { INPUT, "f_op_B", HW_H_UINT, CGEN_MODE_UINT, 0, 0, 0 },
+  { INPUT, "h_memory_HI_add__DFLT_pc_4", HW_H_MEMORY, CGEN_MODE_HI, 0, 0, COND_REF },
+  { INPUT, "h_memory_HI_add__DFLT_pc_add__DFLT_4_2", HW_H_MEMORY, CGEN_MODE_HI, 0, 0, COND_REF },
+  { INPUT, "pc", HW_H_PC, CGEN_MODE_USI, 0, 0, COND_REF },
+  { INPUT, "vbit", HW_H_VBIT, CGEN_MODE_BI, 0, 0, COND_REF },
+  { OUTPUT, "RB", HW_H_CR, CGEN_MODE_SI, OP_ENT (RB), 0, 0 },
+  { OUTPUT, "cbit", HW_H_CBIT, CGEN_MODE_BI, 0, 0, COND_REF },
+  { OUTPUT, "nbit", HW_H_NBIT, CGEN_MODE_BI, 0, 0, COND_REF },
+  { OUTPUT, "vbit", HW_H_VBIT, CGEN_MODE_BI, 0, 0, COND_REF },
+  { OUTPUT, "zbit", HW_H_ZBIT, CGEN_MODE_BI, 0, 0, COND_REF },
+  { END, (const char *)0, (enum cgen_hw_type)0, (enum cgen_mode)0, (enum cgen_operand_type)0, 0, 0 }
+};
+
+static const CGEN_OPINST sfmt_not_L_r_r__RC_ops[] ATTRIBUTE_UNUSED = {
+  { INPUT, "F", HW_H_UFLAGS, CGEN_MODE_UINT, OP_ENT (F), 0, 0 },
+  { INPUT, "RC", HW_H_CR, CGEN_MODE_SI, OP_ENT (RC), 0, 0 },
+  { INPUT, "f_op_C", HW_H_UINT, CGEN_MODE_UINT, 0, 0, 0 },
+  { INPUT, "h_memory_HI_add__DFLT_pc_4", HW_H_MEMORY, CGEN_MODE_HI, 0, 0, COND_REF },
+  { INPUT, "h_memory_HI_add__DFLT_pc_add__DFLT_4_2", HW_H_MEMORY, CGEN_MODE_HI, 0, 0, COND_REF },
+  { INPUT, "pc", HW_H_PC, CGEN_MODE_USI, 0, 0, COND_REF },
+  { OUTPUT, "RB", HW_H_CR, CGEN_MODE_SI, OP_ENT (RB), 0, 0 },
+  { OUTPUT, "nbit", HW_H_NBIT, CGEN_MODE_BI, 0, 0, COND_REF },
+  { OUTPUT, "zbit", HW_H_ZBIT, CGEN_MODE_BI, 0, 0, COND_REF },
+  { END, (const char *)0, (enum cgen_hw_type)0, (enum cgen_mode)0, (enum cgen_operand_type)0, 0, 0 }
+};
+
+static const CGEN_OPINST sfmt_not_L_u6__ops[] ATTRIBUTE_UNUSED = {
+  { INPUT, "F", HW_H_UFLAGS, CGEN_MODE_UINT, OP_ENT (F), 0, 0 },
+  { INPUT, "U6", HW_H_UINT, CGEN_MODE_UINT, OP_ENT (U6), 0, 0 },
+  { INPUT, "f_op_B", HW_H_UINT, CGEN_MODE_UINT, 0, 0, 0 },
+  { INPUT, "h_memory_HI_add__DFLT_pc_4", HW_H_MEMORY, CGEN_MODE_HI, 0, 0, COND_REF },
+  { INPUT, "h_memory_HI_add__DFLT_pc_add__DFLT_4_2", HW_H_MEMORY, CGEN_MODE_HI, 0, 0, COND_REF },
+  { INPUT, "pc", HW_H_PC, CGEN_MODE_USI, 0, 0, COND_REF },
+  { OUTPUT, "RB", HW_H_CR, CGEN_MODE_SI, OP_ENT (RB), 0, 0 },
+  { OUTPUT, "nbit", HW_H_NBIT, CGEN_MODE_BI, 0, 0, COND_REF },
+  { OUTPUT, "zbit", HW_H_ZBIT, CGEN_MODE_BI, 0, 0, COND_REF },
+  { END, (const char *)0, (enum cgen_hw_type)0, (enum cgen_mode)0, (enum cgen_operand_type)0, 0, 0 }
+};
+
+static const CGEN_OPINST sfmt_ex_L_r_r__RC_ops[] ATTRIBUTE_UNUSED = {
+  { INPUT, "F", HW_H_UFLAGS, CGEN_MODE_UINT, OP_ENT (F), 0, 0 },
+  { INPUT, "RB", HW_H_CR, CGEN_MODE_SI, OP_ENT (RB), 0, 0 },
+  { INPUT, "RC", HW_H_CR, CGEN_MODE_USI, OP_ENT (RC), 0, 0 },
+  { INPUT, "f_op_B", HW_H_UINT, CGEN_MODE_UINT, 0, 0, 0 },
+  { INPUT, "f_op_C", HW_H_UINT, CGEN_MODE_UINT, 0, 0, 0 },
+  { INPUT, "h_memory_HI_add__DFLT_pc_4", HW_H_MEMORY, CGEN_MODE_HI, 0, 0, COND_REF },
+  { INPUT, "h_memory_HI_add__DFLT_pc_add__DFLT_4_2", HW_H_MEMORY, CGEN_MODE_HI, 0, 0, COND_REF },
+  { INPUT, "h_memory_SI_RC", HW_H_MEMORY, CGEN_MODE_SI, 0, 0, 0 },
+  { INPUT, "pc", HW_H_PC, CGEN_MODE_USI, 0, 0, COND_REF },
+  { OUTPUT, "RB", HW_H_CR, CGEN_MODE_SI, OP_ENT (RB), 0, 0 },
+  { OUTPUT, "h_memory_SI_RC", HW_H_MEMORY, CGEN_MODE_SI, 0, 0, 0 },
+  { END, (const char *)0, (enum cgen_hw_type)0, (enum cgen_mode)0, (enum cgen_operand_type)0, 0, 0 }
+};
+
+static const CGEN_OPINST sfmt_ex_L_u6__ops[] ATTRIBUTE_UNUSED = {
+  { INPUT, "F", HW_H_UFLAGS, CGEN_MODE_UINT, OP_ENT (F), 0, 0 },
+  { INPUT, "RB", HW_H_CR, CGEN_MODE_SI, OP_ENT (RB), 0, 0 },
+  { INPUT, "U6", HW_H_UINT, CGEN_MODE_USI, OP_ENT (U6), 0, 0 },
+  { INPUT, "f_op_B", HW_H_UINT, CGEN_MODE_UINT, 0, 0, 0 },
+  { INPUT, "h_memory_HI_add__DFLT_pc_4", HW_H_MEMORY, CGEN_MODE_HI, 0, 0, COND_REF },
+  { INPUT, "h_memory_HI_add__DFLT_pc_add__DFLT_4_2", HW_H_MEMORY, CGEN_MODE_HI, 0, 0, COND_REF },
+  { INPUT, "h_memory_SI_U6", HW_H_MEMORY, CGEN_MODE_SI, 0, 0, 0 },
+  { INPUT, "pc", HW_H_PC, CGEN_MODE_USI, 0, 0, COND_REF },
+  { OUTPUT, "RB", HW_H_CR, CGEN_MODE_SI, OP_ENT (RB), 0, 0 },
+  { OUTPUT, "h_memory_SI_U6", HW_H_MEMORY, CGEN_MODE_SI, 0, 0, 0 },
+  { END, (const char *)0, (enum cgen_hw_type)0, (enum cgen_mode)0, (enum cgen_operand_type)0, 0, 0 }
+};
+
+static const CGEN_OPINST sfmt_swi_ops[] ATTRIBUTE_UNUSED = {
+  { INPUT, "h_auxr_SI_34", HW_H_AUXR, CGEN_MODE_SI, 0, 34, 0 },
+  { INPUT, "h_auxr_SI_37", HW_H_AUXR, CGEN_MODE_SI, 0, 37, COND_REF },
+  { INPUT, "h_e1_BI", HW_H_E1, CGEN_MODE_BI, 0, 0, 0 },
+  { INPUT, "h_memory_UHI_countp", HW_H_MEMORY, CGEN_MODE_UHI, 0, 0, COND_REF },
+  { INPUT, "h_prof_offset_SI_0", HW_H_PROF_OFFSET, CGEN_MODE_SI, 0, 0, COND_REF },
+  { INPUT, "h_status32_SI_0", HW_H_STATUS32, CGEN_MODE_SI, 0, 0, COND_REF },
+  { INPUT, "h_timer_expire_SI_0", HW_H_TIMER_EXPIRE, CGEN_MODE_SI, 0, 0, 0 },
+  { INPUT, "h_ubit_BI", HW_H_UBIT, CGEN_MODE_BI, 0, 0, COND_REF },
+  { INPUT, "pc", HW_H_PC, CGEN_MODE_USI, 0, 0, COND_REF },
+  { OUTPUT, "h_auxr_SI_11", HW_H_AUXR, CGEN_MODE_SI, 0, 11, COND_REF },
+  { OUTPUT, "h_auxr_SI_33", HW_H_AUXR, CGEN_MODE_SI, 0, 33, COND_REF },
+  { OUTPUT, "h_cr_SI_0", HW_H_CR, CGEN_MODE_SI, 0, 0, COND_REF },
+  { OUTPUT, "h_cr_SI_29", HW_H_CR, CGEN_MODE_SI, 0, 29, COND_REF },
+  { OUTPUT, "h_e1_BI", HW_H_E1, CGEN_MODE_BI, 0, 0, COND_REF },
+  { OUTPUT, "h_memory_UHI_countp", HW_H_MEMORY, CGEN_MODE_UHI, 0, 0, COND_REF },
+  { OUTPUT, "pc", HW_H_PC, CGEN_MODE_USI, 0, 0, COND_REF },
+  { END, (const char *)0, (enum cgen_hw_type)0, (enum cgen_mode)0, (enum cgen_operand_type)0, 0, 0 }
+};
+
+static const CGEN_OPINST sfmt_trap_s_ops[] ATTRIBUTE_UNUSED = {
+  { INPUT, "h_auxr_SI_34", HW_H_AUXR, CGEN_MODE_SI, 0, 34, 0 },
+  { INPUT, "h_auxr_SI_37", HW_H_AUXR, CGEN_MODE_SI, 0, 37, COND_REF },
+  { INPUT, "h_e1_BI", HW_H_E1, CGEN_MODE_BI, 0, 0, 0 },
+  { INPUT, "h_memory_UHI_countp", HW_H_MEMORY, CGEN_MODE_UHI, 0, 0, COND_REF },
+  { INPUT, "h_prof_offset_SI_0", HW_H_PROF_OFFSET, CGEN_MODE_SI, 0, 0, COND_REF },
+  { INPUT, "h_status32_SI_0", HW_H_STATUS32, CGEN_MODE_SI, 0, 0, COND_REF },
+  { INPUT, "h_timer_expire_SI_0", HW_H_TIMER_EXPIRE, CGEN_MODE_SI, 0, 0, 0 },
+  { INPUT, "h_ubit_BI", HW_H_UBIT, CGEN_MODE_BI, 0, 0, COND_REF },
+  { INPUT, "pc", HW_H_PC, CGEN_MODE_USI, 0, 0, COND_REF },
+  { INPUT, "trapnum", HW_H_UINT, CGEN_MODE_UINT, OP_ENT (TRAPNUM), 0, COND_REF },
+  { OUTPUT, "h_auxr_SI_11", HW_H_AUXR, CGEN_MODE_SI, 0, 11, COND_REF },
+  { OUTPUT, "h_auxr_SI_33", HW_H_AUXR, CGEN_MODE_SI, 0, 33, COND_REF },
+  { OUTPUT, "h_cr_SI_0", HW_H_CR, CGEN_MODE_SI, 0, 0, COND_REF },
+  { OUTPUT, "h_cr_SI_29", HW_H_CR, CGEN_MODE_SI, 0, 29, COND_REF },
+  { OUTPUT, "h_e1_BI", HW_H_E1, CGEN_MODE_BI, 0, 0, COND_REF },
+  { OUTPUT, "h_memory_UHI_countp", HW_H_MEMORY, CGEN_MODE_UHI, 0, 0, COND_REF },
+  { OUTPUT, "pc", HW_H_PC, CGEN_MODE_USI, 0, 0, COND_REF },
+  { END, (const char *)0, (enum cgen_hw_type)0, (enum cgen_mode)0, (enum cgen_operand_type)0, 0, 0 }
+};
+
+static const CGEN_OPINST sfmt_brk_ops[] ATTRIBUTE_UNUSED = {
+  { INPUT, "pc", HW_H_PC, CGEN_MODE_USI, 0, 0, 0 },
+  { END, (const char *)0, (enum cgen_hw_type)0, (enum cgen_mode)0, (enum cgen_operand_type)0, 0, 0 }
+};
+
+static const CGEN_OPINST sfmt_asl_L_s12__RA__ops[] ATTRIBUTE_UNUSED = {
+  { INPUT, "F", HW_H_UFLAGS, CGEN_MODE_UINT, OP_ENT (F), 0, 0 },
+  { INPUT, "RB", HW_H_CR, CGEN_MODE_SI, OP_ENT (RB), 0, COND_REF },
+  { INPUT, "f_op_B", HW_H_UINT, CGEN_MODE_UINT, 0, 0, 0 },
+  { INPUT, "h_memory_HI_add__DFLT_pc_4", HW_H_MEMORY, CGEN_MODE_HI, 0, 0, COND_REF },
+  { INPUT, "h_memory_HI_add__DFLT_pc_add__DFLT_4_2", HW_H_MEMORY, CGEN_MODE_HI, 0, 0, COND_REF },
+  { INPUT, "pc", HW_H_PC, CGEN_MODE_USI, 0, 0, COND_REF },
+  { INPUT, "s12", HW_H_SINT, CGEN_MODE_INT, OP_ENT (S12), 0, COND_REF },
+  { OUTPUT, "RB", HW_H_CR, CGEN_MODE_SI, OP_ENT (RB), 0, 0 },
+  { OUTPUT, "cbit", HW_H_CBIT, CGEN_MODE_BI, 0, 0, COND_REF },
+  { OUTPUT, "nbit", HW_H_NBIT, CGEN_MODE_BI, 0, 0, COND_REF },
+  { OUTPUT, "zbit", HW_H_ZBIT, CGEN_MODE_BI, 0, 0, COND_REF },
+  { END, (const char *)0, (enum cgen_hw_type)0, (enum cgen_mode)0, (enum cgen_operand_type)0, 0, 0 }
+};
+
+static const CGEN_OPINST sfmt_asl_ccu6__RA__ops[] ATTRIBUTE_UNUSED = {
+  { INPUT, "F", HW_H_UFLAGS, CGEN_MODE_UINT, OP_ENT (F), 0, COND_REF },
+  { INPUT, "Qcondb", HW_H_QCONDB, CGEN_MODE_BI, OP_ENT (QCONDB), 0, 0 },
+  { INPUT, "RB", HW_H_CR, CGEN_MODE_SI, OP_ENT (RB), 0, COND_REF },
+  { INPUT, "U6", HW_H_UINT, CGEN_MODE_UINT, OP_ENT (U6), 0, COND_REF },
+  { INPUT, "f_op_B", HW_H_UINT, CGEN_MODE_UINT, 0, 0, 0 },
+  { INPUT, "h_memory_HI_add__DFLT_pc_4", HW_H_MEMORY, CGEN_MODE_HI, 0, 0, COND_REF },
+  { INPUT, "h_memory_HI_add__DFLT_pc_add__DFLT_4_2", HW_H_MEMORY, CGEN_MODE_HI, 0, 0, COND_REF },
+  { INPUT, "pc", HW_H_PC, CGEN_MODE_USI, 0, 0, COND_REF },
+  { OUTPUT, "RB", HW_H_CR, CGEN_MODE_SI, OP_ENT (RB), 0, COND_REF },
+  { OUTPUT, "cbit", HW_H_CBIT, CGEN_MODE_BI, 0, 0, COND_REF },
+  { OUTPUT, "nbit", HW_H_NBIT, CGEN_MODE_BI, 0, 0, COND_REF },
+  { OUTPUT, "zbit", HW_H_ZBIT, CGEN_MODE_BI, 0, 0, COND_REF },
+  { END, (const char *)0, (enum cgen_hw_type)0, (enum cgen_mode)0, (enum cgen_operand_type)0, 0, 0 }
+};
+
+static const CGEN_OPINST sfmt_asl_L_u6__RA__ops[] ATTRIBUTE_UNUSED = {
+  { INPUT, "F", HW_H_UFLAGS, CGEN_MODE_UINT, OP_ENT (F), 0, 0 },
+  { INPUT, "RB", HW_H_CR, CGEN_MODE_SI, OP_ENT (RB), 0, COND_REF },
+  { INPUT, "U6", HW_H_UINT, CGEN_MODE_UINT, OP_ENT (U6), 0, COND_REF },
+  { INPUT, "f_op_B", HW_H_UINT, CGEN_MODE_UINT, 0, 0, 0 },
+  { INPUT, "h_memory_HI_add__DFLT_pc_4", HW_H_MEMORY, CGEN_MODE_HI, 0, 0, COND_REF },
+  { INPUT, "h_memory_HI_add__DFLT_pc_add__DFLT_4_2", HW_H_MEMORY, CGEN_MODE_HI, 0, 0, COND_REF },
+  { INPUT, "pc", HW_H_PC, CGEN_MODE_USI, 0, 0, COND_REF },
+  { OUTPUT, "RA", HW_H_CR, CGEN_MODE_SI, OP_ENT (RA), 0, 0 },
+  { OUTPUT, "cbit", HW_H_CBIT, CGEN_MODE_BI, 0, 0, COND_REF },
+  { OUTPUT, "nbit", HW_H_NBIT, CGEN_MODE_BI, 0, 0, COND_REF },
+  { OUTPUT, "zbit", HW_H_ZBIT, CGEN_MODE_BI, 0, 0, COND_REF },
+  { END, (const char *)0, (enum cgen_hw_type)0, (enum cgen_mode)0, (enum cgen_operand_type)0, 0, 0 }
+};
+
+static const CGEN_OPINST sfmt_asl_L_r_r__RA__RC_ops[] ATTRIBUTE_UNUSED = {
+  { INPUT, "F", HW_H_UFLAGS, CGEN_MODE_UINT, OP_ENT (F), 0, 0 },
+  { INPUT, "RB", HW_H_CR, CGEN_MODE_SI, OP_ENT (RB), 0, COND_REF },
+  { INPUT, "RC", HW_H_CR, CGEN_MODE_SI, OP_ENT (RC), 0, COND_REF },
+  { INPUT, "f_op_B", HW_H_UINT, CGEN_MODE_UINT, 0, 0, 0 },
+  { INPUT, "f_op_C", HW_H_UINT, CGEN_MODE_UINT, 0, 0, 0 },
+  { INPUT, "h_memory_HI_add__DFLT_pc_4", HW_H_MEMORY, CGEN_MODE_HI, 0, 0, COND_REF },
+  { INPUT, "h_memory_HI_add__DFLT_pc_add__DFLT_4_2", HW_H_MEMORY, CGEN_MODE_HI, 0, 0, COND_REF },
+  { INPUT, "pc", HW_H_PC, CGEN_MODE_USI, 0, 0, COND_REF },
+  { OUTPUT, "RA", HW_H_CR, CGEN_MODE_SI, OP_ENT (RA), 0, 0 },
+  { OUTPUT, "cbit", HW_H_CBIT, CGEN_MODE_BI, 0, 0, COND_REF },
+  { OUTPUT, "nbit", HW_H_NBIT, CGEN_MODE_BI, 0, 0, COND_REF },
+  { OUTPUT, "zbit", HW_H_ZBIT, CGEN_MODE_BI, 0, 0, COND_REF },
+  { END, (const char *)0, (enum cgen_hw_type)0, (enum cgen_mode)0, (enum cgen_operand_type)0, 0, 0 }
+};
+
+static const CGEN_OPINST sfmt_asl_cc__RA__RC_ops[] ATTRIBUTE_UNUSED = {
+  { INPUT, "F", HW_H_UFLAGS, CGEN_MODE_UINT, OP_ENT (F), 0, COND_REF },
+  { INPUT, "Qcondb", HW_H_QCONDB, CGEN_MODE_BI, OP_ENT (QCONDB), 0, 0 },
+  { INPUT, "RB", HW_H_CR, CGEN_MODE_SI, OP_ENT (RB), 0, COND_REF },
+  { INPUT, "RC", HW_H_CR, CGEN_MODE_SI, OP_ENT (RC), 0, COND_REF },
+  { INPUT, "f_op_B", HW_H_UINT, CGEN_MODE_UINT, 0, 0, 0 },
+  { INPUT, "f_op_C", HW_H_UINT, CGEN_MODE_UINT, 0, 0, 0 },
+  { INPUT, "h_memory_HI_add__DFLT_pc_4", HW_H_MEMORY, CGEN_MODE_HI, 0, 0, COND_REF },
+  { INPUT, "h_memory_HI_add__DFLT_pc_add__DFLT_4_2", HW_H_MEMORY, CGEN_MODE_HI, 0, 0, COND_REF },
+  { INPUT, "pc", HW_H_PC, CGEN_MODE_USI, 0, 0, COND_REF },
+  { OUTPUT, "RB", HW_H_CR, CGEN_MODE_SI, OP_ENT (RB), 0, COND_REF },
+  { OUTPUT, "cbit", HW_H_CBIT, CGEN_MODE_BI, 0, 0, COND_REF },
+  { OUTPUT, "nbit", HW_H_NBIT, CGEN_MODE_BI, 0, 0, COND_REF },
+  { OUTPUT, "zbit", HW_H_ZBIT, CGEN_MODE_BI, 0, 0, COND_REF },
+  { END, (const char *)0, (enum cgen_hw_type)0, (enum cgen_mode)0, (enum cgen_operand_type)0, 0, 0 }
+};
+
+static const CGEN_OPINST sfmt_mul64_L_s12__ops[] ATTRIBUTE_UNUSED = {
+  { INPUT, "RB", HW_H_CR, CGEN_MODE_SI, OP_ENT (RB), 0, COND_REF },
+  { INPUT, "f_op_B", HW_H_UINT, CGEN_MODE_UINT, 0, 0, 0 },
+  { INPUT, "h_memory_HI_add__DFLT_pc_4", HW_H_MEMORY, CGEN_MODE_HI, 0, 0, COND_REF },
+  { INPUT, "h_memory_HI_add__DFLT_pc_add__DFLT_4_2", HW_H_MEMORY, CGEN_MODE_HI, 0, 0, COND_REF },
+  { INPUT, "pc", HW_H_PC, CGEN_MODE_USI, 0, 0, COND_REF },
+  { INPUT, "s12", HW_H_SINT, CGEN_MODE_INT, OP_ENT (S12), 0, COND_REF },
+  { OUTPUT, "h_cr_SI_57", HW_H_CR, CGEN_MODE_SI, 0, 57, COND_REF },
+  { OUTPUT, "h_cr_SI_58", HW_H_CR, CGEN_MODE_SI, 0, 58, COND_REF },
+  { OUTPUT, "h_cr_SI_59", HW_H_CR, CGEN_MODE_SI, 0, 59, COND_REF },
+  { END, (const char *)0, (enum cgen_hw_type)0, (enum cgen_mode)0, (enum cgen_operand_type)0, 0, 0 }
+};
+
+static const CGEN_OPINST sfmt_mul64_ccu6__ops[] ATTRIBUTE_UNUSED = {
+  { INPUT, "Qcondb", HW_H_QCONDB, CGEN_MODE_BI, OP_ENT (QCONDB), 0, 0 },
+  { INPUT, "RB", HW_H_CR, CGEN_MODE_SI, OP_ENT (RB), 0, COND_REF },
+  { INPUT, "U6", HW_H_UINT, CGEN_MODE_UINT, OP_ENT (U6), 0, COND_REF },
+  { INPUT, "f_op_B", HW_H_UINT, CGEN_MODE_UINT, 0, 0, 0 },
+  { INPUT, "h_memory_HI_add__DFLT_pc_4", HW_H_MEMORY, CGEN_MODE_HI, 0, 0, COND_REF },
+  { INPUT, "h_memory_HI_add__DFLT_pc_add__DFLT_4_2", HW_H_MEMORY, CGEN_MODE_HI, 0, 0, COND_REF },
+  { INPUT, "pc", HW_H_PC, CGEN_MODE_USI, 0, 0, COND_REF },
+  { OUTPUT, "h_cr_SI_57", HW_H_CR, CGEN_MODE_SI, 0, 57, COND_REF },
+  { OUTPUT, "h_cr_SI_58", HW_H_CR, CGEN_MODE_SI, 0, 58, COND_REF },
+  { OUTPUT, "h_cr_SI_59", HW_H_CR, CGEN_MODE_SI, 0, 59, COND_REF },
+  { END, (const char *)0, (enum cgen_hw_type)0, (enum cgen_mode)0, (enum cgen_operand_type)0, 0, 0 }
+};
+
+static const CGEN_OPINST sfmt_mul64_L_u6__ops[] ATTRIBUTE_UNUSED = {
+  { INPUT, "RB", HW_H_CR, CGEN_MODE_SI, OP_ENT (RB), 0, COND_REF },
+  { INPUT, "U6", HW_H_UINT, CGEN_MODE_UINT, OP_ENT (U6), 0, COND_REF },
+  { INPUT, "f_op_B", HW_H_UINT, CGEN_MODE_UINT, 0, 0, 0 },
+  { INPUT, "h_memory_HI_add__DFLT_pc_4", HW_H_MEMORY, CGEN_MODE_HI, 0, 0, COND_REF },
+  { INPUT, "h_memory_HI_add__DFLT_pc_add__DFLT_4_2", HW_H_MEMORY, CGEN_MODE_HI, 0, 0, COND_REF },
+  { INPUT, "pc", HW_H_PC, CGEN_MODE_USI, 0, 0, COND_REF },
+  { OUTPUT, "h_cr_SI_57", HW_H_CR, CGEN_MODE_SI, 0, 57, COND_REF },
+  { OUTPUT, "h_cr_SI_58", HW_H_CR, CGEN_MODE_SI, 0, 58, COND_REF },
+  { OUTPUT, "h_cr_SI_59", HW_H_CR, CGEN_MODE_SI, 0, 59, COND_REF },
+  { END, (const char *)0, (enum cgen_hw_type)0, (enum cgen_mode)0, (enum cgen_operand_type)0, 0, 0 }
+};
+
+static const CGEN_OPINST sfmt_mul64_L_r_r__RC_ops[] ATTRIBUTE_UNUSED = {
+  { INPUT, "RB", HW_H_CR, CGEN_MODE_SI, OP_ENT (RB), 0, COND_REF },
+  { INPUT, "RC", HW_H_CR, CGEN_MODE_SI, OP_ENT (RC), 0, COND_REF },
+  { INPUT, "f_op_B", HW_H_UINT, CGEN_MODE_UINT, 0, 0, 0 },
+  { INPUT, "f_op_C", HW_H_UINT, CGEN_MODE_UINT, 0, 0, 0 },
+  { INPUT, "h_memory_HI_add__DFLT_pc_4", HW_H_MEMORY, CGEN_MODE_HI, 0, 0, COND_REF },
+  { INPUT, "h_memory_HI_add__DFLT_pc_add__DFLT_4_2", HW_H_MEMORY, CGEN_MODE_HI, 0, 0, COND_REF },
+  { INPUT, "pc", HW_H_PC, CGEN_MODE_USI, 0, 0, COND_REF },
+  { OUTPUT, "h_cr_SI_57", HW_H_CR, CGEN_MODE_SI, 0, 57, COND_REF },
+  { OUTPUT, "h_cr_SI_58", HW_H_CR, CGEN_MODE_SI, 0, 58, COND_REF },
+  { OUTPUT, "h_cr_SI_59", HW_H_CR, CGEN_MODE_SI, 0, 59, COND_REF },
+  { END, (const char *)0, (enum cgen_hw_type)0, (enum cgen_mode)0, (enum cgen_operand_type)0, 0, 0 }
+};
+
+static const CGEN_OPINST sfmt_mul64_cc__RC_ops[] ATTRIBUTE_UNUSED = {
+  { INPUT, "Qcondb", HW_H_QCONDB, CGEN_MODE_BI, OP_ENT (QCONDB), 0, 0 },
+  { INPUT, "RB", HW_H_CR, CGEN_MODE_SI, OP_ENT (RB), 0, COND_REF },
+  { INPUT, "RC", HW_H_CR, CGEN_MODE_SI, OP_ENT (RC), 0, COND_REF },
+  { INPUT, "f_op_B", HW_H_UINT, CGEN_MODE_UINT, 0, 0, 0 },
+  { INPUT, "f_op_C", HW_H_UINT, CGEN_MODE_UINT, 0, 0, 0 },
+  { INPUT, "h_memory_HI_add__DFLT_pc_4", HW_H_MEMORY, CGEN_MODE_HI, 0, 0, COND_REF },
+  { INPUT, "h_memory_HI_add__DFLT_pc_add__DFLT_4_2", HW_H_MEMORY, CGEN_MODE_HI, 0, 0, COND_REF },
+  { INPUT, "pc", HW_H_PC, CGEN_MODE_USI, 0, 0, COND_REF },
+  { OUTPUT, "h_cr_SI_57", HW_H_CR, CGEN_MODE_SI, 0, 57, COND_REF },
+  { OUTPUT, "h_cr_SI_58", HW_H_CR, CGEN_MODE_SI, 0, 58, COND_REF },
+  { OUTPUT, "h_cr_SI_59", HW_H_CR, CGEN_MODE_SI, 0, 59, COND_REF },
+  { END, (const char *)0, (enum cgen_hw_type)0, (enum cgen_mode)0, (enum cgen_operand_type)0, 0, 0 }
+};
+
+static const CGEN_OPINST sfmt_mul64_s_go_ops[] ATTRIBUTE_UNUSED = {
+  { INPUT, "R_b", HW_H_CR16, CGEN_MODE_SI, OP_ENT (R_B), 0, COND_REF },
+  { INPUT, "R_c", HW_H_CR16, CGEN_MODE_SI, OP_ENT (R_C), 0, COND_REF },
+  { OUTPUT, "h_cr_SI_57", HW_H_CR, CGEN_MODE_SI, 0, 57, COND_REF },
+  { OUTPUT, "h_cr_SI_58", HW_H_CR, CGEN_MODE_SI, 0, 58, COND_REF },
+  { OUTPUT, "h_cr_SI_59", HW_H_CR, CGEN_MODE_SI, 0, 59, COND_REF },
+  { END, (const char *)0, (enum cgen_hw_type)0, (enum cgen_mode)0, (enum cgen_operand_type)0, 0, 0 }
+};
+
+static const CGEN_OPINST sfmt_adds_L_s12__RA__ops[] ATTRIBUTE_UNUSED = {
+  { INPUT, "F", HW_H_UFLAGS, CGEN_MODE_UINT, OP_ENT (F), 0, 0 },
+  { INPUT, "RB", HW_H_CR, CGEN_MODE_SI, OP_ENT (RB), 0, COND_REF },
+  { INPUT, "f_op_B", HW_H_UINT, CGEN_MODE_UINT, 0, 0, 0 },
+  { INPUT, "h_memory_HI_add__DFLT_pc_4", HW_H_MEMORY, CGEN_MODE_HI, 0, 0, COND_REF },
+  { INPUT, "h_memory_HI_add__DFLT_pc_add__DFLT_4_2", HW_H_MEMORY, CGEN_MODE_HI, 0, 0, COND_REF },
+  { INPUT, "pc", HW_H_PC, CGEN_MODE_USI, 0, 0, COND_REF },
+  { INPUT, "s12", HW_H_SINT, CGEN_MODE_INT, OP_ENT (S12), 0, COND_REF },
+  { OUTPUT, "RB", HW_H_CR, CGEN_MODE_SI, OP_ENT (RB), 0, 0 },
+  { OUTPUT, "cbit", HW_H_CBIT, CGEN_MODE_BI, 0, 0, COND_REF },
+  { OUTPUT, "nbit", HW_H_NBIT, CGEN_MODE_BI, 0, 0, COND_REF },
+  { OUTPUT, "s1bit", HW_H_S1BIT, CGEN_MODE_BI, 0, 0, COND_REF },
+  { OUTPUT, "s2bit", HW_H_S2BIT, CGEN_MODE_BI, 0, 0, COND_REF },
+  { OUTPUT, "vbit", HW_H_VBIT, CGEN_MODE_BI, 0, 0, COND_REF },
+  { OUTPUT, "zbit", HW_H_ZBIT, CGEN_MODE_BI, 0, 0, COND_REF },
+  { END, (const char *)0, (enum cgen_hw_type)0, (enum cgen_mode)0, (enum cgen_operand_type)0, 0, 0 }
+};
+
+static const CGEN_OPINST sfmt_adds_ccu6__RA__ops[] ATTRIBUTE_UNUSED = {
+  { INPUT, "F", HW_H_UFLAGS, CGEN_MODE_UINT, OP_ENT (F), 0, COND_REF },
+  { INPUT, "Qcondb", HW_H_QCONDB, CGEN_MODE_BI, OP_ENT (QCONDB), 0, 0 },
+  { INPUT, "RB", HW_H_CR, CGEN_MODE_SI, OP_ENT (RB), 0, COND_REF },
+  { INPUT, "U6", HW_H_UINT, CGEN_MODE_UINT, OP_ENT (U6), 0, COND_REF },
+  { INPUT, "f_op_B", HW_H_UINT, CGEN_MODE_UINT, 0, 0, 0 },
+  { INPUT, "h_memory_HI_add__DFLT_pc_4", HW_H_MEMORY, CGEN_MODE_HI, 0, 0, COND_REF },
+  { INPUT, "h_memory_HI_add__DFLT_pc_add__DFLT_4_2", HW_H_MEMORY, CGEN_MODE_HI, 0, 0, COND_REF },
+  { INPUT, "pc", HW_H_PC, CGEN_MODE_USI, 0, 0, COND_REF },
+  { OUTPUT, "RB", HW_H_CR, CGEN_MODE_SI, OP_ENT (RB), 0, COND_REF },
+  { OUTPUT, "cbit", HW_H_CBIT, CGEN_MODE_BI, 0, 0, COND_REF },
+  { OUTPUT, "nbit", HW_H_NBIT, CGEN_MODE_BI, 0, 0, COND_REF },
+  { OUTPUT, "s1bit", HW_H_S1BIT, CGEN_MODE_BI, 0, 0, COND_REF },
+  { OUTPUT, "s2bit", HW_H_S2BIT, CGEN_MODE_BI, 0, 0, COND_REF },
+  { OUTPUT, "vbit", HW_H_VBIT, CGEN_MODE_BI, 0, 0, COND_REF },
+  { OUTPUT, "zbit", HW_H_ZBIT, CGEN_MODE_BI, 0, 0, COND_REF },
+  { END, (const char *)0, (enum cgen_hw_type)0, (enum cgen_mode)0, (enum cgen_operand_type)0, 0, 0 }
+};
+
+static const CGEN_OPINST sfmt_adds_L_u6__RA__ops[] ATTRIBUTE_UNUSED = {
+  { INPUT, "F", HW_H_UFLAGS, CGEN_MODE_UINT, OP_ENT (F), 0, 0 },
+  { INPUT, "RB", HW_H_CR, CGEN_MODE_SI, OP_ENT (RB), 0, COND_REF },
+  { INPUT, "U6", HW_H_UINT, CGEN_MODE_UINT, OP_ENT (U6), 0, COND_REF },
+  { INPUT, "f_op_B", HW_H_UINT, CGEN_MODE_UINT, 0, 0, 0 },
+  { INPUT, "h_memory_HI_add__DFLT_pc_4", HW_H_MEMORY, CGEN_MODE_HI, 0, 0, COND_REF },
+  { INPUT, "h_memory_HI_add__DFLT_pc_add__DFLT_4_2", HW_H_MEMORY, CGEN_MODE_HI, 0, 0, COND_REF },
+  { INPUT, "pc", HW_H_PC, CGEN_MODE_USI, 0, 0, COND_REF },
+  { OUTPUT, "RA", HW_H_CR, CGEN_MODE_SI, OP_ENT (RA), 0, 0 },
+  { OUTPUT, "cbit", HW_H_CBIT, CGEN_MODE_BI, 0, 0, COND_REF },
+  { OUTPUT, "nbit", HW_H_NBIT, CGEN_MODE_BI, 0, 0, COND_REF },
+  { OUTPUT, "s1bit", HW_H_S1BIT, CGEN_MODE_BI, 0, 0, COND_REF },
+  { OUTPUT, "s2bit", HW_H_S2BIT, CGEN_MODE_BI, 0, 0, COND_REF },
+  { OUTPUT, "vbit", HW_H_VBIT, CGEN_MODE_BI, 0, 0, COND_REF },
+  { OUTPUT, "zbit", HW_H_ZBIT, CGEN_MODE_BI, 0, 0, COND_REF },
+  { END, (const char *)0, (enum cgen_hw_type)0, (enum cgen_mode)0, (enum cgen_operand_type)0, 0, 0 }
+};
+
+static const CGEN_OPINST sfmt_adds_L_r_r__RA__RC_ops[] ATTRIBUTE_UNUSED = {
+  { INPUT, "F", HW_H_UFLAGS, CGEN_MODE_UINT, OP_ENT (F), 0, 0 },
+  { INPUT, "RB", HW_H_CR, CGEN_MODE_SI, OP_ENT (RB), 0, COND_REF },
+  { INPUT, "RC", HW_H_CR, CGEN_MODE_SI, OP_ENT (RC), 0, COND_REF },
+  { INPUT, "f_op_B", HW_H_UINT, CGEN_MODE_UINT, 0, 0, 0 },
+  { INPUT, "f_op_C", HW_H_UINT, CGEN_MODE_UINT, 0, 0, 0 },
+  { INPUT, "h_memory_HI_add__DFLT_pc_4", HW_H_MEMORY, CGEN_MODE_HI, 0, 0, COND_REF },
+  { INPUT, "h_memory_HI_add__DFLT_pc_add__DFLT_4_2", HW_H_MEMORY, CGEN_MODE_HI, 0, 0, COND_REF },
+  { INPUT, "pc", HW_H_PC, CGEN_MODE_USI, 0, 0, COND_REF },
+  { OUTPUT, "RA", HW_H_CR, CGEN_MODE_SI, OP_ENT (RA), 0, 0 },
+  { OUTPUT, "cbit", HW_H_CBIT, CGEN_MODE_BI, 0, 0, COND_REF },
+  { OUTPUT, "nbit", HW_H_NBIT, CGEN_MODE_BI, 0, 0, COND_REF },
+  { OUTPUT, "s1bit", HW_H_S1BIT, CGEN_MODE_BI, 0, 0, COND_REF },
+  { OUTPUT, "s2bit", HW_H_S2BIT, CGEN_MODE_BI, 0, 0, COND_REF },
+  { OUTPUT, "vbit", HW_H_VBIT, CGEN_MODE_BI, 0, 0, COND_REF },
+  { OUTPUT, "zbit", HW_H_ZBIT, CGEN_MODE_BI, 0, 0, COND_REF },
+  { END, (const char *)0, (enum cgen_hw_type)0, (enum cgen_mode)0, (enum cgen_operand_type)0, 0, 0 }
+};
+
+static const CGEN_OPINST sfmt_adds_cc__RA__RC_ops[] ATTRIBUTE_UNUSED = {
+  { INPUT, "F", HW_H_UFLAGS, CGEN_MODE_UINT, OP_ENT (F), 0, COND_REF },
+  { INPUT, "Qcondb", HW_H_QCONDB, CGEN_MODE_BI, OP_ENT (QCONDB), 0, 0 },
+  { INPUT, "RB", HW_H_CR, CGEN_MODE_SI, OP_ENT (RB), 0, COND_REF },
+  { INPUT, "RC", HW_H_CR, CGEN_MODE_SI, OP_ENT (RC), 0, COND_REF },
+  { INPUT, "f_op_B", HW_H_UINT, CGEN_MODE_UINT, 0, 0, 0 },
+  { INPUT, "f_op_C", HW_H_UINT, CGEN_MODE_UINT, 0, 0, 0 },
+  { INPUT, "h_memory_HI_add__DFLT_pc_4", HW_H_MEMORY, CGEN_MODE_HI, 0, 0, COND_REF },
+  { INPUT, "h_memory_HI_add__DFLT_pc_add__DFLT_4_2", HW_H_MEMORY, CGEN_MODE_HI, 0, 0, COND_REF },
+  { INPUT, "pc", HW_H_PC, CGEN_MODE_USI, 0, 0, COND_REF },
+  { OUTPUT, "RB", HW_H_CR, CGEN_MODE_SI, OP_ENT (RB), 0, COND_REF },
+  { OUTPUT, "cbit", HW_H_CBIT, CGEN_MODE_BI, 0, 0, COND_REF },
+  { OUTPUT, "nbit", HW_H_NBIT, CGEN_MODE_BI, 0, 0, COND_REF },
+  { OUTPUT, "s1bit", HW_H_S1BIT, CGEN_MODE_BI, 0, 0, COND_REF },
+  { OUTPUT, "s2bit", HW_H_S2BIT, CGEN_MODE_BI, 0, 0, COND_REF },
+  { OUTPUT, "vbit", HW_H_VBIT, CGEN_MODE_BI, 0, 0, COND_REF },
+  { OUTPUT, "zbit", HW_H_ZBIT, CGEN_MODE_BI, 0, 0, COND_REF },
+  { END, (const char *)0, (enum cgen_hw_type)0, (enum cgen_mode)0, (enum cgen_operand_type)0, 0, 0 }
+};
+
+static const CGEN_OPINST sfmt_divaw_L_s12__RA__ops[] ATTRIBUTE_UNUSED = {
+  { INPUT, "F", HW_H_UFLAGS, CGEN_MODE_UINT, OP_ENT (F), 0, 0 },
+  { INPUT, "RB", HW_H_CR, CGEN_MODE_SI, OP_ENT (RB), 0, COND_REF },
+  { INPUT, "f_op_B", HW_H_UINT, CGEN_MODE_UINT, 0, 0, 0 },
+  { INPUT, "h_memory_HI_add__DFLT_pc_4", HW_H_MEMORY, CGEN_MODE_HI, 0, 0, COND_REF },
+  { INPUT, "h_memory_HI_add__DFLT_pc_add__DFLT_4_2", HW_H_MEMORY, CGEN_MODE_HI, 0, 0, COND_REF },
+  { INPUT, "pc", HW_H_PC, CGEN_MODE_USI, 0, 0, COND_REF },
+  { INPUT, "s12", HW_H_SINT, CGEN_MODE_SI, OP_ENT (S12), 0, COND_REF },
+  { OUTPUT, "RB", HW_H_CR, CGEN_MODE_SI, OP_ENT (RB), 0, 0 },
+  { END, (const char *)0, (enum cgen_hw_type)0, (enum cgen_mode)0, (enum cgen_operand_type)0, 0, 0 }
+};
+
+static const CGEN_OPINST sfmt_divaw_ccu6__RA__ops[] ATTRIBUTE_UNUSED = {
+  { INPUT, "F", HW_H_UFLAGS, CGEN_MODE_UINT, OP_ENT (F), 0, COND_REF },
+  { INPUT, "Qcondb", HW_H_QCONDB, CGEN_MODE_BI, OP_ENT (QCONDB), 0, 0 },
+  { INPUT, "RB", HW_H_CR, CGEN_MODE_SI, OP_ENT (RB), 0, COND_REF },
+  { INPUT, "U6", HW_H_UINT, CGEN_MODE_SI, OP_ENT (U6), 0, COND_REF },
+  { INPUT, "f_op_B", HW_H_UINT, CGEN_MODE_UINT, 0, 0, 0 },
+  { INPUT, "h_memory_HI_add__DFLT_pc_4", HW_H_MEMORY, CGEN_MODE_HI, 0, 0, COND_REF },
+  { INPUT, "h_memory_HI_add__DFLT_pc_add__DFLT_4_2", HW_H_MEMORY, CGEN_MODE_HI, 0, 0, COND_REF },
+  { INPUT, "pc", HW_H_PC, CGEN_MODE_USI, 0, 0, COND_REF },
+  { OUTPUT, "RB", HW_H_CR, CGEN_MODE_SI, OP_ENT (RB), 0, COND_REF },
+  { END, (const char *)0, (enum cgen_hw_type)0, (enum cgen_mode)0, (enum cgen_operand_type)0, 0, 0 }
+};
+
+static const CGEN_OPINST sfmt_divaw_L_u6__RA__ops[] ATTRIBUTE_UNUSED = {
+  { INPUT, "F", HW_H_UFLAGS, CGEN_MODE_UINT, OP_ENT (F), 0, 0 },
+  { INPUT, "RB", HW_H_CR, CGEN_MODE_SI, OP_ENT (RB), 0, COND_REF },
+  { INPUT, "U6", HW_H_UINT, CGEN_MODE_SI, OP_ENT (U6), 0, COND_REF },
+  { INPUT, "f_op_B", HW_H_UINT, CGEN_MODE_UINT, 0, 0, 0 },
+  { INPUT, "h_memory_HI_add__DFLT_pc_4", HW_H_MEMORY, CGEN_MODE_HI, 0, 0, COND_REF },
+  { INPUT, "h_memory_HI_add__DFLT_pc_add__DFLT_4_2", HW_H_MEMORY, CGEN_MODE_HI, 0, 0, COND_REF },
+  { INPUT, "pc", HW_H_PC, CGEN_MODE_USI, 0, 0, COND_REF },
+  { OUTPUT, "RA", HW_H_CR, CGEN_MODE_SI, OP_ENT (RA), 0, 0 },
+  { END, (const char *)0, (enum cgen_hw_type)0, (enum cgen_mode)0, (enum cgen_operand_type)0, 0, 0 }
+};
+
+static const CGEN_OPINST sfmt_divaw_L_r_r__RA__RC_ops[] ATTRIBUTE_UNUSED = {
+  { INPUT, "F", HW_H_UFLAGS, CGEN_MODE_UINT, OP_ENT (F), 0, 0 },
+  { INPUT, "RB", HW_H_CR, CGEN_MODE_SI, OP_ENT (RB), 0, COND_REF },
+  { INPUT, "RC", HW_H_CR, CGEN_MODE_SI, OP_ENT (RC), 0, COND_REF },
+  { INPUT, "f_op_B", HW_H_UINT, CGEN_MODE_UINT, 0, 0, 0 },
+  { INPUT, "f_op_C", HW_H_UINT, CGEN_MODE_UINT, 0, 0, 0 },
+  { INPUT, "h_memory_HI_add__DFLT_pc_4", HW_H_MEMORY, CGEN_MODE_HI, 0, 0, COND_REF },
+  { INPUT, "h_memory_HI_add__DFLT_pc_add__DFLT_4_2", HW_H_MEMORY, CGEN_MODE_HI, 0, 0, COND_REF },
+  { INPUT, "pc", HW_H_PC, CGEN_MODE_USI, 0, 0, COND_REF },
+  { OUTPUT, "RA", HW_H_CR, CGEN_MODE_SI, OP_ENT (RA), 0, 0 },
+  { END, (const char *)0, (enum cgen_hw_type)0, (enum cgen_mode)0, (enum cgen_operand_type)0, 0, 0 }
+};
+
+static const CGEN_OPINST sfmt_divaw_cc__RA__RC_ops[] ATTRIBUTE_UNUSED = {
+  { INPUT, "F", HW_H_UFLAGS, CGEN_MODE_UINT, OP_ENT (F), 0, COND_REF },
+  { INPUT, "Qcondb", HW_H_QCONDB, CGEN_MODE_BI, OP_ENT (QCONDB), 0, 0 },
+  { INPUT, "RB", HW_H_CR, CGEN_MODE_SI, OP_ENT (RB), 0, COND_REF },
+  { INPUT, "RC", HW_H_CR, CGEN_MODE_SI, OP_ENT (RC), 0, COND_REF },
+  { INPUT, "f_op_B", HW_H_UINT, CGEN_MODE_UINT, 0, 0, 0 },
+  { INPUT, "f_op_C", HW_H_UINT, CGEN_MODE_UINT, 0, 0, 0 },
+  { INPUT, "h_memory_HI_add__DFLT_pc_4", HW_H_MEMORY, CGEN_MODE_HI, 0, 0, COND_REF },
+  { INPUT, "h_memory_HI_add__DFLT_pc_add__DFLT_4_2", HW_H_MEMORY, CGEN_MODE_HI, 0, 0, COND_REF },
+  { INPUT, "pc", HW_H_PC, CGEN_MODE_USI, 0, 0, COND_REF },
+  { OUTPUT, "RB", HW_H_CR, CGEN_MODE_SI, OP_ENT (RB), 0, COND_REF },
+  { END, (const char *)0, (enum cgen_hw_type)0, (enum cgen_mode)0, (enum cgen_operand_type)0, 0, 0 }
+};
+
+static const CGEN_OPINST sfmt_asls_L_s12__RA__ops[] ATTRIBUTE_UNUSED = {
+  { INPUT, "F", HW_H_UFLAGS, CGEN_MODE_UINT, OP_ENT (F), 0, 0 },
+  { INPUT, "RB", HW_H_CR, CGEN_MODE_SI, OP_ENT (RB), 0, COND_REF },
+  { INPUT, "f_op_B", HW_H_UINT, CGEN_MODE_UINT, 0, 0, 0 },
+  { INPUT, "h_memory_HI_add__DFLT_pc_4", HW_H_MEMORY, CGEN_MODE_HI, 0, 0, COND_REF },
+  { INPUT, "h_memory_HI_add__DFLT_pc_add__DFLT_4_2", HW_H_MEMORY, CGEN_MODE_HI, 0, 0, COND_REF },
+  { INPUT, "pc", HW_H_PC, CGEN_MODE_USI, 0, 0, COND_REF },
+  { INPUT, "s12", HW_H_SINT, CGEN_MODE_SI, OP_ENT (S12), 0, COND_REF },
+  { OUTPUT, "RB", HW_H_CR, CGEN_MODE_SI, OP_ENT (RB), 0, 0 },
+  { OUTPUT, "nbit", HW_H_NBIT, CGEN_MODE_BI, 0, 0, COND_REF },
+  { OUTPUT, "s1bit", HW_H_S1BIT, CGEN_MODE_BI, 0, 0, COND_REF },
+  { OUTPUT, "s2bit", HW_H_S2BIT, CGEN_MODE_BI, 0, 0, COND_REF },
+  { OUTPUT, "vbit", HW_H_VBIT, CGEN_MODE_BI, 0, 0, COND_REF },
+  { OUTPUT, "zbit", HW_H_ZBIT, CGEN_MODE_BI, 0, 0, COND_REF },
+  { END, (const char *)0, (enum cgen_hw_type)0, (enum cgen_mode)0, (enum cgen_operand_type)0, 0, 0 }
+};
+
+static const CGEN_OPINST sfmt_asls_ccu6__RA__ops[] ATTRIBUTE_UNUSED = {
+  { INPUT, "F", HW_H_UFLAGS, CGEN_MODE_UINT, OP_ENT (F), 0, COND_REF },
+  { INPUT, "Qcondb", HW_H_QCONDB, CGEN_MODE_BI, OP_ENT (QCONDB), 0, 0 },
+  { INPUT, "RB", HW_H_CR, CGEN_MODE_SI, OP_ENT (RB), 0, COND_REF },
+  { INPUT, "U6", HW_H_UINT, CGEN_MODE_SI, OP_ENT (U6), 0, COND_REF },
+  { INPUT, "f_op_B", HW_H_UINT, CGEN_MODE_UINT, 0, 0, 0 },
+  { INPUT, "h_memory_HI_add__DFLT_pc_4", HW_H_MEMORY, CGEN_MODE_HI, 0, 0, COND_REF },
+  { INPUT, "h_memory_HI_add__DFLT_pc_add__DFLT_4_2", HW_H_MEMORY, CGEN_MODE_HI, 0, 0, COND_REF },
+  { INPUT, "pc", HW_H_PC, CGEN_MODE_USI, 0, 0, COND_REF },
+  { OUTPUT, "RB", HW_H_CR, CGEN_MODE_SI, OP_ENT (RB), 0, COND_REF },
+  { OUTPUT, "nbit", HW_H_NBIT, CGEN_MODE_BI, 0, 0, COND_REF },
+  { OUTPUT, "s1bit", HW_H_S1BIT, CGEN_MODE_BI, 0, 0, COND_REF },
+  { OUTPUT, "s2bit", HW_H_S2BIT, CGEN_MODE_BI, 0, 0, COND_REF },
+  { OUTPUT, "vbit", HW_H_VBIT, CGEN_MODE_BI, 0, 0, COND_REF },
+  { OUTPUT, "zbit", HW_H_ZBIT, CGEN_MODE_BI, 0, 0, COND_REF },
+  { END, (const char *)0, (enum cgen_hw_type)0, (enum cgen_mode)0, (enum cgen_operand_type)0, 0, 0 }
+};
+
+static const CGEN_OPINST sfmt_asls_L_u6__RA__ops[] ATTRIBUTE_UNUSED = {
+  { INPUT, "F", HW_H_UFLAGS, CGEN_MODE_UINT, OP_ENT (F), 0, 0 },
+  { INPUT, "RB", HW_H_CR, CGEN_MODE_SI, OP_ENT (RB), 0, COND_REF },
+  { INPUT, "U6", HW_H_UINT, CGEN_MODE_SI, OP_ENT (U6), 0, COND_REF },
+  { INPUT, "f_op_B", HW_H_UINT, CGEN_MODE_UINT, 0, 0, 0 },
+  { INPUT, "h_memory_HI_add__DFLT_pc_4", HW_H_MEMORY, CGEN_MODE_HI, 0, 0, COND_REF },
+  { INPUT, "h_memory_HI_add__DFLT_pc_add__DFLT_4_2", HW_H_MEMORY, CGEN_MODE_HI, 0, 0, COND_REF },
+  { INPUT, "pc", HW_H_PC, CGEN_MODE_USI, 0, 0, COND_REF },
+  { OUTPUT, "RA", HW_H_CR, CGEN_MODE_SI, OP_ENT (RA), 0, 0 },
+  { OUTPUT, "nbit", HW_H_NBIT, CGEN_MODE_BI, 0, 0, COND_REF },
+  { OUTPUT, "s1bit", HW_H_S1BIT, CGEN_MODE_BI, 0, 0, COND_REF },
+  { OUTPUT, "s2bit", HW_H_S2BIT, CGEN_MODE_BI, 0, 0, COND_REF },
+  { OUTPUT, "vbit", HW_H_VBIT, CGEN_MODE_BI, 0, 0, COND_REF },
+  { OUTPUT, "zbit", HW_H_ZBIT, CGEN_MODE_BI, 0, 0, COND_REF },
+  { END, (const char *)0, (enum cgen_hw_type)0, (enum cgen_mode)0, (enum cgen_operand_type)0, 0, 0 }
+};
+
+static const CGEN_OPINST sfmt_asls_L_r_r__RA__RC_ops[] ATTRIBUTE_UNUSED = {
+  { INPUT, "F", HW_H_UFLAGS, CGEN_MODE_UINT, OP_ENT (F), 0, 0 },
+  { INPUT, "RB", HW_H_CR, CGEN_MODE_SI, OP_ENT (RB), 0, COND_REF },
+  { INPUT, "RC", HW_H_CR, CGEN_MODE_SI, OP_ENT (RC), 0, COND_REF },
+  { INPUT, "f_op_B", HW_H_UINT, CGEN_MODE_UINT, 0, 0, 0 },
+  { INPUT, "f_op_C", HW_H_UINT, CGEN_MODE_UINT, 0, 0, 0 },
+  { INPUT, "h_memory_HI_add__DFLT_pc_4", HW_H_MEMORY, CGEN_MODE_HI, 0, 0, COND_REF },
+  { INPUT, "h_memory_HI_add__DFLT_pc_add__DFLT_4_2", HW_H_MEMORY, CGEN_MODE_HI, 0, 0, COND_REF },
+  { INPUT, "pc", HW_H_PC, CGEN_MODE_USI, 0, 0, COND_REF },
+  { OUTPUT, "RA", HW_H_CR, CGEN_MODE_SI, OP_ENT (RA), 0, 0 },
+  { OUTPUT, "nbit", HW_H_NBIT, CGEN_MODE_BI, 0, 0, COND_REF },
+  { OUTPUT, "s1bit", HW_H_S1BIT, CGEN_MODE_BI, 0, 0, COND_REF },
+  { OUTPUT, "s2bit", HW_H_S2BIT, CGEN_MODE_BI, 0, 0, COND_REF },
+  { OUTPUT, "vbit", HW_H_VBIT, CGEN_MODE_BI, 0, 0, COND_REF },
+  { OUTPUT, "zbit", HW_H_ZBIT, CGEN_MODE_BI, 0, 0, COND_REF },
+  { END, (const char *)0, (enum cgen_hw_type)0, (enum cgen_mode)0, (enum cgen_operand_type)0, 0, 0 }
+};
+
+static const CGEN_OPINST sfmt_asls_cc__RA__RC_ops[] ATTRIBUTE_UNUSED = {
+  { INPUT, "F", HW_H_UFLAGS, CGEN_MODE_UINT, OP_ENT (F), 0, COND_REF },
+  { INPUT, "Qcondb", HW_H_QCONDB, CGEN_MODE_BI, OP_ENT (QCONDB), 0, 0 },
+  { INPUT, "RB", HW_H_CR, CGEN_MODE_SI, OP_ENT (RB), 0, COND_REF },
+  { INPUT, "RC", HW_H_CR, CGEN_MODE_SI, OP_ENT (RC), 0, COND_REF },
+  { INPUT, "f_op_B", HW_H_UINT, CGEN_MODE_UINT, 0, 0, 0 },
+  { INPUT, "f_op_C", HW_H_UINT, CGEN_MODE_UINT, 0, 0, 0 },
+  { INPUT, "h_memory_HI_add__DFLT_pc_4", HW_H_MEMORY, CGEN_MODE_HI, 0, 0, COND_REF },
+  { INPUT, "h_memory_HI_add__DFLT_pc_add__DFLT_4_2", HW_H_MEMORY, CGEN_MODE_HI, 0, 0, COND_REF },
+  { INPUT, "pc", HW_H_PC, CGEN_MODE_USI, 0, 0, COND_REF },
+  { OUTPUT, "RB", HW_H_CR, CGEN_MODE_SI, OP_ENT (RB), 0, COND_REF },
+  { OUTPUT, "nbit", HW_H_NBIT, CGEN_MODE_BI, 0, 0, COND_REF },
+  { OUTPUT, "s1bit", HW_H_S1BIT, CGEN_MODE_BI, 0, 0, COND_REF },
+  { OUTPUT, "s2bit", HW_H_S2BIT, CGEN_MODE_BI, 0, 0, COND_REF },
+  { OUTPUT, "vbit", HW_H_VBIT, CGEN_MODE_BI, 0, 0, COND_REF },
+  { OUTPUT, "zbit", HW_H_ZBIT, CGEN_MODE_BI, 0, 0, COND_REF },
+  { END, (const char *)0, (enum cgen_hw_type)0, (enum cgen_mode)0, (enum cgen_operand_type)0, 0, 0 }
+};
+
+static const CGEN_OPINST sfmt_swap_L_r_r__RC_ops[] ATTRIBUTE_UNUSED = {
+  { INPUT, "F", HW_H_UFLAGS, CGEN_MODE_UINT, OP_ENT (F), 0, 0 },
+  { INPUT, "RC", HW_H_CR, CGEN_MODE_SI, OP_ENT (RC), 0, COND_REF },
+  { INPUT, "f_op_C", HW_H_UINT, CGEN_MODE_UINT, 0, 0, 0 },
+  { INPUT, "h_memory_HI_add__DFLT_pc_4", HW_H_MEMORY, CGEN_MODE_HI, 0, 0, COND_REF },
+  { INPUT, "h_memory_HI_add__DFLT_pc_add__DFLT_4_2", HW_H_MEMORY, CGEN_MODE_HI, 0, 0, COND_REF },
+  { INPUT, "pc", HW_H_PC, CGEN_MODE_USI, 0, 0, COND_REF },
+  { OUTPUT, "RB", HW_H_CR, CGEN_MODE_SI, OP_ENT (RB), 0, 0 },
+  { OUTPUT, "nbit", HW_H_NBIT, CGEN_MODE_BI, 0, 0, COND_REF },
+  { OUTPUT, "zbit", HW_H_ZBIT, CGEN_MODE_BI, 0, 0, COND_REF },
+  { END, (const char *)0, (enum cgen_hw_type)0, (enum cgen_mode)0, (enum cgen_operand_type)0, 0, 0 }
+};
+
+static const CGEN_OPINST sfmt_swap_L_u6__ops[] ATTRIBUTE_UNUSED = {
+  { INPUT, "F", HW_H_UFLAGS, CGEN_MODE_UINT, OP_ENT (F), 0, 0 },
+  { INPUT, "U6", HW_H_UINT, CGEN_MODE_UINT, OP_ENT (U6), 0, COND_REF },
+  { INPUT, "f_op_B", HW_H_UINT, CGEN_MODE_UINT, 0, 0, 0 },
+  { INPUT, "h_memory_HI_add__DFLT_pc_4", HW_H_MEMORY, CGEN_MODE_HI, 0, 0, COND_REF },
+  { INPUT, "h_memory_HI_add__DFLT_pc_add__DFLT_4_2", HW_H_MEMORY, CGEN_MODE_HI, 0, 0, COND_REF },
+  { INPUT, "pc", HW_H_PC, CGEN_MODE_USI, 0, 0, COND_REF },
+  { OUTPUT, "RB", HW_H_CR, CGEN_MODE_SI, OP_ENT (RB), 0, 0 },
+  { OUTPUT, "nbit", HW_H_NBIT, CGEN_MODE_BI, 0, 0, COND_REF },
+  { OUTPUT, "zbit", HW_H_ZBIT, CGEN_MODE_BI, 0, 0, COND_REF },
+  { END, (const char *)0, (enum cgen_hw_type)0, (enum cgen_mode)0, (enum cgen_operand_type)0, 0, 0 }
+};
+
+static const CGEN_OPINST sfmt_norm_L_u6__ops[] ATTRIBUTE_UNUSED = {
+  { INPUT, "F", HW_H_UFLAGS, CGEN_MODE_UINT, OP_ENT (F), 0, 0 },
+  { INPUT, "U6", HW_H_UINT, CGEN_MODE_SI, OP_ENT (U6), 0, COND_REF },
+  { INPUT, "f_op_B", HW_H_UINT, CGEN_MODE_UINT, 0, 0, 0 },
+  { INPUT, "h_memory_HI_add__DFLT_pc_4", HW_H_MEMORY, CGEN_MODE_HI, 0, 0, COND_REF },
+  { INPUT, "h_memory_HI_add__DFLT_pc_add__DFLT_4_2", HW_H_MEMORY, CGEN_MODE_HI, 0, 0, COND_REF },
+  { INPUT, "pc", HW_H_PC, CGEN_MODE_USI, 0, 0, COND_REF },
+  { OUTPUT, "RB", HW_H_CR, CGEN_MODE_SI, OP_ENT (RB), 0, 0 },
+  { OUTPUT, "nbit", HW_H_NBIT, CGEN_MODE_BI, 0, 0, COND_REF },
+  { OUTPUT, "zbit", HW_H_ZBIT, CGEN_MODE_BI, 0, 0, COND_REF },
+  { END, (const char *)0, (enum cgen_hw_type)0, (enum cgen_mode)0, (enum cgen_operand_type)0, 0, 0 }
+};
+
+static const CGEN_OPINST sfmt_rnd16_L_r_r__RC_ops[] ATTRIBUTE_UNUSED = {
+  { INPUT, "F", HW_H_UFLAGS, CGEN_MODE_UINT, OP_ENT (F), 0, 0 },
+  { INPUT, "RC", HW_H_CR, CGEN_MODE_SI, OP_ENT (RC), 0, COND_REF },
+  { INPUT, "f_op_C", HW_H_UINT, CGEN_MODE_UINT, 0, 0, 0 },
+  { INPUT, "h_memory_HI_add__DFLT_pc_4", HW_H_MEMORY, CGEN_MODE_HI, 0, 0, COND_REF },
+  { INPUT, "h_memory_HI_add__DFLT_pc_add__DFLT_4_2", HW_H_MEMORY, CGEN_MODE_HI, 0, 0, COND_REF },
+  { INPUT, "pc", HW_H_PC, CGEN_MODE_USI, 0, 0, COND_REF },
+  { OUTPUT, "RB", HW_H_CR, CGEN_MODE_SI, OP_ENT (RB), 0, 0 },
+  { OUTPUT, "nbit", HW_H_NBIT, CGEN_MODE_BI, 0, 0, COND_REF },
+  { OUTPUT, "s1bit", HW_H_S1BIT, CGEN_MODE_BI, 0, 0, COND_REF },
+  { OUTPUT, "s2bit", HW_H_S2BIT, CGEN_MODE_BI, 0, 0, COND_REF },
+  { OUTPUT, "vbit", HW_H_VBIT, CGEN_MODE_BI, 0, 0, COND_REF },
+  { OUTPUT, "zbit", HW_H_ZBIT, CGEN_MODE_BI, 0, 0, COND_REF },
+  { END, (const char *)0, (enum cgen_hw_type)0, (enum cgen_mode)0, (enum cgen_operand_type)0, 0, 0 }
+};
+
+static const CGEN_OPINST sfmt_rnd16_L_u6__ops[] ATTRIBUTE_UNUSED = {
+  { INPUT, "F", HW_H_UFLAGS, CGEN_MODE_UINT, OP_ENT (F), 0, 0 },
+  { INPUT, "U6", HW_H_UINT, CGEN_MODE_UINT, OP_ENT (U6), 0, COND_REF },
+  { INPUT, "f_op_B", HW_H_UINT, CGEN_MODE_UINT, 0, 0, 0 },
+  { INPUT, "h_memory_HI_add__DFLT_pc_4", HW_H_MEMORY, CGEN_MODE_HI, 0, 0, COND_REF },
+  { INPUT, "h_memory_HI_add__DFLT_pc_add__DFLT_4_2", HW_H_MEMORY, CGEN_MODE_HI, 0, 0, COND_REF },
+  { INPUT, "pc", HW_H_PC, CGEN_MODE_USI, 0, 0, COND_REF },
+  { OUTPUT, "RB", HW_H_CR, CGEN_MODE_SI, OP_ENT (RB), 0, 0 },
+  { OUTPUT, "nbit", HW_H_NBIT, CGEN_MODE_BI, 0, 0, COND_REF },
+  { OUTPUT, "s1bit", HW_H_S1BIT, CGEN_MODE_BI, 0, 0, COND_REF },
+  { OUTPUT, "s2bit", HW_H_S2BIT, CGEN_MODE_BI, 0, 0, COND_REF },
+  { OUTPUT, "vbit", HW_H_VBIT, CGEN_MODE_BI, 0, 0, COND_REF },
+  { OUTPUT, "zbit", HW_H_ZBIT, CGEN_MODE_BI, 0, 0, COND_REF },
+  { END, (const char *)0, (enum cgen_hw_type)0, (enum cgen_mode)0, (enum cgen_operand_type)0, 0, 0 }
+};
+
+static const CGEN_OPINST sfmt_abssw_L_r_r__RC_ops[] ATTRIBUTE_UNUSED = {
+  { INPUT, "F", HW_H_UFLAGS, CGEN_MODE_UINT, OP_ENT (F), 0, 0 },
+  { INPUT, "RC", HW_H_CR, CGEN_MODE_HI, OP_ENT (RC), 0, COND_REF },
+  { INPUT, "f_op_C", HW_H_UINT, CGEN_MODE_UINT, 0, 0, 0 },
+  { INPUT, "h_memory_HI_add__DFLT_pc_4", HW_H_MEMORY, CGEN_MODE_HI, 0, 0, COND_REF },
+  { INPUT, "h_memory_HI_add__DFLT_pc_add__DFLT_4_2", HW_H_MEMORY, CGEN_MODE_HI, 0, 0, COND_REF },
+  { INPUT, "pc", HW_H_PC, CGEN_MODE_USI, 0, 0, COND_REF },
+  { OUTPUT, "RB", HW_H_CR, CGEN_MODE_SI, OP_ENT (RB), 0, 0 },
+  { OUTPUT, "nbit", HW_H_NBIT, CGEN_MODE_BI, 0, 0, COND_REF },
+  { OUTPUT, "s1bit", HW_H_S1BIT, CGEN_MODE_BI, 0, 0, COND_REF },
+  { OUTPUT, "s2bit", HW_H_S2BIT, CGEN_MODE_BI, 0, 0, COND_REF },
+  { OUTPUT, "vbit", HW_H_VBIT, CGEN_MODE_BI, 0, 0, COND_REF },
+  { OUTPUT, "zbit", HW_H_ZBIT, CGEN_MODE_BI, 0, 0, COND_REF },
+  { END, (const char *)0, (enum cgen_hw_type)0, (enum cgen_mode)0, (enum cgen_operand_type)0, 0, 0 }
+};
+
+static const CGEN_OPINST sfmt_abssw_L_u6__ops[] ATTRIBUTE_UNUSED = {
+  { INPUT, "F", HW_H_UFLAGS, CGEN_MODE_UINT, OP_ENT (F), 0, 0 },
+  { INPUT, "U6", HW_H_UINT, CGEN_MODE_HI, OP_ENT (U6), 0, COND_REF },
+  { INPUT, "f_op_B", HW_H_UINT, CGEN_MODE_UINT, 0, 0, 0 },
+  { INPUT, "h_memory_HI_add__DFLT_pc_4", HW_H_MEMORY, CGEN_MODE_HI, 0, 0, COND_REF },
+  { INPUT, "h_memory_HI_add__DFLT_pc_add__DFLT_4_2", HW_H_MEMORY, CGEN_MODE_HI, 0, 0, COND_REF },
+  { INPUT, "pc", HW_H_PC, CGEN_MODE_USI, 0, 0, COND_REF },
+  { OUTPUT, "RB", HW_H_CR, CGEN_MODE_SI, OP_ENT (RB), 0, 0 },
+  { OUTPUT, "nbit", HW_H_NBIT, CGEN_MODE_BI, 0, 0, COND_REF },
+  { OUTPUT, "s1bit", HW_H_S1BIT, CGEN_MODE_BI, 0, 0, COND_REF },
+  { OUTPUT, "s2bit", HW_H_S2BIT, CGEN_MODE_BI, 0, 0, COND_REF },
+  { OUTPUT, "vbit", HW_H_VBIT, CGEN_MODE_BI, 0, 0, COND_REF },
+  { OUTPUT, "zbit", HW_H_ZBIT, CGEN_MODE_BI, 0, 0, COND_REF },
+  { END, (const char *)0, (enum cgen_hw_type)0, (enum cgen_mode)0, (enum cgen_operand_type)0, 0, 0 }
+};
+
+static const CGEN_OPINST sfmt_abss_L_u6__ops[] ATTRIBUTE_UNUSED = {
+  { INPUT, "F", HW_H_UFLAGS, CGEN_MODE_UINT, OP_ENT (F), 0, 0 },
+  { INPUT, "U6", HW_H_UINT, CGEN_MODE_SI, OP_ENT (U6), 0, COND_REF },
+  { INPUT, "f_op_B", HW_H_UINT, CGEN_MODE_UINT, 0, 0, 0 },
+  { INPUT, "h_memory_HI_add__DFLT_pc_4", HW_H_MEMORY, CGEN_MODE_HI, 0, 0, COND_REF },
+  { INPUT, "h_memory_HI_add__DFLT_pc_add__DFLT_4_2", HW_H_MEMORY, CGEN_MODE_HI, 0, 0, COND_REF },
+  { INPUT, "pc", HW_H_PC, CGEN_MODE_USI, 0, 0, COND_REF },
+  { OUTPUT, "RB", HW_H_CR, CGEN_MODE_SI, OP_ENT (RB), 0, 0 },
+  { OUTPUT, "nbit", HW_H_NBIT, CGEN_MODE_BI, 0, 0, COND_REF },
+  { OUTPUT, "s1bit", HW_H_S1BIT, CGEN_MODE_BI, 0, 0, COND_REF },
+  { OUTPUT, "s2bit", HW_H_S2BIT, CGEN_MODE_BI, 0, 0, COND_REF },
+  { OUTPUT, "vbit", HW_H_VBIT, CGEN_MODE_BI, 0, 0, COND_REF },
+  { OUTPUT, "zbit", HW_H_ZBIT, CGEN_MODE_BI, 0, 0, COND_REF },
+  { END, (const char *)0, (enum cgen_hw_type)0, (enum cgen_mode)0, (enum cgen_operand_type)0, 0, 0 }
+};
+
+static const CGEN_OPINST sfmt_nop_s_ops[] ATTRIBUTE_UNUSED = {
+  { END, (const char *)0, (enum cgen_hw_type)0, (enum cgen_mode)0, (enum cgen_operand_type)0, 0, 0 }
+};
+
+static const CGEN_OPINST sfmt_pop_s_b_ops[] ATTRIBUTE_UNUSED = {
+  { INPUT, "SP", HW_H_SP, CGEN_MODE_USI, 0, 0, 0 },
+  { INPUT, "h_memory_SI_SP", HW_H_MEMORY, CGEN_MODE_SI, 0, 0, 0 },
+  { OUTPUT, "R_b", HW_H_CR16, CGEN_MODE_SI, OP_ENT (R_B), 0, 0 },
+  { OUTPUT, "SP", HW_H_SP, CGEN_MODE_SI, 0, 0, 0 },
+  { END, (const char *)0, (enum cgen_hw_type)0, (enum cgen_mode)0, (enum cgen_operand_type)0, 0, 0 }
+};
+
+static const CGEN_OPINST sfmt_pop_s_blink_ops[] ATTRIBUTE_UNUSED = {
+  { INPUT, "SP", HW_H_SP, CGEN_MODE_USI, 0, 0, 0 },
+  { INPUT, "h_memory_SI_SP", HW_H_MEMORY, CGEN_MODE_SI, 0, 0, 0 },
+  { OUTPUT, "R31", HW_H_R31, CGEN_MODE_SI, 0, 0, 0 },
+  { OUTPUT, "SP", HW_H_SP, CGEN_MODE_SI, 0, 0, 0 },
+  { END, (const char *)0, (enum cgen_hw_type)0, (enum cgen_mode)0, (enum cgen_operand_type)0, 0, 0 }
+};
+
+static const CGEN_OPINST sfmt_push_s_b_ops[] ATTRIBUTE_UNUSED = {
+  { INPUT, "R_b", HW_H_CR16, CGEN_MODE_SI, OP_ENT (R_B), 0, 0 },
+  { INPUT, "SP", HW_H_SP, CGEN_MODE_SI, 0, 0, 0 },
+  { OUTPUT, "SP", HW_H_SP, CGEN_MODE_SI, 0, 0, 0 },
+  { OUTPUT, "h_memory_SI_SP", HW_H_MEMORY, CGEN_MODE_SI, 0, 0, 0 },
+  { END, (const char *)0, (enum cgen_hw_type)0, (enum cgen_mode)0, (enum cgen_operand_type)0, 0, 0 }
+};
+
+static const CGEN_OPINST sfmt_push_s_blink_ops[] ATTRIBUTE_UNUSED = {
+  { INPUT, "R31", HW_H_R31, CGEN_MODE_SI, 0, 0, 0 },
+  { INPUT, "SP", HW_H_SP, CGEN_MODE_SI, 0, 0, 0 },
+  { OUTPUT, "SP", HW_H_SP, CGEN_MODE_SI, 0, 0, 0 },
+  { OUTPUT, "h_memory_SI_SP", HW_H_MEMORY, CGEN_MODE_SI, 0, 0, 0 },
+  { END, (const char *)0, (enum cgen_hw_type)0, (enum cgen_mode)0, (enum cgen_operand_type)0, 0, 0 }
+};
+
+static const CGEN_OPINST sfmt_mullw_L_s12__RA__ops[] ATTRIBUTE_UNUSED = {
+  { INPUT, "F", HW_H_UFLAGS, CGEN_MODE_UINT, OP_ENT (F), 0, 0 },
+  { INPUT, "RB", HW_H_CR, CGEN_MODE_SI, OP_ENT (RB), 0, COND_REF },
+  { INPUT, "f_op_B", HW_H_UINT, CGEN_MODE_UINT, 0, 0, 0 },
+  { INPUT, "h_memory_HI_add__DFLT_pc_4", HW_H_MEMORY, CGEN_MODE_HI, 0, 0, COND_REF },
+  { INPUT, "h_memory_HI_add__DFLT_pc_add__DFLT_4_2", HW_H_MEMORY, CGEN_MODE_HI, 0, 0, COND_REF },
+  { INPUT, "pc", HW_H_PC, CGEN_MODE_USI, 0, 0, COND_REF },
+  { INPUT, "s12", HW_H_SINT, CGEN_MODE_INT, OP_ENT (S12), 0, COND_REF },
+  { OUTPUT, "RB", HW_H_CR, CGEN_MODE_SI, OP_ENT (RB), 0, 0 },
+  { OUTPUT, "h_cr_SI_56", HW_H_CR, CGEN_MODE_SI, 0, 56, 0 },
+  { OUTPUT, "h_cr_SI_57", HW_H_CR, CGEN_MODE_SI, 0, 57, 0 },
+  { OUTPUT, "nbit", HW_H_NBIT, CGEN_MODE_BI, 0, 0, COND_REF },
+  { OUTPUT, "s1bit", HW_H_S1BIT, CGEN_MODE_BI, 0, 0, COND_REF },
+  { OUTPUT, "s2bit", HW_H_S2BIT, CGEN_MODE_BI, 0, 0, COND_REF },
+  { OUTPUT, "vbit", HW_H_VBIT, CGEN_MODE_BI, 0, 0, COND_REF },
+  { OUTPUT, "zbit", HW_H_ZBIT, CGEN_MODE_BI, 0, 0, COND_REF },
+  { END, (const char *)0, (enum cgen_hw_type)0, (enum cgen_mode)0, (enum cgen_operand_type)0, 0, 0 }
+};
+
+static const CGEN_OPINST sfmt_mullw_ccu6__RA__ops[] ATTRIBUTE_UNUSED = {
+  { INPUT, "F", HW_H_UFLAGS, CGEN_MODE_UINT, OP_ENT (F), 0, COND_REF },
+  { INPUT, "Qcondb", HW_H_QCONDB, CGEN_MODE_BI, OP_ENT (QCONDB), 0, 0 },
+  { INPUT, "RB", HW_H_CR, CGEN_MODE_SI, OP_ENT (RB), 0, COND_REF },
+  { INPUT, "U6", HW_H_UINT, CGEN_MODE_UINT, OP_ENT (U6), 0, COND_REF },
+  { INPUT, "f_op_B", HW_H_UINT, CGEN_MODE_UINT, 0, 0, 0 },
+  { INPUT, "h_memory_HI_add__DFLT_pc_4", HW_H_MEMORY, CGEN_MODE_HI, 0, 0, COND_REF },
+  { INPUT, "h_memory_HI_add__DFLT_pc_add__DFLT_4_2", HW_H_MEMORY, CGEN_MODE_HI, 0, 0, COND_REF },
+  { INPUT, "pc", HW_H_PC, CGEN_MODE_USI, 0, 0, COND_REF },
+  { OUTPUT, "RB", HW_H_CR, CGEN_MODE_SI, OP_ENT (RB), 0, COND_REF },
+  { OUTPUT, "h_cr_SI_56", HW_H_CR, CGEN_MODE_SI, 0, 56, COND_REF },
+  { OUTPUT, "h_cr_SI_57", HW_H_CR, CGEN_MODE_SI, 0, 57, COND_REF },
+  { OUTPUT, "nbit", HW_H_NBIT, CGEN_MODE_BI, 0, 0, COND_REF },
+  { OUTPUT, "s1bit", HW_H_S1BIT, CGEN_MODE_BI, 0, 0, COND_REF },
+  { OUTPUT, "s2bit", HW_H_S2BIT, CGEN_MODE_BI, 0, 0, COND_REF },
+  { OUTPUT, "vbit", HW_H_VBIT, CGEN_MODE_BI, 0, 0, COND_REF },
+  { OUTPUT, "zbit", HW_H_ZBIT, CGEN_MODE_BI, 0, 0, COND_REF },
+  { END, (const char *)0, (enum cgen_hw_type)0, (enum cgen_mode)0, (enum cgen_operand_type)0, 0, 0 }
+};
+
+static const CGEN_OPINST sfmt_mullw_L_u6__RA__ops[] ATTRIBUTE_UNUSED = {
+  { INPUT, "F", HW_H_UFLAGS, CGEN_MODE_UINT, OP_ENT (F), 0, 0 },
+  { INPUT, "RB", HW_H_CR, CGEN_MODE_SI, OP_ENT (RB), 0, COND_REF },
+  { INPUT, "U6", HW_H_UINT, CGEN_MODE_UINT, OP_ENT (U6), 0, COND_REF },
+  { INPUT, "f_op_B", HW_H_UINT, CGEN_MODE_UINT, 0, 0, 0 },
+  { INPUT, "h_memory_HI_add__DFLT_pc_4", HW_H_MEMORY, CGEN_MODE_HI, 0, 0, COND_REF },
+  { INPUT, "h_memory_HI_add__DFLT_pc_add__DFLT_4_2", HW_H_MEMORY, CGEN_MODE_HI, 0, 0, COND_REF },
+  { INPUT, "pc", HW_H_PC, CGEN_MODE_USI, 0, 0, COND_REF },
+  { OUTPUT, "RA", HW_H_CR, CGEN_MODE_SI, OP_ENT (RA), 0, 0 },
+  { OUTPUT, "h_cr_SI_56", HW_H_CR, CGEN_MODE_SI, 0, 56, 0 },
+  { OUTPUT, "h_cr_SI_57", HW_H_CR, CGEN_MODE_SI, 0, 57, 0 },
+  { OUTPUT, "nbit", HW_H_NBIT, CGEN_MODE_BI, 0, 0, COND_REF },
+  { OUTPUT, "s1bit", HW_H_S1BIT, CGEN_MODE_BI, 0, 0, COND_REF },
+  { OUTPUT, "s2bit", HW_H_S2BIT, CGEN_MODE_BI, 0, 0, COND_REF },
+  { OUTPUT, "vbit", HW_H_VBIT, CGEN_MODE_BI, 0, 0, COND_REF },
+  { OUTPUT, "zbit", HW_H_ZBIT, CGEN_MODE_BI, 0, 0, COND_REF },
+  { END, (const char *)0, (enum cgen_hw_type)0, (enum cgen_mode)0, (enum cgen_operand_type)0, 0, 0 }
+};
+
+static const CGEN_OPINST sfmt_mullw_L_r_r__RA__RC_ops[] ATTRIBUTE_UNUSED = {
+  { INPUT, "F", HW_H_UFLAGS, CGEN_MODE_UINT, OP_ENT (F), 0, 0 },
+  { INPUT, "RB", HW_H_CR, CGEN_MODE_SI, OP_ENT (RB), 0, COND_REF },
+  { INPUT, "RC", HW_H_CR, CGEN_MODE_SI, OP_ENT (RC), 0, COND_REF },
+  { INPUT, "f_op_B", HW_H_UINT, CGEN_MODE_UINT, 0, 0, 0 },
+  { INPUT, "f_op_C", HW_H_UINT, CGEN_MODE_UINT, 0, 0, 0 },
+  { INPUT, "h_memory_HI_add__DFLT_pc_4", HW_H_MEMORY, CGEN_MODE_HI, 0, 0, COND_REF },
+  { INPUT, "h_memory_HI_add__DFLT_pc_add__DFLT_4_2", HW_H_MEMORY, CGEN_MODE_HI, 0, 0, COND_REF },
+  { INPUT, "pc", HW_H_PC, CGEN_MODE_USI, 0, 0, COND_REF },
+  { OUTPUT, "RA", HW_H_CR, CGEN_MODE_SI, OP_ENT (RA), 0, 0 },
+  { OUTPUT, "h_cr_SI_56", HW_H_CR, CGEN_MODE_SI, 0, 56, 0 },
+  { OUTPUT, "h_cr_SI_57", HW_H_CR, CGEN_MODE_SI, 0, 57, 0 },
+  { OUTPUT, "nbit", HW_H_NBIT, CGEN_MODE_BI, 0, 0, COND_REF },
+  { OUTPUT, "s1bit", HW_H_S1BIT, CGEN_MODE_BI, 0, 0, COND_REF },
+  { OUTPUT, "s2bit", HW_H_S2BIT, CGEN_MODE_BI, 0, 0, COND_REF },
+  { OUTPUT, "vbit", HW_H_VBIT, CGEN_MODE_BI, 0, 0, COND_REF },
+  { OUTPUT, "zbit", HW_H_ZBIT, CGEN_MODE_BI, 0, 0, COND_REF },
+  { END, (const char *)0, (enum cgen_hw_type)0, (enum cgen_mode)0, (enum cgen_operand_type)0, 0, 0 }
+};
+
+static const CGEN_OPINST sfmt_mullw_cc__RA__RC_ops[] ATTRIBUTE_UNUSED = {
+  { INPUT, "F", HW_H_UFLAGS, CGEN_MODE_UINT, OP_ENT (F), 0, COND_REF },
+  { INPUT, "Qcondb", HW_H_QCONDB, CGEN_MODE_BI, OP_ENT (QCONDB), 0, 0 },
+  { INPUT, "RB", HW_H_CR, CGEN_MODE_SI, OP_ENT (RB), 0, COND_REF },
+  { INPUT, "RC", HW_H_CR, CGEN_MODE_SI, OP_ENT (RC), 0, COND_REF },
+  { INPUT, "f_op_B", HW_H_UINT, CGEN_MODE_UINT, 0, 0, 0 },
+  { INPUT, "f_op_C", HW_H_UINT, CGEN_MODE_UINT, 0, 0, 0 },
+  { INPUT, "h_memory_HI_add__DFLT_pc_4", HW_H_MEMORY, CGEN_MODE_HI, 0, 0, COND_REF },
+  { INPUT, "h_memory_HI_add__DFLT_pc_add__DFLT_4_2", HW_H_MEMORY, CGEN_MODE_HI, 0, 0, COND_REF },
+  { INPUT, "pc", HW_H_PC, CGEN_MODE_USI, 0, 0, COND_REF },
+  { OUTPUT, "RB", HW_H_CR, CGEN_MODE_SI, OP_ENT (RB), 0, COND_REF },
+  { OUTPUT, "h_cr_SI_56", HW_H_CR, CGEN_MODE_SI, 0, 56, COND_REF },
+  { OUTPUT, "h_cr_SI_57", HW_H_CR, CGEN_MODE_SI, 0, 57, COND_REF },
+  { OUTPUT, "nbit", HW_H_NBIT, CGEN_MODE_BI, 0, 0, COND_REF },
+  { OUTPUT, "s1bit", HW_H_S1BIT, CGEN_MODE_BI, 0, 0, COND_REF },
+  { OUTPUT, "s2bit", HW_H_S2BIT, CGEN_MODE_BI, 0, 0, COND_REF },
+  { OUTPUT, "vbit", HW_H_VBIT, CGEN_MODE_BI, 0, 0, COND_REF },
+  { OUTPUT, "zbit", HW_H_ZBIT, CGEN_MODE_BI, 0, 0, COND_REF },
+  { END, (const char *)0, (enum cgen_hw_type)0, (enum cgen_mode)0, (enum cgen_operand_type)0, 0, 0 }
+};
+
+static const CGEN_OPINST sfmt_maclw_L_s12__RA__ops[] ATTRIBUTE_UNUSED = {
+  { INPUT, "F", HW_H_UFLAGS, CGEN_MODE_UINT, OP_ENT (F), 0, 0 },
+  { INPUT, "RB", HW_H_CR, CGEN_MODE_SI, OP_ENT (RB), 0, COND_REF },
+  { INPUT, "f_op_B", HW_H_UINT, CGEN_MODE_UINT, 0, 0, 0 },
+  { INPUT, "h_cr_SI_56", HW_H_CR, CGEN_MODE_SI, 0, 56, 0 },
+  { INPUT, "h_cr_SI_57", HW_H_CR, CGEN_MODE_SI, 0, 57, 0 },
+  { INPUT, "h_memory_HI_add__DFLT_pc_4", HW_H_MEMORY, CGEN_MODE_HI, 0, 0, COND_REF },
+  { INPUT, "h_memory_HI_add__DFLT_pc_add__DFLT_4_2", HW_H_MEMORY, CGEN_MODE_HI, 0, 0, COND_REF },
+  { INPUT, "pc", HW_H_PC, CGEN_MODE_USI, 0, 0, COND_REF },
+  { INPUT, "s12", HW_H_SINT, CGEN_MODE_INT, OP_ENT (S12), 0, COND_REF },
+  { INPUT, "vbit", HW_H_VBIT, CGEN_MODE_BI, 0, 0, 0 },
+  { OUTPUT, "RB", HW_H_CR, CGEN_MODE_SI, OP_ENT (RB), 0, 0 },
+  { OUTPUT, "h_cr_SI_56", HW_H_CR, CGEN_MODE_SI, 0, 56, 0 },
+  { OUTPUT, "h_cr_SI_57", HW_H_CR, CGEN_MODE_SI, 0, 57, 0 },
+  { OUTPUT, "nbit", HW_H_NBIT, CGEN_MODE_BI, 0, 0, COND_REF },
+  { OUTPUT, "s1bit", HW_H_S1BIT, CGEN_MODE_BI, 0, 0, COND_REF },
+  { OUTPUT, "s2bit", HW_H_S2BIT, CGEN_MODE_BI, 0, 0, COND_REF },
+  { OUTPUT, "vbit", HW_H_VBIT, CGEN_MODE_BI, 0, 0, 0 },
+  { OUTPUT, "zbit", HW_H_ZBIT, CGEN_MODE_BI, 0, 0, COND_REF },
+  { END, (const char *)0, (enum cgen_hw_type)0, (enum cgen_mode)0, (enum cgen_operand_type)0, 0, 0 }
+};
+
+static const CGEN_OPINST sfmt_maclw_ccu6__RA__ops[] ATTRIBUTE_UNUSED = {
+  { INPUT, "F", HW_H_UFLAGS, CGEN_MODE_UINT, OP_ENT (F), 0, COND_REF },
+  { INPUT, "Qcondb", HW_H_QCONDB, CGEN_MODE_BI, OP_ENT (QCONDB), 0, 0 },
+  { INPUT, "RB", HW_H_CR, CGEN_MODE_SI, OP_ENT (RB), 0, COND_REF },
+  { INPUT, "U6", HW_H_UINT, CGEN_MODE_UINT, OP_ENT (U6), 0, COND_REF },
+  { INPUT, "f_op_B", HW_H_UINT, CGEN_MODE_UINT, 0, 0, 0 },
+  { INPUT, "h_cr_SI_56", HW_H_CR, CGEN_MODE_SI, 0, 56, COND_REF },
+  { INPUT, "h_cr_SI_57", HW_H_CR, CGEN_MODE_SI, 0, 57, COND_REF },
+  { INPUT, "h_memory_HI_add__DFLT_pc_4", HW_H_MEMORY, CGEN_MODE_HI, 0, 0, COND_REF },
+  { INPUT, "h_memory_HI_add__DFLT_pc_add__DFLT_4_2", HW_H_MEMORY, CGEN_MODE_HI, 0, 0, COND_REF },
+  { INPUT, "pc", HW_H_PC, CGEN_MODE_USI, 0, 0, COND_REF },
+  { INPUT, "vbit", HW_H_VBIT, CGEN_MODE_BI, 0, 0, COND_REF },
+  { OUTPUT, "RB", HW_H_CR, CGEN_MODE_SI, OP_ENT (RB), 0, COND_REF },
+  { OUTPUT, "h_cr_SI_56", HW_H_CR, CGEN_MODE_SI, 0, 56, COND_REF },
+  { OUTPUT, "h_cr_SI_57", HW_H_CR, CGEN_MODE_SI, 0, 57, COND_REF },
+  { OUTPUT, "nbit", HW_H_NBIT, CGEN_MODE_BI, 0, 0, COND_REF },
+  { OUTPUT, "s1bit", HW_H_S1BIT, CGEN_MODE_BI, 0, 0, COND_REF },
+  { OUTPUT, "s2bit", HW_H_S2BIT, CGEN_MODE_BI, 0, 0, COND_REF },
+  { OUTPUT, "vbit", HW_H_VBIT, CGEN_MODE_BI, 0, 0, COND_REF },
+  { OUTPUT, "zbit", HW_H_ZBIT, CGEN_MODE_BI, 0, 0, COND_REF },
+  { END, (const char *)0, (enum cgen_hw_type)0, (enum cgen_mode)0, (enum cgen_operand_type)0, 0, 0 }
+};
+
+static const CGEN_OPINST sfmt_maclw_L_u6__RA__ops[] ATTRIBUTE_UNUSED = {
+  { INPUT, "F", HW_H_UFLAGS, CGEN_MODE_UINT, OP_ENT (F), 0, 0 },
+  { INPUT, "RB", HW_H_CR, CGEN_MODE_SI, OP_ENT (RB), 0, COND_REF },
+  { INPUT, "U6", HW_H_UINT, CGEN_MODE_UINT, OP_ENT (U6), 0, COND_REF },
+  { INPUT, "f_op_B", HW_H_UINT, CGEN_MODE_UINT, 0, 0, 0 },
+  { INPUT, "h_cr_SI_56", HW_H_CR, CGEN_MODE_SI, 0, 56, 0 },
+  { INPUT, "h_cr_SI_57", HW_H_CR, CGEN_MODE_SI, 0, 57, 0 },
+  { INPUT, "h_memory_HI_add__DFLT_pc_4", HW_H_MEMORY, CGEN_MODE_HI, 0, 0, COND_REF },
+  { INPUT, "h_memory_HI_add__DFLT_pc_add__DFLT_4_2", HW_H_MEMORY, CGEN_MODE_HI, 0, 0, COND_REF },
+  { INPUT, "pc", HW_H_PC, CGEN_MODE_USI, 0, 0, COND_REF },
+  { INPUT, "vbit", HW_H_VBIT, CGEN_MODE_BI, 0, 0, 0 },
+  { OUTPUT, "RA", HW_H_CR, CGEN_MODE_SI, OP_ENT (RA), 0, 0 },
+  { OUTPUT, "h_cr_SI_56", HW_H_CR, CGEN_MODE_SI, 0, 56, 0 },
+  { OUTPUT, "h_cr_SI_57", HW_H_CR, CGEN_MODE_SI, 0, 57, 0 },
+  { OUTPUT, "nbit", HW_H_NBIT, CGEN_MODE_BI, 0, 0, COND_REF },
+  { OUTPUT, "s1bit", HW_H_S1BIT, CGEN_MODE_BI, 0, 0, COND_REF },
+  { OUTPUT, "s2bit", HW_H_S2BIT, CGEN_MODE_BI, 0, 0, COND_REF },
+  { OUTPUT, "vbit", HW_H_VBIT, CGEN_MODE_BI, 0, 0, 0 },
+  { OUTPUT, "zbit", HW_H_ZBIT, CGEN_MODE_BI, 0, 0, COND_REF },
+  { END, (const char *)0, (enum cgen_hw_type)0, (enum cgen_mode)0, (enum cgen_operand_type)0, 0, 0 }
+};
+
+static const CGEN_OPINST sfmt_maclw_L_r_r__RA__RC_ops[] ATTRIBUTE_UNUSED = {
+  { INPUT, "F", HW_H_UFLAGS, CGEN_MODE_UINT, OP_ENT (F), 0, 0 },
+  { INPUT, "RB", HW_H_CR, CGEN_MODE_SI, OP_ENT (RB), 0, COND_REF },
+  { INPUT, "RC", HW_H_CR, CGEN_MODE_SI, OP_ENT (RC), 0, COND_REF },
+  { INPUT, "f_op_B", HW_H_UINT, CGEN_MODE_UINT, 0, 0, 0 },
+  { INPUT, "f_op_C", HW_H_UINT, CGEN_MODE_UINT, 0, 0, 0 },
+  { INPUT, "h_cr_SI_56", HW_H_CR, CGEN_MODE_SI, 0, 56, 0 },
+  { INPUT, "h_cr_SI_57", HW_H_CR, CGEN_MODE_SI, 0, 57, 0 },
+  { INPUT, "h_memory_HI_add__DFLT_pc_4", HW_H_MEMORY, CGEN_MODE_HI, 0, 0, COND_REF },
+  { INPUT, "h_memory_HI_add__DFLT_pc_add__DFLT_4_2", HW_H_MEMORY, CGEN_MODE_HI, 0, 0, COND_REF },
+  { INPUT, "pc", HW_H_PC, CGEN_MODE_USI, 0, 0, COND_REF },
+  { INPUT, "vbit", HW_H_VBIT, CGEN_MODE_BI, 0, 0, 0 },
+  { OUTPUT, "RA", HW_H_CR, CGEN_MODE_SI, OP_ENT (RA), 0, 0 },
+  { OUTPUT, "h_cr_SI_56", HW_H_CR, CGEN_MODE_SI, 0, 56, 0 },
+  { OUTPUT, "h_cr_SI_57", HW_H_CR, CGEN_MODE_SI, 0, 57, 0 },
+  { OUTPUT, "nbit", HW_H_NBIT, CGEN_MODE_BI, 0, 0, COND_REF },
+  { OUTPUT, "s1bit", HW_H_S1BIT, CGEN_MODE_BI, 0, 0, COND_REF },
+  { OUTPUT, "s2bit", HW_H_S2BIT, CGEN_MODE_BI, 0, 0, COND_REF },
+  { OUTPUT, "vbit", HW_H_VBIT, CGEN_MODE_BI, 0, 0, 0 },
+  { OUTPUT, "zbit", HW_H_ZBIT, CGEN_MODE_BI, 0, 0, COND_REF },
+  { END, (const char *)0, (enum cgen_hw_type)0, (enum cgen_mode)0, (enum cgen_operand_type)0, 0, 0 }
+};
+
+static const CGEN_OPINST sfmt_maclw_cc__RA__RC_ops[] ATTRIBUTE_UNUSED = {
+  { INPUT, "F", HW_H_UFLAGS, CGEN_MODE_UINT, OP_ENT (F), 0, COND_REF },
+  { INPUT, "Qcondb", HW_H_QCONDB, CGEN_MODE_BI, OP_ENT (QCONDB), 0, 0 },
+  { INPUT, "RB", HW_H_CR, CGEN_MODE_SI, OP_ENT (RB), 0, COND_REF },
+  { INPUT, "RC", HW_H_CR, CGEN_MODE_SI, OP_ENT (RC), 0, COND_REF },
+  { INPUT, "f_op_B", HW_H_UINT, CGEN_MODE_UINT, 0, 0, 0 },
+  { INPUT, "f_op_C", HW_H_UINT, CGEN_MODE_UINT, 0, 0, 0 },
+  { INPUT, "h_cr_SI_56", HW_H_CR, CGEN_MODE_SI, 0, 56, COND_REF },
+  { INPUT, "h_cr_SI_57", HW_H_CR, CGEN_MODE_SI, 0, 57, COND_REF },
+  { INPUT, "h_memory_HI_add__DFLT_pc_4", HW_H_MEMORY, CGEN_MODE_HI, 0, 0, COND_REF },
+  { INPUT, "h_memory_HI_add__DFLT_pc_add__DFLT_4_2", HW_H_MEMORY, CGEN_MODE_HI, 0, 0, COND_REF },
+  { INPUT, "pc", HW_H_PC, CGEN_MODE_USI, 0, 0, COND_REF },
+  { INPUT, "vbit", HW_H_VBIT, CGEN_MODE_BI, 0, 0, COND_REF },
+  { OUTPUT, "RB", HW_H_CR, CGEN_MODE_SI, OP_ENT (RB), 0, COND_REF },
+  { OUTPUT, "h_cr_SI_56", HW_H_CR, CGEN_MODE_SI, 0, 56, COND_REF },
+  { OUTPUT, "h_cr_SI_57", HW_H_CR, CGEN_MODE_SI, 0, 57, COND_REF },
+  { OUTPUT, "nbit", HW_H_NBIT, CGEN_MODE_BI, 0, 0, COND_REF },
+  { OUTPUT, "s1bit", HW_H_S1BIT, CGEN_MODE_BI, 0, 0, COND_REF },
+  { OUTPUT, "s2bit", HW_H_S2BIT, CGEN_MODE_BI, 0, 0, COND_REF },
+  { OUTPUT, "vbit", HW_H_VBIT, CGEN_MODE_BI, 0, 0, COND_REF },
+  { OUTPUT, "zbit", HW_H_ZBIT, CGEN_MODE_BI, 0, 0, COND_REF },
+  { END, (const char *)0, (enum cgen_hw_type)0, (enum cgen_mode)0, (enum cgen_operand_type)0, 0, 0 }
+};
+
+static const CGEN_OPINST sfmt_machulw_L_s12__RA__ops[] ATTRIBUTE_UNUSED = {
+  { INPUT, "F", HW_H_UFLAGS, CGEN_MODE_UINT, OP_ENT (F), 0, 0 },
+  { INPUT, "RB", HW_H_CR, CGEN_MODE_SI, OP_ENT (RB), 0, COND_REF },
+  { INPUT, "f_op_B", HW_H_UINT, CGEN_MODE_UINT, 0, 0, 0 },
+  { INPUT, "h_cr_SI_56", HW_H_CR, CGEN_MODE_SI, 0, 56, 0 },
+  { INPUT, "h_cr_SI_57", HW_H_CR, CGEN_MODE_SI, 0, 57, 0 },
+  { INPUT, "h_memory_HI_add__DFLT_pc_4", HW_H_MEMORY, CGEN_MODE_HI, 0, 0, COND_REF },
+  { INPUT, "h_memory_HI_add__DFLT_pc_add__DFLT_4_2", HW_H_MEMORY, CGEN_MODE_HI, 0, 0, COND_REF },
+  { INPUT, "pc", HW_H_PC, CGEN_MODE_USI, 0, 0, COND_REF },
+  { INPUT, "s12", HW_H_SINT, CGEN_MODE_INT, OP_ENT (S12), 0, COND_REF },
+  { OUTPUT, "RB", HW_H_CR, CGEN_MODE_SI, OP_ENT (RB), 0, 0 },
+  { OUTPUT, "h_cr_SI_56", HW_H_CR, CGEN_MODE_SI, 0, 56, 0 },
+  { OUTPUT, "h_cr_SI_57", HW_H_CR, CGEN_MODE_SI, 0, 57, 0 },
+  { OUTPUT, "nbit", HW_H_NBIT, CGEN_MODE_BI, 0, 0, COND_REF },
+  { OUTPUT, "s1bit", HW_H_S1BIT, CGEN_MODE_BI, 0, 0, COND_REF },
+  { OUTPUT, "s2bit", HW_H_S2BIT, CGEN_MODE_BI, 0, 0, COND_REF },
+  { OUTPUT, "vbit", HW_H_VBIT, CGEN_MODE_BI, 0, 0, COND_REF },
+  { OUTPUT, "zbit", HW_H_ZBIT, CGEN_MODE_BI, 0, 0, COND_REF },
+  { END, (const char *)0, (enum cgen_hw_type)0, (enum cgen_mode)0, (enum cgen_operand_type)0, 0, 0 }
+};
+
+static const CGEN_OPINST sfmt_machulw_ccu6__RA__ops[] ATTRIBUTE_UNUSED = {
+  { INPUT, "F", HW_H_UFLAGS, CGEN_MODE_UINT, OP_ENT (F), 0, COND_REF },
+  { INPUT, "Qcondb", HW_H_QCONDB, CGEN_MODE_BI, OP_ENT (QCONDB), 0, 0 },
+  { INPUT, "RB", HW_H_CR, CGEN_MODE_SI, OP_ENT (RB), 0, COND_REF },
+  { INPUT, "U6", HW_H_UINT, CGEN_MODE_UINT, OP_ENT (U6), 0, COND_REF },
+  { INPUT, "f_op_B", HW_H_UINT, CGEN_MODE_UINT, 0, 0, 0 },
+  { INPUT, "h_cr_SI_56", HW_H_CR, CGEN_MODE_SI, 0, 56, COND_REF },
+  { INPUT, "h_cr_SI_57", HW_H_CR, CGEN_MODE_SI, 0, 57, COND_REF },
+  { INPUT, "h_memory_HI_add__DFLT_pc_4", HW_H_MEMORY, CGEN_MODE_HI, 0, 0, COND_REF },
+  { INPUT, "h_memory_HI_add__DFLT_pc_add__DFLT_4_2", HW_H_MEMORY, CGEN_MODE_HI, 0, 0, COND_REF },
+  { INPUT, "pc", HW_H_PC, CGEN_MODE_USI, 0, 0, COND_REF },
+  { OUTPUT, "RB", HW_H_CR, CGEN_MODE_SI, OP_ENT (RB), 0, COND_REF },
+  { OUTPUT, "h_cr_SI_56", HW_H_CR, CGEN_MODE_SI, 0, 56, COND_REF },
+  { OUTPUT, "h_cr_SI_57", HW_H_CR, CGEN_MODE_SI, 0, 57, COND_REF },
+  { OUTPUT, "nbit", HW_H_NBIT, CGEN_MODE_BI, 0, 0, COND_REF },
+  { OUTPUT, "s1bit", HW_H_S1BIT, CGEN_MODE_BI, 0, 0, COND_REF },
+  { OUTPUT, "s2bit", HW_H_S2BIT, CGEN_MODE_BI, 0, 0, COND_REF },
+  { OUTPUT, "vbit", HW_H_VBIT, CGEN_MODE_BI, 0, 0, COND_REF },
+  { OUTPUT, "zbit", HW_H_ZBIT, CGEN_MODE_BI, 0, 0, COND_REF },
+  { END, (const char *)0, (enum cgen_hw_type)0, (enum cgen_mode)0, (enum cgen_operand_type)0, 0, 0 }
+};
+
+static const CGEN_OPINST sfmt_machulw_L_u6__RA__ops[] ATTRIBUTE_UNUSED = {
+  { INPUT, "F", HW_H_UFLAGS, CGEN_MODE_UINT, OP_ENT (F), 0, 0 },
+  { INPUT, "RB", HW_H_CR, CGEN_MODE_SI, OP_ENT (RB), 0, COND_REF },
+  { INPUT, "U6", HW_H_UINT, CGEN_MODE_UINT, OP_ENT (U6), 0, COND_REF },
+  { INPUT, "f_op_B", HW_H_UINT, CGEN_MODE_UINT, 0, 0, 0 },
+  { INPUT, "h_cr_SI_56", HW_H_CR, CGEN_MODE_SI, 0, 56, 0 },
+  { INPUT, "h_cr_SI_57", HW_H_CR, CGEN_MODE_SI, 0, 57, 0 },
+  { INPUT, "h_memory_HI_add__DFLT_pc_4", HW_H_MEMORY, CGEN_MODE_HI, 0, 0, COND_REF },
+  { INPUT, "h_memory_HI_add__DFLT_pc_add__DFLT_4_2", HW_H_MEMORY, CGEN_MODE_HI, 0, 0, COND_REF },
+  { INPUT, "pc", HW_H_PC, CGEN_MODE_USI, 0, 0, COND_REF },
+  { OUTPUT, "RA", HW_H_CR, CGEN_MODE_SI, OP_ENT (RA), 0, 0 },
+  { OUTPUT, "h_cr_SI_56", HW_H_CR, CGEN_MODE_SI, 0, 56, 0 },
+  { OUTPUT, "h_cr_SI_57", HW_H_CR, CGEN_MODE_SI, 0, 57, 0 },
+  { OUTPUT, "nbit", HW_H_NBIT, CGEN_MODE_BI, 0, 0, COND_REF },
+  { OUTPUT, "s1bit", HW_H_S1BIT, CGEN_MODE_BI, 0, 0, COND_REF },
+  { OUTPUT, "s2bit", HW_H_S2BIT, CGEN_MODE_BI, 0, 0, COND_REF },
+  { OUTPUT, "vbit", HW_H_VBIT, CGEN_MODE_BI, 0, 0, COND_REF },
+  { OUTPUT, "zbit", HW_H_ZBIT, CGEN_MODE_BI, 0, 0, COND_REF },
+  { END, (const char *)0, (enum cgen_hw_type)0, (enum cgen_mode)0, (enum cgen_operand_type)0, 0, 0 }
+};
+
+static const CGEN_OPINST sfmt_machulw_L_r_r__RA__RC_ops[] ATTRIBUTE_UNUSED = {
+  { INPUT, "F", HW_H_UFLAGS, CGEN_MODE_UINT, OP_ENT (F), 0, 0 },
+  { INPUT, "RB", HW_H_CR, CGEN_MODE_SI, OP_ENT (RB), 0, COND_REF },
+  { INPUT, "RC", HW_H_CR, CGEN_MODE_SI, OP_ENT (RC), 0, COND_REF },
+  { INPUT, "f_op_B", HW_H_UINT, CGEN_MODE_UINT, 0, 0, 0 },
+  { INPUT, "f_op_C", HW_H_UINT, CGEN_MODE_UINT, 0, 0, 0 },
+  { INPUT, "h_cr_SI_56", HW_H_CR, CGEN_MODE_SI, 0, 56, 0 },
+  { INPUT, "h_cr_SI_57", HW_H_CR, CGEN_MODE_SI, 0, 57, 0 },
+  { INPUT, "h_memory_HI_add__DFLT_pc_4", HW_H_MEMORY, CGEN_MODE_HI, 0, 0, COND_REF },
+  { INPUT, "h_memory_HI_add__DFLT_pc_add__DFLT_4_2", HW_H_MEMORY, CGEN_MODE_HI, 0, 0, COND_REF },
+  { INPUT, "pc", HW_H_PC, CGEN_MODE_USI, 0, 0, COND_REF },
+  { OUTPUT, "RA", HW_H_CR, CGEN_MODE_SI, OP_ENT (RA), 0, 0 },
+  { OUTPUT, "h_cr_SI_56", HW_H_CR, CGEN_MODE_SI, 0, 56, 0 },
+  { OUTPUT, "h_cr_SI_57", HW_H_CR, CGEN_MODE_SI, 0, 57, 0 },
+  { OUTPUT, "nbit", HW_H_NBIT, CGEN_MODE_BI, 0, 0, COND_REF },
+  { OUTPUT, "s1bit", HW_H_S1BIT, CGEN_MODE_BI, 0, 0, COND_REF },
+  { OUTPUT, "s2bit", HW_H_S2BIT, CGEN_MODE_BI, 0, 0, COND_REF },
+  { OUTPUT, "vbit", HW_H_VBIT, CGEN_MODE_BI, 0, 0, COND_REF },
+  { OUTPUT, "zbit", HW_H_ZBIT, CGEN_MODE_BI, 0, 0, COND_REF },
+  { END, (const char *)0, (enum cgen_hw_type)0, (enum cgen_mode)0, (enum cgen_operand_type)0, 0, 0 }
+};
+
+static const CGEN_OPINST sfmt_machulw_cc__RA__RC_ops[] ATTRIBUTE_UNUSED = {
+  { INPUT, "F", HW_H_UFLAGS, CGEN_MODE_UINT, OP_ENT (F), 0, COND_REF },
+  { INPUT, "Qcondb", HW_H_QCONDB, CGEN_MODE_BI, OP_ENT (QCONDB), 0, 0 },
+  { INPUT, "RB", HW_H_CR, CGEN_MODE_SI, OP_ENT (RB), 0, COND_REF },
+  { INPUT, "RC", HW_H_CR, CGEN_MODE_SI, OP_ENT (RC), 0, COND_REF },
+  { INPUT, "f_op_B", HW_H_UINT, CGEN_MODE_UINT, 0, 0, 0 },
+  { INPUT, "f_op_C", HW_H_UINT, CGEN_MODE_UINT, 0, 0, 0 },
+  { INPUT, "h_cr_SI_56", HW_H_CR, CGEN_MODE_SI, 0, 56, COND_REF },
+  { INPUT, "h_cr_SI_57", HW_H_CR, CGEN_MODE_SI, 0, 57, COND_REF },
+  { INPUT, "h_memory_HI_add__DFLT_pc_4", HW_H_MEMORY, CGEN_MODE_HI, 0, 0, COND_REF },
+  { INPUT, "h_memory_HI_add__DFLT_pc_add__DFLT_4_2", HW_H_MEMORY, CGEN_MODE_HI, 0, 0, COND_REF },
+  { INPUT, "pc", HW_H_PC, CGEN_MODE_USI, 0, 0, COND_REF },
+  { OUTPUT, "RB", HW_H_CR, CGEN_MODE_SI, OP_ENT (RB), 0, COND_REF },
+  { OUTPUT, "h_cr_SI_56", HW_H_CR, CGEN_MODE_SI, 0, 56, COND_REF },
+  { OUTPUT, "h_cr_SI_57", HW_H_CR, CGEN_MODE_SI, 0, 57, COND_REF },
+  { OUTPUT, "nbit", HW_H_NBIT, CGEN_MODE_BI, 0, 0, COND_REF },
+  { OUTPUT, "s1bit", HW_H_S1BIT, CGEN_MODE_BI, 0, 0, COND_REF },
+  { OUTPUT, "s2bit", HW_H_S2BIT, CGEN_MODE_BI, 0, 0, COND_REF },
+  { OUTPUT, "vbit", HW_H_VBIT, CGEN_MODE_BI, 0, 0, COND_REF },
+  { OUTPUT, "zbit", HW_H_ZBIT, CGEN_MODE_BI, 0, 0, COND_REF },
+  { END, (const char *)0, (enum cgen_hw_type)0, (enum cgen_mode)0, (enum cgen_operand_type)0, 0, 0 }
+};
+
+static const CGEN_OPINST sfmt_current_loop_end_ops[] ATTRIBUTE_UNUSED = {
+  { INPUT, "h_auxr_SI_2", HW_H_AUXR, CGEN_MODE_SI, 0, 2, COND_REF },
+  { INPUT, "h_auxr_SI_3", HW_H_AUXR, CGEN_MODE_SI, 0, 3, 0 },
+  { INPUT, "h_auxr_SI_34", HW_H_AUXR, CGEN_MODE_SI, 0, 34, COND_REF },
+  { INPUT, "h_auxr_SI_37", HW_H_AUXR, CGEN_MODE_SI, 0, 37, COND_REF },
+  { INPUT, "h_cr_SI_60", HW_H_CR, CGEN_MODE_SI, 0, 60, COND_REF },
+  { INPUT, "h_e1_BI", HW_H_E1, CGEN_MODE_BI, 0, 0, COND_REF },
+  { INPUT, "h_memory_UHI_countp", HW_H_MEMORY, CGEN_MODE_UHI, 0, 0, COND_REF },
+  { INPUT, "h_prof_offset_SI_0", HW_H_PROF_OFFSET, CGEN_MODE_SI, 0, 0, COND_REF },
+  { INPUT, "h_status32_SI_0", HW_H_STATUS32, CGEN_MODE_SI, 0, 0, COND_REF },
+  { INPUT, "h_timer_expire_SI_0", HW_H_TIMER_EXPIRE, CGEN_MODE_SI, 0, 0, COND_REF },
+  { INPUT, "h_ubit_BI", HW_H_UBIT, CGEN_MODE_BI, 0, 0, COND_REF },
+  { INPUT, "lbit", HW_H_LBIT, CGEN_MODE_BI, 0, 0, 0 },
+  { INPUT, "pc", HW_H_PC, CGEN_MODE_USI, 0, 0, 0 },
+  { OUTPUT, "h_auxr_SI_11", HW_H_AUXR, CGEN_MODE_SI, 0, 11, COND_REF },
+  { OUTPUT, "h_auxr_SI_33", HW_H_AUXR, CGEN_MODE_SI, 0, 33, COND_REF },
+  { OUTPUT, "h_cr_SI_29", HW_H_CR, CGEN_MODE_SI, 0, 29, COND_REF },
+  { OUTPUT, "h_cr_SI_60", HW_H_CR, CGEN_MODE_SI, 0, 60, COND_REF },
+  { OUTPUT, "h_e1_BI", HW_H_E1, CGEN_MODE_BI, 0, 0, COND_REF },
+  { OUTPUT, "h_memory_UHI_countp", HW_H_MEMORY, CGEN_MODE_UHI, 0, 0, COND_REF },
+  { OUTPUT, "pc", HW_H_PC, CGEN_MODE_USI, 0, 0, COND_REF },
+  { END, (const char *)0, (enum cgen_hw_type)0, (enum cgen_mode)0, (enum cgen_operand_type)0, 0, 0 }
+};
+
+static const CGEN_OPINST sfmt_current_loop_end_after_branch_ops[] ATTRIBUTE_UNUSED = {
+  { INPUT, "h_auxr_SI_2", HW_H_AUXR, CGEN_MODE_SI, 0, 2, COND_REF },
+  { INPUT, "h_auxr_SI_3", HW_H_AUXR, CGEN_MODE_SI, 0, 3, COND_REF },
+  { INPUT, "h_auxr_SI_34", HW_H_AUXR, CGEN_MODE_SI, 0, 34, COND_REF },
+  { INPUT, "h_auxr_SI_37", HW_H_AUXR, CGEN_MODE_SI, 0, 37, COND_REF },
+  { INPUT, "h_cr_SI_60", HW_H_CR, CGEN_MODE_SI, 0, 60, COND_REF },
+  { INPUT, "h_e1_BI", HW_H_E1, CGEN_MODE_BI, 0, 0, COND_REF },
+  { INPUT, "h_memory_UHI_countp", HW_H_MEMORY, CGEN_MODE_UHI, 0, 0, COND_REF },
+  { INPUT, "h_prof_offset_SI_0", HW_H_PROF_OFFSET, CGEN_MODE_SI, 0, 0, COND_REF },
+  { INPUT, "h_status32_SI_0", HW_H_STATUS32, CGEN_MODE_SI, 0, 0, COND_REF },
+  { INPUT, "h_timer_expire_SI_0", HW_H_TIMER_EXPIRE, CGEN_MODE_SI, 0, 0, COND_REF },
+  { INPUT, "h_ubit_BI", HW_H_UBIT, CGEN_MODE_BI, 0, 0, COND_REF },
+  { INPUT, "lbit", HW_H_LBIT, CGEN_MODE_BI, 0, 0, COND_REF },
+  { INPUT, "pc", HW_H_PC, CGEN_MODE_USI, 0, 0, COND_REF },
+  { OUTPUT, "h_auxr_SI_11", HW_H_AUXR, CGEN_MODE_SI, 0, 11, COND_REF },
+  { OUTPUT, "h_auxr_SI_33", HW_H_AUXR, CGEN_MODE_SI, 0, 33, COND_REF },
+  { OUTPUT, "h_cr_SI_29", HW_H_CR, CGEN_MODE_SI, 0, 29, COND_REF },
+  { OUTPUT, "h_cr_SI_60", HW_H_CR, CGEN_MODE_SI, 0, 60, COND_REF },
+  { OUTPUT, "h_e1_BI", HW_H_E1, CGEN_MODE_BI, 0, 0, COND_REF },
+  { OUTPUT, "h_memory_UHI_countp", HW_H_MEMORY, CGEN_MODE_UHI, 0, 0, COND_REF },
+  { OUTPUT, "pc", HW_H_PC, CGEN_MODE_USI, 0, 0, COND_REF },
+  { END, (const char *)0, (enum cgen_hw_type)0, (enum cgen_mode)0, (enum cgen_operand_type)0, 0, 0 }
+};
+
+#undef OP_ENT
+#undef INPUT
+#undef OUTPUT
+#undef END
+#undef COND_REF
+
+/* Operand instance lookup table.  */
+
+static const CGEN_OPINST *arc_cgen_opinst_table[MAX_INSNS] = {
+  0,
+  & sfmt_b_s_ops[0],
+  & sfmt_bcc_s_ops[0],
+  & sfmt_brcc_s_ops[0],
+  & sfmt_bcc_l_ops[0],
+  & sfmt_bcc_l_ops[0],
+  & sfmt_b_l_ops[0],
+  & sfmt_b_l_ops[0],
+  & sfmt_brcc_RC_ops[0],
+  & sfmt_brcc_RC_ops[0],
+  & sfmt_brcc_U6_ops[0],
+  & sfmt_brcc_U6_ops[0],
+  & sfmt_bl_s_ops[0],
+  & sfmt_blcc_ops[0],
+  & sfmt_blcc_ops[0],
+  & sfmt_bl_ops[0],
+  & sfmt_bl_d_ops[0],
+  & sfmt_ld_abs_ops[0],
+  & sfmt_ld__AW_abs_ops[0],
+  & sfmt_ld__AW_abs_ops[0],
+  & sfmt_ld_abs_ops[0],
+  & sfmt_ld_abc_ops[0],
+  & sfmt_ld__AW_abc_ops[0],
+  & sfmt_ld__AW_abc_ops[0],
+  & sfmt_ld_abc_ops[0],
+  & sfmt_ld_s_abc_ops[0],
+  & sfmt_ld_s_abu_ops[0],
+  & sfmt_ld_s_absp_ops[0],
+  & sfmt_ld_s_gprel_ops[0],
+  & sfmt_ld_s_pcrel_ops[0],
+  & sfmt_ldb_abs_ops[0],
+  & sfmt_ldb__AW_abs_ops[0],
+  & sfmt_ldb__AW_abs_ops[0],
+  & sfmt_ldb_as_abs_ops[0],
+  & sfmt_ldb_abc_ops[0],
+  & sfmt_ldb__AW_abc_ops[0],
+  & sfmt_ldb__AW_abc_ops[0],
+  & sfmt_ldb_as_abc_ops[0],
+  & sfmt_ldb_s_abc_ops[0],
+  & sfmt_ldb_s_abu_ops[0],
+  & sfmt_ldb_s_absp_ops[0],
+  & sfmt_ldb_s_gprel_ops[0],
+  & sfmt_ldb_abs_ops[0],
+  & sfmt_ldb__AW_abs_ops[0],
+  & sfmt_ldb__AW_abs_ops[0],
+  & sfmt_ldb_as_abs_ops[0],
+  & sfmt_ldb_abc_ops[0],
+  & sfmt_ldb__AW_abc_ops[0],
+  & sfmt_ldb__AW_abc_ops[0],
+  & sfmt_ldb_as_abc_ops[0],
+  & sfmt_ldw_abs_ops[0],
+  & sfmt_ldw__AW_abs_ops[0],
+  & sfmt_ldw__AW_abs_ops[0],
+  & sfmt_ldw_abs_ops[0],
+  & sfmt_ldw_abc_ops[0],
+  & sfmt_ldw__AW_abc_ops[0],
+  & sfmt_ldw__AW_abc_ops[0],
+  & sfmt_ldw_abc_ops[0],
+  & sfmt_ldw_s_abc_ops[0],
+  & sfmt_ldw_s_abu_ops[0],
+  & sfmt_ldw_s_gprel_ops[0],
+  & sfmt_ldw_abs_ops[0],
+  & sfmt_ldw__AW_abs_ops[0],
+  & sfmt_ldw__AW_abs_ops[0],
+  & sfmt_ldw_abs_ops[0],
+  & sfmt_ldw_abc_ops[0],
+  & sfmt_ldw__AW_abc_ops[0],
+  & sfmt_ldw__AW_abc_ops[0],
+  & sfmt_ldw_abc_ops[0],
+  & sfmt_ldw_s_abu_ops[0],
+  & sfmt_st_abs_ops[0],
+  & sfmt_st__AW_abs_ops[0],
+  & sfmt_st__AW_abs_ops[0],
+  & sfmt_st_abs_ops[0],
+  & sfmt_st_s_abu_ops[0],
+  & sfmt_st_s_absp_ops[0],
+  & sfmt_stb_abs_ops[0],
+  & sfmt_stb__AW_abs_ops[0],
+  & sfmt_stb__AW_abs_ops[0],
+  & sfmt_stb_as_abs_ops[0],
+  & sfmt_stb_s_abu_ops[0],
+  & sfmt_stb_s_absp_ops[0],
+  & sfmt_stw_abs_ops[0],
+  & sfmt_stw__AW_abs_ops[0],
+  & sfmt_stw__AW_abs_ops[0],
+  & sfmt_stw_abs_ops[0],
+  & sfmt_stw_s_abu_ops[0],
+  & sfmt_add_L_s12__RA__ops[0],
+  & sfmt_add_ccu6__RA__ops[0],
+  & sfmt_add_L_u6__RA__ops[0],
+  & sfmt_add_L_r_r__RA__RC_ops[0],
+  & sfmt_add_cc__RA__RC_ops[0],
+  & sfmt_add_s_abc_ops[0],
+  & sfmt_add_s_cbu3_ops[0],
+  & sfmt_add_s_mcah_ops[0],
+  & sfmt_add_s_absp_ops[0],
+  & sfmt_add_s_asspsp_ops[0],
+  & sfmt_add_s_gp_ops[0],
+  & sfmt_add_s_r_u7_ops[0],
+  & sfmt_adc_L_s12__RA__ops[0],
+  & sfmt_adc_ccu6__RA__ops[0],
+  & sfmt_adc_L_u6__RA__ops[0],
+  & sfmt_adc_L_r_r__RA__RC_ops[0],
+  & sfmt_adc_cc__RA__RC_ops[0],
+  & sfmt_add_L_s12__RA__ops[0],
+  & sfmt_add_ccu6__RA__ops[0],
+  & sfmt_add_L_u6__RA__ops[0],
+  & sfmt_add_L_r_r__RA__RC_ops[0],
+  & sfmt_add_cc__RA__RC_ops[0],
+  & sfmt_add_s_cbu3_ops[0],
+  & sfmt_I16_GO_SUB_s_go_ops[0],
+  & sfmt_sub_s_go_sub_ne_ops[0],
+  & sfmt_sub_s_ssb_ops[0],
+  & sfmt_add_s_asspsp_ops[0],
+  & sfmt_adc_L_s12__RA__ops[0],
+  & sfmt_adc_ccu6__RA__ops[0],
+  & sfmt_adc_L_u6__RA__ops[0],
+  & sfmt_adc_L_r_r__RA__RC_ops[0],
+  & sfmt_adc_cc__RA__RC_ops[0],
+  & sfmt_and_L_s12__RA__ops[0],
+  & sfmt_and_ccu6__RA__ops[0],
+  & sfmt_and_L_u6__RA__ops[0],
+  & sfmt_and_L_r_r__RA__RC_ops[0],
+  & sfmt_and_cc__RA__RC_ops[0],
+  & sfmt_I16_GO_SUB_s_go_ops[0],
+  & sfmt_and_L_s12__RA__ops[0],
+  & sfmt_and_ccu6__RA__ops[0],
+  & sfmt_and_L_u6__RA__ops[0],
+  & sfmt_and_L_r_r__RA__RC_ops[0],
+  & sfmt_and_cc__RA__RC_ops[0],
+  & sfmt_I16_GO_SUB_s_go_ops[0],
+  & sfmt_and_L_s12__RA__ops[0],
+  & sfmt_and_ccu6__RA__ops[0],
+  & sfmt_and_L_u6__RA__ops[0],
+  & sfmt_and_L_r_r__RA__RC_ops[0],
+  & sfmt_and_cc__RA__RC_ops[0],
+  & sfmt_I16_GO_SUB_s_go_ops[0],
+  & sfmt_and_L_s12__RA__ops[0],
+  & sfmt_and_ccu6__RA__ops[0],
+  & sfmt_and_L_u6__RA__ops[0],
+  & sfmt_and_L_r_r__RA__RC_ops[0],
+  & sfmt_and_cc__RA__RC_ops[0],
+  & sfmt_I16_GO_SUB_s_go_ops[0],
+  & sfmt_add_L_s12__RA__ops[0],
+  & sfmt_add_ccu6__RA__ops[0],
+  & sfmt_add_L_u6__RA__ops[0],
+  & sfmt_add_L_r_r__RA__RC_ops[0],
+  & sfmt_add_cc__RA__RC_ops[0],
+  & sfmt_add_L_s12__RA__ops[0],
+  & sfmt_add_ccu6__RA__ops[0],
+  & sfmt_add_L_u6__RA__ops[0],
+  & sfmt_add_L_r_r__RA__RC_ops[0],
+  & sfmt_add_cc__RA__RC_ops[0],
+  & sfmt_mov_L_s12__ops[0],
+  & sfmt_mov_ccu6__ops[0],
+  & sfmt_mov_L_u6__ops[0],
+  & sfmt_mov_L_r_r__RC_ops[0],
+  & sfmt_mov_cc__RC_ops[0],
+  & sfmt_mov_s_mcah_ops[0],
+  & sfmt_mov_s_mcahb_ops[0],
+  & sfmt_mov_s_r_u7_ops[0],
+  & sfmt_tst_L_s12__ops[0],
+  & sfmt_tst_ccu6__ops[0],
+  & sfmt_tst_L_u6__ops[0],
+  & sfmt_tst_L_r_r__RC_ops[0],
+  & sfmt_tst_cc__RC_ops[0],
+  & sfmt_tst_s_go_ops[0],
+  & sfmt_cmp_L_s12__ops[0],
+  & sfmt_cmp_ccu6__ops[0],
+  & sfmt_cmp_L_u6__ops[0],
+  & sfmt_cmp_L_r_r__RC_ops[0],
+  & sfmt_cmp_cc__RC_ops[0],
+  & sfmt_cmp_s_mcah_ops[0],
+  & sfmt_cmp_s_r_u7_ops[0],
+  & sfmt_cmp_L_s12__ops[0],
+  & sfmt_cmp_ccu6__ops[0],
+  & sfmt_cmp_L_u6__ops[0],
+  & sfmt_cmp_L_r_r__RC_ops[0],
+  & sfmt_cmp_cc__RC_ops[0],
+  & sfmt_add_L_s12__RA__ops[0],
+  & sfmt_add_ccu6__RA__ops[0],
+  & sfmt_add_L_u6__RA__ops[0],
+  & sfmt_add_L_r_r__RA__RC_ops[0],
+  & sfmt_add_cc__RA__RC_ops[0],
+  & sfmt_and_L_s12__RA__ops[0],
+  & sfmt_and_ccu6__RA__ops[0],
+  & sfmt_and_L_u6__RA__ops[0],
+  & sfmt_and_L_r_r__RA__RC_ops[0],
+  & sfmt_and_cc__RA__RC_ops[0],
+  & sfmt_sub_s_ssb_ops[0],
+  & sfmt_and_L_s12__RA__ops[0],
+  & sfmt_and_ccu6__RA__ops[0],
+  & sfmt_and_L_u6__RA__ops[0],
+  & sfmt_and_L_r_r__RA__RC_ops[0],
+  & sfmt_and_cc__RA__RC_ops[0],
+  & sfmt_sub_s_ssb_ops[0],
+  & sfmt_tst_L_s12__ops[0],
+  & sfmt_tst_ccu6__ops[0],
+  & sfmt_tst_L_u6__ops[0],
+  & sfmt_tst_L_r_r__RC_ops[0],
+  & sfmt_tst_cc__RC_ops[0],
+  & sfmt_btst_s_ssb_ops[0],
+  & sfmt_and_L_s12__RA__ops[0],
+  & sfmt_and_ccu6__RA__ops[0],
+  & sfmt_and_L_u6__RA__ops[0],
+  & sfmt_and_L_r_r__RA__RC_ops[0],
+  & sfmt_and_cc__RA__RC_ops[0],
+  & sfmt_and_L_s12__RA__ops[0],
+  & sfmt_and_ccu6__RA__ops[0],
+  & sfmt_and_L_u6__RA__ops[0],
+  & sfmt_and_L_r_r__RA__RC_ops[0],
+  & sfmt_and_cc__RA__RC_ops[0],
+  & sfmt_sub_s_ssb_ops[0],
+  & sfmt_add_L_s12__RA__ops[0],
+  & sfmt_add_ccu6__RA__ops[0],
+  & sfmt_add_L_u6__RA__ops[0],
+  & sfmt_add_L_r_r__RA__RC_ops[0],
+  & sfmt_add_cc__RA__RC_ops[0],
+  & sfmt_I16_GO_SUB_s_go_ops[0],
+  & sfmt_add_L_s12__RA__ops[0],
+  & sfmt_add_ccu6__RA__ops[0],
+  & sfmt_add_L_u6__RA__ops[0],
+  & sfmt_add_L_r_r__RA__RC_ops[0],
+  & sfmt_add_cc__RA__RC_ops[0],
+  & sfmt_I16_GO_SUB_s_go_ops[0],
+  & sfmt_add_L_s12__RA__ops[0],
+  & sfmt_add_ccu6__RA__ops[0],
+  & sfmt_add_L_u6__RA__ops[0],
+  & sfmt_add_L_r_r__RA__RC_ops[0],
+  & sfmt_add_cc__RA__RC_ops[0],
+  & sfmt_I16_GO_SUB_s_go_ops[0],
+  & sfmt_add_L_s12__RA__ops[0],
+  & sfmt_add_ccu6__RA__ops[0],
+  & sfmt_add_L_u6__RA__ops[0],
+  & sfmt_add_L_r_r__RA__RC_ops[0],
+  & sfmt_add_cc__RA__RC_ops[0],
+  & sfmt_add_L_s12__RA__ops[0],
+  & sfmt_add_ccu6__RA__ops[0],
+  & sfmt_add_L_u6__RA__ops[0],
+  & sfmt_add_L_r_r__RA__RC_ops[0],
+  & sfmt_add_cc__RA__RC_ops[0],
+  & sfmt_add_L_s12__RA__ops[0],
+  & sfmt_add_ccu6__RA__ops[0],
+  & sfmt_add_L_u6__RA__ops[0],
+  & sfmt_add_L_r_r__RA__RC_ops[0],
+  & sfmt_add_cc__RA__RC_ops[0],
+  & sfmt_mpy_L_s12__RA__ops[0],
+  & sfmt_mpy_ccu6__RA__ops[0],
+  & sfmt_mpy_L_u6__RA__ops[0],
+  & sfmt_mpy_L_r_r__RA__RC_ops[0],
+  & sfmt_mpy_cc__RA__RC_ops[0],
+  & sfmt_mpy_L_s12__RA__ops[0],
+  & sfmt_mpy_ccu6__RA__ops[0],
+  & sfmt_mpy_L_u6__RA__ops[0],
+  & sfmt_mpy_L_r_r__RA__RC_ops[0],
+  & sfmt_mpy_cc__RA__RC_ops[0],
+  & sfmt_mpy_L_s12__RA__ops[0],
+  & sfmt_mpy_ccu6__RA__ops[0],
+  & sfmt_mpy_L_u6__RA__ops[0],
+  & sfmt_mpy_L_r_r__RA__RC_ops[0],
+  & sfmt_mpy_cc__RA__RC_ops[0],
+  & sfmt_mpy_L_s12__RA__ops[0],
+  & sfmt_mpy_ccu6__RA__ops[0],
+  & sfmt_mpy_L_u6__RA__ops[0],
+  & sfmt_mpy_L_r_r__RA__RC_ops[0],
+  & sfmt_mpy_cc__RA__RC_ops[0],
+  & sfmt_j_L_r_r___RC_noilink__ops[0],
+  & sfmt_j_cc___RC_noilink__ops[0],
+  & sfmt_j_L_r_r___RC_ilink__ops[0],
+  & sfmt_j_cc___RC_ilink__ops[0],
+  & sfmt_j_L_s12__ops[0],
+  & sfmt_j_ccu6__ops[0],
+  & sfmt_j_L_u6__ops[0],
+  & sfmt_j_s_ops[0],
+  & sfmt_j_s__S_ops[0],
+  & sfmt_j_seq__S_ops[0],
+  & sfmt_j_seq__S_ops[0],
+  & sfmt_j_L_s12_d__ops[0],
+  & sfmt_j_ccu6_d__ops[0],
+  & sfmt_j_L_u6_d__ops[0],
+  & sfmt_j_L_r_r_d___RC__ops[0],
+  & sfmt_j_cc_d___RC__ops[0],
+  & sfmt_j_s_ops[0],
+  & sfmt_j_s__S_ops[0],
+  & sfmt_jl_L_s12__ops[0],
+  & sfmt_jl_ccu6__ops[0],
+  & sfmt_jl_L_u6__ops[0],
+  & sfmt_jl_s_ops[0],
+  & sfmt_jl_L_r_r___RC_noilink__ops[0],
+  & sfmt_jl_cc___RC_noilink__ops[0],
+  & sfmt_jl_L_s12__ops[0],
+  & sfmt_jl_ccu6__ops[0],
+  & sfmt_jl_L_u6__ops[0],
+  & sfmt_jl_L_r_r_d___RC__ops[0],
+  & sfmt_jl_cc_d___RC__ops[0],
+  & sfmt_jl_s_d_ops[0],
+  & sfmt_lp_L_s12__ops[0],
+  & sfmt_lpcc_ccu6_ops[0],
+  & sfmt_flag_L_s12__ops[0],
+  & sfmt_flag_ccu6__ops[0],
+  & sfmt_flag_L_u6__ops[0],
+  & sfmt_flag_L_r_r__RC_ops[0],
+  & sfmt_flag_cc__RC_ops[0],
+  & sfmt_lr_L_r_r___RC__ops[0],
+  & sfmt_lr_L_s12__ops[0],
+  & sfmt_lr_L_u6__ops[0],
+  & sfmt_sr_L_r_r___RC__ops[0],
+  & sfmt_sr_L_s12__ops[0],
+  & sfmt_sr_L_u6__ops[0],
+  & sfmt_asl_L_r_r__RC_ops[0],
+  & sfmt_asl_L_u6__ops[0],
+  & sfmt_I16_GO_SUB_s_go_ops[0],
+  & sfmt_asr_L_r_r__RC_ops[0],
+  & sfmt_asr_L_u6__ops[0],
+  & sfmt_I16_GO_SUB_s_go_ops[0],
+  & sfmt_asr_L_r_r__RC_ops[0],
+  & sfmt_asr_L_u6__ops[0],
+  & sfmt_I16_GO_SUB_s_go_ops[0],
+  & sfmt_asr_L_r_r__RC_ops[0],
+  & sfmt_asr_L_u6__ops[0],
+  & sfmt_rrc_L_r_r__RC_ops[0],
+  & sfmt_rrc_L_u6__ops[0],
+  & sfmt_sexb_L_r_r__RC_ops[0],
+  & sfmt_sexb_L_u6__ops[0],
+  & sfmt_I16_GO_SUB_s_go_ops[0],
+  & sfmt_sexw_L_r_r__RC_ops[0],
+  & sfmt_sexw_L_u6__ops[0],
+  & sfmt_I16_GO_SUB_s_go_ops[0],
+  & sfmt_sexb_L_r_r__RC_ops[0],
+  & sfmt_sexb_L_u6__ops[0],
+  & sfmt_I16_GO_SUB_s_go_ops[0],
+  & sfmt_sexw_L_r_r__RC_ops[0],
+  & sfmt_sexw_L_u6__ops[0],
+  & sfmt_I16_GO_SUB_s_go_ops[0],
+  & sfmt_abs_L_r_r__RC_ops[0],
+  & sfmt_abs_L_u6__ops[0],
+  & sfmt_I16_GO_SUB_s_go_ops[0],
+  & sfmt_not_L_r_r__RC_ops[0],
+  & sfmt_not_L_u6__ops[0],
+  & sfmt_I16_GO_SUB_s_go_ops[0],
+  & sfmt_rrc_L_r_r__RC_ops[0],
+  & sfmt_rrc_L_u6__ops[0],
+  & sfmt_ex_L_r_r__RC_ops[0],
+  & sfmt_ex_L_u6__ops[0],
+  & sfmt_I16_GO_SUB_s_go_ops[0],
+  & sfmt_swi_ops[0],
+  & sfmt_trap_s_ops[0],
+  & sfmt_brk_ops[0],
+  & sfmt_brk_ops[0],
+  & sfmt_asl_L_s12__RA__ops[0],
+  & sfmt_asl_ccu6__RA__ops[0],
+  & sfmt_asl_L_u6__RA__ops[0],
+  & sfmt_asl_L_r_r__RA__RC_ops[0],
+  & sfmt_asl_cc__RA__RC_ops[0],
+  & sfmt_add_s_cbu3_ops[0],
+  & sfmt_sub_s_ssb_ops[0],
+  & sfmt_I16_GO_SUB_s_go_ops[0],
+  & sfmt_asl_L_s12__RA__ops[0],
+  & sfmt_asl_ccu6__RA__ops[0],
+  & sfmt_asl_L_u6__RA__ops[0],
+  & sfmt_asl_L_r_r__RA__RC_ops[0],
+  & sfmt_asl_cc__RA__RC_ops[0],
+  & sfmt_sub_s_ssb_ops[0],
+  & sfmt_I16_GO_SUB_s_go_ops[0],
+  & sfmt_asl_L_s12__RA__ops[0],
+  & sfmt_asl_ccu6__RA__ops[0],
+  & sfmt_asl_L_u6__RA__ops[0],
+  & sfmt_asl_L_r_r__RA__RC_ops[0],
+  & sfmt_asl_cc__RA__RC_ops[0],
+  & sfmt_add_s_cbu3_ops[0],
+  & sfmt_sub_s_ssb_ops[0],
+  & sfmt_I16_GO_SUB_s_go_ops[0],
+  & sfmt_asl_L_s12__RA__ops[0],
+  & sfmt_asl_ccu6__RA__ops[0],
+  & sfmt_asl_L_u6__RA__ops[0],
+  & sfmt_asl_L_r_r__RA__RC_ops[0],
+  & sfmt_asl_cc__RA__RC_ops[0],
+  & sfmt_mul64_L_s12__ops[0],
+  & sfmt_mul64_ccu6__ops[0],
+  & sfmt_mul64_L_u6__ops[0],
+  & sfmt_mul64_L_r_r__RC_ops[0],
+  & sfmt_mul64_cc__RC_ops[0],
+  & sfmt_mul64_s_go_ops[0],
+  & sfmt_mul64_L_s12__ops[0],
+  & sfmt_mul64_ccu6__ops[0],
+  & sfmt_mul64_L_u6__ops[0],
+  & sfmt_mul64_L_r_r__RC_ops[0],
+  & sfmt_mul64_cc__RC_ops[0],
+  & sfmt_adds_L_s12__RA__ops[0],
+  & sfmt_adds_ccu6__RA__ops[0],
+  & sfmt_adds_L_u6__RA__ops[0],
+  & sfmt_adds_L_r_r__RA__RC_ops[0],
+  & sfmt_adds_cc__RA__RC_ops[0],
+  & sfmt_adds_L_s12__RA__ops[0],
+  & sfmt_adds_ccu6__RA__ops[0],
+  & sfmt_adds_L_u6__RA__ops[0],
+  & sfmt_adds_L_r_r__RA__RC_ops[0],
+  & sfmt_adds_cc__RA__RC_ops[0],
+  & sfmt_divaw_L_s12__RA__ops[0],
+  & sfmt_divaw_ccu6__RA__ops[0],
+  & sfmt_divaw_L_u6__RA__ops[0],
+  & sfmt_divaw_L_r_r__RA__RC_ops[0],
+  & sfmt_divaw_cc__RA__RC_ops[0],
+  & sfmt_asls_L_s12__RA__ops[0],
+  & sfmt_asls_ccu6__RA__ops[0],
+  & sfmt_asls_L_u6__RA__ops[0],
+  & sfmt_asls_L_r_r__RA__RC_ops[0],
+  & sfmt_asls_cc__RA__RC_ops[0],
+  & sfmt_asls_L_s12__RA__ops[0],
+  & sfmt_asls_ccu6__RA__ops[0],
+  & sfmt_asls_L_u6__RA__ops[0],
+  & sfmt_asls_L_r_r__RA__RC_ops[0],
+  & sfmt_asls_cc__RA__RC_ops[0],
+  & sfmt_asls_L_s12__RA__ops[0],
+  & sfmt_asls_ccu6__RA__ops[0],
+  & sfmt_asls_L_u6__RA__ops[0],
+  & sfmt_asls_L_r_r__RA__RC_ops[0],
+  & sfmt_asls_cc__RA__RC_ops[0],
+  & sfmt_asls_L_s12__RA__ops[0],
+  & sfmt_asls_ccu6__RA__ops[0],
+  & sfmt_asls_L_u6__RA__ops[0],
+  & sfmt_asls_L_r_r__RA__RC_ops[0],
+  & sfmt_asls_cc__RA__RC_ops[0],
+  & sfmt_swap_L_r_r__RC_ops[0],
+  & sfmt_swap_L_u6__ops[0],
+  & sfmt_swap_L_r_r__RC_ops[0],
+  & sfmt_norm_L_u6__ops[0],
+  & sfmt_rnd16_L_r_r__RC_ops[0],
+  & sfmt_rnd16_L_u6__ops[0],
+  & sfmt_abssw_L_r_r__RC_ops[0],
+  & sfmt_abssw_L_u6__ops[0],
+  & sfmt_rnd16_L_r_r__RC_ops[0],
+  & sfmt_abss_L_u6__ops[0],
+  & sfmt_abssw_L_r_r__RC_ops[0],
+  & sfmt_abssw_L_u6__ops[0],
+  & sfmt_rnd16_L_r_r__RC_ops[0],
+  & sfmt_rnd16_L_u6__ops[0],
+  & sfmt_swap_L_r_r__RC_ops[0],
+  & sfmt_swap_L_u6__ops[0],
+  & sfmt_nop_s_ops[0],
+  & sfmt_nop_s_ops[0],
+  & sfmt_pop_s_b_ops[0],
+  & sfmt_pop_s_blink_ops[0],
+  & sfmt_push_s_b_ops[0],
+  & sfmt_push_s_blink_ops[0],
+  & sfmt_mullw_L_s12__RA__ops[0],
+  & sfmt_mullw_ccu6__RA__ops[0],
+  & sfmt_mullw_L_u6__RA__ops[0],
+  & sfmt_mullw_L_r_r__RA__RC_ops[0],
+  & sfmt_mullw_cc__RA__RC_ops[0],
+  & sfmt_maclw_L_s12__RA__ops[0],
+  & sfmt_maclw_ccu6__RA__ops[0],
+  & sfmt_maclw_L_u6__RA__ops[0],
+  & sfmt_maclw_L_r_r__RA__RC_ops[0],
+  & sfmt_maclw_cc__RA__RC_ops[0],
+  & sfmt_maclw_L_s12__RA__ops[0],
+  & sfmt_maclw_ccu6__RA__ops[0],
+  & sfmt_maclw_L_u6__RA__ops[0],
+  & sfmt_maclw_L_r_r__RA__RC_ops[0],
+  & sfmt_maclw_cc__RA__RC_ops[0],
+  & sfmt_mullw_L_s12__RA__ops[0],
+  & sfmt_mullw_ccu6__RA__ops[0],
+  & sfmt_mullw_L_u6__RA__ops[0],
+  & sfmt_mullw_L_r_r__RA__RC_ops[0],
+  & sfmt_mullw_cc__RA__RC_ops[0],
+  & sfmt_machulw_L_s12__RA__ops[0],
+  & sfmt_machulw_ccu6__RA__ops[0],
+  & sfmt_machulw_L_u6__RA__ops[0],
+  & sfmt_machulw_L_r_r__RA__RC_ops[0],
+  & sfmt_machulw_cc__RA__RC_ops[0],
+  & sfmt_current_loop_end_ops[0],
+  & sfmt_current_loop_end_after_branch_ops[0],
+  & sfmt_current_loop_end_after_branch_ops[0],
+};
+
+/* Function to call before using the operand instance table.  */
+
+void
+arc_cgen_init_opinst_table (cd)
+     CGEN_CPU_DESC cd;
+{
+  int i;
+  const CGEN_OPINST **oi = & arc_cgen_opinst_table[0];
+  CGEN_INSN *insns = (CGEN_INSN *) cd->insn_table.init_entries;
+  for (i = 0; i < MAX_INSNS; ++i)
+    insns[i].opinst = oi[i];
+}
diff --git a/opcodes/arcompact-dis.c b/opcodes/arcompact-dis.c
new file mode 100644
index 0000000..545eecb
--- /dev/null
+++ b/opcodes/arcompact-dis.c
@@ -0,0 +1,3833 @@
+/* Instruction printing code for the ARC.
+   Copyright (C) 1994, 1995, 1997, 1998 Free Software Foundation, Inc.
+   Contributed by Doug Evans (dje@cygnus.com).
+
+   Sources derived from work done by Sankhya Technologies (www.sankhya.com)
+
+   Cleaned up , Comments Added, Support For A700 instructions by
+   Saurabh Verma (saurabh.verma@codito.com)
+   Ramana Radhakrishnan(ramana.radhakrishnan@codito.com)
+
+
+   This program 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 of the License, or
+   (at your option) any later version.
+
+   This program 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 this program; if not, write to the Free Software
+   Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston,
+   MA 02110-1301, USA.  */
+
+#include <ansidecl.h>
+#include "dis-asm.h"
+#include "opcode/arc.h"
+#include "elf-bfd.h"
+#include "elf/arc.h"
+#include <string.h>
+
+#include <ctype.h>
+#include <stdarg.h>
+#include "arc-dis.h"
+#include "arc-ext.h"
+
+  /*
+    warning: implicit declaration of function `printf_unfiltered'
+    if dbg is 1 then this definition is required
+  */
+  void printf_unfiltered (const char *,...);
+static bfd_vma bfd_getm32 (unsigned int);
+static bfd_vma bfd_getm32_ac (unsigned int) ATTRIBUTE_UNUSED;
+struct arcDisState arcAnalyzeInstr (bfd_vma, disassemble_info*);
+
+
+#ifndef dbg
+#define dbg	(0)
+#endif
+
+  /*
+    Ravi:
+    : undefined reference to `printf_unfiltered'
+    if dbg is 1 then this definition is required
+  */
+#if dbg
+  void printf_unfiltered (const char *,...)
+ {
+   va_list args;
+   va_start (args, format);
+   vfprintf_unfiltered (gdb_stdout, format, args);
+   va_end (args);
+ }
+#endif
+
+#undef _NELEM
+#define _NELEM(ary)	(sizeof(ary) / sizeof(ary[0]))
+
+#define BIT(word,n)       ((word) & (1 << n))
+#define BITS(word,s,e)    (((word) << (31-e)) >> (s+(31-e)))
+#define OPCODE(word)      (BITS ((word), 27, 31))
+#define FIELDA(word)      (BITS ((word), 0, 5))
+#define FIELDb(word)      (BITS ((word), 24, 26))
+#define FIELDB(word)      (BITS ((word), 12, 14))
+#define FIELDC(word)      (BITS ((word), 6, 11))
+#define OPCODE_AC(word)   (BITS ((word), 11, 15))
+#define FIELDA_AC(word)   (BITS ((word), 0, 2))
+#define FIELDB_AC(word)   (BITS ((word), 8, 10))
+#define FIELDC_AC(word)   (BITS ((word), 5, 7))
+#define FIELDU_AC(word)   (BITS ((word), 0, 4))
+
+/*
+ * FIELDS_AC is the 11-bit signed immediate value used for
+ * GP-relative instructions.
+ */
+#define FIELDS_AC(word)   (BITS (((signed int) word), 0, 8))
+
+/*
+ * FIELDD is signed in all of its uses, so we make sure argument is
+ * treated as signed for bit shifting purposes.
+ */
+#define FIELDD(word)      (BITS (((signed int) word), 16, 23))
+
+/*
+ * FIELDD9 is the 9-bit signed immediate value used for
+ * load/store instructions.
+ */
+#define FIELDD9(word)     ((BITS(((signed int)word),15,15) << 8) | (BITS((word),16,23)))
+
+/*
+ * FIELDS is the 12-bit signed immediate value
+ */
+#define FIELDS(word)      ((BITS(((signed int)word),0,5) << 6) | (BITS((word),6,11)))					\
+
+/*
+ * FIELD S9 is the 9-bit signed immediate value used for
+ * bbit0/bbit instruction
+ */
+#define FIELDS9(word)     (((BITS(((signed int)word),15,15) << 7) | (BITS((word),17,23))) << 1)
+#define FIELDS9_FLAG(word)     (((BITS(((signed int)word),0,5) << 6) | (BITS((word),6,11))) )
+
+#define PUT_NEXT_WORD_IN(a) {		\
+	if (is_limm==1 && !NEXT_WORD(1))       	\
+	  mwerror(state, "Illegal limm reference in last instruction!\n"); \
+        a = ((state->words[1] & 0xff00) | (state->words[1] & 0xff)) << 16; \
+        a |= ((state->words[1] & 0xff0000) | (state->words[1] & 0xff000000)) >> 16;	\
+	}
+
+#define CHECK_NULLIFY() do{		\
+	state->nullifyMode = BITS(state->words[0],5,5);	\
+	}while(0)
+
+#define CHECK_COND_NULLIFY() do {		\
+	state->nullifyMode = BITS(state->words[0],5,5);	\
+	cond = BITS(state->words[0],0,4);	\
+	}while(0)
+
+#define CHECK_FLAG_COND_NULLIFY() do{	\
+	if (is_shimm == 0) {			\
+	  flag = BIT(state->words[0],15);	\
+	  state->nullifyMode = BITS(state->words[0],5,5); \
+	  cond = BITS(state->words[0],0,4);	\
+	}					\
+	}while(0)
+
+#define CHECK_FLAG_COND() {		\
+	if (is_shimm == 0) {			\
+	  flag = BIT(state->words[0],15);	\
+	  cond = BITS(state->words[0],0,4);	\
+	}					\
+	}
+
+#define CHECK_FLAG() {			\
+	flag = BIT(state->words[0],15);	\
+	}
+
+#define CHECK_COND() {		                \
+	if (is_shimm == 0) {			\
+	  cond = BITS(state->words[0],0,4);	\
+	}					\
+	}
+
+#define CHECK_FIELD(field) {			\
+	if (field == 62) {			\
+	  is_limm++;				\
+	  field##isReg = 0;			\
+	  PUT_NEXT_WORD_IN(field);		\
+	  limm_value = field;			\
+	}					\
+	}
+
+#define CHECK_FIELD_A() {			\
+	fieldA = FIELDA(state->words[0]);	\
+	if (fieldA == 62) {			\
+	  fieldAisReg = 0;			\
+	  fieldA = 0;				\
+	}					\
+	}
+
+#define FIELD_B() {				\
+	fieldB = (FIELDB(state->words[0]) << 3);\
+	fieldB |= FIELDb(state->words[0]);	\
+	if (fieldB == 62) {			\
+	  fieldBisReg = 0;			\
+	  fieldB = 0;				\
+	}					\
+	}
+
+#define FIELD_C() {				\
+	fieldC = FIELDC(state->words[0]);	\
+	if (fieldC == 62) {  			\
+	  fieldCisReg = 0; 			\
+	}					\
+	}
+/********** Aurora SIMD ARC 8 - bit constant **********/
+#define FIELD_U8() {                            \
+                                                \
+          fieldC  = BITS(state->words[0],15,16);\
+          fieldC  = fieldC <<6;                 \
+          fieldC |= FIELDC(state->words[0]);    \
+          fieldCisReg = 0;                      \
+        }
+
+#define CHECK_FIELD_B() {			\
+	fieldB = (FIELDB(state->words[0]) << 3);\
+	fieldB |= FIELDb(state->words[0]);	\
+	CHECK_FIELD(fieldB);			\
+	}
+
+#define CHECK_FIELD_C() {			\
+	fieldC = FIELDC(state->words[0]);	\
+	CHECK_FIELD(fieldC);			\
+	}
+
+#define FIELD_C_S() {				\
+	fieldC_S = (FIELDC_S(state->words[0]) << 3);	\
+	}
+
+#define FIELD_B_S() {				\
+	fieldB_S = (FIELDB_S(state->words[0]) << 3);	\
+	}
+
+#define CHECK_FIELD_H_AC() {			\
+	fieldC = ((FIELDA_AC(state->words[0])) << 3);	\
+	fieldC |= FIELDC_AC(state->words[0]);	\
+	CHECK_FIELD(fieldC);			\
+	}
+
+#define FIELD_H_AC() {				\
+	fieldC = ((FIELDA_AC(state->words[0])) << 3);	\
+	fieldC |= FIELDC_AC(state->words[0]);	\
+	if (fieldC > 60) {  			\
+	  fieldCisReg = 0; 			\
+	  fieldC = 0;				\
+	}					\
+	}
+
+#define FIELD_C_AC() {				\
+	fieldC = FIELDC_AC(state->words[0]);	\
+	if (fieldC > 3) {  			\
+	  fieldC += 8;  			\
+	}				  	\
+	}
+
+#define FIELD_B_AC() {				\
+	fieldB = FIELDB_AC(state->words[0]);	\
+	if (fieldB > 3) {  			\
+	  fieldB += 8; 				\
+	}				  	\
+	}
+
+#define FIELD_A_AC() {				\
+	fieldA = FIELDA_AC(state->words[0]);	\
+	if (fieldA > 3) {  			\
+	  fieldA += 8; 				\
+	}				  	\
+	}
+
+#define IS_SMALL(x) (((field##x) < 256) && ((field##x) > -257))
+#define IS_REG(x)   (field##x##isReg)
+#define IS_SIMD_128_REG(x)  (usesSimdReg##x == 1)
+#define IS_SIMD_16_REG(x)   (usesSimdReg##x == 2)
+#define IS_SIMD_DATA_REG(x) (usesSimdReg##x == 3)
+#define WRITE_FORMAT_LB_Rx_RB(x)     WRITE_FORMAT(x,"[","]","","")
+#define WRITE_FORMAT_x_COMMA_LB(x)   WRITE_FORMAT(x,"",",[","",",[")
+#define WRITE_FORMAT_COMMA_x_RB(x)   WRITE_FORMAT(x,",","]",",","]")
+#define WRITE_FORMAT_x_RB(x)         WRITE_FORMAT(x,"","]","","]")
+#define WRITE_FORMAT_COMMA_x(x)      WRITE_FORMAT(x,",","",",","")
+#define WRITE_FORMAT_x_COMMA(x)      WRITE_FORMAT(x,"",",","",",")
+#define WRITE_FORMAT_x(x)            WRITE_FORMAT(x,"","","","")
+#define WRITE_FORMAT(x,cb1,ca1,cb,ca) strcat(formatString,              \
+                                     (IS_SIMD_128_REG(x) ? cb1"%S"ca1:  \
+                                      IS_SIMD_16_REG(x)  ? cb1"%I"ca1:  \
+                                      IS_SIMD_DATA_REG(x)? cb1"%D"ca1:  \
+                                      IS_REG(x)          ? cb1"%r"ca1:  \
+                                      usesAuxReg         ?  cb"%a"ca :  \
+                                      IS_SMALL(x) ? cb"%d"ca : cb"%h"ca))
+
+#define WRITE_FORMAT_LB() strcat(formatString, "[")
+#define WRITE_FORMAT_RB() strcat(formatString, "]")
+#define WRITE_COMMENT(str)	(state->comm[state->commNum++] = (str))
+#define WRITE_NOP_COMMENT() if (!fieldAisReg && !flag) WRITE_COMMENT("nop");
+
+#define NEXT_WORD(x) (offset += 4, state->words[x])
+
+#define NEXT_WORD_AC(x) (offset += 2, state->words[x])
+
+#define add_target(x) 	(state->targets[state->tcnt++] = (x))
+
+static char comment_prefix[] = "\t; ";
+short int enable_simd = 0;
+
+static const char *
+core_reg_name(struct arcDisState *state, int val)
+{
+  if (state->coreRegName)
+    return (*state->coreRegName)(state->_this, val);
+  return 0;
+}
+
+static const char *
+aux_reg_name(struct arcDisState *state, int val)
+{
+  if (state->auxRegName)
+    return (*state->auxRegName)(state->_this, val);
+  return 0;
+}
+
+static const char *
+cond_code_name(struct arcDisState *state, int val)
+{
+  if (state->condCodeName)
+    return (*state->condCodeName)(state->_this, val);
+  return 0;
+}
+
+static const char *
+instruction_name(struct arcDisState *state, int op1, int op2, int *flags)
+{
+  if (state->instName)
+    return (*state->instName)(state->_this, op1, op2, flags);
+  return 0;
+}
+
+static void
+mwerror(struct arcDisState *state, const char *msg)
+{
+  if (state->err != 0)
+    (*state->err)(state->_this, (msg));
+}
+
+static const char *
+post_address(struct arcDisState *state, int addr)
+{
+  static char id[3*_NELEM(state->addresses)];
+  unsigned int j, i = state->acnt;
+  if (i < _NELEM(state->addresses)) {
+    state->addresses[i] = addr;
+    ++state->acnt;
+    j = i*3;
+    id[j+0] = '@';
+    id[j+1] = '0'+i;
+    id[j+2] = 0;
+    return id+j;
+  }
+  return "";
+}
+
+static void
+my_sprintf (struct arcDisState *state, char *buf, const char*format, ...)
+{
+  char *bp;
+  const char *p;
+  int size, leading_zero, regMap[2];
+  long auxNum;
+  va_list ap;
+
+  va_start(ap,format);
+  bp = buf;
+  *bp = 0;
+  p = format;
+  auxNum = -1;
+  regMap[0] = 0;
+  regMap[1] = 0;
+  while (1)
+    switch(*p++) {
+    case 0: goto DOCOMM; /*(return) */
+    default:
+      *bp++ = p[-1];
+      break;
+    case '%':
+      size = 0;
+      leading_zero = 0;
+    RETRY: ;
+      switch(*p++)
+	{
+	case '0':
+	case '1':
+	case '2':
+	case '3':
+	case '4':
+	case '5':
+	case '6':
+	case '7':
+	case '8':
+	case '9':
+	  {
+	    /* size. */
+	    size = p[-1]-'0';
+	    if (size == 0) leading_zero = 1; /* e.g. %08x */
+	    while (*p >= '0' && *p <= '9')
+	      size = size*10+*p-'0', p++;
+	    goto RETRY;
+	  }
+#define inc_bp() bp = bp+strlen(bp)
+
+	case 'h':
+	  {
+	    unsigned u = va_arg(ap,int);
+	    /*
+	     * Hex.  We can change the format to 0x%08x in
+	     * one place, here, if we wish.
+	     * We add underscores for easy reading.
+	     */
+#define CDT_DEBUG
+	    if (u > 65536)
+#ifndef CDT_DEBUG
+	      sprintf(bp,"0x%x_%04x",u >> 16, u & 0xffff);
+#else
+	      sprintf(bp,"0x%08x",u);
+#endif // CDT_DEBUG
+	    else
+	      sprintf(bp,"0x%x",u);
+	    inc_bp();
+	  }
+	  break;
+	case 'X': case 'x':
+	  {
+	    int val = va_arg(ap,int);
+	    if (size != 0)
+	      if (leading_zero) sprintf(bp,"%0*x",size,val);
+	      else sprintf(bp,"%*x",size,val);
+	    else sprintf(bp,"%x",val);
+	    inc_bp();
+	  }
+	  break;
+	case 'd':
+	  {
+	    int val = va_arg(ap,int);
+	    if (size != 0) sprintf(bp,"%*d",size,val);
+	    else sprintf(bp,"%d",val);
+	    inc_bp();
+	  }
+	  break;
+	case 'r':
+	  {
+	    /* Register. */
+	    int val = va_arg(ap,int);
+
+#define REG2NAME(num, name) case num: sprintf(bp,""name); \
+			regMap[(num<32)?0:1] |= 1<<(num-((num<32)?0:32)); break;
+	    switch (val)
+	      {
+		REG2NAME(26, "gp");
+		REG2NAME(27, "fp");
+		REG2NAME(28, "sp");
+		REG2NAME(29, "ilink1");
+		REG2NAME(30, "ilink2");
+		REG2NAME(31, "blink");
+		REG2NAME(60, "lp_count");
+		REG2NAME(63, "pcl");
+	      default:
+		{
+		  const char *ext;
+		  ext = core_reg_name(state, val);
+		  if (ext) sprintf(bp, "%s", ext);
+		  else     sprintf(bp,"r%d",val);
+		}break;
+	      }
+	    inc_bp();
+	  } break;
+
+	case 'a':
+	  {
+	  /* Aux Register. */
+	    int val = va_arg(ap,int);
+	    char *ret;
+	    ret = arc_aux_reg_name(val);
+	    if(ret)
+	      sprintf(bp,"%s",ret);
+	    else
+	      {
+		const char *ext;
+		  ext = aux_reg_name(state, val);
+		  if (ext) sprintf(bp, "%s", ext);
+		  else     my_sprintf(state, bp,"%h",val);
+	      }
+
+	    inc_bp();
+	  }
+	  break;
+	case 's':
+	  {
+	    sprintf(bp,"%s",va_arg(ap,char*));
+	    inc_bp();
+	  }
+	  break;
+	case '*':
+	  {
+	    va_arg(ap,char*);
+	    inc_bp();
+	    break;
+	  }
+
+	  /* SIMD operands follow*/
+	case 'S':
+	  {
+	    int val = va_arg (ap,int);
+
+	    sprintf (bp, "vr%d",val);
+	    inc_bp ();
+	    break;
+	  }
+	case 'I':
+	  {
+	    int val = va_arg (ap,int);
+
+	    sprintf (bp, "i%d",val);
+	    inc_bp ();
+	    break;
+	  }
+	case 'D':
+	  {
+	    int val = va_arg (ap,int);
+
+	    sprintf (bp, "dr%d",val);
+	    inc_bp ();
+	    break;
+	  }
+	  /* SIMD operands end */
+	default:
+	  fprintf(stderr,"?? format %c\n",p[-1]);
+	  break;
+	}
+    }
+
+
+ DOCOMM: *bp = 0;
+
+}
+
+static void
+write_comments_(struct arcDisState *state, int shimm, int is_limm, long limm_value)
+{
+  if (state->commentBuffer != 0)
+    {
+      int i;
+      if (is_limm)
+	{
+	  const char *name = post_address(state, limm_value+shimm);
+	  if (*name != 0) WRITE_COMMENT(name);
+	}
+      for(i = 0; i < state->commNum; i++)
+	{
+	  if (i == 0) strcpy(state->commentBuffer, comment_prefix);
+	  else  strcat(state->commentBuffer, ", ");
+	  strncat(state->commentBuffer, state->comm[i], sizeof(state->commentBuffer));
+	}
+    }
+}
+
+#define write_comments2(x)	write_comments_(state, x, is_limm, limm_value)
+#define write_comments()	write_comments2(0)
+
+static const char *condName[] =
+{
+  /* 0..15. */
+  ""   , "z"  , "nz" , "p"  , "n"  , "c"  , "nc" , "v"  ,
+  "nv" , "gt" , "ge" , "lt" , "le" , "hi" , "ls" , "pnz",
+  "ss" , "sc"
+
+};
+
+static void
+write_instr_name_(struct arcDisState *state,
+		  const char *instrName,
+		  int cond,
+		  int condCodeIsPartOfName,
+		  int flag,
+		  int signExtend,
+		  int addrWriteBack,
+		  int directMem)
+{
+  strcpy(state->instrBuffer, instrName);
+  if (cond > 0)
+    {
+      int condlim = 0; /* condition code limit*/
+      const char *cc = 0;
+      if (!condCodeIsPartOfName) strcat(state->instrBuffer, ".");
+      condlim = 18;
+      if (cond < condlim)
+	cc = condName[cond];
+      else
+	cc = cond_code_name(state, cond);
+      if (!cc) cc = "???";
+      strcat(state->instrBuffer, cc);
+    }
+  if (flag) strcat(state->instrBuffer, ".f");
+  if (state->nullifyMode)
+    strcat(state->instrBuffer, ".d");
+  if (signExtend)    strcat(state->instrBuffer, ".x");
+  switch (addrWriteBack)
+  {
+    case 1: strcat(state->instrBuffer, ".a"); break;
+    case 2: strcat(state->instrBuffer, ".ab"); break;
+    case 3: strcat(state->instrBuffer, ".as"); break;
+  }
+  if (directMem)     strcat(state->instrBuffer, ".di");
+}
+
+#define write_instr_name()	{\
+  write_instr_name_(state, instrName,cond, condCodeIsPartOfName, flag, signExtend, addrWriteBack, directMem); \
+ formatString[0] = '\0'; \
+}
+
+enum
+{
+  op_BC = 0, op_BLC = 1, op_LD  = 2, op_ST = 3, op_MAJOR_4  = 4,
+  op_MAJOR_5 = 5, op_SIMD=6,      op_LD_ADD = 12, op_ADD_SUB_SHIFT  = 13,
+  op_ADD_MOV_CMP = 14, op_S = 15, op_LD_S = 16, op_LDB_S = 17,
+  op_LDW_S = 18, op_LDWX_S  = 19, op_ST_S = 20, op_STB_S = 21,
+  op_STW_S = 22, op_Su5     = 23, op_SP   = 24, op_GP    = 25, op_Pcl = 26,
+  op_MOV_S = 27, op_ADD_CMP = 28, op_BR_S = 29, op_B_S   = 30, op_BL_S = 31
+};
+
+extern disassemble_info tm_print_insn_info;
+
+/*
+ * bfd_getm32 - To retrieve the upper 16-bits of the ARCtangent-A5
+ *              basecase (32-bit) instruction
+ */
+static bfd_vma
+bfd_getm32 (data)
+     unsigned int data;
+{
+   bfd_vma value = 0;
+
+   value = ((data & 0xff00) | (data & 0xff)) << 16;
+   value |= ((data & 0xff0000) | (data & 0xff000000)) >> 16;
+   return value;
+}
+
+/*
+ * bfd_getm32_ac - To retrieve the upper 8-bits of the ARCompact
+ *                 16-bit instruction
+ */
+static bfd_vma
+bfd_getm32_ac (data)
+     unsigned int data;
+{
+   bfd_vma value = 0;
+
+   value = ((data & 0xff) << 8 | (data & 0xff00) >> 8);
+   return value;
+}
+
+/*
+ * sign_extend - Sign Extend the value
+ *
+ */
+static int
+sign_extend (int value, int bits)
+{
+  if (BIT(value, (bits-1)))
+    value |= (0xffffffff << bits);
+  return value;
+}
+
+/* dsmOneArcInst - This module is used to identify the instruction
+ *		   and to decode them based on the ARCtangent-A5
+ *                 instruction set architecture.
+ *                 First, the major opcode is computed. Based on the
+ *		   major opcode and sub opcode, the instruction is
+ * 		   identified. The appropriate decoding class is assigned
+ *		   based on the instruction.Further subopcode 2 is used in
+ *                 cases where decoding upto subopcode1 is not possible.
+ *
+ *		   The instruction is then decoded accordingly.
+ */
+static int
+dsmOneArcInst (bfd_vma addr, struct arcDisState *state, disassemble_info * info)
+{
+
+  int subopcode, mul;
+  int condCodeIsPartOfName=0;
+  int decodingClass;
+  const char *instrName;
+  int fieldAisReg=1, fieldBisReg=1, fieldCisReg=1;
+  int fieldA=0, fieldB=0, fieldC=0;
+  int flag=0, cond=0, is_shimm=0, is_limm=0;
+  long limm_value=0;
+  int signExtend=0, addrWriteBack=0, directMem=0;
+  int is_linked=0;
+  int offset=0;
+  int usesAuxReg = 0;
+  int usesSimdRegA= 0, usesSimdRegB=0, usesSimdRegC=0,simd_scale_u8=-1;
+  int flags = !E_ARC_MACH_A4;
+  char formatString[60];
+
+  state->nullifyMode = BR_exec_when_no_jump;
+  state->isBranch = 0;
+
+  state->_mem_load = 0;
+  state->_ea_present = 0;
+  state->_load_len = 0;
+  state->ea_reg1 = no_reg;
+  state->ea_reg2 = no_reg;
+  state->_offset = 0;
+  state->_addrWriteBack = 0;
+
+  state->instructionLen = info->bytes_per_line;
+
+  /* ARCtangent-A5 basecase instruction and little-endian mode */
+  if ((info->endian == BFD_ENDIAN_LITTLE) && (state->instructionLen == 4))
+    state->words[0] = bfd_getm32(state->words[0]);
+
+  if (state->instructionLen == 4)
+  {
+    if (!NEXT_WORD(0))
+      return 0;
+    /* Get the major opcode of the ARCtangent-A5 32-bit instruction. */
+    state->_opcode = OPCODE(state->words[0]);
+  }
+  else
+  {
+    /* ARCompact 16-bit instruction */
+    if (!NEXT_WORD_AC(0))
+      return 0;
+    /* Get the major opcode of the ARCompact 16-bit instruction. */
+    state->_opcode = OPCODE_AC(state->words[0]);
+  }
+
+  instrName = 0;
+  decodingClass = 0; /* default! */
+  mul = 0;
+  condCodeIsPartOfName=0;
+  state->commNum = 0;
+  state->tcnt = 0;
+  state->acnt = 0;
+  state->flow = noflow;
+
+  if (state->commentBuffer)
+    state->commentBuffer[0] = '\0';
+
+  /* Find the match for the opcode. Once the major opcode category is
+   * identified, get the subopcode to determine the exact instruction.
+   * Based on the instruction identified, select the decoding class.
+   * If condition code is part of the instruction name, then set the
+   * flag 'condCodeIsPartOfName'.
+   * For branch, jump instructions set 'isBranch' (state->isBranch).
+   */
+
+  switch (state->_opcode)
+    {
+    case op_BC:
+    /* Branch Conditionally */
+      instrName = "b";
+      decodingClass = 13;
+      condCodeIsPartOfName = 1;
+      state->isBranch = 1;
+      break;
+
+    case op_BLC:
+    /* Branch and Link, Compare and Branch  */
+      decodingClass = 9;
+      state->isBranch = 1;
+      switch (BITS(state->words[0],16,16))
+      {
+	case 0:
+	  if (!instrName)
+	    instrName = "bl";
+	  decodingClass = 13;
+      	  condCodeIsPartOfName = 1;
+	  break;
+	case 1:
+	  switch (BITS(state->words[0],0,3))
+	  {
+	    case 0: instrName = "breq"; break;
+	    case 1: instrName = "brne"; break;
+	    case 2: instrName = "brlt"; break;
+	    case 3: instrName = "brge"; break;
+	    case 4: instrName = "brlo"; break;
+	    case 5: instrName = "brhs"; break;
+	    case 14: instrName = "bbit0"; break;
+	    case 15: instrName = "bbit1"; break;
+	    default:
+	      instrName = "??? (0[3])";
+	      state->flow = invalid_instr;
+	      break;
+	  }
+	  break;
+	default:
+	  instrName = "??? (0[3])";
+	  state->flow = invalid_instr;
+	  break;
+      }
+      break;
+
+    case op_LD:
+    /* Load register with offset [major opcode 2]  */
+      decodingClass = 6;
+      switch (BITS(state->words[0],7,8))
+      {
+	case 0: instrName  = "ld";  state->_load_len = 4; break;
+	case 1: instrName  = "ldb"; state->_load_len = 1; break;
+	case 2: instrName  = "ldw"; state->_load_len = 2; break;
+	default:
+	  instrName = "??? (0[3])";
+	  state->flow = invalid_instr;
+	  break;
+      }
+      break;
+
+    case op_ST:
+    /* Store register with offset [major opcode 0x03] */
+      decodingClass = 7;
+      switch (BITS(state->words[0],1,2))
+      {
+	case 0: instrName = "st";  break;
+	case 1: instrName = "stb"; break;
+  	case 2: instrName = "stw"; break;
+	default:
+	  instrName = "??? (2[3])";
+	  state->flow = invalid_instr;
+	  break;
+      }
+      break;
+
+    case op_MAJOR_4:
+    /* ARC 32-bit basecase instructions with 3 Operands */
+      decodingClass = 0;  /* Default for 3 operand instructions */
+      subopcode = BITS(state->words[0],16,21);
+      switch (subopcode)
+        {
+	case 0: instrName = "add";  break;
+	case 1: instrName = "adc";  break;
+	case 2: instrName = "sub";  break;
+	case 3: instrName = "sbc";  break;
+	case 4: instrName = "and";  break;
+	case 5: instrName = "or";   break;
+	case 6: instrName = "bic";  break;
+	case 7: instrName = "xor";  break;
+	case 8: instrName = "max";  break;
+	case 9: instrName = "min";  break;
+	case 10:
+	  {
+	    if(state->words[0] == 0x264a7000)
+	      {
+		instrName = "nop";
+		decodingClass = 26;
+	      }
+	    else
+	      {
+		instrName = "mov";
+		decodingClass = 12;
+	      }
+	    break;
+	  }
+	case 11: instrName = "tst"; decodingClass = 2; break;
+	case 12: instrName = "cmp"; decodingClass = 2; break;
+	case 13: instrName = "rcmp"; decodingClass = 2; break;
+	case 14: instrName = "rsub"; break;
+	case 15: instrName = "bset"; break;
+	case 16: instrName = "bclr"; break;
+	case 17: instrName = "btst"; decodingClass = 2; break;
+	case 18: instrName = "bxor"; break;
+	case 19: instrName = "bmsk"; break;
+	case 20: instrName = "add1"; break;
+	case 21: instrName = "add2"; break;
+	case 22: instrName = "add3"; break;
+	case 23: instrName = "sub1"; break;
+	case 24: instrName = "sub2"; break;
+	case 25: instrName = "sub3"; break;
+	case 26: instrName = "mpylo"; break;
+	case 27: instrName = "mpyhi"; break;
+	case 28: instrName = "mpyhiu";break;
+	case 29: instrName = "mpylou";break;
+        case 32:
+        case 33:
+	  instrName = "j";
+        case 34:
+        case 35:
+	  if (!instrName) instrName = "jl";
+	  decodingClass = 4;
+	  condCodeIsPartOfName = 1;
+          state->isBranch = 1;
+	  break;
+        case 40:
+	  instrName = "lp";
+	  decodingClass = 11;
+	  condCodeIsPartOfName = 1;
+          state->isBranch = 1;
+	  break;
+        case 41: instrName = "flag"; decodingClass = 3; break;
+        case 42: instrName = "lr"; decodingClass = 10;  break;
+        case 43: instrName = "sr"; decodingClass =  8;  break;
+        case 47:
+	  decodingClass = 1;
+          switch (BITS(state->words[0],0,5)) /* Checking based on Subopcode2 */
+	  {
+	  case 0: instrName = "asl";  break;
+	  case 1: instrName = "asr";  break;
+	  case 2: instrName = "lsr";  break;
+	  case 3: instrName = "ror";  break;
+	  case 4: instrName = "rrc";  break;
+	  case 5: instrName = "sexb"; break;
+	  case 6: instrName = "sexw"; break;
+	  case 7: instrName = "extb"; break;
+	  case 8: instrName = "extw"; break;
+	  case 9: instrName = "abs";  break;
+	  case 10: instrName = "not"; break;
+	  case 11: instrName = "rlc"; break;
+	  case 12:  instrName = "ex";
+
+
+	    decodingClass = 34;
+	    break; // ramana adds
+
+	  case 63:
+	    decodingClass = 26;
+	    switch (BITS(state->words[0],24,26))
+	      {
+	      case 1 : instrName = "sleep"; decodingClass = 32; break;
+	      case 2 :
+		if((info->mach) == ARC_MACH_ARC7)
+		  instrName = "trap0";
+		else
+		  instrName = "swi";
+		break;
+	      case 3:
+
+		if(BITS(state->words[0],22,23) == 1)
+		  instrName = "sync" ;
+
+		break;
+	      case 4 : instrName = "rtie" ; break;
+	      case 5 : instrName = "brk"; break;
+	      default:
+
+		instrName = "???";
+		state->flow=invalid_instr;
+		break;
+	      }
+	    break;
+	  }
+	  break;
+      }
+
+      if (!instrName)
+      {
+        subopcode = BITS(state->words[0],17,21);
+	decodingClass = 5;
+	switch (subopcode)
+    	{
+	  case 24: instrName  = "ld";   state->_load_len = 4; break;
+	  case 25: instrName  = "ldb";  state->_load_len = 1; break;
+	  case 26: instrName  = "ldw";  state->_load_len = 2; break;
+	  default:
+	    instrName = "??? (0[3])";
+	    state->flow = invalid_instr;
+	    break;
+	}
+      }
+      break;
+
+    case op_MAJOR_5:
+    /* ARC 32-bit extension instructions */
+      decodingClass = 0;  /* Default for Major opcode 5 ... */
+      subopcode = BITS(state->words[0],16,21);
+      switch (subopcode)
+      {
+	case 0: instrName = "asl"; break;
+	case 1: instrName = "lsr"; break;
+	case 2: instrName = "asr"; break;
+	case 3: instrName = "ror"; break;
+	case 4: instrName = "mul64"; mul =1; decodingClass = 2; break;
+	case 5: instrName = "mulu64"; mul =1; decodingClass = 2; break;
+
+	  /* ARC A700 */
+      case 6: instrName = "adds" ;break;
+
+      case 7: instrName = "subs"; break;
+      case 8: instrName = "divaw"; break;
+      case 0xA: instrName = "asls"; break;
+      case 0xB: instrName = "asrs"; break;
+      case 0x28: instrName = "addsdw";break;
+      case 0x29: instrName = "subsdw"; break;
+
+      case 47:
+	switch(BITS(state->words[0],0,5))
+	  {
+	  case 0: instrName = "swap"; decodingClass = 1; break;
+	  case 1: instrName = "norm"; decodingClass = 1; break;
+	    /* ARC A700 DSP Extensions */
+	  case 2: instrName = "sat16"; decodingClass = 1; break;
+	  case 3: instrName = "rnd16"; decodingClass = 1; break;
+	  case 4: instrName = "abssw"; decodingClass = 1; break;
+	  case 5: instrName = "abss"; decodingClass = 1; break;
+	  case 6: instrName = "negsw"; decodingClass = 1; break;
+	  case 7: instrName = "negs"; decodingClass = 1; break;
+
+
+	  case 8: instrName = "normw"; decodingClass = 1; break;
+	  default:
+	    instrName = "???";
+	    state->flow =invalid_instr;
+	    break;
+
+	  }
+	break;
+      default:
+	instrName = "??? (2[3])";
+	state->flow = invalid_instr;
+	break;
+      }
+    break;
+
+
+    /* Aurora SIMD instruction support*/
+  case op_SIMD:
+
+    if (enable_simd)
+      {
+	decodingClass = 42;
+	subopcode     = BITS(state->words[0], 17, 23);
+
+	switch (subopcode)
+	  {
+
+	  case 68:
+	    instrName = "vld32";
+	    decodingClass = 37;
+	    usesSimdRegA=1;
+	    usesSimdRegB=2;
+	    usesSimdRegC=0;
+	    simd_scale_u8 = 2;
+	    break;
+
+	  case 72:
+	    instrName = "vld64";
+	    decodingClass = 37;
+	    usesSimdRegA  = 1;
+	    usesSimdRegB  = 2;
+	    usesSimdRegC  = 0;
+	    simd_scale_u8 = 3;
+	    break;
+
+	  case 74:
+	    instrName = "vld64w";
+	    decodingClass = 37;
+	    usesSimdRegA  = 1;
+	    usesSimdRegB  = 2;
+	    usesSimdRegC  = 0;
+	    simd_scale_u8 = 3;
+	    break;
+
+	  case 70:
+	    instrName = "vld32wl";
+	    decodingClass = 37;
+	    usesSimdRegA  = 1;
+	    usesSimdRegB  = 2;
+	    usesSimdRegC  = 0;
+	    simd_scale_u8 = 2;
+	    break;
+
+	  case 66:
+	    instrName = "vld32wh";
+	    decodingClass = 37;
+	    usesSimdRegA  = 1;
+	    usesSimdRegB  = 2;
+	    usesSimdRegC  = 0;
+	    simd_scale_u8 = 2;
+	    break;
+
+	  case 76:
+	    instrName = "vld128";
+	    decodingClass = 37;
+	    usesSimdRegA  = 1;
+	    usesSimdRegB  = 2;
+	    usesSimdRegC  = 0;
+	    simd_scale_u8 = 4;
+	    break;
+
+	  case 78:
+	    {
+	      short  sub_subopcode = BITS(state->words[0], 15, 16);
+	      switch (sub_subopcode)
+		{
+		case 0:
+		  instrName = "vld128r";
+		  decodingClass = 38;
+		  usesSimdRegA  = 1;
+		  usesSimdRegB  = usesSimdRegC = 0;
+		  break;
+		default:
+		  instrName = "SIMD";
+		  state->flow = invalid_instr;
+		}
+	    }
+	    break;
+	  case 71:
+	    instrName = "vst16_0";
+	    decodingClass = 37;
+	    usesSimdRegA = 1;
+	    usesSimdRegB = 2;
+	    usesSimdRegC = 0;
+	    simd_scale_u8 = 1;
+	    break;
+
+	  case 81:
+	    instrName = "vst16_1";
+	    decodingClass = 37;
+	    usesSimdRegA = 1;
+	    usesSimdRegB = 2;
+	    usesSimdRegC = 0;
+	    simd_scale_u8 = 1;
+	    break;
+
+	  case 67:
+	    instrName = "vst16_2";
+	    decodingClass = 37;
+	    usesSimdRegA = 1;
+	    usesSimdRegB = 2;
+	    usesSimdRegC = 0;
+	    simd_scale_u8 = 1;
+	    break;
+
+	  case 75:
+	    instrName = "vst16_3";
+	    decodingClass = 37;
+	    usesSimdRegA = 1;
+	    usesSimdRegB = 2;
+	    usesSimdRegC = 0;
+	    simd_scale_u8 = 1;
+	    break;
+
+	  case 83:
+	    instrName = "vst16_4";
+	    decodingClass = 37;
+	    usesSimdRegA = 1;
+	    usesSimdRegB = 2;
+	    usesSimdRegC = 0;
+	    simd_scale_u8 = 1;
+	    break;
+
+	  case 89:
+	    instrName = "vst16_5";
+	    decodingClass = 37;
+	    usesSimdRegA = 1;
+	    usesSimdRegB = 2;
+	    usesSimdRegC = 0;
+	    simd_scale_u8 = 1;
+	    break;
+
+	  case 91:
+	    instrName = "vst16_6";
+	    decodingClass = 37;
+	    usesSimdRegA = 1;
+	    usesSimdRegB = 2;
+	    usesSimdRegC = 0;
+	    simd_scale_u8 = 1;
+	    break;
+
+	  case 93:
+	    instrName = "vst16_7";
+	    decodingClass = 37;
+	    usesSimdRegA = 1;
+	    usesSimdRegB = 2;
+	    usesSimdRegC = 0;
+	    simd_scale_u8 = 1;
+	    break;
+
+	  case 69:
+	    instrName = "vst32_0";
+	    decodingClass = 37;
+	    usesSimdRegA  = 1;
+	    usesSimdRegB  = 2;
+	    usesSimdRegC  = 0;
+	    simd_scale_u8 = 2;
+	    break;
+
+	  case 82:
+	    instrName = "vst32_2";
+	    decodingClass = 37;
+	    usesSimdRegA  = 1;
+	    usesSimdRegB  = 2;
+	    usesSimdRegC  = 0;
+	    simd_scale_u8 = 2;
+	    break;
+
+	  case 86:
+	    instrName = "vst32_4";
+	    decodingClass = 37;
+	    usesSimdRegA  = 1;
+	    usesSimdRegB  = 2;
+	    usesSimdRegC  = 0;
+	    simd_scale_u8 = 2;
+	    break;
+
+	  case 88:
+	    instrName = "vst32_6";
+	    decodingClass = 37;
+	    usesSimdRegA  = 1;
+	    usesSimdRegB  = 2;
+	    usesSimdRegC  = 0;
+	    simd_scale_u8 = 2;
+	    break;
+
+	  case 73:
+	    instrName = "vst64";
+	    decodingClass = 37 ;
+	    usesSimdRegA  = 1;
+	    usesSimdRegB  = 2;
+	    usesSimdRegC  = 0;
+	    simd_scale_u8 = 3;
+	    break;
+
+	  case 77:
+	    instrName = "vst128";
+	    decodingClass = 37;
+	    usesSimdRegA  = 1;
+	    usesSimdRegB  = 2;
+	    usesSimdRegC  = 0;
+	    simd_scale_u8 = 4;
+	    break;
+
+	  case 79:
+	    {
+	      short sub_subopcode = BITS(state->words[0], 15, 16);
+	      switch (sub_subopcode)
+		{
+		case 0:
+		  instrName = "vst128r";
+		  decodingClass = 38;
+		  usesSimdRegA = 1;
+		  usesSimdRegB = usesSimdRegC = 0;
+		  break;
+
+		default:
+		  instrName = "SIMD";
+		  state->flow = invalid_instr;
+		}
+
+	    }
+	    break;
+	  case 80:
+	    instrName = "vmvw";
+	    usesSimdRegA = usesSimdRegB = 1;
+	    usesSimdRegC = 0;
+	    decodingClass = 39;
+	    break;
+
+	  case 84:
+	    instrName = "vmvzw";
+	    decodingClass = 39;
+	    usesSimdRegA = usesSimdRegB = 1;
+	    usesSimdRegC = 0;
+	    break;
+
+	  case 90:
+	    instrName = "vmovw";
+	    decodingClass = 39;
+	    usesSimdRegA  = 1;
+	    usesSimdRegB  = usesSimdRegC = 0;
+	    break;
+
+	  case 94:
+	    instrName = "vmovzw";
+	    decodingClass = 39;
+	    usesSimdRegA  = 1;
+	    usesSimdRegB  = usesSimdRegC = 0;
+	    break;
+
+	  case 85:
+	    instrName = "vmvaw";
+	    decodingClass = 39;
+	    usesSimdRegA  = usesSimdRegB = 1;
+	    usesSimdRegC  = 0;
+	    break;
+
+	  case 95:
+	    instrName = "vmovaw";
+	    decodingClass = 39;
+	    usesSimdRegA  = 1;
+	    usesSimdRegB  = usesSimdRegC = 0;
+	    break;
+
+	  case 10:
+	    {
+	      short sub_subopcode = BITS(state->words[0], 15, 16);
+	      switch (sub_subopcode)
+		{
+		case 0:
+		  instrName = "vaddw"; decodingClass = 42;
+		  usesSimdRegA = usesSimdRegB = usesSimdRegC =1;
+		  break;
+
+		case 1:
+		  instrName = "vaddaw"; decodingClass = 42;
+		  usesSimdRegA = usesSimdRegB = usesSimdRegC =1;
+		  break;
+
+		case 2:
+		  instrName = "vbaddw"; decodingClass = 42;
+		  usesSimdRegA = usesSimdRegB = 1;
+		  usesSimdRegC = 0;
+		  break;
+		}
+	      break;
+	    }
+
+	  case 11:
+	    {
+	      short sub_subopcode = BITS(state->words[0], 15, 16);
+	      switch (sub_subopcode)
+		{
+		case 0:
+		  instrName = "vsubw";
+		  decodingClass = 42;
+		  usesSimdRegA  = usesSimdRegB = usesSimdRegC = 1;
+		  break;
+
+		case 1:
+		  instrName = "vsubaw";
+		  decodingClass = 42;
+		  usesSimdRegA  = usesSimdRegB = usesSimdRegC = 1;
+		  break;
+
+		case 2:
+		  instrName = "vbsubw";
+		  decodingClass = 42;
+		  usesSimdRegA  = usesSimdRegB = 1;
+		  usesSimdRegC  = 0;
+		  break;
+		}
+	    }
+	    break;
+
+	  case 12:
+	    {
+	      short sub_subopcode = BITS(state->words[0], 15, 16);
+	      switch (sub_subopcode)
+		{
+		case 0:
+		  instrName = "vmulw";
+		  decodingClass = 42;
+		  usesSimdRegA  = usesSimdRegB = usesSimdRegC = 1;
+		  break;
+
+		case 1:
+		  instrName = "vmulaw";
+		  decodingClass = 42;
+		  usesSimdRegA  = usesSimdRegB = usesSimdRegC = 1;
+		  break;
+
+		case 2:
+		  instrName = "vbmulw";
+		  decodingClass = 42;
+		  usesSimdRegA  = usesSimdRegB = 1;
+		  usesSimdRegC  = 0;
+		  break;
+
+		case 3:
+		  instrName = "vbmulaw";
+		  decodingClass = 42;
+		  usesSimdRegA  = usesSimdRegB = 1;
+		  usesSimdRegC  = 0;
+		  break;
+		}
+	    }
+	    break;
+
+	  case 13:
+	    {
+	      short sub_subopcode = BITS(state->words[0], 15, 16);
+	      switch (sub_subopcode)
+		{
+		case 0:
+		  instrName = "vmulfw";
+		  decodingClass = 42;
+		  usesSimdRegA  = usesSimdRegB = usesSimdRegC = 1;
+		  break;
+
+		case 1:
+		  instrName = "vmulfaw";
+		  decodingClass = 42;
+		  usesSimdRegA  = usesSimdRegB = usesSimdRegC = 1;
+		  break;
+
+		case 2:
+		  instrName = "vbmulfw";
+		  decodingClass = 42;
+		  usesSimdRegA  = usesSimdRegB = 1;
+		  usesSimdRegC  = 0;
+		  break;
+		}
+	    }
+	    break;
+
+	  case 15:
+	    {
+	      short sub_subopcode = BITS(state->words[0], 15, 16);
+	      switch (sub_subopcode)
+		{
+		case 0:
+		  instrName = "vsummw";
+		  decodingClass = 42;
+		  usesSimdRegA = usesSimdRegB = usesSimdRegC = 1;
+		  break;
+		case 2:
+		  instrName = "vbrsubw";
+		  decodingClass = 42;
+		  usesSimdRegA  = usesSimdRegB = 1;
+		  usesSimdRegC  = 0;
+		  break;
+		}
+	    }
+	    break;
+
+	  case 23:
+	    {
+	      short sub_subopcode = BITS(state->words[0], 15, 16);
+	      switch (sub_subopcode)
+		{
+		case 0:
+		  instrName = "vmr7w";
+		  decodingClass = 42;
+		  usesSimdRegA  = usesSimdRegB = usesSimdRegC = 1;
+		  break;
+
+		case 1:
+		  instrName = "vmr7aw";
+		  decodingClass = 42;
+		  usesSimdRegA  = usesSimdRegB = usesSimdRegC = 1;
+		  break;
+
+
+		case 2:
+		  switch (BITS(state->words[0], 0, 5))
+		    {
+		    case 0:
+		      instrName = "vaddsuw";
+		      decodingClass = 40;
+		      usesSimdRegC  = usesSimdRegB = 1;
+		      usesSimdRegA  = 0;
+		      break;
+
+		    case 1:
+		      instrName = "vabsw";
+		      decodingClass = 40;
+		      usesSimdRegC  = usesSimdRegB = 1;
+		      usesSimdRegA  = 0;
+		      break;
+
+		    case 2:
+		      instrName = "vsignw";
+		      decodingClass = 40;
+		      usesSimdRegC  = usesSimdRegB = 1;
+		      usesSimdRegA  = 0;
+		      break;
+
+		    case 3:
+		      instrName = "vupbw";
+		      decodingClass = 40;
+		      usesSimdRegC  = usesSimdRegB = 1;
+		      usesSimdRegA  = 0;
+		      break;
+
+		    case 4:
+		      instrName = "vexch1";
+		      decodingClass = 40;
+		      usesSimdRegC  = usesSimdRegB = 1;
+		      usesSimdRegA  = 0;
+		      break;
+
+		    case 5:
+		      instrName = "vexch2";
+		      decodingClass = 40;
+		      usesSimdRegC  = usesSimdRegB = 1;
+		      usesSimdRegA  = 0;
+		      break;
+
+		    case 6:
+		      instrName = "vexch4";
+		      decodingClass = 40;
+		      usesSimdRegC  = usesSimdRegB = 1;
+		      usesSimdRegA  = 0;
+		      break;
+
+		    case 7:
+		      instrName = "vupsbw";
+		      decodingClass = 40;
+		      usesSimdRegC  = usesSimdRegB = 1;
+		      usesSimdRegA  = 0;
+		      break;
+
+		    case 8:
+		      instrName = "vdirun";
+		      decodingClass = 40;
+		      usesSimdRegC  = usesSimdRegB = usesSimdRegA = 0;
+		      break;
+
+		    case 9:
+		      instrName = "vdorun";
+		      decodingClass = 40;
+		      usesSimdRegC  = usesSimdRegB = usesSimdRegA = 0;
+		      break;
+
+		    case 10:
+		      instrName = "vdiwr";
+		      decodingClass = 40;
+		      usesSimdRegB  = 3;
+		      usesSimdRegA  = usesSimdRegC = 0;
+		      fieldCisReg   = 1;
+		      break;
+
+		    case 11:
+		      instrName = "vdowr";
+		      decodingClass = 40;
+		      usesSimdRegB  = 3;
+		      usesSimdRegA  = usesSimdRegC = 0;
+		      fieldCisReg   = 1;
+		      break;
+
+		    case 12:
+		      instrName = "vdird";
+		      decodingClass = 40;
+		      usesSimdRegB  = 1;
+		      usesSimdRegC  = 3;
+		      usesSimdRegA  = 0;
+		      break;
+
+		    case 13:
+		      instrName = "vdord";
+		      decodingClass = 40;
+		      usesSimdRegB  = 1;
+		      usesSimdRegC  = 3;
+		      usesSimdRegA  = 0;
+		      break;
+
+		    case 63:
+		      {
+			switch (BITS(state->words[0], 24, 25))
+			  {
+			  case 0:
+			    instrName = "vrec";
+			    decodingClass = 43;
+			    usesSimdRegC  = 0;
+			    usesSimdRegB  = usesSimdRegA = 0;
+			    break;
+
+			  case 1:
+			    instrName = "vrecrun";
+			    decodingClass = 43;
+			    usesSimdRegC  = 0;
+			    usesSimdRegA  = usesSimdRegB = 0;
+			    break;
+
+			  case 2:
+			    instrName = "vrun";
+			    decodingClass = 43;
+			    usesSimdRegC  = 0;
+			    usesSimdRegB  = usesSimdRegA = 0;
+			    break;
+
+			  case 3:
+			    instrName = "vendrec";
+			    decodingClass = 43;
+			    usesSimdRegC  = 0;
+			    usesSimdRegB  = usesSimdRegA = 0;
+			    break;
+			  }
+		      }
+		      break;
+		    }
+		  break;
+
+		case 3:
+		  switch (BITS(state->words[0], 0, 2))
+		    {
+		    case 1:
+		      instrName = "vabsaw";
+		      decodingClass = 40;
+		      usesSimdRegC  = usesSimdRegB = 1;
+		      usesSimdRegA  = 0;
+		      break;
+		    case 3:
+		      instrName = "vupbaw";
+		      decodingClass = 40;
+		      usesSimdRegC  = usesSimdRegB = 1;
+		      usesSimdRegA  = 0;
+		      break;
+		    case 7:
+		      instrName = "vupsbaw";
+		      decodingClass = 40;
+		      usesSimdRegC  = usesSimdRegB = 1;
+		      usesSimdRegA  = 0;
+		      break;
+		    }
+		  break;
+		}
+	    }
+	    break;
+
+	  case 16:
+	    instrName = "vasrw";
+	    decodingClass = 42;
+	    usesSimdRegA  = usesSimdRegB = 1;
+	    usesSimdRegC  = 2;
+	    break;
+
+	  case 48:
+	    {
+	      short sub_subopcode = BITS(state->words[0], 15, 16);
+	      switch (sub_subopcode)
+		{
+		case 0:
+		  instrName = "vasrwi";
+		  decodingClass = 41;
+		  usesSimdRegA  = usesSimdRegB = 1;
+		  usesSimdRegC  = 0;
+		  break;
+		case 2:
+		  instrName = "vasrrwi";
+		  decodingClass = 41;
+		  usesSimdRegA  = usesSimdRegB = 1;
+		  usesSimdRegC  = 0;
+		  break;
+		}
+	    }
+	    break;
+
+	  case 59:
+	    instrName = "vasrsrwi";
+	    decodingClass = 41;
+	    usesSimdRegA  = usesSimdRegB = 1;
+	    usesSimdRegC  = 0;
+	    break;
+
+	  case 18:
+	    {
+	      short sub_subopcode = BITS(state->words[0], 15, 16);
+	      switch (sub_subopcode)
+		{
+		case 0:
+		  instrName = "vmaxw";
+		  usesSimdRegC = 1;
+		  break;
+		case 1:
+		  instrName = "vmaxaw";
+		  usesSimdRegC = 1;
+		  break;
+		case 2:
+		  instrName = "vbmaxw";
+		  usesSimdRegC = 0;
+		  break;
+		}
+	      decodingClass = 42;
+	      usesSimdRegA  = usesSimdRegB = 1;
+	      break;
+	    }
+
+	  case 19:
+	    {
+	      short sub_subopcode = BITS(state->words[0], 15, 16);
+	      switch (sub_subopcode)
+		{
+		case 0:
+		  instrName = "vminw";
+		  usesSimdRegC = 1;
+		  break;
+		case 1:
+		  instrName = "vminaw";
+		  usesSimdRegC = 0;
+		  break;
+		case 2:
+		  instrName = "vbminw";
+		  usesSimdRegC = 0;
+		  break;
+		}
+	      decodingClass = 42;
+	      usesSimdRegA  = usesSimdRegB = 1;
+	      break;
+	    }
+
+	  case 14:
+	    {
+	      short sub_subopcode = BITS(state->words[0], 15, 16);
+	      switch (sub_subopcode)
+		{
+		case 0:
+		  instrName = "vdifw";
+		  break;
+		case 1:
+		  instrName = "vdifaw";
+		  break;
+		case 2:
+		  instrName = "vmrb";
+		  break;
+		}
+	      decodingClass = 42;
+	      usesSimdRegA  = usesSimdRegB = usesSimdRegC = 1;
+	      break;
+	    }
+
+	  case 24:
+	    {
+	      short sub_subopcode = BITS(state->words[0], 15, 16);
+	      switch (sub_subopcode)
+		{
+		case 0:
+		  instrName = "vand";
+		  decodingClass = 42;
+		  usesSimdRegA = usesSimdRegB = usesSimdRegC = 1;
+		  break;
+		case 1:
+		  instrName = "vandaw";
+		  decodingClass = 42;
+		  usesSimdRegA = usesSimdRegB = usesSimdRegC = 1;
+		  break;
+		}
+	      break;
+	    }
+
+	  case 25:
+	    {
+	      short sub_subopcode = BITS(state->words[0], 15, 16);
+	      switch (sub_subopcode)
+		{
+		case 0:
+		  instrName = "vor";
+		  decodingClass = 42;
+		  usesSimdRegA  = usesSimdRegB = usesSimdRegC = 1;
+		  break;
+		}
+	      break;
+	    }
+
+	  case 26:
+	    {
+	      short sub_subopcode = BITS(state->words[0], 15, 16);
+	      switch (sub_subopcode)
+		{
+		case 0:
+		  instrName = "vxor";
+		  break;
+		case 1:
+		  instrName = "vxoraw";
+		  break;
+		}
+	      decodingClass = 42;
+	      usesSimdRegA  = usesSimdRegB = usesSimdRegC = 1;
+	      break;
+	    }
+
+	  case 27:
+	    {
+	      short sub_subopcode = BITS(state->words[0], 15, 16);
+	      switch (sub_subopcode)
+		{
+		case 0:
+		  instrName = "vbic";
+		  break;
+		case 1:
+		  instrName = "vbicaw";
+		  break;
+		}
+	      decodingClass = 42;
+	      usesSimdRegA  = usesSimdRegB = usesSimdRegC = 1;
+	      break;
+	    }
+
+	  case 4:
+	    {
+	      short sub_subopcode = BITS(state->words[0], 15, 16);
+	      switch (sub_subopcode)
+		{
+		case 0:
+		  instrName = "vavb";
+		  break;
+		case 2:
+		  instrName = "vavrb";
+		  break;
+		}
+	      decodingClass = 42;
+	      usesSimdRegA  = usesSimdRegB = usesSimdRegC = 1;
+	      break;
+	    }
+
+	  case 28:
+	    instrName = "veqw";
+	    decodingClass = 42;
+	    usesSimdRegA  = usesSimdRegB = usesSimdRegC = 1;
+	    break;
+
+	  case 29:
+	    instrName = "vnew";
+	    decodingClass = 42;
+	    usesSimdRegA  = usesSimdRegB = usesSimdRegC = 1;
+	    break;
+
+	  case 30:
+	    instrName = "vlew";
+	    decodingClass = 42;
+	    usesSimdRegA  = usesSimdRegB = usesSimdRegC = 1;
+	    break;
+
+	  case 31:
+	    instrName = "vltw";
+	    decodingClass = 42;
+	    usesSimdRegA  = usesSimdRegB = usesSimdRegC = 1;
+	    break;
+
+	  case 49:
+	    {
+	      short sub_subopcode = BITS(state->words[0], 15, 16);
+	      switch (sub_subopcode)
+		{
+		case 0:
+		  instrName = "vasrpwbi";
+		  decodingClass = 41;
+		  usesSimdRegA  = usesSimdRegB = 1;
+		  usesSimdRegC  = 0;
+		  break;
+		case 2:
+		  instrName = "vasrrpwbi";
+		  decodingClass = 41;
+		  usesSimdRegA  = usesSimdRegB = 1;
+		  usesSimdRegC  = 0;
+		  break;
+		}
+	      break;
+	    }
+
+	  case 5:
+	    {
+	      short sub_subopcode = BITS(state->words[0], 15, 16);
+	      switch (sub_subopcode)
+		{
+		case 0:
+		  instrName = "vsr8";
+		  decodingClass = 42;
+		  usesSimdRegA  = usesSimdRegB = 1;
+		  usesSimdRegC  = 2;
+		  break;
+
+		case 1:
+		  instrName = "vsr8aw";
+		  decodingClass = 42;
+		  usesSimdRegA  = usesSimdRegB = 1;
+		  usesSimdRegC  = 2;
+		  break;
+		}
+	      break;
+	    }
+
+	  case 37:
+	    {
+	      short sub_subopcode = BITS(state->words[0], 15, 16);
+	      switch (sub_subopcode)
+		{
+		case 0:
+		  instrName = "vsr8i";
+		  decodingClass = 41;
+		  usesSimdRegA  = usesSimdRegB = 1;
+		  usesSimdRegC  = 0;
+		  break;
+
+		case 1:
+		  instrName = "vsr8awi";
+		  decodingClass = 41;
+		  usesSimdRegA  = usesSimdRegB = 1;
+		  usesSimdRegC  = 0;
+		  break;
+		}
+	      break;
+	    }
+
+	  case 20:
+	  case 21:
+	  case 22:
+	    {
+	      short subopcode2 = BITS(state->words[0], 15, 18);
+	      switch (subopcode2)
+		{
+		case 0:
+		  instrName = "vmr1w";
+		  break;
+
+		case 2:
+		  instrName = "vmr2w";
+		  break;
+
+		case 4:
+		  instrName = "vmr3w";
+		  break;
+
+		case 6:
+		  instrName = "vmr4w";
+		  break;
+
+		case 8:
+		  instrName = "vmr5w";
+		  break;
+
+		case 10:
+		  instrName = "vmr6w";
+		  break;
+
+		case 1:
+		  instrName = "vmr1aw";
+		  break;
+
+		case 3:
+		  instrName = "vmr2aw";
+		  break;
+
+		case 5:
+		  instrName = "vmr3aw";
+		  break;
+
+		case 7:
+		  instrName = "vmr4aw";
+		  break;
+
+		case 9:
+		  instrName = "vmr5aw";
+		  break;
+
+		case 11:
+		  instrName = "vmr6aw";
+		  break;
+
+		}
+
+	      decodingClass = 42;
+	      usesSimdRegA  = usesSimdRegB = usesSimdRegC = 1;
+	      break;
+	    }
+
+
+	  case 7:
+	  case 6:
+	    {
+	      switch (BITS(state->words[0], 16, 19))
+		{
+		case 15:
+		  instrName = "vh264ft";
+		  break;
+		case 14:
+		  instrName = "vh264f";
+		  break;
+		case 13:
+		  instrName = "vvc1ft";
+		  break;
+		case 12:
+		  instrName = "vvc1f";
+		  break;
+		}
+	      decodingClass = 42;
+	      usesSimdRegA  = usesSimdRegB = usesSimdRegC = 1;
+	      break;
+
+	    }
+
+	  case 92:
+	    instrName = "vd6tapf";
+	    decodingClass = 39;
+	    usesSimdRegA  = usesSimdRegB = 1;
+	    usesSimdRegC  = 0;
+	    break;
+
+	  case 55:
+	    instrName = "vinti";
+	    decodingClass = 43;
+	    usesSimdRegA  = usesSimdRegB = usesSimdRegC = 0;
+	    break;
+
+	  default:
+	    instrName = "SIMD";
+	    state->flow = invalid_instr;
+	    break;
+	  }
+      }
+    else
+      {
+	instrName = "???_SIMD";
+	state->flow = invalid_instr;
+      }
+	break;
+
+
+    case op_LD_ADD:
+    /* Load/Add resister-register */
+      decodingClass = 15;  /* default for Major opcode 12 ... */
+      switch(BITS(state->words[0],3,4))
+	{
+	case 0: instrName = "ld_s"; break;
+	case 1: instrName = "ldb_s"; break;
+	case 2: instrName = "ldw_s"; break;
+	case 3: instrName = "add_s"; break;
+        default:
+	  instrName = "??? (2[3])";
+	  state->flow = invalid_instr;
+	  break;
+	}
+      break;
+
+  case op_ADD_SUB_SHIFT:
+    /* Add/sub/shift immediate */
+    decodingClass = 16;  /* default for Major opcode 13 ... */
+    switch(BITS(state->words[0],3,4))
+      {
+      case 0: instrName = "add_s"; break;
+      case 1: instrName = "sub_s"; break;
+      case 2: instrName = "asl_s"; break;
+      case 3: instrName = "asr_s"; break;
+      default:
+	instrName = "??? (2[3])";
+	state->flow = invalid_instr;
+	break;
+      }
+    break;
+
+    case op_ADD_MOV_CMP:
+    /* One Dest/Source can be any of r0 - r63 */
+      decodingClass = 17;  /* default for Major opcode 14 ... */
+      switch(BITS(state->words[0],3,4))
+      {
+	case 0: instrName = "add_s"; break;
+	case 1:
+	case 3: instrName = "mov_s"; decodingClass = 18; break;
+	case 2: instrName = "cmp_s"; decodingClass = 18; break;
+        default:
+	  instrName = "??? (2[3])";
+	  state->flow = invalid_instr;
+	  break;
+      }
+      break;
+
+    case op_S:
+    /* ARCompact 16-bit instructions, General ops/ single ops */
+      decodingClass = 22;  /* default for Major opcode 15 ... */
+      switch(BITS(state->words[0],0,4))
+      {
+	case 0:
+	  decodingClass = 27;
+          switch(BITS(state->words[0],5,7))
+	  {
+            case 0 : instrName = "j_s";
+            case 2 : if (!instrName) instrName = "jl_s";
+	             state->isBranch = 1;
+		     state->nullifyMode = BR_exec_when_no_jump;
+		     break;
+            case 1 : if (!instrName) instrName = "j_s.d";
+            case 3 : if (!instrName) instrName = "jl_s.d";
+          	     state->isBranch = 1;
+		     state->nullifyMode = BR_exec_always;
+		     break;
+            case 6 : instrName = "sub_s.ne";
+	             decodingClass = 35;
+	             break;
+            case 7 :
+	      decodingClass = 26;
+              switch(BITS(state->words[0],8,10))
+	      {
+              	case 0 : instrName = "nop_s"; break;
+
+		  /* Unimplemented instruction reserved in ARC700 */
+	        case 1: instrName = "unimp_s";break;
+
+
+	        case 4: instrName = "jeq_s [blink]";
+		case 5: if (!instrName) instrName = "jne_s [blink]";
+		case 6:
+		  if (!instrName)
+		    instrName = "j_s [blink]";
+		  state->isBranch = 1;
+		  state->nullifyMode = BR_exec_when_no_jump;
+		  break;
+		case 7:
+		  if (!instrName)
+		    {
+		      instrName = "j_s.d [blink]";
+		      state->flow = indirect_jump;
+		      state->register_for_indirect_jump = 31; /* blink is r31 */
+		    }
+		  state->isBranch = 1;
+		  state->nullifyMode = BR_exec_always;
+		  break;
+                default:
+		  instrName = "??? (2[3])";
+	      	  state->flow = invalid_instr;
+		  break;
+	      }
+	      break;
+            default:
+	      instrName = "??? (2[3])";
+	      state->flow = invalid_instr;
+	      break;
+	  }
+	  break;
+        case 2 : instrName = "sub_s"; break;
+        case 4 : instrName = "and_s"; break;
+        case 5 : instrName = "or_s"; break;
+        case 6 : instrName = "bic_s"; break;
+        case 7 : instrName = "xor_s"; break;
+	case 11: instrName = "tst_s"; decodingClass = 14; break;
+	case 12: instrName = "mul64_s"; mul =1; decodingClass = 14; break;
+	case 13: instrName = "sexb_s"; decodingClass = 14; break;
+	case 14: instrName = "sexw_s"; decodingClass = 14; break;
+	case 15: instrName = "extb_s"; decodingClass = 14; break;
+	case 16: instrName = "extw_s"; decodingClass = 14; break;
+	case 17: instrName = "abs_s"; decodingClass = 14; break;
+	case 18: instrName = "not_s"; decodingClass = 14; break;
+	case 19: instrName = "neg_s"; decodingClass = 14; break;
+        case 20: instrName = "add1_s"; break;
+        case 21: instrName = "add2_s"; break;
+        case 22: instrName = "add3_s"; break;
+        case 24: instrName = "asl_s"; break;
+        case 25: instrName = "lsr_s"; break;
+        case 26: instrName = "asr_s"; break;
+        case 27: instrName = "asl_s"; decodingClass = 14; break;
+        case 28: instrName = "asr_s"; decodingClass = 14; break;
+        case 29: instrName = "lsr_s"; decodingClass = 14; break;
+      case 30: instrName = "trap_s"; decodingClass = 33; break;
+      case 31: instrName = "brk_s"; decodingClass = 26; break;
+
+        default:
+	  instrName = "??? (2[3])";
+	  state->flow = invalid_instr;
+	  break;
+      }
+      break;
+
+       case op_LD_S:
+    /* ARCompact 16-bit Load with offset, Major Opcode 0x10 */
+      instrName = "ld_s";
+      decodingClass = 28;
+      break;
+
+    case op_LDB_S:
+    /* ARCompact 16-bit Load with offset, Major Opcode 0x11 */
+      instrName = "ldb_s";
+      decodingClass = 28;
+      break;
+
+    case op_LDW_S:
+    /* ARCompact 16-bit Load with offset, Major Opcode 0x12 */
+      instrName = "ldw_s";
+      decodingClass = 28;
+      break;
+
+    case op_LDWX_S:
+    /* ARCompact 16-bit Load with offset, Major Opcode 0x13 */
+      instrName = "ldw_s.x";
+      decodingClass = 28;
+      break;
+
+    case op_ST_S:
+    /* ARCompact 16-bit Store with offset, Major Opcode 0x14 */
+      instrName = "st_s";
+      decodingClass = 28;
+      break;
+
+    case op_STB_S:
+    /* ARCompact 16-bit Store with offset, Major Opcode 0x15 */
+      instrName = "stb_s";
+      decodingClass = 28;
+      break;
+
+    case op_STW_S:
+    /* ARCompact 16-bit Store with offset, Major Opcode 0x16 */
+      instrName = "stw_s";
+      decodingClass = 28;
+      break;
+
+    case op_Su5:
+    /* ARCompact 16-bit involving unsigned 5-bit immediate operand */
+      decodingClass = 23;  /* default for major opcode 0x17 ... */
+      switch (BITS(state->words[0],5,7))
+      {
+	case 0: instrName = "asl_s"; break;
+	case 1: instrName = "lsr_s"; break;
+	case 2: instrName = "asr_s"; break;
+	case 3: instrName = "sub_s"; break;
+	case 4: instrName = "bset_s"; break;
+	case 5: instrName = "bclr_s"; break;
+	case 6: instrName = "bmsk_s"; break;
+	case 7: instrName = "btst_s"; decodingClass = 21; break;
+      }
+      break;
+
+    case op_SP:
+    /* ARCompact 16-bit Stack pointer-based instructions */
+      decodingClass = 19;  /* default for Stack pointer-based insns ... */
+      switch (BITS(state->words[0],5,7))
+      {
+        case 0: instrName = "ld_s"; break;
+        case 1: instrName = "ldb_s"; break;
+        case 2: instrName = "st_s"; break;
+        case 3: instrName = "stb_s"; break;
+        case 4: instrName = "add_s"; break;
+        case 5:
+      	  if (!BITS(state->words[0],8,8))
+	    instrName = "add_s";
+	  else
+	    instrName = "sub_s";
+	  break;
+        case 6: instrName = "pop_s"; decodingClass = 31; break;
+        case 7: instrName = "push_s"; decodingClass = 31; break;
+	default:
+          instrName = "??? (2[3])";
+          state->flow = invalid_instr;
+	  break;
+      }
+    break;
+
+    case op_GP:
+    /* ARCompact 16-bit Gp-based ld/add (data aligned offset) */
+      decodingClass = 20;  /* default for gp-relative insns ... */
+      switch (BITS(state->words[0],9,10))
+      {
+        case 0: instrName = "ld_s"; break;
+        case 1: instrName = "ldb_s"; break;
+        case 2: instrName = "ldw_s"; break;
+        case 3: instrName = "add_s"; break;
+      }
+      break;
+
+    case op_Pcl:
+    /* ARCompact 16-bit Pcl-based ld (32-bit aligned offset) */
+      instrName = "ld_s";
+      decodingClass = 29;
+      break;
+
+    case op_MOV_S:
+    /* ARCompact 16-bit Move immediate */
+      instrName = "mov_s";
+      decodingClass = 30;
+      break;
+
+    case op_ADD_CMP:
+    /* ARCompact 16-bit Add/compare immediate */
+      decodingClass = 21;  /* default for major opcode 0x1c ... */
+      if (BIT(state->words[0],7))
+	instrName = "cmp_s";
+      else
+	instrName = "add_s";
+      break;
+
+    case op_BR_S:
+    /* ARCompact 16-bit Branch conditionally on reg z/nz */
+      decodingClass = 25; /* Default for BR_S instruction ... */
+      if (BIT(state->words[0],7))
+	instrName = "brne_s";
+      else
+	instrName = "breq_s";
+      state->isBranch = 1;
+      break;
+
+    case op_B_S:
+    /* ARCompact 16-bit Branch conditionally */
+      decodingClass = 24; /* Default for B_S instruction ... */
+      state->isBranch = 1;
+      switch (BITS(state->words[0],9,10))
+      {
+	case 0: instrName = "b_s"; break;
+	case 1: instrName = "beq_s"; break;
+	case 2: instrName = "bne_s"; break;
+	case 3:
+          switch (BITS(state->words[0],6,8))
+	  {
+	    case 0: instrName = "bgt_s"; break;
+	    case 1: instrName = "bge_s"; break;
+	    case 2: instrName = "blt_s"; break;
+	    case 3: instrName = "ble_s"; break;
+	    case 4: instrName = "bhi_s"; break;
+	    case 5: instrName = "bhs_s"; break;
+	    case 6: instrName = "blo_s"; break;
+	    case 7: instrName = "bls_s"; break;
+	  }
+	  break;
+      }
+      break;
+
+    case op_BL_S:
+    /* ARCompact 16-bit Branch and link unconditionally */
+      decodingClass = 24; /* Default for B_S instruction ... */
+      instrName = "bl_s";
+      state->isBranch = 1;
+      break;
+
+    default:
+      instrName = instruction_name (state, state->_opcode, 0, &flags);
+      if (!instrName)
+	{
+	  instrName = "???";
+	  state->flow=invalid_instr;
+	}
+      break;
+  }
+
+  /* Maybe we should be checking for extension instructions over here
+   * instead of all over this crazy switch case. */
+  if (state->flow == invalid_instr)
+    {
+      if (!((state->_opcode == op_SIMD) && enable_simd))
+	instrName = instruction_name(state,state->_opcode,
+				     state->words[0],
+				     &flags);
+
+      if (state->instructionLen == 2)
+	{
+	  switch (flags)
+	    {
+	    case AC_SYNTAX_3OP:
+	      decodingClass = 22;
+	      break;
+	    case AC_SYNTAX_2OP:
+	      decodingClass = 14;
+	      break;
+	    case AC_SYNTAX_1OP:
+	      decodingClass = 36;
+	      break;
+	    case AC_SYNTAX_NOP:
+	      decodingClass = 26;
+	      break;
+	    default:
+	      mwerror(state, "Invalid syntax class\n");
+	    }
+	}
+      else
+	{
+/* Must do the above for this one too */
+	  switch (flags)
+	    {
+	    case AC_SYNTAX_3OP:
+	      decodingClass = 0;
+	      break;
+	    case AC_SYNTAX_2OP:
+	      decodingClass = 1;
+	      break;
+	    case AC_SYNTAX_1OP:
+	      decodingClass = 32;
+	      break;
+	    case AC_SYNTAX_NOP:
+	      break;
+	    case AC_SYNTAX_SIMD:
+	      break;
+	    default:
+	      mwerror(state, "Invalid syntax class\n");
+	    }
+	}
+
+      if (!instrName)
+	{
+	  instrName = "???";
+	  state->flow=invalid_instr;
+	}
+    }
+
+  fieldAisReg = fieldBisReg = fieldCisReg = 1; /* assume regs for now */
+  flag = cond = is_shimm = is_limm = 0;
+  signExtend = addrWriteBack = directMem = 0;
+  usesAuxReg = 0;
+
+  /* The following module decodes the instruction */
+  switch (decodingClass)
+  {
+    case 0:
+
+      /* For ARCtangent 32-bit instructions with 3 operands */
+
+      subopcode = BITS(state->words[0],22,23);
+      switch (subopcode)
+      {
+	case 0:
+
+          /* Either fieldB or fieldC or both can be a limm value;
+	   * fieldA can be 0;
+           */
+
+          CHECK_FIELD_C();
+     	  if (!is_limm)
+	  {
+	    /* If fieldC is not a limm, then fieldB may be a limm value */
+            CHECK_FIELD_B();
+	  }
+      	  else
+	  {
+            FIELD_B();
+      	    if (!fieldBisReg)
+	      fieldB = fieldC;
+	  }
+      	  CHECK_FIELD_A();
+      	  CHECK_FLAG();
+	  break;
+
+	case 1:
+
+          /* fieldB may ba a limm value
+	   * fieldC is a shimm (unsigned 6-bit immediate)
+	   * fieldA can be 0
+           */
+
+          CHECK_FIELD_B();
+          FIELD_C();
+	  fieldCisReg = 0;
+          /* Say ea is not present, so only one of us will do the
+	     name lookup. */
+	  state->_offset += fieldB, state->_ea_present = 0;
+      	  CHECK_FIELD_A();
+      	  CHECK_FLAG();
+	  break;
+
+	case 2:
+
+          /* fieldB may ba a limm value
+	   * fieldC is a shimm (signed 12-bit immediate)
+	   * fieldA can be 0
+           */
+
+	  fieldCisReg = 0;
+          fieldC = FIELDS(state->words[0]);
+          CHECK_FIELD_B();
+          /* Say ea is not present, so only one of us will do the
+	     name lookup. */
+	  state->_offset += fieldB, state->_ea_present = 0;
+	  if (is_limm)
+	    fieldAisReg = fieldA = 0;
+	  else
+	    fieldA = fieldB;
+      	  CHECK_FLAG();
+	  break;
+
+	case 3:
+
+          /* fieldB may ba a limm value
+	   * fieldC may be a limm or a shimm (unsigned 6-bit immediate)
+	   * fieldA can be 0
+	   * Conditional instructions
+           */
+
+          CHECK_FIELD_B();
+	  /* fieldC is a shimm (unsigned 6-bit immediate) */
+	  if (is_limm)
+	  {
+	    fieldAisReg = fieldA = 0;
+            FIELD_C();
+            if (BIT(state->words[0],5))
+	      fieldCisReg = 0;
+	    else if (fieldC == 62)
+	    {
+              fieldCisReg = 0;
+	      fieldC = fieldB;
+	    }
+	  }
+	  else
+	  {
+	    fieldA = fieldB;
+            if (BIT(state->words[0],5))
+	    {
+              FIELD_C();
+              fieldCisReg = 0;
+	    }
+	    else
+	    {
+              CHECK_FIELD_C();
+	    }
+	  }
+      	  CHECK_FLAG_COND();
+	  break;
+      }
+
+      write_instr_name();
+      WRITE_FORMAT_x(A);
+      WRITE_FORMAT_COMMA_x(B);
+      WRITE_FORMAT_COMMA_x(C);
+      WRITE_NOP_COMMENT();
+      my_sprintf(state, state->operandBuffer, formatString, fieldA, fieldB, fieldC);
+      write_comments();
+      break;
+
+    case 1:
+
+      /* For ARCtangent 32-bit instructions with 2 operands */
+
+      /* field C is either a register or limm (different!) */
+      CHECK_FIELD_C();
+      FIELD_B();
+      CHECK_FLAG();
+
+      if (BITS(state->words[0],22,23) == 1 )
+	fieldCisReg = 0;
+      if (fieldCisReg) state->ea_reg1 = fieldC;
+      /* field C is either a shimm (same as fieldC) or limm (different!) */
+      /* Say ea is not present, so only one of us will do the name lookup. */
+      else state->_offset += fieldB, state->_ea_present = 0;
+
+      write_instr_name();
+      WRITE_FORMAT_x(B);
+      WRITE_FORMAT_COMMA_x(C);
+      WRITE_NOP_COMMENT();
+      my_sprintf(state, state->operandBuffer, formatString, fieldB, fieldC);
+      write_comments();
+      break;
+
+    case 2:
+
+      /* For BTST, CMP, MUL64, MULU64 instruction */
+
+      /* field C is either a register or limm (different!) */
+      subopcode =  BITS(state->words[0],22,23);
+      if (subopcode == 0 || ((subopcode == 3) && (!BIT(state->words[0],5))))
+      {
+      	CHECK_FIELD_C();
+	if (is_limm)
+	{
+	  FIELD_B();
+	  if (!fieldBisReg)
+	    fieldB = fieldC;
+	}
+	else
+	{
+      	  CHECK_FIELD_B();
+	}
+      }
+      else if (subopcode == 1 || ((subopcode == 3) && (BIT(state->words[0],5))))
+      {
+	FIELD_C();
+	fieldCisReg = 0;
+      	CHECK_FIELD_B();
+      }
+      else if (subopcode == 2)
+      {
+	FIELD_B();
+	fieldC = FIELDS(state->words[0]);
+	fieldCisReg = 0;
+      }
+      if (subopcode == 3)
+	CHECK_COND();
+
+      if (fieldCisReg) state->ea_reg1 = fieldC;
+      /* field C is either a shimm (same as fieldC) or limm (different!) */
+      /* Say ea is not present, so only one of us will do the name lookup. */
+      else state->_offset += fieldB, state->_ea_present = 0;
+
+      write_instr_name();
+      if (mul)
+      {
+	/* For Multiply instructions, the first operand is 0 */
+	WRITE_FORMAT_x(A);
+	WRITE_FORMAT_COMMA_x(B);
+        WRITE_FORMAT_COMMA_x(C);
+        WRITE_NOP_COMMENT();
+        my_sprintf(state, state->operandBuffer, formatString, 0, fieldB, fieldC);
+      }
+      else
+      {
+	WRITE_FORMAT_x(B);
+        WRITE_FORMAT_COMMA_x(C);
+        WRITE_NOP_COMMENT();
+        my_sprintf(state, state->operandBuffer, formatString, fieldB, fieldC);
+      }
+      write_comments();
+      break;
+
+    case 3:
+      /*
+       * For FLAG instruction
+       */
+      subopcode =  BITS(state->words[0],22,23);
+
+      if (subopcode == 0 || ((subopcode == 3) && (!BIT(state->words[0],5))))
+      {
+        CHECK_FIELD_C();
+      }
+      else if (subopcode == 1 || ((subopcode == 3) && (BIT(state->words[0],5))))
+      {
+        FIELD_C();
+	fieldCisReg = 0;
+      }
+      else if (subopcode == 2)
+      {
+	fieldC = FIELDS(state->words[0]);
+	fieldCisReg = 0;
+      }
+      if (subopcode == 3)
+        CHECK_COND();
+      flag = 0;  /* this is the FLAG instruction -- it's redundant */
+
+      write_instr_name();
+      WRITE_FORMAT_x(C);
+      my_sprintf(state, state->operandBuffer, formatString, fieldC);
+      write_comments();
+      break;
+
+    case 4:
+      /*
+       * For op_JC -- jump to address specified.
+       *     Also covers jump and link--bit 9 of the instr. word
+       *     selects whether linked, thus "is_linked" is set above.
+       */
+      subopcode =  BITS(state->words[0],22,23);
+      if (subopcode == 0 || ((subopcode == 3) && (!BIT(state->words[0],5))))
+      {
+        CHECK_FIELD_C();
+	/* ilink registers */
+	if (fieldC == 29 || fieldC == 31)
+      	  CHECK_FLAG();
+      }
+      else if (subopcode == 1 || ((subopcode == 3) && (BIT(state->words[0],5))))
+      {
+        FIELD_C();
+	fieldCisReg = 0;
+      }
+      else if (subopcode == 2)
+      {
+	fieldC = FIELDS(state->words[0]);
+	fieldCisReg = 0;
+      }
+
+      if (subopcode == 3)
+        CHECK_COND();
+
+      state->nullifyMode = BITS(state->words[0],16,16);
+
+      if (!fieldCisReg)
+	{
+	  state->flow = is_linked ? direct_call : direct_jump;
+	  add_target(fieldC);
+	}
+      else
+	{
+	  state->flow = is_linked ? indirect_call : indirect_jump;
+	  /*
+	   * We should also treat this as indirect call if NOT linked
+	   * but the preceding instruction was a "lr blink,[status]"
+	   * and we have a delay slot with "add blink,blink,2".
+	   * For now we can't detect such.
+	   */
+	  state->register_for_indirect_jump = fieldC;
+	}
+
+      write_instr_name();
+      strcat(formatString,
+	     IS_REG(C)?"[%r]":"%s"); /* address/label name */
+
+      if (IS_REG(C))
+	my_sprintf(state, state->operandBuffer, formatString, fieldC);
+      else
+	my_sprintf(state, state->operandBuffer, formatString,
+		   post_address(state, fieldC));
+      write_comments();
+      break;
+
+    case 5:
+      /* LD instruction.  B and C can be regs, or one or both can be limm. */
+
+      CHECK_FIELD_A();
+      CHECK_FIELD_B();
+
+      if(FIELDA(state->words[0]) == 62)
+	{
+	  instrName = "prefetch";
+	}
+
+
+
+      if (is_limm)
+      {
+        FIELD_C();
+        if (!fieldCisReg)
+          fieldC = fieldB;
+      }
+      else
+      {
+        CHECK_FIELD_C();
+      }
+      if (dbg) printf("5:b reg %d %d c reg %d %d  \n",
+		      fieldBisReg,fieldB,fieldCisReg,fieldC);
+      state->_offset = 0;
+      state->_ea_present = 1;
+      if (fieldBisReg) state->ea_reg1 = fieldB; else state->_offset += fieldB;
+      if (fieldCisReg) state->ea_reg2 = fieldC; else state->_offset += fieldC;
+      state->_mem_load = 1;
+
+      directMem     = BIT(state->words[0],15);
+      /* Check if address writeback is allowed before decoding the
+	 address writeback field of a load instruction.*/
+      if (fieldBisReg && (fieldB != 62))
+        addrWriteBack = BITS(state->words[0],22,23);
+      signExtend    = BIT(state->words[0],16);
+
+      write_instr_name();
+
+      /* Check for prefetch or ld 0,...*/
+      if(IS_REG(A))
+	WRITE_FORMAT_x_COMMA_LB(A);
+      else
+	{
+	  strcat(formatString,"%*");
+	  WRITE_FORMAT_LB();
+	}
+
+
+      if (fieldBisReg || fieldB != 0)
+	WRITE_FORMAT_x(B);
+      else
+	fieldB = fieldC;
+
+      WRITE_FORMAT_COMMA_x_RB(C);
+      my_sprintf(state, state->operandBuffer, formatString, fieldA, fieldB, fieldC);
+      write_comments();
+      break;
+
+    case 6:
+      /* LD instruction. */
+      CHECK_FIELD_B();
+      CHECK_FIELD_A();
+      /* Support for Prefetch */
+      /* Fixme :: Check for A700 within this function */
+
+      if(FIELDA(state->words[0]) == 62)
+	{
+	  instrName = "prefetch";
+	}
+
+      fieldC = FIELDD9(state->words[0]);
+      fieldCisReg = 0;
+
+      if (dbg) printf_unfiltered("6:b reg %d %d c 0x%x  \n",
+				 fieldBisReg,fieldB,fieldC);
+      state->_ea_present = 1;
+      state->_offset = fieldC;
+      state->_mem_load = 1;
+      if (fieldBisReg) state->ea_reg1 = fieldB;
+      /* field B is either a shimm (same as fieldC) or limm (different!) */
+      /* Say ea is not present, so only one of us will do the name lookup. */
+      else state->_offset += fieldB, state->_ea_present = 0;
+
+      directMem     = BIT(state->words[0],11);
+      /* Check if address writeback is allowed before decoding the
+	 address writeback field of a load instruction.*/
+      if (fieldBisReg && (fieldB != 62))
+        addrWriteBack = BITS(state->words[0],9,10);
+      signExtend    = BIT(state->words[0],6);
+
+      write_instr_name();
+      if(IS_REG(A))
+	WRITE_FORMAT_x_COMMA_LB(A);
+      else
+	{
+	  strcat(formatString,"%*");
+	  WRITE_FORMAT_LB();
+	}
+      if (!fieldBisReg)
+	{
+	  fieldB = state->_offset;
+	  WRITE_FORMAT_x_RB(B);
+	}
+      else
+	{
+	  WRITE_FORMAT_x(B);
+	  WRITE_FORMAT_COMMA_x_RB(C);
+	}
+      my_sprintf(state, state->operandBuffer, formatString, fieldA, fieldB, fieldC);
+      write_comments();
+      break;
+
+    case 7:
+      /* ST instruction. */
+      CHECK_FIELD_B ();
+      CHECK_FIELD_C ();
+      state->source_operand.registerNum = fieldC;
+      state->sourceType = fieldCisReg ? ARC_REGISTER : ARC_LIMM;
+      fieldA  = FIELDD9 (state->words[0]); /* shimm */
+      fieldAisReg = 0;
+
+      /* [B,A offset] */
+      if (dbg) printf_unfiltered("7:b reg %d %x off %x\n",
+				 fieldBisReg,fieldB,fieldA);
+      state->_ea_present = 1;
+      state->_offset = fieldA;
+      if (fieldBisReg) state->ea_reg1 = fieldB;
+      /*
+       * field B is either a shimm (same as fieldA) or limm (different!)
+       * Say ea is not present, so only one of us will do the name lookup.
+       * (for is_limm we do the name translation here).
+       */
+      else
+	state->_offset += fieldB, state->_ea_present = 0;
+
+      directMem     = BIT (state->words[0], 5);
+      addrWriteBack = BITS (state->words[0], 3, 4);
+      state->_addrWriteBack = addrWriteBack;
+      write_instr_name ();
+      WRITE_FORMAT_x_COMMA_LB (C);
+      if (fieldA == 0)
+      {
+        WRITE_FORMAT_x_RB(B);
+      }
+      else
+      {
+	WRITE_FORMAT_x(B);
+        fieldAisReg = 0;
+        WRITE_FORMAT_COMMA_x_RB(A);
+      }
+      my_sprintf(state, state->operandBuffer, formatString, fieldC, fieldB, fieldA);
+      write_comments2(fieldA);
+      break;
+
+    case 8:
+      /* SR instruction */
+      CHECK_FIELD_B();
+      switch (BITS(state->words[0],22,23))
+      {
+ 	case 0:
+          if (is_limm)
+          {
+       	    FIELD_C();
+      	    if (!fieldCisReg)
+	      fieldC = fieldB;
+      	  }
+      	  else
+	  {
+	    CHECK_FIELD_C();
+	  }
+	  break;
+	case 1:
+	  FIELD_C();
+	  fieldCisReg = 0;
+	  break;
+	case 2:
+	  fieldC = FIELDS(state->words[0]);
+	  fieldCisReg = 0;
+	  break;
+      }
+
+      write_instr_name();
+      WRITE_FORMAT_x_COMMA_LB(B);
+      /* Try to print B as an aux reg if it is not a core reg. */
+      usesAuxReg = 1;
+      WRITE_FORMAT_x(C);
+      WRITE_FORMAT_RB();
+      my_sprintf(state, state->operandBuffer, formatString, fieldB, fieldC);
+      write_comments();
+      break;
+
+    case 9:
+      /* BBIT0/BBIT1 Instruction */
+
+      CHECK_FIELD_C();
+      if (is_limm || BIT(state->words[0],4))
+      {
+	fieldCisReg = 0;
+        FIELD_B();
+      }
+      else
+      {
+        CHECK_FIELD_B();
+      }
+      fieldAisReg = fieldA = 0;
+      fieldA = FIELDS9(state->words[0]);
+      fieldA += (addr & ~0x3);
+      CHECK_NULLIFY();
+
+      write_instr_name();
+
+      add_target(fieldA);
+      state->flow = state->_opcode == op_BLC ? direct_call : direct_jump;
+      WRITE_FORMAT_x(B);
+      WRITE_FORMAT_COMMA_x(C);
+      strcat(formatString, ",%s"); /* address/label name */
+      WRITE_NOP_COMMENT();
+      my_sprintf(state, state->operandBuffer, formatString, fieldB, fieldC, post_address(state, fieldA));
+      write_comments();
+      break;
+
+    case 10:
+      /* LR instruction */
+      CHECK_FIELD_B();
+      switch (BITS(state->words[0],22,23))
+      {
+ 	case 0:
+	  CHECK_FIELD_C(); break;
+	case 1:
+	  FIELD_C();
+	  fieldCisReg = 0;
+	  break;
+	case 2:
+	  fieldC = FIELDS(state->words[0]);
+	  fieldCisReg = 0;
+	  break;
+      }
+
+      write_instr_name();
+      WRITE_FORMAT_x_COMMA_LB(B);
+      /* Try to print B as an aux reg if it is not a core reg. */
+      usesAuxReg = 1;
+      WRITE_FORMAT_x(C);
+      WRITE_FORMAT_RB();
+      my_sprintf(state, state->operandBuffer, formatString, fieldB, fieldC);
+      write_comments();
+      break;
+
+    case 11:
+      /* lp instruction */
+
+      if (BITS(state->words[0],22,23) == 3)
+      {
+        FIELD_C();
+        CHECK_COND();
+      }
+      else
+      {
+	fieldC = FIELDS(state->words[0]);
+      }
+
+      fieldC = fieldC << 1;
+      fieldC += (addr & ~0x3);
+
+      write_instr_name();
+
+      /* This address could be a label we know.  Convert it. */
+      add_target(fieldC);
+      state->flow = state->_opcode == op_BLC ? direct_call : direct_jump;
+
+      fieldCisReg = 0;
+      strcat(formatString, "%s"); /* address/label name */
+      my_sprintf(state, state->operandBuffer, formatString, post_address(state, fieldC));
+      write_comments();
+      break;
+
+    case 12:
+      /* MOV instruction */
+      FIELD_B();
+      subopcode = BITS(state->words[0],22,23);
+      if (subopcode == 0 || ((subopcode == 3) && (!BIT(state->words[0],5))))
+      {
+      	CHECK_FIELD_C();
+      }
+      else if (subopcode == 1 || ((subopcode == 3) && (BIT(state->words[0],5))))
+      {
+      	FIELD_C();
+	fieldCisReg = 0;
+      }
+      else if (subopcode == 2)
+      {
+	fieldC = FIELDS(state->words[0]);
+	fieldCisReg = 0;
+      }
+      if (subopcode == 3)
+      {
+        CHECK_FLAG_COND();
+      }
+      else
+      {
+        CHECK_FLAG();
+      }
+
+     write_instr_name();
+     WRITE_FORMAT_x(B);
+     WRITE_FORMAT_COMMA_x(C);
+     WRITE_NOP_COMMENT();
+     my_sprintf(state, state->operandBuffer, formatString, fieldB, fieldC);
+     break;
+
+    case 13:
+    /* "B", "BL" instruction */
+
+      fieldA = 0;
+      if ((state->_opcode == op_BC  && (BIT(state->words[0],16))) ||
+ 	  (state->_opcode == op_BLC && (BIT(state->words[0],17))))
+      {
+	/* unconditional branch s25 or branch and link d25 */
+        fieldA = (BITS(state->words[0],0,4)) << 10;
+      }
+      fieldA |= BITS(state->words[0],6,15);
+
+      if (state->_opcode == op_BLC)
+      {
+	  /* Fix for Bug #553.  A bl unconditional has only 9 bits in the
+	   * least order bits. */
+	fieldA = fieldA << 9;
+        fieldA |= BITS(state->words[0],18,26);
+	fieldA = fieldA << 2;
+      }
+      else
+      {
+	fieldA = fieldA << 10;
+        fieldA |= BITS(state->words[0],17,26);
+	fieldA = fieldA << 1;
+      }
+
+      if ((state->_opcode == op_BC  && (BIT(state->words[0],16))) ||
+ 	  (state->_opcode == op_BLC && (BIT(state->words[0],17))))
+	/* unconditional branch s25 or branch and link d25 */
+        fieldA = sign_extend(fieldA, 25);
+      else
+	/* conditional branch s21 or branch and link d21 */
+        fieldA = sign_extend(fieldA, 21);
+
+      fieldA += (addr & ~0x3);
+
+      if (BIT(state->words[0],16) && state->_opcode == op_BC)
+        CHECK_NULLIFY();
+      else
+	/* Checking for bl unconditionally FIX For Bug #553 */
+	if((state->_opcode == op_BLC && BITS(state->words[0],16,17) == 2 )
+	   ||(state->_opcode == op_BC && (BIT(state->words[0],16))))
+	    CHECK_NULLIFY();
+	  else
+	    CHECK_COND_NULLIFY();
+
+
+
+      write_instr_name();
+      /* This address could be a label we know.  Convert it. */
+      add_target(fieldA); /* For debugger. */
+      state->flow = state->_opcode == op_BLC /* BL */
+          ? direct_call
+          : direct_jump;
+        /* indirect calls are achieved by "lr blink,[status]; */
+        /*      lr dest<- func addr; j [dest]" */
+
+      strcat(formatString, "%s"); /* address/label name */
+      my_sprintf(state, state->operandBuffer, formatString, post_address(state, fieldA));
+      write_comments();
+      break;
+
+    case 14:
+
+      /* Extension Instructions */
+
+      FIELD_C_AC();
+      FIELD_B_AC();
+
+      write_instr_name();
+      if (mul)
+      {
+        fieldA = fieldAisReg = 0;
+	WRITE_FORMAT_x(A);
+        WRITE_FORMAT_COMMA_x(B);
+      }
+      else
+        WRITE_FORMAT_x(B);
+      WRITE_FORMAT_COMMA_x(C);
+      WRITE_NOP_COMMENT();
+      if (mul)
+        my_sprintf(state, state->operandBuffer, formatString, 0, fieldB, fieldC);
+      else
+        my_sprintf(state, state->operandBuffer, formatString, fieldB, fieldC);
+      break;
+
+    case 15:
+
+      /* ARCompact 16-bit Load/Add resister-register */
+
+      FIELD_C_AC();
+      FIELD_B_AC();
+      FIELD_A_AC();
+
+      write_instr_name();
+
+      if (BITS(state->words[0],3,4) != 3)
+      {
+        WRITE_FORMAT_x_COMMA_LB(A);
+	WRITE_FORMAT_x(B);
+	WRITE_FORMAT_COMMA_x_RB(C);
+      }
+      else
+      {
+        WRITE_FORMAT_x(A);
+        WRITE_FORMAT_COMMA_x(B);
+        WRITE_FORMAT_COMMA_x(C);
+      }
+      WRITE_NOP_COMMENT();
+      my_sprintf(state, state->operandBuffer, formatString, fieldA, fieldB, fieldC);
+      break;
+
+    case 16:
+
+    /* ARCompact 16-bit Add/Sub/Shift instructions */
+
+      FIELD_C_AC();
+      FIELD_B_AC();
+      fieldA = FIELDA_AC(state->words[0]);
+      fieldAisReg = 0;
+
+      write_instr_name();
+      WRITE_FORMAT_x(C);
+      WRITE_FORMAT_COMMA_x(B);
+      WRITE_FORMAT_COMMA_x(A);
+      WRITE_NOP_COMMENT();
+      my_sprintf(state, state->operandBuffer, formatString, fieldC, fieldB, fieldA);
+      break;
+
+    case 17:
+
+      /* add_s instruction, one Dest/Source can be any of r0 - r63 */
+
+      CHECK_FIELD_H_AC();
+      FIELD_B_AC();
+
+      write_instr_name();
+      WRITE_FORMAT_x(B);
+      WRITE_FORMAT_COMMA_x(B);
+      WRITE_FORMAT_COMMA_x(C);
+      WRITE_NOP_COMMENT();
+      my_sprintf(state, state->operandBuffer, formatString, fieldB, fieldB, fieldC);
+      break;
+
+    case 18:
+
+      /* mov_s/cmp_s instruction, one Dest/Source can be any of r0 - r63 */
+
+      if ((BITS(state->words[0],3,4) == 1) || (BITS(state->words[0],3,4) == 2))
+      {
+      	CHECK_FIELD_H_AC();
+      }
+      else if (BITS(state->words[0],3,4) == 3)
+      {
+	FIELD_H_AC();
+      }
+      FIELD_B_AC();
+
+      write_instr_name();
+      if (BITS(state->words[0],3,4) == 3)
+      {
+        WRITE_FORMAT_x(C);
+        WRITE_FORMAT_COMMA_x(B);
+        WRITE_NOP_COMMENT();
+        my_sprintf(state, state->operandBuffer, formatString, fieldC, fieldB);
+      }
+      else
+      {
+        WRITE_FORMAT_x(B);
+        WRITE_FORMAT_COMMA_x(C);
+        WRITE_NOP_COMMENT();
+        my_sprintf(state, state->operandBuffer, formatString, fieldB, fieldC);
+      }
+      break;
+
+    case 19:
+
+      /* Stack pointer-based instructions [major opcode 0x18] */
+
+      if (BITS(state->words[0],5,7) == 5)
+        fieldA = 28;
+      else
+      {
+        FIELD_B_AC();
+	fieldA = fieldB;
+      }
+      fieldB = 28; /* Field B is the stack pointer register */
+      fieldC = (FIELDU_AC(state->words[0])) << 2;
+      fieldCisReg = 0;
+
+      write_instr_name();
+
+      switch (BITS(state->words[0],5,7))
+      {
+	case 0:
+	case 1:
+	case 2:
+	case 3:
+          WRITE_FORMAT_x_COMMA_LB(A);
+	  WRITE_FORMAT_x(B);
+	  WRITE_FORMAT_COMMA_x_RB(C);
+	  break;
+	case 4:
+	case 5:
+          WRITE_FORMAT_x(A);
+          WRITE_FORMAT_COMMA_x(B);
+          WRITE_FORMAT_COMMA_x(C);
+	  break;
+      }
+      WRITE_NOP_COMMENT();
+      my_sprintf(state, state->operandBuffer, formatString, fieldA, fieldB, fieldC);
+      break;
+
+    case 20:
+
+      /* gp-relative instructions [major opcode 0x19] */
+
+      fieldA = 0;
+      fieldB = 26; /* Field B is the gp register */
+      fieldC = FIELDS_AC(state->words[0]);
+      switch (BITS(state->words[0],9,10))
+      {
+	case 0:
+	case 3:
+	  fieldC = fieldC << 2; break;
+	case 2:
+	  fieldC = fieldC << 1; break;
+      }
+      fieldCisReg = 0;
+
+      write_instr_name();
+
+      if (BITS(state->words[0],9,10) != 3)
+      {
+        WRITE_FORMAT_x_COMMA_LB(A);
+	WRITE_FORMAT_x(B);
+	WRITE_FORMAT_COMMA_x_RB(C);
+      }
+      else
+      {
+        WRITE_FORMAT_x(A);
+        WRITE_FORMAT_COMMA_x(B);
+        WRITE_FORMAT_COMMA_x(C);
+      }
+      WRITE_NOP_COMMENT();
+      my_sprintf(state, state->operandBuffer, formatString, fieldA, fieldB, fieldC);
+      break;
+
+    case 21:
+
+      /* add/cmp/btst instructions [major opcode 28] */
+
+      FIELD_B_AC();
+      if (state->_opcode == op_Su5)
+        fieldC = (BITS(state->words[0],0,4));
+      else
+        fieldC = (BITS(state->words[0],0,6));
+      fieldCisReg = 0;
+      write_instr_name();
+
+      if (!BIT(state->words[0],7))
+      {
+        WRITE_FORMAT_x(B);
+        WRITE_FORMAT_COMMA_x(B);
+        WRITE_FORMAT_COMMA_x(C);
+        WRITE_NOP_COMMENT();
+        my_sprintf(state, state->operandBuffer, formatString, fieldB, fieldB, fieldC);
+      }
+      else
+      {
+        WRITE_FORMAT_x(B);
+        WRITE_FORMAT_COMMA_x(C);
+        WRITE_NOP_COMMENT();
+        my_sprintf(state, state->operandBuffer, formatString, fieldB, fieldC);
+      }
+      break;
+
+    case 22:
+
+      /* ARCompact 16-bit instructions, General ops/ single ops */
+
+      FIELD_C_AC();
+      FIELD_B_AC();
+
+      write_instr_name();
+
+      WRITE_FORMAT_x(B);
+      WRITE_FORMAT_COMMA_x(B);
+      WRITE_FORMAT_COMMA_x(C);
+      WRITE_NOP_COMMENT();
+      my_sprintf(state, state->operandBuffer, formatString, fieldB, fieldB, fieldC);
+      break;
+
+    case 23:
+
+      /* Shift/subtract/bit immediate instructions [major opcode 23] */
+
+      FIELD_B_AC();
+      fieldC = FIELDU_AC(state->words[0]);
+      fieldCisReg = 0;
+      write_instr_name();
+      WRITE_FORMAT_x(B);
+      WRITE_FORMAT_COMMA_x(B);
+      WRITE_FORMAT_COMMA_x(C);
+      WRITE_NOP_COMMENT();
+      my_sprintf(state, state->operandBuffer, formatString, fieldB, fieldB, fieldC);
+      break;
+
+    case 24:
+
+      /* ARCompact 16-bit Branch conditionally */
+
+      if (state->_opcode == op_BL_S)
+      {
+        fieldA = (BITS(state->words[0],0,10)) << 2;
+	fieldA = sign_extend(fieldA, 13);
+      }
+      else if (BITS(state->words[0],9,10) != 3)
+      {
+        fieldA = (BITS(state->words[0],0,8)) << 1;
+	fieldA = sign_extend(fieldA, 10);
+      }
+      else
+      {
+        fieldA = (BITS(state->words[0],0,5)) << 1;
+	fieldA = sign_extend(fieldA, 7);
+      }
+      fieldA += (addr & ~0x3);
+
+      write_instr_name();
+      /* This address could be a label we know.  Convert it. */
+      add_target(fieldA); /* For debugger. */
+      state->flow = state->_opcode == op_BL_S /* BL */
+          ? direct_call
+          : direct_jump;
+        /* indirect calls are achieved by "lr blink,[status]; */
+        /*      lr dest<- func addr; j [dest]" */
+
+      strcat(formatString, "%s"); /* address/label name */
+      my_sprintf(state, state->operandBuffer, formatString, post_address(state, fieldA));
+      write_comments();
+      break;
+
+    case 25:
+
+      /* ARCompact 16-bit Branch conditionally on reg z/nz */
+
+      FIELD_B_AC();
+      fieldC = (BITS(state->words[0],0,6)) << 1;
+      fieldC = sign_extend (fieldC, 8);
+
+      fieldC += (addr & ~0x3);
+      fieldA = fieldAisReg = fieldCisReg = 0;
+
+      write_instr_name();
+      /* This address could be a label we know.  Convert it. */
+      add_target(fieldC); /* For debugger. */
+
+      WRITE_FORMAT_x(B);
+      WRITE_FORMAT_COMMA_x(A);
+      strcat(formatString, ",%s"); /* address/label name */
+      WRITE_NOP_COMMENT();
+      my_sprintf(state, state->operandBuffer, formatString, fieldB, fieldA, post_address(state, fieldC));
+      write_comments();
+      break;
+
+    case 26:
+
+      /* Zero operand Instructions */
+
+      write_instr_name();
+      state->operandBuffer[0] = '\0';
+      break;
+
+    case 27:
+
+      /* j_s instruction */
+
+      FIELD_B_AC ();
+      state->register_for_indirect_jump = fieldB;
+      write_instr_name ();
+      strcat (formatString,"[%r]");
+      my_sprintf (state, state->operandBuffer, formatString, fieldB);
+      break;
+
+    case 28:
+
+      /* Load/Store with offset */
+
+      FIELD_C_AC();
+      FIELD_B_AC();
+      switch (state->_opcode)
+      {
+	case op_LD_S :
+	case op_ST_S :
+      	  fieldA = (FIELDU_AC(state->words[0])) << 2;
+	  break;
+	case op_LDB_S :
+	case op_STB_S :
+      	  fieldA = (FIELDU_AC(state->words[0]));
+	  break;
+	case op_LDW_S :
+	case op_LDWX_S :
+	case op_STW_S :
+      	  fieldA = (FIELDU_AC(state->words[0])) << 1;
+	  break;
+      }
+      fieldAisReg = 0;
+
+      write_instr_name();
+
+      WRITE_FORMAT_x_COMMA_LB(C);
+      WRITE_FORMAT_x(B);
+      WRITE_FORMAT_COMMA_x(A);
+      WRITE_FORMAT_RB();
+      WRITE_NOP_COMMENT();
+      my_sprintf(state, state->operandBuffer, formatString, fieldC, fieldB, fieldA);
+      write_comments();
+      break;
+
+    case 29:
+
+      /* Load pc-relative */
+
+      FIELD_B_AC();
+      fieldC = 63;
+      fieldA = (BITS(state->words[0],0,7)) << 2;
+      fieldAisReg = 0;
+
+      write_instr_name();
+
+      WRITE_FORMAT_x(B);
+      WRITE_FORMAT_COMMA_x(C);
+      WRITE_FORMAT_COMMA_x(A);
+      WRITE_NOP_COMMENT();
+      my_sprintf(state, state->operandBuffer, formatString, fieldB, fieldC, fieldA);
+      write_comments();
+      break;
+
+    case 30:
+
+      /* mov immediate */
+
+      FIELD_B_AC();
+      fieldC = (BITS(state->words[0],0,7));
+      fieldCisReg = 0;
+
+      write_instr_name();
+
+      WRITE_FORMAT_x(B);
+      WRITE_FORMAT_COMMA_x(C);
+      WRITE_NOP_COMMENT();
+      my_sprintf(state, state->operandBuffer, formatString, fieldB, fieldC);
+      write_comments();
+      break;
+
+    case 31:
+
+      /* push/pop instructions */
+
+      if (BITS(state->words[0],0,4) == 1)
+      {
+        FIELD_B_AC();
+      }
+      else if (BITS(state->words[0],0,4) == 17)
+	fieldB = 31;
+
+      write_instr_name();
+
+      WRITE_FORMAT_x(B);
+      WRITE_NOP_COMMENT();
+      my_sprintf(state, state->operandBuffer, formatString, fieldB);
+      break;
+
+    case 32:
+
+      /* Single operand instruction */
+
+      if (!BITS(state->words[0],22,23))
+      {
+        CHECK_FIELD_C();
+      }
+      else
+      {
+	FIELD_C();
+	fieldCisReg = 0;
+      }
+
+      write_instr_name();
+
+      if (!fieldC)
+        state->operandBuffer[0] = '\0';
+      else
+      {
+        WRITE_FORMAT_x(C);
+        WRITE_NOP_COMMENT();
+        my_sprintf(state, state->operandBuffer, formatString, fieldC);
+      }
+      break;
+
+  case 33:
+    /* For trap_s and the class of instructions that have
+       unsigned 6 bits in the fields B and C in A700 16 bit
+       instructions */
+    fieldC = FIELDC_AC(state->words[0]);
+    fieldB = FIELDB_AC(state->words[0]);
+    fieldCisReg = 0;
+    fieldBisReg = 0;
+    write_instr_name();
+    strcat(formatString,"%d");
+    my_sprintf(state,state->operandBuffer,formatString, ((fieldB << 3) | fieldC));
+    break;
+
+  case 34:
+    /* For ex.di and its class of instructions within op_major_4
+       This class is different from the normal set of instructions
+       in op_major_4 because this uses bit 15 as .di and the second
+       operand is actually a memory operand.
+       This is of the class
+       <op>.<di> b,[c] and <op>.<di> b,[limm]
+    */
+
+
+    /* field C is either a register or limm (different!) */
+
+    CHECK_FIELD_C();
+    FIELD_B();
+    directMem = BIT(state->words[0],15);
+
+
+    if (BITS(state->words[0],22,23) == 1 )
+      fieldCisReg = 0;
+    if (fieldCisReg)
+      state->ea_reg1 = fieldC;
+
+    write_instr_name();
+    WRITE_FORMAT_x_COMMA_LB(B);
+
+    WRITE_FORMAT_x_RB(C);
+
+    WRITE_NOP_COMMENT();
+    my_sprintf(state, state->operandBuffer, formatString, fieldB, fieldC);
+    write_comments();
+    break;
+
+  case 35:
+
+    /* sub_s.ne instruction */
+
+    FIELD_B_AC();
+    write_instr_name();
+    strcat(formatString,"%r,%r,%r");
+    my_sprintf(state, state->operandBuffer, formatString, fieldB, fieldB, fieldB);
+    break;
+
+  case 36:
+
+    FIELD_B_AC();
+
+    write_instr_name();
+
+    WRITE_FORMAT_x(B);
+    WRITE_NOP_COMMENT();
+    my_sprintf(state, state->operandBuffer, formatString, fieldB);
+
+    break;
+    /*******SIMD instructions decoding follows*************/
+  case 37:
+  case 39:
+  case 41:
+    /*fieldA is vr register
+      fieldB is I register
+      fieldC is a constant
+      %*,[%(,%<]
+      or
+      %*,%(,%<
+      or
+      %*,%(,%u
+    */
+
+    CHECK_FIELD_A();
+
+    CHECK_FIELD_B();
+    if (decodingClass == 41)
+       {
+	 FIELD_C();
+       }
+    else
+      {
+	FIELD_U8();
+
+	if (simd_scale_u8>0)
+	  fieldC = fieldC << simd_scale_u8;
+      }
+
+    fieldCisReg = 0;
+
+    write_instr_name();
+    (decodingClass == 37 ? WRITE_FORMAT_x_COMMA_LB(A) :
+                           WRITE_FORMAT_x_COMMA(A));
+    WRITE_FORMAT_x_COMMA(B);
+    (decodingClass == 37 ?  WRITE_FORMAT_x_RB(C):
+                            WRITE_FORMAT_x(C));
+    WRITE_NOP_COMMENT();
+    my_sprintf(state,state->operandBuffer, formatString, fieldA, fieldB, fieldC);
+
+
+    break;
+  case 38:
+    /* fieldA is a vr register
+       fieldB is a ARC700 basecase register.
+       %*,[%b]
+    */
+    CHECK_FIELD_A();
+    CHECK_FIELD_B();
+
+    write_instr_name();
+    WRITE_FORMAT_x_COMMA_LB(A);
+    WRITE_FORMAT_x_RB(B);
+    WRITE_NOP_COMMENT();
+    my_sprintf(state,state->operandBuffer, formatString, fieldA, fieldB);
+
+    break;
+  case 40:
+    /* fieldB & fieldC are vr registers
+       %(,%)
+       or
+       %B,%C
+       or
+       %(,%C
+    */
+    CHECK_FIELD_B();
+    CHECK_FIELD_C();
+
+    write_instr_name();
+    WRITE_FORMAT_x(B);
+    WRITE_FORMAT_COMMA_x(C);
+    my_sprintf(state, state->operandBuffer, formatString, fieldB, fieldC);
+    break;
+
+  case 42:
+    /* fieldA, fieldB, fieldC are all vr registers
+       %*, %(, %) */
+    CHECK_FIELD_A();
+    CHECK_FIELD_B();
+    FIELD_C();
+
+    write_instr_name();
+    WRITE_FORMAT_x(A);
+    WRITE_FORMAT_COMMA_x(B);
+    WRITE_FORMAT_COMMA_x(C);
+    my_sprintf(state, state->operandBuffer, formatString, fieldA, fieldB, fieldC);
+    break;
+
+  case 43:
+    /* Only fieldC is a register
+     %C*/
+    CHECK_FIELD_C();
+
+    if (BITS(state->words[0], 17, 23) == 55)
+      fieldCisReg = 0;
+
+    write_instr_name();
+    WRITE_FORMAT_x(C);
+    my_sprintf(state, state->operandBuffer, formatString, fieldC);
+    break;
+
+    /***************SIMD decoding ends*********************/
+  default:
+    mwerror(state, "Bad decoding class in ARC disassembler");
+    break;
+  }
+
+  state->_cond = cond;
+  return state->instructionLen = offset;
+}
+
+
+/*
+ * _coreRegName - Returns the name the user specified core extension
+ *                register.
+ */
+static const char *
+_coreRegName
+(
+ void *_this ATTRIBUTE_UNUSED, /* C++ this pointer */
+ int v                         /* Register value */
+ )
+{
+  return arcExtMap_coreRegName(v);
+}
+
+/*
+ * _auxRegName - Returns the name the user specified AUX extension
+ *               register.
+ */
+static const char *
+_auxRegName
+( void *_this ATTRIBUTE_UNUSED, /* C++ this pointer */
+  int v                         /* Register value */
+  )
+{
+  return arcExtMap_auxRegName(v);
+}
+
+
+/*
+ * _condCodeName - Returns the name the user specified condition code
+ *                 name.
+ */
+static const char *
+_condCodeName
+(
+ void *_this ATTRIBUTE_UNUSED, /* C++ this pointer */
+ int v                         /* Register value */
+ )
+{
+  return arcExtMap_condCodeName(v);
+}
+
+
+/*
+ * _instName - Returns the name the user specified extension instruction.
+ */
+static const char *
+_instName
+(
+ void *_this ATTRIBUTE_UNUSED, /* C++ this pointer */
+ int op1,                      /* major opcode value */
+ int op2,                      /* minor opcode value */
+ int *flags                    /* instruction flags */
+ )
+{
+  return arcExtMap_instName(op1, op2, flags);
+}
+
+static void
+parse_disassembler_options (char *options)
+{
+  if (!strncasecmp (options, "simd",4))
+    {
+      enable_simd = 1;
+    }
+}
+
+/*
+ * This function is the same as decodeInstr except that this function
+ * returns a struct arcDisState instead of the instruction length.
+ *
+ * This struct contains information useful to the debugger.
+ */
+struct arcDisState
+arcAnalyzeInstr
+(
+ bfd_vma address,		/* Address of this instruction */
+ disassemble_info* info
+ )
+{
+  int status;
+  bfd_byte buffer[4];
+  struct arcDisState s;	/* ARC Disassembler state */
+  int lowbyte, highbyte;
+
+  lowbyte = ((info->endian == BFD_ENDIAN_LITTLE) ? 1 : 0);
+  highbyte = ((info->endian == BFD_ENDIAN_LITTLE) ? 0 : 1);
+
+  memset (&s, 0, sizeof (struct arcDisState));
+
+  /* read first instruction */
+  status = (*info->read_memory_func) (address, buffer, 2, info);
+
+  if (status != 0)
+    {
+      (*info->memory_error_func) (status, address, info);
+      s.instructionLen = -1;
+      return s;
+    }
+
+  if ((buffer[lowbyte] & 0xf8) > 0x38)
+    {
+      info->bytes_per_line = 2;
+      s.words[0] = (buffer[lowbyte] << 8) | buffer[highbyte];
+      status = (*info->read_memory_func) (address + 2, buffer, 4, info);
+      if (info->endian == BFD_ENDIAN_LITTLE)
+	s.words[1] = bfd_getl32 (buffer);
+      else
+	s.words[1] = bfd_getb32 (buffer);
+    }
+  else
+    {
+      info->bytes_per_line = 4;
+      status = (*info->read_memory_func) (address + 2, &buffer[2], 2, info);
+      if (status != 0)
+	{
+	  (*info->memory_error_func) (status, address + 2, info);
+	  s.instructionLen = -1;
+	  return s;
+	}
+      if (info->endian == BFD_ENDIAN_LITTLE)
+	s.words[0] = bfd_getl32(buffer);
+      else
+	s.words[0] = bfd_getb32(buffer);
+
+      /* Always read second word in case of limm.  */
+      /* We ignore the result since the last insn may not have a limm.  */
+      status = (*info->read_memory_func) (address + 4, buffer, 4, info);
+      if (info->endian == BFD_ENDIAN_LITTLE)
+	s.words[1] = bfd_getl32(buffer);
+      else
+	s.words[1] = bfd_getb32(buffer);
+    }
+
+  s._this = &s;
+  s.coreRegName = _coreRegName;
+  s.auxRegName = _auxRegName;
+  s.condCodeName = _condCodeName;
+  s.instName = _instName;
+
+  /* disassemble */
+  dsmOneArcInst (address, (void *)&s, info);
+
+  return s;
+}
+
+/* ARCompact_decodeInstr - Decode an ARCompact instruction returning the
+   size of the instruction in bytes or zero if unrecognized.  */
+int
+ARCompact_decodeInstr (address, info)
+     bfd_vma address; /* Address of this instruction.  */
+     disassemble_info* info;
+{
+  void *stream = info->stream; /* output stream */
+  fprintf_ftype func = info->fprintf_func;
+  char buf[256];
+
+  if (info->disassembler_options)
+    {
+      parse_disassembler_options (info->disassembler_options);
+
+      /* To avoid repeated parsing of these options, we remove them here.  */
+      info->disassembler_options = NULL;
+    }
+
+  s = arcAnalyzeInstr (address, info);
+
+  if (!s.this)
+    return -1;
+
+  /* display the disassembly instruction */
+
+  if (s.instructionLen == 2)
+    (*func) (stream, "        ");
+
+  (*func) (stream, "%08x ", s.words[0]);
+  (*func) (stream, "    ");
+
+  (*func) (stream, "%-10s ", s.instrBuffer);
+
+  if (__TRANSLATION_REQUIRED(s))
+    {
+      bfd_vma addr;
+      char *tmpBuffer;
+      int i = 1;
+      if (s.operandBuffer[0] != '@')
+	{
+	  /* Branch instruction with 3 operands, Translation is required
+	     only for the third operand. Print the first 2 operands */
+	  strcpy (buf, s.operandBuffer);
+	  tmpBuffer = strtok (buf,"@");
+	  (*func) (stream, "%s",tmpBuffer);
+	  i = strlen (tmpBuffer)+1;
+	}
+      addr = s.addresses[s.operandBuffer[i] - '0'];
+      (*info->print_address_func) ((bfd_vma) addr, info);
+      (*func) (stream, "\n");
+    }
+  else
+    (*func) (stream, "%s",s.operandBuffer);
+  return s.instructionLen;
+
+}
diff --git a/sim/common/ChangeLog.ARC b/sim/common/ChangeLog.ARC
new file mode 100644
index 0000000..2b73a9f
--- /dev/null
+++ b/sim/common/ChangeLog.ARC
@@ -0,0 +1,42 @@
+2007-09-17  J"orn Rennecke  <joern.rennecke@arc.com>
+
+	* gentvals.sh: Allow target-specific definitions to override
+	later generic ones.
+	* gennltvals.sh: Use ${srcroot}/newlib/libc/sys/arc/sys/fcntl.h
+	for open on arc.
+	* nltvals.def: Regenerate.
+
+2007-08-22  J"orn Rennecke  <joern.rennecke@arc.com>
+
+	* cgen-trace.c (sim_cgen_disassemble_insn):
+	Check for CGEN_INSN_DISASM_BITSIZE.
+
+2007-08-21  J"orn Rennecke  <joern.rennecke@arc.com>
+
+	* cgen-trace.c (sim_cgen_disassemble_insn): Disable bogus sanity check.
+
+2007-05-14  J"orn Rennecke  <joern.rennecke@arc.com>
+
+	* callback.c (fdmap, fdbad): No longer static.
+
+2007-05-02  J"orn Rennecke  <joern.rennecke@arc.com>
+
+	* syscall.c (get_path): No longer static.
+
+2007-04-30  J"orn Rennecke  <joern.rennecke@arc.com>
+
+	* gennltvals.sh: Add arc code.
+	* nltvals.def: Regenerate.
+
+	Speed up simulator startup:
+	* sim-utils.c (zalloc): Use xcalloc.
+
+	Debugging utility functions:
+	* sim-utils.c (dump_hex, dump_strn_1, dump_asc): New functions.
+	* (dump_str, dump_strn): Likewise.
+
+	Fix descriptor 0/1/2 handling in pesence of freopen:
+	* syscall.c (cb_syscall): Add comments about descriptors 0/1/2.
+	* callback.c (os_read_stdin): Use os_read.
+	(os_write): Use fwrite to stdout / stderr for descriptor 1 / 2.
+	(os_write_stdout, os_write_stderr): Use os_write.