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.
