Home | History | Annotate | Line # | Download | only in cr16
simops.c revision 1.6
      1  1.1  christos /* Simulation code for the CR16 processor.
      2  1.6  christos    Copyright (C) 2008-2016 Free Software Foundation, Inc.
      3  1.1  christos    Contributed by M Ranga Swami Reddy <MR.Swami.Reddy (at) nsc.com>
      4  1.1  christos 
      5  1.1  christos    This file is part of GDB, the GNU debugger.
      6  1.1  christos 
      7  1.1  christos    This program is free software; you can redistribute it and/or modify
      8  1.1  christos    it under the terms of the GNU General Public License as published by
      9  1.1  christos    the Free Software Foundation; either version 3, or (at your option)
     10  1.1  christos    any later version.
     11  1.1  christos 
     12  1.1  christos    This program is distributed in the hope that it will be useful,
     13  1.1  christos    but WITHOUT ANY WARRANTY; without even the implied warranty of
     14  1.1  christos    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
     15  1.1  christos    GNU General Public License for more details.
     16  1.1  christos 
     17  1.1  christos    You should have received a copy of the GNU General Public License
     18  1.1  christos    along with this program. If not, see <http://www.gnu.org/licenses/>.  */
     19  1.1  christos 
     20  1.1  christos 
     21  1.1  christos #include "config.h"
     22  1.1  christos 
     23  1.1  christos #include <signal.h>
     24  1.1  christos #include <errno.h>
     25  1.1  christos #include <sys/types.h>
     26  1.1  christos #include <sys/stat.h>
     27  1.1  christos #ifdef HAVE_UNISTD_H
     28  1.1  christos #include <unistd.h>
     29  1.1  christos #endif
     30  1.1  christos #ifdef HAVE_STRING_H
     31  1.1  christos #include <string.h>
     32  1.1  christos #endif
     33  1.5  christos #ifdef HAVE_TIME_H
     34  1.5  christos #include <time.h>
     35  1.5  christos #endif
     36  1.5  christos #ifdef HAVE_SYS_TIME_H
     37  1.5  christos #include <sys/time.h>
     38  1.5  christos #endif
     39  1.1  christos 
     40  1.5  christos #include "sim-main.h"
     41  1.1  christos #include "simops.h"
     42  1.1  christos #include "targ-vals.h"
     43  1.1  christos 
     44  1.5  christos #ifdef TARGET_SYS_utime
     45  1.5  christos #include <utime.h>
     46  1.5  christos #endif
     47  1.5  christos #ifdef TARGET_SYS_wait
     48  1.5  christos #include <sys/wait.h>
     49  1.5  christos #endif
     50  1.1  christos 
     51  1.6  christos #define EXCEPTION(sig) sim_engine_halt (sd, cpu, NULL, PC, sim_stopped, sig)
     52  1.6  christos 
     53  1.1  christos enum op_types {
     54  1.1  christos   OP_VOID,
     55  1.1  christos   OP_CONSTANT3,
     56  1.1  christos   OP_UCONSTANT3,
     57  1.1  christos   OP_CONSTANT4,
     58  1.1  christos   OP_CONSTANT4_1,
     59  1.1  christos   OP_CONSTANT5,
     60  1.1  christos   OP_CONSTANT6,
     61  1.1  christos   OP_CONSTANT16,
     62  1.1  christos   OP_UCONSTANT16,
     63  1.1  christos   OP_CONSTANT20,
     64  1.1  christos   OP_UCONSTANT20,
     65  1.1  christos   OP_CONSTANT32,
     66  1.1  christos   OP_UCONSTANT32,
     67  1.1  christos   OP_MEMREF,
     68  1.1  christos   OP_MEMREF2,
     69  1.1  christos   OP_MEMREF3,
     70  1.1  christos 
     71  1.1  christos   OP_DISP5,
     72  1.1  christos   OP_DISP17,
     73  1.1  christos   OP_DISP25,
     74  1.1  christos   OP_DISPE9,
     75  1.1  christos   //OP_ABS20,
     76  1.1  christos   OP_ABS20_OUTPUT,
     77  1.1  christos   //OP_ABS24,
     78  1.1  christos   OP_ABS24_OUTPUT,
     79  1.1  christos 
     80  1.1  christos   OP_R_BASE_DISPS16,
     81  1.1  christos   OP_R_BASE_DISP20,
     82  1.1  christos   OP_R_BASE_DISPS20,
     83  1.1  christos   OP_R_BASE_DISPE20,
     84  1.1  christos 
     85  1.1  christos   OP_RP_BASE_DISPE0,
     86  1.1  christos   OP_RP_BASE_DISP4,
     87  1.1  christos   OP_RP_BASE_DISPE4,
     88  1.1  christos   OP_RP_BASE_DISP14,
     89  1.1  christos   OP_RP_BASE_DISP16,
     90  1.1  christos   OP_RP_BASE_DISP20,
     91  1.1  christos   OP_RP_BASE_DISPS20,
     92  1.1  christos   OP_RP_BASE_DISPE20,
     93  1.1  christos 
     94  1.1  christos   OP_R_INDEX7_ABS20,
     95  1.1  christos   OP_R_INDEX8_ABS20,
     96  1.1  christos 
     97  1.1  christos   OP_RP_INDEX_DISP0,
     98  1.1  christos   OP_RP_INDEX_DISP14,
     99  1.1  christos   OP_RP_INDEX_DISP20,
    100  1.1  christos   OP_RP_INDEX_DISPS20,
    101  1.1  christos 
    102  1.1  christos   OP_REG,
    103  1.1  christos   OP_REGP,
    104  1.1  christos   OP_PROC_REG,
    105  1.1  christos   OP_PROC_REGP,
    106  1.1  christos   OP_COND,
    107  1.1  christos   OP_RA
    108  1.1  christos };
    109  1.1  christos 
    110  1.1  christos 
    111  1.1  christos enum {
    112  1.1  christos   PSR_MASK = (PSR_I_BIT
    113  1.1  christos 	      | PSR_P_BIT
    114  1.1  christos 	      | PSR_E_BIT
    115  1.1  christos 	      | PSR_N_BIT
    116  1.1  christos 	      | PSR_Z_BIT
    117  1.1  christos 	      | PSR_F_BIT
    118  1.1  christos 	      | PSR_U_BIT
    119  1.1  christos 	      | PSR_L_BIT
    120  1.1  christos 	      | PSR_T_BIT
    121  1.1  christos 	      | PSR_C_BIT),
    122  1.1  christos   /* The following bits in the PSR _can't_ be set by instructions such
    123  1.1  christos      as mvtc.  */
    124  1.1  christos   PSR_HW_MASK = (PSR_MASK)
    125  1.1  christos };
    126  1.1  christos 
    127  1.1  christos /* cond    Code Condition            True State
    128  1.1  christos  * EQ      Equal                     Z flag is 1
    129  1.1  christos  * NE      Not Equal                 Z flag is 0
    130  1.1  christos  * CS      Carry Set                 C flag is 1
    131  1.1  christos  * CC      Carry Clear               C flag is 0
    132  1.1  christos  * HI      Higher                    L flag is 1
    133  1.1  christos  * LS      Lower or Same             L flag is 0
    134  1.1  christos  * GT      Greater Than              N flag is 1
    135  1.1  christos  * LE      Less Than or Equal To     N flag is 0
    136  1.1  christos  * FS      Flag Set                  F flag is 1
    137  1.1  christos  * FC      Flag Clear                F flag is 0
    138  1.1  christos  * LO      Lower                     Z and L flags are 0
    139  1.1  christos  * HS      Higher or Same            Z or L flag is 1
    140  1.1  christos  * LT      Less Than                 Z and N flags are 0
    141  1.1  christos  * GE      Greater Than or Equal To  Z or N flag is 1.  */
    142  1.1  christos 
    143  1.5  christos static int cond_stat(int cc)
    144  1.1  christos {
    145  1.1  christos   switch (cc)
    146  1.1  christos     {
    147  1.1  christos       case 0: return  PSR_Z; break;
    148  1.1  christos       case 1: return !PSR_Z; break;
    149  1.1  christos       case 2: return  PSR_C; break;
    150  1.1  christos       case 3: return !PSR_C; break;
    151  1.1  christos       case 4: return  PSR_L; break;
    152  1.1  christos       case 5: return !PSR_L; break;
    153  1.1  christos       case 6: return  PSR_N; break;
    154  1.1  christos       case 7: return !PSR_N; break;
    155  1.1  christos       case 8: return  PSR_F; break;
    156  1.1  christos       case 9: return !PSR_F; break;
    157  1.1  christos       case 10: return !PSR_Z && !PSR_L; break;
    158  1.1  christos       case 11: return  PSR_Z ||  PSR_L; break;
    159  1.1  christos       case 12: return !PSR_Z && !PSR_N; break;
    160  1.1  christos       case 13: return  PSR_Z ||  PSR_N; break;
    161  1.1  christos       case 14: return 1; break; /*ALWAYS.  */
    162  1.1  christos       default:
    163  1.1  christos      // case NEVER:  return false; break;
    164  1.1  christos       //case NO_COND_CODE:
    165  1.1  christos       //panic("Shouldn't have NO_COND_CODE in an actual instruction!");
    166  1.1  christos       return 0; break;
    167  1.1  christos      }
    168  1.1  christos    return 0;
    169  1.1  christos }
    170  1.1  christos 
    171  1.1  christos 
    172  1.1  christos creg_t
    173  1.6  christos move_to_cr (SIM_DESC sd, SIM_CPU *cpu, int cr, creg_t mask, creg_t val, int psw_hw_p)
    174  1.1  christos {
    175  1.1  christos   /* A MASK bit is set when the corresponding bit in the CR should
    176  1.1  christos      be left alone.  */
    177  1.1  christos   /* This assumes that (VAL & MASK) == 0.  */
    178  1.1  christos   switch (cr)
    179  1.1  christos     {
    180  1.1  christos     case PSR_CR:
    181  1.1  christos       if (psw_hw_p)
    182  1.1  christos 	val &= PSR_HW_MASK;
    183  1.1  christos #if 0
    184  1.1  christos       else
    185  1.1  christos 	val &= PSR_MASK;
    186  1.6  christos 	  sim_io_printf
    187  1.6  christos 		(sd,
    188  1.1  christos 		 "ERROR at PC 0x%x: ST can only be set when FX is set.\n", PC);
    189  1.6  christos 	  EXCEPTION (SIM_SIGILL);
    190  1.1  christos #endif
    191  1.1  christos       /* keep an up-to-date psw around for tracing.  */
    192  1.1  christos       State.trace.psw = (State.trace.psw & mask) | val;
    193  1.1  christos       break;
    194  1.1  christos     default:
    195  1.1  christos       break;
    196  1.1  christos     }
    197  1.1  christos   /* only issue an update if the register is being changed.  */
    198  1.1  christos   if ((State.cregs[cr] & ~mask) != val)
    199  1.1  christos    SLOT_PEND_MASK (State.cregs[cr], mask, val);
    200  1.1  christos 
    201  1.1  christos   return val;
    202  1.1  christos }
    203  1.1  christos 
    204  1.1  christos #ifdef DEBUG
    205  1.6  christos static void trace_input_func (SIM_DESC sd,
    206  1.6  christos 			      const char *name,
    207  1.1  christos 			      enum op_types in1,
    208  1.1  christos 			      enum op_types in2,
    209  1.1  christos 			      enum op_types in3);
    210  1.1  christos 
    211  1.6  christos #define trace_input(name, in1, in2, in3) do { if (cr16_debug) trace_input_func (sd, name, in1, in2, in3); } while (0)
    212  1.1  christos 
    213  1.1  christos #ifndef SIZE_INSTRUCTION
    214  1.1  christos #define SIZE_INSTRUCTION 8
    215  1.1  christos #endif
    216  1.1  christos 
    217  1.1  christos #ifndef SIZE_OPERANDS
    218  1.1  christos #define SIZE_OPERANDS 18
    219  1.1  christos #endif
    220  1.1  christos 
    221  1.1  christos #ifndef SIZE_VALUES
    222  1.1  christos #define SIZE_VALUES 13
    223  1.1  christos #endif
    224  1.1  christos 
    225  1.1  christos #ifndef SIZE_LOCATION
    226  1.1  christos #define SIZE_LOCATION 20
    227  1.1  christos #endif
    228  1.1  christos 
    229  1.1  christos #ifndef SIZE_PC
    230  1.1  christos #define SIZE_PC 4
    231  1.1  christos #endif
    232  1.1  christos 
    233  1.1  christos #ifndef SIZE_LINE_NUMBER
    234  1.1  christos #define SIZE_LINE_NUMBER 2
    235  1.1  christos #endif
    236  1.1  christos 
    237  1.1  christos static void
    238  1.6  christos trace_input_func (SIM_DESC sd, const char *name, enum op_types in1, enum op_types in2, enum op_types in3)
    239  1.1  christos {
    240  1.1  christos   char *comma;
    241  1.1  christos   enum op_types in[3];
    242  1.1  christos   int i;
    243  1.1  christos   char buf[1024];
    244  1.1  christos   char *p;
    245  1.1  christos   long tmp;
    246  1.1  christos   char *type;
    247  1.1  christos   const char *filename;
    248  1.1  christos   const char *functionname;
    249  1.1  christos   unsigned int linenumber;
    250  1.1  christos   bfd_vma byte_pc;
    251  1.1  christos 
    252  1.1  christos   if ((cr16_debug & DEBUG_TRACE) == 0)
    253  1.1  christos     return;
    254  1.1  christos 
    255  1.1  christos   switch (State.ins_type)
    256  1.1  christos     {
    257  1.1  christos     default:
    258  1.1  christos     case INS_UNKNOWN:		type = " ?"; break;
    259  1.1  christos     }
    260  1.1  christos 
    261  1.1  christos   if ((cr16_debug & DEBUG_LINE_NUMBER) == 0)
    262  1.6  christos     sim_io_printf (sd,
    263  1.1  christos 				       "0x%.*x %s: %-*s ",
    264  1.1  christos 				       SIZE_PC, (unsigned)PC,
    265  1.1  christos 				       type,
    266  1.1  christos 				       SIZE_INSTRUCTION, name);
    267  1.1  christos 
    268  1.1  christos   else
    269  1.1  christos     {
    270  1.1  christos       buf[0] = '\0';
    271  1.5  christos       byte_pc = PC;
    272  1.6  christos       if (STATE_TEXT_SECTION (sd)
    273  1.6  christos 	  && byte_pc >= STATE_TEXT_START (sd)
    274  1.6  christos 	  && byte_pc < STATE_TEXT_END (sd))
    275  1.1  christos 	{
    276  1.1  christos 	  filename = (const char *)0;
    277  1.1  christos 	  functionname = (const char *)0;
    278  1.1  christos 	  linenumber = 0;
    279  1.6  christos 	  if (bfd_find_nearest_line (STATE_PROG_BFD (sd),
    280  1.6  christos 				     STATE_TEXT_SECTION (sd),
    281  1.5  christos 				     (struct bfd_symbol **)0,
    282  1.6  christos 				     byte_pc - STATE_TEXT_START (sd),
    283  1.1  christos 				     &filename, &functionname, &linenumber))
    284  1.1  christos 	    {
    285  1.1  christos 	      p = buf;
    286  1.1  christos 	      if (linenumber)
    287  1.1  christos 		{
    288  1.1  christos 		  sprintf (p, "#%-*d ", SIZE_LINE_NUMBER, linenumber);
    289  1.1  christos 		  p += strlen (p);
    290  1.1  christos 		}
    291  1.1  christos 	      else
    292  1.1  christos 		{
    293  1.1  christos 		  sprintf (p, "%-*s ", SIZE_LINE_NUMBER+1, "---");
    294  1.1  christos 		  p += SIZE_LINE_NUMBER+2;
    295  1.1  christos 		}
    296  1.1  christos 
    297  1.1  christos 	      if (functionname)
    298  1.1  christos 		{
    299  1.1  christos 		  sprintf (p, "%s ", functionname);
    300  1.1  christos 		  p += strlen (p);
    301  1.1  christos 		}
    302  1.1  christos 	      else if (filename)
    303  1.1  christos 		{
    304  1.1  christos 		  char *q = strrchr (filename, '/');
    305  1.1  christos 		  sprintf (p, "%s ", (q) ? q+1 : filename);
    306  1.1  christos 		  p += strlen (p);
    307  1.1  christos 		}
    308  1.1  christos 
    309  1.1  christos 	      if (*p == ' ')
    310  1.1  christos 		*p = '\0';
    311  1.1  christos 	    }
    312  1.1  christos 	}
    313  1.1  christos 
    314  1.6  christos       sim_io_printf (sd,
    315  1.1  christos 					 "0x%.*x %s: %-*.*s %-*s ",
    316  1.1  christos 					 SIZE_PC, (unsigned)PC,
    317  1.1  christos 					 type,
    318  1.1  christos 					 SIZE_LOCATION, SIZE_LOCATION, buf,
    319  1.1  christos 					 SIZE_INSTRUCTION, name);
    320  1.1  christos     }
    321  1.1  christos 
    322  1.1  christos   in[0] = in1;
    323  1.1  christos   in[1] = in2;
    324  1.1  christos   in[2] = in3;
    325  1.1  christos   comma = "";
    326  1.1  christos   p = buf;
    327  1.1  christos   for (i = 0; i < 3; i++)
    328  1.1  christos     {
    329  1.1  christos       switch (in[i])
    330  1.1  christos 	{
    331  1.1  christos 	case OP_VOID:
    332  1.1  christos 	  break;
    333  1.1  christos 
    334  1.1  christos 	case OP_REG:
    335  1.1  christos 	case OP_REGP:
    336  1.1  christos 	  sprintf (p, "%sr%d", comma, OP[i]);
    337  1.1  christos 	  p += strlen (p);
    338  1.1  christos 	  comma = ",";
    339  1.1  christos 	  break;
    340  1.1  christos 
    341  1.1  christos 	case OP_PROC_REG:
    342  1.1  christos 	  sprintf (p, "%scr%d", comma, OP[i]);
    343  1.1  christos 	  p += strlen (p);
    344  1.1  christos 	  comma = ",";
    345  1.1  christos 	  break;
    346  1.1  christos 
    347  1.1  christos 	case OP_CONSTANT16:
    348  1.1  christos 	  sprintf (p, "%s%d", comma, OP[i]);
    349  1.1  christos 	  p += strlen (p);
    350  1.1  christos 	  comma = ",";
    351  1.1  christos 	  break;
    352  1.1  christos 
    353  1.1  christos 	case OP_CONSTANT4:
    354  1.1  christos 	  sprintf (p, "%s%d", comma, SEXT4(OP[i]));
    355  1.1  christos 	  p += strlen (p);
    356  1.1  christos 	  comma = ",";
    357  1.1  christos 	  break;
    358  1.1  christos 
    359  1.1  christos 	case OP_CONSTANT3:
    360  1.1  christos 	  sprintf (p, "%s%d", comma, SEXT3(OP[i]));
    361  1.1  christos 	  p += strlen (p);
    362  1.1  christos 	  comma = ",";
    363  1.1  christos 	  break;
    364  1.1  christos 
    365  1.1  christos 	case OP_MEMREF:
    366  1.1  christos 	  sprintf (p, "%s@r%d", comma, OP[i]);
    367  1.1  christos 	  p += strlen (p);
    368  1.1  christos 	  comma = ",";
    369  1.1  christos 	  break;
    370  1.1  christos 
    371  1.1  christos 	case OP_MEMREF2:
    372  1.1  christos 	  sprintf (p, "%s@(%d,r%d)", comma, (int16)OP[i], OP[i+1]);
    373  1.1  christos 	  p += strlen (p);
    374  1.1  christos 	  comma = ",";
    375  1.1  christos 	  break;
    376  1.1  christos 
    377  1.1  christos 	case OP_MEMREF3:
    378  1.1  christos 	  sprintf (p, "%s@%d", comma, OP[i]);
    379  1.1  christos 	  p += strlen (p);
    380  1.1  christos 	  comma = ",";
    381  1.1  christos 	  break;
    382  1.1  christos 	}
    383  1.1  christos     }
    384  1.1  christos 
    385  1.1  christos   if ((cr16_debug & DEBUG_VALUES) == 0)
    386  1.1  christos     {
    387  1.1  christos       *p++ = '\n';
    388  1.1  christos       *p = '\0';
    389  1.6  christos       sim_io_printf (sd, "%s", buf);
    390  1.1  christos     }
    391  1.1  christos   else
    392  1.1  christos     {
    393  1.1  christos       *p = '\0';
    394  1.6  christos       sim_io_printf (sd, "%-*s", SIZE_OPERANDS, buf);
    395  1.1  christos 
    396  1.1  christos       p = buf;
    397  1.1  christos       for (i = 0; i < 3; i++)
    398  1.1  christos 	{
    399  1.1  christos 	  buf[0] = '\0';
    400  1.1  christos 	  switch (in[i])
    401  1.1  christos 	    {
    402  1.1  christos 	    case OP_VOID:
    403  1.6  christos 	      sim_io_printf (sd, "%*s", SIZE_VALUES, "");
    404  1.1  christos 	      break;
    405  1.1  christos 
    406  1.1  christos 	    case OP_REG:
    407  1.6  christos 	      sim_io_printf (sd, "%*s0x%.4x", SIZE_VALUES-6, "",
    408  1.1  christos 						 (uint16) GPR (OP[i]));
    409  1.1  christos 	      break;
    410  1.1  christos 
    411  1.1  christos 	    case OP_REGP:
    412  1.1  christos 	      tmp = (long)((((uint32) GPR (OP[i])) << 16) | ((uint32) GPR (OP[i] + 1)));
    413  1.6  christos 	      sim_io_printf (sd, "%*s0x%.8lx", SIZE_VALUES-10, "", tmp);
    414  1.1  christos 	      break;
    415  1.1  christos 
    416  1.1  christos 	    case OP_PROC_REG:
    417  1.6  christos 	      sim_io_printf (sd, "%*s0x%.4x", SIZE_VALUES-6, "",
    418  1.1  christos 						 (uint16) CREG (OP[i]));
    419  1.1  christos 	      break;
    420  1.1  christos 
    421  1.1  christos 	    case OP_CONSTANT16:
    422  1.6  christos 	      sim_io_printf (sd, "%*s0x%.4x", SIZE_VALUES-6, "",
    423  1.1  christos 						 (uint16)OP[i]);
    424  1.1  christos 	      break;
    425  1.1  christos 
    426  1.1  christos 	    case OP_CONSTANT4:
    427  1.6  christos 	      sim_io_printf (sd, "%*s0x%.4x", SIZE_VALUES-6, "",
    428  1.1  christos 						 (uint16)SEXT4(OP[i]));
    429  1.1  christos 	      break;
    430  1.1  christos 
    431  1.1  christos 	    case OP_CONSTANT3:
    432  1.6  christos 	      sim_io_printf (sd, "%*s0x%.4x", SIZE_VALUES-6, "",
    433  1.1  christos 						 (uint16)SEXT3(OP[i]));
    434  1.1  christos 	      break;
    435  1.1  christos 
    436  1.1  christos 	    case OP_MEMREF2:
    437  1.6  christos 	      sim_io_printf (sd, "%*s0x%.4x", SIZE_VALUES-6, "",
    438  1.1  christos 						 (uint16)OP[i]);
    439  1.6  christos 	      sim_io_printf (sd, "%*s0x%.4x", SIZE_VALUES-6, "",
    440  1.1  christos 						 (uint16)GPR (OP[i + 1]));
    441  1.1  christos 	      i++;
    442  1.1  christos 	      break;
    443  1.1  christos 	    }
    444  1.1  christos 	}
    445  1.1  christos     }
    446  1.1  christos 
    447  1.6  christos   sim_io_flush_stdout (sd);
    448  1.1  christos }
    449  1.1  christos 
    450  1.1  christos static void
    451  1.6  christos do_trace_output_flush (SIM_DESC sd)
    452  1.1  christos {
    453  1.6  christos   sim_io_flush_stdout (sd);
    454  1.1  christos }
    455  1.1  christos 
    456  1.1  christos static void
    457  1.6  christos do_trace_output_finish (SIM_DESC sd)
    458  1.1  christos {
    459  1.6  christos   sim_io_printf (sd,
    460  1.1  christos 				     " F0=%d F1=%d C=%d\n",
    461  1.1  christos 				     (State.trace.psw & PSR_F_BIT) != 0,
    462  1.1  christos 				     (State.trace.psw & PSR_F_BIT) != 0,
    463  1.1  christos 				     (State.trace.psw & PSR_C_BIT) != 0);
    464  1.6  christos   sim_io_flush_stdout (sd);
    465  1.1  christos }
    466  1.1  christos 
    467  1.5  christos #if 0
    468  1.1  christos static void
    469  1.6  christos trace_output_40 (SIM_DESC sd, uint64 val)
    470  1.1  christos {
    471  1.1  christos   if ((cr16_debug & (DEBUG_TRACE | DEBUG_VALUES)) == (DEBUG_TRACE | DEBUG_VALUES))
    472  1.1  christos     {
    473  1.6  christos       sim_io_printf (sd,
    474  1.1  christos 					 " :: %*s0x%.2x%.8lx",
    475  1.1  christos 					 SIZE_VALUES - 12,
    476  1.1  christos 					 "",
    477  1.1  christos 					 ((int)(val >> 32) & 0xff),
    478  1.1  christos 					 ((unsigned long) val) & 0xffffffff);
    479  1.1  christos       do_trace_output_finish ();
    480  1.1  christos     }
    481  1.1  christos }
    482  1.5  christos #endif
    483  1.1  christos 
    484  1.1  christos static void
    485  1.6  christos trace_output_32 (SIM_DESC sd, uint32 val)
    486  1.1  christos {
    487  1.1  christos   if ((cr16_debug & (DEBUG_TRACE | DEBUG_VALUES)) == (DEBUG_TRACE | DEBUG_VALUES))
    488  1.1  christos     {
    489  1.6  christos       sim_io_printf (sd,
    490  1.1  christos 					 " :: %*s0x%.8x",
    491  1.1  christos 					 SIZE_VALUES - 10,
    492  1.1  christos 					 "",
    493  1.1  christos 					 (int) val);
    494  1.6  christos       do_trace_output_finish (sd);
    495  1.1  christos     }
    496  1.1  christos }
    497  1.1  christos 
    498  1.1  christos static void
    499  1.6  christos trace_output_16 (SIM_DESC sd, uint16 val)
    500  1.1  christos {
    501  1.1  christos   if ((cr16_debug & (DEBUG_TRACE | DEBUG_VALUES)) == (DEBUG_TRACE | DEBUG_VALUES))
    502  1.1  christos     {
    503  1.6  christos       sim_io_printf (sd,
    504  1.1  christos 					 " :: %*s0x%.4x",
    505  1.1  christos 					 SIZE_VALUES - 6,
    506  1.1  christos 					 "",
    507  1.1  christos 					 (int) val);
    508  1.6  christos       do_trace_output_finish (sd);
    509  1.1  christos     }
    510  1.1  christos }
    511  1.1  christos 
    512  1.1  christos static void
    513  1.6  christos trace_output_void (SIM_DESC sd)
    514  1.1  christos {
    515  1.1  christos   if ((cr16_debug & (DEBUG_TRACE | DEBUG_VALUES)) == (DEBUG_TRACE | DEBUG_VALUES))
    516  1.1  christos     {
    517  1.6  christos       sim_io_printf (sd, "\n");
    518  1.6  christos       do_trace_output_flush (sd);
    519  1.1  christos     }
    520  1.1  christos }
    521  1.1  christos 
    522  1.1  christos static void
    523  1.6  christos trace_output_flag (SIM_DESC sd)
    524  1.1  christos {
    525  1.1  christos   if ((cr16_debug & (DEBUG_TRACE | DEBUG_VALUES)) == (DEBUG_TRACE | DEBUG_VALUES))
    526  1.1  christos     {
    527  1.6  christos       sim_io_printf (sd,
    528  1.1  christos 					 " :: %*s",
    529  1.1  christos 					 SIZE_VALUES,
    530  1.1  christos 					 "");
    531  1.6  christos       do_trace_output_finish (sd);
    532  1.1  christos     }
    533  1.1  christos }
    534  1.1  christos 
    535  1.1  christos 
    536  1.1  christos 
    537  1.1  christos 
    538  1.1  christos #else
    539  1.1  christos #define trace_input(NAME, IN1, IN2, IN3)
    540  1.1  christos #define trace_output(RESULT)
    541  1.1  christos #endif
    542  1.1  christos 
    543  1.1  christos /* addub.  */
    544  1.1  christos void
    545  1.6  christos OP_2C_8 (SIM_DESC sd, SIM_CPU *cpu)
    546  1.1  christos {
    547  1.1  christos   uint8 tmp;
    548  1.1  christos   uint8 a = OP[0] & 0xff;
    549  1.1  christos   uint16 b = (GPR (OP[1])) & 0xff;
    550  1.1  christos   trace_input ("addub", OP_CONSTANT4_1, OP_REG, OP_VOID);
    551  1.1  christos   tmp = (a + b) & 0xff;
    552  1.1  christos   SET_GPR (OP[1], (tmp | ((GPR (OP[1])) & 0xff00)));
    553  1.6  christos   trace_output_16 (sd, tmp);
    554  1.1  christos }
    555  1.1  christos 
    556  1.1  christos /* addub.  */
    557  1.1  christos void
    558  1.6  christos OP_2CB_C (SIM_DESC sd, SIM_CPU *cpu)
    559  1.1  christos {
    560  1.1  christos   uint16 tmp;
    561  1.1  christos   uint8 a = ((OP[0]) & 0xff), b = (GPR (OP[1])) & 0xff;
    562  1.1  christos   trace_input ("addub", OP_CONSTANT16, OP_REG, OP_VOID);
    563  1.1  christos   tmp = (a + b) & 0xff;
    564  1.1  christos   SET_GPR (OP[1], (tmp | ((GPR (OP[1])) & 0xff00)));
    565  1.6  christos   trace_output_16 (sd, tmp);
    566  1.1  christos }
    567  1.1  christos 
    568  1.1  christos /* addub.  */
    569  1.1  christos void
    570  1.6  christos OP_2D_8 (SIM_DESC sd, SIM_CPU *cpu)
    571  1.1  christos {
    572  1.1  christos   uint8 a = (GPR (OP[0])) & 0xff;
    573  1.1  christos   uint8 b = (GPR (OP[1])) & 0xff;
    574  1.1  christos   uint16 tmp = (a + b) & 0xff;
    575  1.1  christos   trace_input ("addub", OP_REG, OP_REG, OP_VOID);
    576  1.1  christos   SET_GPR (OP[1], (tmp | ((GPR (OP[1])) & 0xff00)));
    577  1.6  christos   trace_output_16 (sd, tmp);
    578  1.1  christos }
    579  1.1  christos 
    580  1.1  christos /* adduw.  */
    581  1.1  christos void
    582  1.6  christos OP_2E_8 (SIM_DESC sd, SIM_CPU *cpu)
    583  1.1  christos {
    584  1.1  christos   uint16 a = OP[0];
    585  1.1  christos   uint16 b = GPR (OP[1]);
    586  1.1  christos   uint16 tmp = (a + b);
    587  1.1  christos   trace_input ("adduw", OP_CONSTANT4_1, OP_REG, OP_VOID);
    588  1.1  christos   SET_GPR (OP[1], tmp);
    589  1.6  christos   trace_output_16 (sd, tmp);
    590  1.1  christos }
    591  1.1  christos 
    592  1.1  christos /* adduw.  */
    593  1.1  christos void
    594  1.6  christos OP_2EB_C (SIM_DESC sd, SIM_CPU *cpu)
    595  1.1  christos {
    596  1.1  christos   uint16 a = OP[0];
    597  1.1  christos   uint16 b = GPR (OP[1]);
    598  1.1  christos   uint16 tmp = (a + b);
    599  1.1  christos   trace_input ("adduw", OP_CONSTANT16, OP_REG, OP_VOID);
    600  1.1  christos   SET_GPR (OP[1], tmp);
    601  1.6  christos   trace_output_16 (sd, tmp);
    602  1.1  christos }
    603  1.1  christos 
    604  1.1  christos /* adduw.  */
    605  1.1  christos void
    606  1.6  christos OP_2F_8 (SIM_DESC sd, SIM_CPU *cpu)
    607  1.1  christos {
    608  1.1  christos   uint16 a = GPR (OP[0]);
    609  1.1  christos   uint16 b = GPR (OP[1]);
    610  1.1  christos   uint16 tmp = (a + b);
    611  1.1  christos   trace_input ("adduw", OP_REG, OP_REG, OP_VOID);
    612  1.1  christos   SET_GPR (OP[1], tmp);
    613  1.6  christos   trace_output_16 (sd, tmp);
    614  1.1  christos }
    615  1.1  christos 
    616  1.1  christos /* addb.  */
    617  1.1  christos void
    618  1.6  christos OP_30_8 (SIM_DESC sd, SIM_CPU *cpu)
    619  1.1  christos {
    620  1.1  christos   uint8 a = OP[0];
    621  1.1  christos   uint8 b = (GPR (OP[1]) & 0xff);
    622  1.5  christos   uint16 tmp = (a + b) & 0xff;
    623  1.1  christos   trace_input ("addb", OP_CONSTANT4_1, OP_REG, OP_VOID);
    624  1.1  christos   SET_GPR (OP[1], (tmp | ((GPR (OP[1])) & 0xff00)));
    625  1.1  christos   SET_PSR_C (tmp > 0xFF);
    626  1.1  christos   SET_PSR_F (((a & 0x80) == (b & 0x80)) && ((b & 0x80) != (tmp & 0x80)));
    627  1.6  christos   trace_output_16 (sd, tmp);
    628  1.1  christos }
    629  1.1  christos 
    630  1.1  christos /* addb.  */
    631  1.1  christos void
    632  1.6  christos OP_30B_C (SIM_DESC sd, SIM_CPU *cpu)
    633  1.1  christos {
    634  1.1  christos   uint8 a = (OP[0]) & 0xff;
    635  1.1  christos   uint8 b = (GPR (OP[1]) & 0xff);
    636  1.5  christos   uint16 tmp = (a + b) & 0xff;
    637  1.1  christos   trace_input ("addb", OP_CONSTANT16, OP_REG, OP_VOID);
    638  1.1  christos   SET_GPR (OP[1], (tmp | ((GPR (OP[1])) & 0xff00)));
    639  1.1  christos   SET_PSR_C (tmp > 0xFF);
    640  1.1  christos   SET_PSR_F (((a & 0x80) == (b & 0x80)) && ((b & 0x80) != (tmp & 0x80)));
    641  1.6  christos   trace_output_16 (sd, tmp);
    642  1.1  christos }
    643  1.1  christos 
    644  1.1  christos /* addb.  */
    645  1.1  christos void
    646  1.6  christos OP_31_8 (SIM_DESC sd, SIM_CPU *cpu)
    647  1.1  christos {
    648  1.1  christos   uint8 a = (GPR (OP[0]) & 0xff);
    649  1.1  christos   uint8 b = (GPR (OP[1]) & 0xff);
    650  1.5  christos   uint16 tmp = (a + b) & 0xff;
    651  1.1  christos   trace_input ("addb", OP_REG, OP_REG, OP_VOID);
    652  1.1  christos   SET_GPR (OP[1], (tmp | ((GPR (OP[1])) & 0xff00)));
    653  1.1  christos   SET_PSR_C (tmp > 0xFF);
    654  1.1  christos   SET_PSR_F (((a & 0x80) == (b & 0x80)) && ((b & 0x80) != (tmp & 0x80)));
    655  1.6  christos   trace_output_16 (sd, tmp);
    656  1.1  christos }
    657  1.1  christos 
    658  1.1  christos /* addw.  */
    659  1.1  christos void
    660  1.6  christos OP_32_8 (SIM_DESC sd, SIM_CPU *cpu)
    661  1.1  christos {
    662  1.1  christos   int16 a = OP[0];
    663  1.1  christos   uint16 tmp, b = GPR (OP[1]);
    664  1.5  christos   tmp = (a + b);
    665  1.1  christos   trace_input ("addw", OP_CONSTANT4_1, OP_REG, OP_VOID);
    666  1.1  christos   SET_GPR (OP[1], tmp);
    667  1.1  christos   SET_PSR_C (tmp > 0xFFFF);
    668  1.1  christos   SET_PSR_F (((a & 0x8000) == (b & 0x8000)) && ((b & 0x8000) != (tmp & 0x8000)));
    669  1.6  christos   trace_output_16 (sd, tmp);
    670  1.1  christos }
    671  1.1  christos 
    672  1.1  christos /* addw.  */
    673  1.1  christos void
    674  1.6  christos OP_32B_C (SIM_DESC sd, SIM_CPU *cpu)
    675  1.1  christos {
    676  1.1  christos   int16 a = OP[0];
    677  1.1  christos   uint16 tmp, b = GPR (OP[1]);
    678  1.1  christos   tmp = (a + b);
    679  1.1  christos   trace_input ("addw", OP_CONSTANT16, OP_REG, OP_VOID);
    680  1.1  christos   SET_GPR (OP[1], tmp);
    681  1.1  christos   SET_PSR_C (tmp > 0xFFFF);
    682  1.1  christos   SET_PSR_F (((a & 0x8000) == (b & 0x8000)) && ((b & 0x8000) != (tmp & 0x8000)));
    683  1.6  christos   trace_output_16 (sd, tmp);
    684  1.1  christos }
    685  1.1  christos 
    686  1.1  christos /* addw.  */
    687  1.1  christos void
    688  1.6  christos OP_33_8 (SIM_DESC sd, SIM_CPU *cpu)
    689  1.1  christos {
    690  1.1  christos   uint16 tmp, a = (GPR (OP[0])), b = (GPR (OP[1]));
    691  1.1  christos   trace_input ("addw", OP_REG, OP_REG, OP_VOID);
    692  1.1  christos   tmp = (a + b);
    693  1.1  christos   SET_GPR (OP[1], tmp);
    694  1.1  christos   SET_PSR_C (tmp > 0xFFFF);
    695  1.1  christos   SET_PSR_F (((a & 0x8000) == (b & 0x8000)) && ((b & 0x8000) != (tmp & 0x8000)));
    696  1.6  christos   trace_output_16 (sd, tmp);
    697  1.1  christos }
    698  1.1  christos 
    699  1.1  christos /* addcb.  */
    700  1.1  christos void
    701  1.6  christos OP_34_8 (SIM_DESC sd, SIM_CPU *cpu)
    702  1.1  christos {
    703  1.1  christos   uint8 tmp, a = OP[0] & 0xff, b = (GPR (OP[1])) & 0xff;
    704  1.1  christos   trace_input ("addcb", OP_CONSTANT4_1, OP_REG, OP_REG);
    705  1.1  christos   tmp = (a + b + PSR_C) & 0xff;
    706  1.1  christos   SET_GPR (OP[1], (tmp | ((GPR (OP[1])) & 0xff00)));
    707  1.1  christos   SET_PSR_C (tmp > 0xFF);
    708  1.1  christos   SET_PSR_F (((a & 0x80) == (b & 0x80)) && ((b & 0x80) != (tmp & 0x80)));
    709  1.6  christos   trace_output_16 (sd, tmp);
    710  1.1  christos }
    711  1.1  christos 
    712  1.1  christos /* addcb.  */
    713  1.1  christos void
    714  1.6  christos OP_34B_C (SIM_DESC sd, SIM_CPU *cpu)
    715  1.1  christos {
    716  1.1  christos   int8 a = OP[0] & 0xff;
    717  1.1  christos   uint8 b = (GPR (OP[1])) & 0xff;
    718  1.5  christos   uint8 tmp = (a + b + PSR_C) & 0xff;
    719  1.1  christos   trace_input ("addcb", OP_CONSTANT16, OP_REG, OP_VOID);
    720  1.1  christos   SET_GPR (OP[1], (tmp | ((GPR (OP[1])) & 0xff00)));
    721  1.1  christos   SET_PSR_C (tmp > 0xFF);
    722  1.1  christos   SET_PSR_F (((a & 0x80) == (b & 0x80)) && ((b & 0x80) != (tmp & 0x80)));
    723  1.6  christos   trace_output_16 (sd, tmp);
    724  1.1  christos }
    725  1.1  christos 
    726  1.1  christos /* addcb.  */
    727  1.1  christos void
    728  1.6  christos OP_35_8 (SIM_DESC sd, SIM_CPU *cpu)
    729  1.1  christos {
    730  1.1  christos   uint8 a = (GPR (OP[0])) & 0xff;
    731  1.1  christos   uint8 b = (GPR (OP[1])) & 0xff;
    732  1.5  christos   uint8 tmp = (a + b + PSR_C) & 0xff;
    733  1.1  christos   trace_input ("addcb", OP_REG, OP_REG, OP_VOID);
    734  1.1  christos   SET_GPR (OP[1], (tmp | ((GPR (OP[1])) & 0xff00)));
    735  1.1  christos   SET_PSR_C (tmp > 0xFF);
    736  1.1  christos   SET_PSR_F (((a & 0x80) == (b & 0x80)) && ((b & 0x80) != (tmp & 0x80)));
    737  1.6  christos   trace_output_16 (sd, tmp);
    738  1.1  christos }
    739  1.1  christos 
    740  1.1  christos /* addcw.  */
    741  1.1  christos void
    742  1.6  christos OP_36_8 (SIM_DESC sd, SIM_CPU *cpu)
    743  1.1  christos {
    744  1.1  christos   uint16 a = OP[0];
    745  1.1  christos   uint16 b = GPR (OP[1]);
    746  1.5  christos   uint16 tmp = (a + b + PSR_C);
    747  1.1  christos   trace_input ("addcw", OP_CONSTANT4_1, OP_REG, OP_VOID);
    748  1.1  christos   SET_GPR (OP[1], tmp);
    749  1.1  christos   SET_PSR_C (tmp > 0xFFFF);
    750  1.1  christos   SET_PSR_F (((a & 0x8000) == (b & 0x8000)) && ((b & 0x8000) != (tmp & 0x8000)));
    751  1.6  christos   trace_output_16 (sd, tmp);
    752  1.1  christos }
    753  1.1  christos 
    754  1.1  christos /* addcw.  */
    755  1.1  christos void
    756  1.6  christos OP_36B_C (SIM_DESC sd, SIM_CPU *cpu)
    757  1.1  christos {
    758  1.1  christos   int16 a = OP[0];
    759  1.1  christos   uint16 b = GPR (OP[1]);
    760  1.5  christos   uint16 tmp = (a + b + PSR_C);
    761  1.1  christos   trace_input ("addcw", OP_CONSTANT16, OP_REG, OP_VOID);
    762  1.1  christos   SET_GPR (OP[1], tmp);
    763  1.1  christos   SET_PSR_C (tmp > 0xFFFF);
    764  1.1  christos   SET_PSR_F (((a & 0x8000) == (b & 0x8000)) && ((b & 0x8000) != (tmp & 0x8000)));
    765  1.6  christos   trace_output_16 (sd, tmp);
    766  1.1  christos }
    767  1.1  christos 
    768  1.1  christos /* addcw.  */
    769  1.1  christos void
    770  1.6  christos OP_37_8 (SIM_DESC sd, SIM_CPU *cpu)
    771  1.1  christos {
    772  1.1  christos   uint16 a = GPR (OP[1]);
    773  1.1  christos   uint16 b = GPR (OP[1]);
    774  1.5  christos   uint16 tmp = (a + b + PSR_C);
    775  1.1  christos   trace_input ("addcw", OP_REG, OP_REG, OP_VOID);
    776  1.1  christos   SET_GPR (OP[1], tmp);
    777  1.1  christos   SET_PSR_C (tmp > 0xFFFF);
    778  1.1  christos   SET_PSR_F (((a & 0x8000) == (b & 0x8000)) && ((b & 0x8000) != (tmp & 0x8000)));
    779  1.6  christos   trace_output_16 (sd, tmp);
    780  1.1  christos }
    781  1.1  christos 
    782  1.1  christos /* addd.  */
    783  1.1  christos void
    784  1.6  christos OP_60_8 (SIM_DESC sd, SIM_CPU *cpu)
    785  1.1  christos {
    786  1.1  christos   int16 a = (OP[0]);
    787  1.1  christos   uint32 b = GPR32 (OP[1]);
    788  1.5  christos   uint32 tmp = (a + b);
    789  1.1  christos   trace_input ("addd", OP_CONSTANT4_1, OP_REGP, OP_VOID);
    790  1.1  christos   SET_GPR32 (OP[1], tmp);
    791  1.1  christos   SET_PSR_C (tmp > 0xFFFFFFFF);
    792  1.1  christos   SET_PSR_F (((a & 0x80000000) == (b & 0x80000000)) && ((b & 0x80000000) != (tmp & 0x80000000)));
    793  1.6  christos   trace_output_32 (sd, tmp);
    794  1.1  christos }
    795  1.1  christos 
    796  1.1  christos /* addd.  */
    797  1.1  christos void
    798  1.6  christos OP_60B_C (SIM_DESC sd, SIM_CPU *cpu)
    799  1.1  christos {
    800  1.1  christos   int32 a = (SEXT16(OP[0]));
    801  1.1  christos   uint32 b = GPR32 (OP[1]);
    802  1.5  christos   uint32 tmp = (a + b);
    803  1.1  christos   trace_input ("addd", OP_CONSTANT16, OP_REGP, OP_VOID);
    804  1.1  christos   SET_GPR32 (OP[1], tmp);
    805  1.1  christos   SET_PSR_C (tmp > 0xFFFFFFFF);
    806  1.1  christos   SET_PSR_F (((a & 0x80000000) == (b & 0x80000000)) && ((b & 0x80000000) != (tmp & 0x80000000)));
    807  1.6  christos   trace_output_32 (sd, tmp);
    808  1.1  christos }
    809  1.1  christos 
    810  1.1  christos /* addd.  */
    811  1.1  christos void
    812  1.6  christos OP_61_8 (SIM_DESC sd, SIM_CPU *cpu)
    813  1.1  christos {
    814  1.1  christos   uint32 a = GPR32 (OP[0]);
    815  1.1  christos   uint32 b = GPR32 (OP[1]);
    816  1.5  christos   uint32 tmp = (a + b);
    817  1.1  christos   trace_input ("addd", OP_REGP, OP_REGP, OP_VOID);
    818  1.1  christos   SET_GPR32 (OP[1], tmp);
    819  1.6  christos   trace_output_32 (sd, tmp);
    820  1.1  christos   SET_PSR_C (tmp > 0xFFFFFFFF);
    821  1.1  christos   SET_PSR_F (((a & 0x80000000) == (b & 0x80000000)) && ((b & 0x80000000) != (tmp & 0x80000000)));
    822  1.1  christos }
    823  1.1  christos 
    824  1.1  christos /* addd.  */
    825  1.1  christos void
    826  1.6  christos OP_4_8 (SIM_DESC sd, SIM_CPU *cpu)
    827  1.1  christos {
    828  1.1  christos   uint32 a = OP[0];
    829  1.1  christos   uint32 b = GPR32 (OP[1]);
    830  1.1  christos   uint32 tmp;
    831  1.1  christos   trace_input ("addd", OP_CONSTANT20, OP_REGP, OP_VOID);
    832  1.1  christos   tmp = (a + b);
    833  1.1  christos   SET_GPR32 (OP[1], tmp);
    834  1.1  christos   SET_PSR_C (tmp > 0xFFFFFFFF);
    835  1.1  christos   SET_PSR_F (((a & 0x80000000) == (b & 0x80000000)) && ((b & 0x80000000) != (tmp & 0x80000000)));
    836  1.6  christos   trace_output_32 (sd, tmp);
    837  1.1  christos }
    838  1.1  christos 
    839  1.1  christos /* addd.  */
    840  1.1  christos void
    841  1.6  christos OP_2_C (SIM_DESC sd, SIM_CPU *cpu)
    842  1.1  christos {
    843  1.1  christos   int32 a = OP[0];
    844  1.1  christos   uint32 b = GPR32 (OP[1]);
    845  1.1  christos   uint32 tmp;
    846  1.1  christos   trace_input ("addd", OP_CONSTANT32, OP_REGP, OP_VOID);
    847  1.1  christos   tmp = (a + b);
    848  1.1  christos   SET_GPR32 (OP[1], tmp);
    849  1.1  christos   SET_PSR_C (tmp > 0xFFFFFFFF);
    850  1.1  christos   SET_PSR_F (((a & 0x80000000) == (b & 0x80000000)) && ((b & 0x80000000) != (tmp & 0x80000000)));
    851  1.6  christos   trace_output_32 (sd, tmp);
    852  1.1  christos }
    853  1.1  christos 
    854  1.1  christos /* andb.  */
    855  1.1  christos void
    856  1.6  christos OP_20_8 (SIM_DESC sd, SIM_CPU *cpu)
    857  1.1  christos {
    858  1.1  christos   uint8 tmp, a = (OP[0]) & 0xff, b = (GPR (OP[1])) & 0xff;
    859  1.1  christos   trace_input ("andb", OP_CONSTANT4, OP_REG, OP_VOID);
    860  1.1  christos   tmp = a & b;
    861  1.1  christos   SET_GPR (OP[1], (tmp | ((GPR (OP[1])) & 0xff00)));
    862  1.6  christos   trace_output_16 (sd, tmp);
    863  1.1  christos }
    864  1.1  christos 
    865  1.1  christos /* andb.  */
    866  1.1  christos void
    867  1.6  christos OP_20B_C (SIM_DESC sd, SIM_CPU *cpu)
    868  1.1  christos {
    869  1.1  christos   uint8 tmp, a = (OP[0]) & 0xff, b = (GPR (OP[1])) & 0xff;
    870  1.1  christos   trace_input ("andb", OP_CONSTANT16, OP_REG, OP_VOID);
    871  1.1  christos   tmp = a & b;
    872  1.1  christos   SET_GPR (OP[1], (tmp | ((GPR (OP[1])) & 0xff00)));
    873  1.6  christos   trace_output_16 (sd, tmp);
    874  1.1  christos }
    875  1.1  christos 
    876  1.1  christos /* andb.  */
    877  1.1  christos void
    878  1.6  christos OP_21_8 (SIM_DESC sd, SIM_CPU *cpu)
    879  1.1  christos {
    880  1.1  christos   uint8 tmp, a = (GPR (OP[0])) & 0xff, b = (GPR (OP[1])) & 0xff;
    881  1.1  christos   trace_input ("andb", OP_REG, OP_REG, OP_VOID);
    882  1.1  christos   tmp = a & b;
    883  1.1  christos   SET_GPR (OP[1], (tmp | ((GPR (OP[1])) & 0xff00)));
    884  1.6  christos   trace_output_16 (sd, tmp);
    885  1.1  christos }
    886  1.1  christos 
    887  1.1  christos /* andw.  */
    888  1.1  christos void
    889  1.6  christos OP_22_8 (SIM_DESC sd, SIM_CPU *cpu)
    890  1.1  christos {
    891  1.1  christos   uint16 tmp, a = OP[0], b = GPR (OP[1]);
    892  1.1  christos   trace_input ("andw", OP_CONSTANT4, OP_REG, OP_VOID);
    893  1.1  christos   tmp = a & b;
    894  1.1  christos   SET_GPR (OP[1], tmp);
    895  1.6  christos   trace_output_16 (sd, tmp);
    896  1.1  christos }
    897  1.1  christos 
    898  1.1  christos /* andw.  */
    899  1.1  christos void
    900  1.6  christos OP_22B_C (SIM_DESC sd, SIM_CPU *cpu)
    901  1.1  christos {
    902  1.1  christos   uint16 tmp, a = OP[0], b = GPR (OP[1]);
    903  1.1  christos   trace_input ("andw", OP_CONSTANT16, OP_REG, OP_VOID);
    904  1.1  christos   tmp = a & b;
    905  1.1  christos   SET_GPR (OP[1], tmp);
    906  1.6  christos   trace_output_16 (sd, tmp);
    907  1.1  christos }
    908  1.1  christos 
    909  1.1  christos /* andw.  */
    910  1.1  christos void
    911  1.6  christos OP_23_8 (SIM_DESC sd, SIM_CPU *cpu)
    912  1.1  christos {
    913  1.1  christos   uint16 tmp, a = GPR (OP[0]), b = GPR (OP[1]);
    914  1.1  christos   trace_input ("andw", OP_REG, OP_REG, OP_VOID);
    915  1.1  christos   tmp = a & b;
    916  1.1  christos   SET_GPR (OP[1], tmp);
    917  1.6  christos   trace_output_16 (sd, tmp);
    918  1.1  christos }
    919  1.1  christos 
    920  1.1  christos /* andd.  */
    921  1.1  christos void
    922  1.6  christos OP_4_C (SIM_DESC sd, SIM_CPU *cpu)
    923  1.1  christos {
    924  1.1  christos   uint32 tmp, a = OP[0],  b = GPR32 (OP[1]);
    925  1.1  christos   trace_input ("andd", OP_CONSTANT32, OP_REGP, OP_VOID);
    926  1.1  christos   tmp = a & b;
    927  1.1  christos   SET_GPR32 (OP[1], tmp);
    928  1.6  christos   trace_output_32 (sd, tmp);
    929  1.1  christos }
    930  1.1  christos 
    931  1.1  christos /* andd.  */
    932  1.1  christos void
    933  1.6  christos OP_14B_14 (SIM_DESC sd, SIM_CPU *cpu)
    934  1.1  christos {
    935  1.1  christos   uint32 tmp, a = (GPR32 (OP[0])), b = (GPR32 (OP[1]));
    936  1.1  christos   trace_input ("andd", OP_REGP, OP_REGP, OP_VOID);
    937  1.1  christos   tmp = a & b;
    938  1.1  christos   SET_GPR32 (OP[1], tmp);
    939  1.6  christos   trace_output_32 (sd, tmp);
    940  1.1  christos }
    941  1.1  christos 
    942  1.1  christos /* ord.  */
    943  1.1  christos void
    944  1.6  christos OP_5_C (SIM_DESC sd, SIM_CPU *cpu)
    945  1.1  christos {
    946  1.1  christos   uint32 tmp, a = (OP[0]), b = GPR32 (OP[1]);
    947  1.1  christos   trace_input ("ord", OP_CONSTANT32, OP_REG, OP_VOID);
    948  1.1  christos   tmp = a | b;
    949  1.1  christos   SET_GPR32 (OP[1], tmp);
    950  1.6  christos   trace_output_32 (sd, tmp);
    951  1.1  christos }
    952  1.1  christos 
    953  1.1  christos /* ord.  */
    954  1.1  christos void
    955  1.6  christos OP_149_14 (SIM_DESC sd, SIM_CPU *cpu)
    956  1.1  christos {
    957  1.1  christos   uint32 tmp, a = GPR32 (OP[0]), b = GPR32 (OP[1]);
    958  1.1  christos   trace_input ("ord", OP_REGP, OP_REGP, OP_VOID);
    959  1.1  christos   tmp = a | b;
    960  1.1  christos   SET_GPR32 (OP[1], tmp);
    961  1.6  christos   trace_output_32 (sd, tmp);
    962  1.1  christos }
    963  1.1  christos 
    964  1.1  christos /* xord.  */
    965  1.1  christos void
    966  1.6  christos OP_6_C (SIM_DESC sd, SIM_CPU *cpu)
    967  1.1  christos {
    968  1.1  christos   uint32 tmp, a = (OP[0]), b = GPR32 (OP[1]);
    969  1.1  christos   trace_input ("xord", OP_CONSTANT32, OP_REG, OP_VOID);
    970  1.1  christos   tmp = a ^ b;
    971  1.1  christos   SET_GPR32 (OP[1], tmp);
    972  1.6  christos   trace_output_32 (sd, tmp);
    973  1.1  christos }
    974  1.1  christos 
    975  1.1  christos /* xord.  */
    976  1.1  christos void
    977  1.6  christos OP_14A_14 (SIM_DESC sd, SIM_CPU *cpu)
    978  1.1  christos {
    979  1.1  christos   uint32 tmp, a = GPR32 (OP[0]), b = GPR32 (OP[1]);
    980  1.1  christos   trace_input ("xord", OP_REGP, OP_REGP, OP_VOID);
    981  1.1  christos   tmp = a ^ b;
    982  1.1  christos   SET_GPR32 (OP[1], tmp);
    983  1.6  christos   trace_output_32 (sd, tmp);
    984  1.1  christos }
    985  1.1  christos 
    986  1.1  christos 
    987  1.1  christos /* b.  */
    988  1.1  christos void
    989  1.6  christos OP_1_4 (SIM_DESC sd, SIM_CPU *cpu)
    990  1.1  christos {
    991  1.5  christos   uint32 tmp = 0, cc = cond_stat (OP[0]);
    992  1.1  christos   trace_input ("b", OP_CONSTANT4, OP_DISPE9, OP_VOID);
    993  1.1  christos   if  (cc)
    994  1.1  christos     {
    995  1.1  christos       if (sign_flag)
    996  1.1  christos 	tmp =  (PC - (OP[1]));
    997  1.1  christos       else
    998  1.1  christos         tmp =  (PC + (OP[1]));
    999  1.1  christos       /* If the resulting PC value is less than 0x00_0000 or greater
   1000  1.1  christos          than 0xFF_FFFF, this instruction causes an IAD trap.*/
   1001  1.1  christos 
   1002  1.1  christos       if ((tmp < 0x000000) || (tmp > 0xFFFFFF))
   1003  1.1  christos         {
   1004  1.6  christos           trace_output_void (sd);
   1005  1.6  christos           EXCEPTION (SIM_SIGBUS);
   1006  1.1  christos         }
   1007  1.1  christos       else
   1008  1.1  christos         JMP (tmp);
   1009  1.1  christos     }
   1010  1.1  christos   sign_flag = 0; /* Reset sign_flag.  */
   1011  1.6  christos   trace_output_32 (sd, tmp);
   1012  1.1  christos }
   1013  1.1  christos 
   1014  1.1  christos /* b.  */
   1015  1.1  christos void
   1016  1.6  christos OP_18_8 (SIM_DESC sd, SIM_CPU *cpu)
   1017  1.1  christos {
   1018  1.5  christos   uint32 tmp = 0, cc = cond_stat (OP[0]);
   1019  1.1  christos   trace_input ("b", OP_CONSTANT4, OP_DISP17, OP_VOID);
   1020  1.1  christos   if (cc)
   1021  1.1  christos     {
   1022  1.1  christos       if (sign_flag)
   1023  1.1  christos 	tmp =  (PC - OP[1]);
   1024  1.1  christos       else
   1025  1.1  christos         tmp =  (PC + OP[1]);
   1026  1.1  christos       /* If the resulting PC value is less than 0x00_0000 or greater
   1027  1.1  christos          than 0xFF_FFFF, this instruction causes an IAD trap.*/
   1028  1.1  christos 
   1029  1.1  christos       if ((tmp < 0x000000) || (tmp > 0xFFFFFF))
   1030  1.1  christos         {
   1031  1.6  christos           trace_output_void (sd);
   1032  1.6  christos           EXCEPTION (SIM_SIGBUS);
   1033  1.1  christos         }
   1034  1.1  christos       else
   1035  1.1  christos         JMP (tmp);
   1036  1.1  christos     }
   1037  1.1  christos   sign_flag = 0; /* Reset sign_flag.  */
   1038  1.6  christos   trace_output_32 (sd, tmp);
   1039  1.1  christos }
   1040  1.1  christos 
   1041  1.1  christos /* b.  */
   1042  1.1  christos void
   1043  1.6  christos OP_10_10 (SIM_DESC sd, SIM_CPU *cpu)
   1044  1.1  christos {
   1045  1.5  christos   uint32 tmp = 0, cc = cond_stat (OP[0]);
   1046  1.1  christos   trace_input ("b", OP_CONSTANT4, OP_DISP25, OP_VOID);
   1047  1.1  christos   if (cc)
   1048  1.1  christos     {
   1049  1.1  christos       if (sign_flag)
   1050  1.1  christos 	tmp =  (PC - (OP[1]));
   1051  1.1  christos       else
   1052  1.1  christos         tmp =  (PC + (OP[1]));
   1053  1.1  christos       /* If the resulting PC value is less than 0x00_0000 or greater
   1054  1.1  christos          than 0xFF_FFFF, this instruction causes an IAD trap.*/
   1055  1.1  christos 
   1056  1.1  christos       if ((tmp < 0x000000) || (tmp > 0xFFFFFF))
   1057  1.1  christos         {
   1058  1.6  christos           trace_output_void (sd);
   1059  1.6  christos           EXCEPTION (SIM_SIGBUS);
   1060  1.1  christos         }
   1061  1.1  christos       else
   1062  1.1  christos         JMP (tmp);
   1063  1.1  christos     }
   1064  1.1  christos   sign_flag = 0; /* Reset sign_flag.  */
   1065  1.6  christos   trace_output_32 (sd, tmp);
   1066  1.1  christos }
   1067  1.1  christos 
   1068  1.1  christos /* bal.  */
   1069  1.1  christos void
   1070  1.6  christos OP_C0_8 (SIM_DESC sd, SIM_CPU *cpu)
   1071  1.1  christos {
   1072  1.1  christos   uint32 tmp;
   1073  1.1  christos   trace_input ("bal", OP_REG, OP_DISP17, OP_VOID);
   1074  1.1  christos   tmp =  ((PC + 4) >> 1); /* Store PC in RA register. */
   1075  1.1  christos   SET_GPR32 (14, tmp);
   1076  1.1  christos   if (sign_flag)
   1077  1.1  christos     tmp =  (PC - (OP[1]));
   1078  1.1  christos   else
   1079  1.1  christos     tmp =  (PC + (OP[1]));
   1080  1.1  christos 
   1081  1.1  christos   /* If the resulting PC value is less than 0x00_0000 or greater
   1082  1.1  christos      than 0xFF_FFFF, this instruction causes an IAD trap.  */
   1083  1.1  christos 
   1084  1.1  christos   if ((tmp < 0x000000) || (tmp > 0xFFFFFF))
   1085  1.1  christos     {
   1086  1.6  christos       trace_output_void (sd);
   1087  1.6  christos       EXCEPTION (SIM_SIGBUS);
   1088  1.1  christos     }
   1089  1.1  christos   else
   1090  1.1  christos     JMP (tmp);
   1091  1.1  christos   sign_flag = 0; /* Reset sign_flag.  */
   1092  1.6  christos   trace_output_32 (sd, tmp);
   1093  1.1  christos }
   1094  1.1  christos 
   1095  1.1  christos 
   1096  1.1  christos /* bal.  */
   1097  1.1  christos void
   1098  1.6  christos OP_102_14 (SIM_DESC sd, SIM_CPU *cpu)
   1099  1.1  christos {
   1100  1.1  christos   uint32 tmp;
   1101  1.1  christos   trace_input ("bal", OP_REGP, OP_DISP25, OP_VOID);
   1102  1.1  christos   tmp = (((PC) + 4) >> 1); /* Store PC in reg pair.  */
   1103  1.1  christos   SET_GPR32 (OP[0], tmp);
   1104  1.1  christos   if (sign_flag)
   1105  1.1  christos     tmp =  ((PC) - (OP[1]));
   1106  1.1  christos   else
   1107  1.1  christos     tmp =  ((PC) + (OP[1]));
   1108  1.1  christos   /* If the resulting PC value is less than 0x00_0000 or greater
   1109  1.1  christos      than 0xFF_FFFF, this instruction causes an IAD trap.*/
   1110  1.1  christos 
   1111  1.1  christos   if ((tmp < 0x000000) || (tmp > 0xFFFFFF))
   1112  1.1  christos     {
   1113  1.6  christos       trace_output_void (sd);
   1114  1.6  christos       EXCEPTION (SIM_SIGBUS);
   1115  1.1  christos     }
   1116  1.1  christos   else
   1117  1.1  christos     JMP (tmp);
   1118  1.1  christos   sign_flag = 0; /* Reset sign_flag.  */
   1119  1.6  christos   trace_output_32 (sd, tmp);
   1120  1.1  christos }
   1121  1.1  christos 
   1122  1.1  christos /* jal.  */
   1123  1.1  christos void
   1124  1.6  christos OP_148_14 (SIM_DESC sd, SIM_CPU *cpu)
   1125  1.1  christos {
   1126  1.1  christos   uint32 tmp;
   1127  1.1  christos   trace_input ("jal", OP_REGP, OP_REGP, OP_VOID);
   1128  1.1  christos   SET_GPR32 (OP[0], (((PC) + 4) >> 1)); /* Store next PC in RA */
   1129  1.1  christos   tmp = GPR32 (OP[1]);
   1130  1.1  christos   tmp = SEXT24(tmp << 1);
   1131  1.1  christos   /* If the resulting PC value is less than 0x00_0000 or greater
   1132  1.1  christos      than 0xFF_FFFF, this instruction causes an IAD trap.*/
   1133  1.1  christos 
   1134  1.1  christos   if ((tmp < 0x0) || (tmp > 0xFFFFFF))
   1135  1.1  christos     {
   1136  1.6  christos       trace_output_void (sd);
   1137  1.6  christos       EXCEPTION (SIM_SIGBUS);
   1138  1.1  christos     }
   1139  1.1  christos   else
   1140  1.1  christos     JMP (tmp);
   1141  1.1  christos 
   1142  1.6  christos   trace_output_32 (sd, tmp);
   1143  1.1  christos }
   1144  1.1  christos 
   1145  1.1  christos 
   1146  1.1  christos /* jal.  */
   1147  1.1  christos void
   1148  1.6  christos OP_D_C (SIM_DESC sd, SIM_CPU *cpu)
   1149  1.1  christos {
   1150  1.1  christos   uint32 tmp;
   1151  1.1  christos   trace_input ("jal", OP_REGP, OP_VOID, OP_VOID);
   1152  1.1  christos   SET_GPR32 (14, (((PC) + 2) >> 1)); /* Store next PC in RA */
   1153  1.1  christos   tmp = GPR32 (OP[0]);
   1154  1.1  christos   tmp = SEXT24(tmp << 1);
   1155  1.1  christos   /* If the resulting PC value is less than 0x00_0000 or greater
   1156  1.1  christos      than 0xFF_FFFF, this instruction causes an IAD trap.*/
   1157  1.1  christos 
   1158  1.1  christos   if ((tmp < 0x0) || (tmp > 0xFFFFFF))
   1159  1.1  christos     {
   1160  1.6  christos       trace_output_void (sd);
   1161  1.6  christos       EXCEPTION (SIM_SIGBUS);
   1162  1.1  christos     }
   1163  1.1  christos   else
   1164  1.1  christos     JMP (tmp);
   1165  1.1  christos 
   1166  1.6  christos   trace_output_32 (sd, tmp);
   1167  1.1  christos }
   1168  1.1  christos 
   1169  1.1  christos 
   1170  1.1  christos /* beq0b.  */
   1171  1.1  christos void
   1172  1.6  christos OP_C_8 (SIM_DESC sd, SIM_CPU *cpu)
   1173  1.1  christos {
   1174  1.1  christos   uint32 addr;
   1175  1.1  christos   uint8 a = (GPR (OP[0]) & 0xFF);
   1176  1.1  christos   trace_input ("beq0b", OP_REG, OP_DISP5, OP_VOID);
   1177  1.1  christos   addr = OP[1];
   1178  1.1  christos   if (a == 0)
   1179  1.1  christos   {
   1180  1.1  christos     if (sign_flag)
   1181  1.1  christos       addr = (PC - OP[1]);
   1182  1.1  christos     else
   1183  1.1  christos       addr = (PC + OP[1]);
   1184  1.1  christos 
   1185  1.1  christos     JMP (addr);
   1186  1.1  christos   }
   1187  1.1  christos   sign_flag = 0; /* Reset sign_flag.  */
   1188  1.6  christos   trace_output_void (sd);
   1189  1.1  christos }
   1190  1.1  christos 
   1191  1.1  christos /* bne0b.  */
   1192  1.1  christos void
   1193  1.6  christos OP_D_8 (SIM_DESC sd, SIM_CPU *cpu)
   1194  1.1  christos {
   1195  1.1  christos   uint32 addr;
   1196  1.1  christos   uint8 a = (GPR (OP[0]) & 0xFF);
   1197  1.1  christos   trace_input ("bne0b", OP_REG, OP_DISP5, OP_VOID);
   1198  1.1  christos   addr = OP[1];
   1199  1.1  christos   if (a != 0)
   1200  1.1  christos   {
   1201  1.1  christos     if (sign_flag)
   1202  1.1  christos       addr = (PC - OP[1]);
   1203  1.1  christos     else
   1204  1.1  christos       addr = (PC + OP[1]);
   1205  1.1  christos 
   1206  1.1  christos     JMP (addr);
   1207  1.1  christos   }
   1208  1.1  christos   sign_flag = 0; /* Reset sign_flag.  */
   1209  1.6  christos   trace_output_void (sd);
   1210  1.1  christos }
   1211  1.1  christos 
   1212  1.1  christos /* beq0w.  */
   1213  1.1  christos void
   1214  1.6  christos OP_E_8 (SIM_DESC sd, SIM_CPU *cpu)
   1215  1.1  christos {
   1216  1.1  christos   uint32 addr;
   1217  1.1  christos   uint16 a = GPR (OP[0]);
   1218  1.1  christos   trace_input ("beq0w", OP_REG, OP_DISP5, OP_VOID);
   1219  1.1  christos   addr = OP[1];
   1220  1.1  christos   if (a == 0)
   1221  1.1  christos   {
   1222  1.1  christos     if (sign_flag)
   1223  1.1  christos       addr = (PC - OP[1]);
   1224  1.1  christos     else
   1225  1.1  christos       addr = (PC + OP[1]);
   1226  1.1  christos 
   1227  1.1  christos     JMP (addr);
   1228  1.1  christos   }
   1229  1.1  christos   sign_flag = 0; /* Reset sign_flag.  */
   1230  1.6  christos   trace_output_void (sd);
   1231  1.1  christos }
   1232  1.1  christos 
   1233  1.1  christos /* bne0w.  */
   1234  1.1  christos void
   1235  1.6  christos OP_F_8 (SIM_DESC sd, SIM_CPU *cpu)
   1236  1.1  christos {
   1237  1.1  christos   uint32 addr;
   1238  1.1  christos   uint16 a = GPR (OP[0]);
   1239  1.1  christos   trace_input ("bne0w", OP_REG, OP_DISP5, OP_VOID);
   1240  1.1  christos   addr = OP[1];
   1241  1.1  christos   if (a != 0)
   1242  1.1  christos   {
   1243  1.1  christos     if (sign_flag)
   1244  1.1  christos       addr = (PC - OP[1]);
   1245  1.1  christos     else
   1246  1.1  christos       addr = (PC + OP[1]);
   1247  1.1  christos 
   1248  1.1  christos     JMP (addr);
   1249  1.1  christos   }
   1250  1.1  christos   sign_flag = 0; /* Reset sign_flag.  */
   1251  1.6  christos   trace_output_void (sd);
   1252  1.1  christos }
   1253  1.1  christos 
   1254  1.1  christos 
   1255  1.1  christos /* jeq.  */
   1256  1.1  christos void
   1257  1.6  christos OP_A0_C (SIM_DESC sd, SIM_CPU *cpu)
   1258  1.1  christos {
   1259  1.5  christos   uint32 tmp = 0;
   1260  1.1  christos   trace_input ("jeq", OP_REGP, OP_VOID, OP_VOID);
   1261  1.1  christos   if ((PSR_Z) == 1)
   1262  1.1  christos   {
   1263  1.1  christos      tmp = (GPR32 (OP[0])) & 0x3fffff; /* Use only 0 - 22 bits.  */
   1264  1.1  christos      JMP (tmp << 1); /* Set PC's 1 - 23 bits and clear 0th bit. */
   1265  1.1  christos   }
   1266  1.6  christos   trace_output_32 (sd, tmp);
   1267  1.1  christos }
   1268  1.1  christos 
   1269  1.1  christos /* jne.  */
   1270  1.1  christos void
   1271  1.6  christos OP_A1_C (SIM_DESC sd, SIM_CPU *cpu)
   1272  1.1  christos {
   1273  1.5  christos   uint32 tmp = 0;
   1274  1.1  christos   trace_input ("jne", OP_REGP, OP_VOID, OP_VOID);
   1275  1.1  christos   if ((PSR_Z) == 0)
   1276  1.1  christos   {
   1277  1.1  christos      tmp = (GPR32 (OP[0])) & 0x3fffff; /* Use only 0 - 22 bits.  */
   1278  1.1  christos      JMP (tmp << 1); /* Set PC's 1 - 23 bits and clear 0th bit. */
   1279  1.1  christos   }
   1280  1.6  christos   trace_output_32 (sd, tmp);
   1281  1.1  christos }
   1282  1.1  christos 
   1283  1.1  christos /* jcs.  */
   1284  1.1  christos void
   1285  1.6  christos OP_A2_C (SIM_DESC sd, SIM_CPU *cpu)
   1286  1.1  christos {
   1287  1.5  christos   uint32 tmp = 0;
   1288  1.1  christos   trace_input ("jcs", OP_REGP, OP_VOID, OP_VOID);
   1289  1.1  christos   if ((PSR_C) == 1)
   1290  1.1  christos   {
   1291  1.1  christos      tmp = (GPR32 (OP[0])) & 0x3fffff; /* Use only 0 - 22 bits */
   1292  1.1  christos      JMP (tmp << 1); /* Set PC's 1 - 23 bits and clear 0th bit*/
   1293  1.1  christos   }
   1294  1.6  christos   trace_output_32 (sd, tmp);
   1295  1.1  christos }
   1296  1.1  christos 
   1297  1.1  christos /* jcc.  */
   1298  1.1  christos void
   1299  1.6  christos OP_A3_C (SIM_DESC sd, SIM_CPU *cpu)
   1300  1.1  christos {
   1301  1.5  christos   uint32 tmp = 0;
   1302  1.1  christos   trace_input ("jcc", OP_REGP, OP_VOID, OP_VOID);
   1303  1.1  christos   if ((PSR_C) == 0)
   1304  1.1  christos   {
   1305  1.1  christos      tmp = (GPR32 (OP[0])) & 0x3fffff; /* Use only 0 - 22 bits */
   1306  1.1  christos      JMP (tmp << 1); /* Set PC's 1 - 23 bits and clear 0th bit*/
   1307  1.1  christos   }
   1308  1.6  christos   trace_output_32 (sd, tmp);
   1309  1.1  christos }
   1310  1.1  christos 
   1311  1.1  christos /* jhi.  */
   1312  1.1  christos void
   1313  1.6  christos OP_A4_C (SIM_DESC sd, SIM_CPU *cpu)
   1314  1.1  christos {
   1315  1.5  christos   uint32 tmp = 0;
   1316  1.1  christos   trace_input ("jhi", OP_REGP, OP_VOID, OP_VOID);
   1317  1.1  christos   if ((PSR_L) == 1)
   1318  1.1  christos   {
   1319  1.1  christos      tmp = (GPR32 (OP[0])) & 0x3fffff; /* Use only 0 - 22 bits */
   1320  1.1  christos      JMP (tmp << 1); /* Set PC's 1 - 23 bits and clear 0th bit*/
   1321  1.1  christos   }
   1322  1.6  christos   trace_output_32 (sd, tmp);
   1323  1.1  christos }
   1324  1.1  christos 
   1325  1.1  christos /* jls.  */
   1326  1.1  christos void
   1327  1.6  christos OP_A5_C (SIM_DESC sd, SIM_CPU *cpu)
   1328  1.1  christos {
   1329  1.5  christos   uint32 tmp = 0;
   1330  1.1  christos   trace_input ("jls", OP_REGP, OP_VOID, OP_VOID);
   1331  1.1  christos   if ((PSR_L) == 0)
   1332  1.1  christos   {
   1333  1.1  christos      tmp = (GPR32 (OP[0])) & 0x3fffff; /* Use only 0 - 22 bits */
   1334  1.1  christos      JMP (tmp << 1); /* Set PC's 1 - 23 bits and clear 0th bit*/
   1335  1.1  christos   }
   1336  1.6  christos   trace_output_32 (sd, tmp);
   1337  1.1  christos }
   1338  1.1  christos 
   1339  1.1  christos /* jgt.  */
   1340  1.1  christos void
   1341  1.6  christos OP_A6_C (SIM_DESC sd, SIM_CPU *cpu)
   1342  1.1  christos {
   1343  1.5  christos   uint32 tmp = 0;
   1344  1.1  christos   trace_input ("jgt", OP_REGP, OP_VOID, OP_VOID);
   1345  1.1  christos   if ((PSR_N) == 1)
   1346  1.1  christos   {
   1347  1.1  christos      tmp = (GPR32 (OP[0])) & 0x3fffff; /* Use only 0 - 22 bits */
   1348  1.1  christos      JMP (tmp << 1); /* Set PC's 1 - 23 bits and clear 0th bit*/
   1349  1.1  christos   }
   1350  1.6  christos   trace_output_32 (sd, tmp);
   1351  1.1  christos }
   1352  1.1  christos 
   1353  1.1  christos /* jle.  */
   1354  1.1  christos void
   1355  1.6  christos OP_A7_C (SIM_DESC sd, SIM_CPU *cpu)
   1356  1.1  christos {
   1357  1.5  christos   uint32 tmp = 0;
   1358  1.1  christos   trace_input ("jle", OP_REGP, OP_VOID, OP_VOID);
   1359  1.1  christos   if ((PSR_N) == 0)
   1360  1.1  christos   {
   1361  1.1  christos      tmp = (GPR32 (OP[0])) & 0x3fffff; /* Use only 0 - 22 bits */
   1362  1.1  christos      JMP (tmp << 1); /* Set PC's 1 - 23 bits and clear 0th bit*/
   1363  1.1  christos   }
   1364  1.6  christos   trace_output_32 (sd, tmp);
   1365  1.1  christos }
   1366  1.1  christos 
   1367  1.1  christos 
   1368  1.1  christos /* jfs.  */
   1369  1.1  christos void
   1370  1.6  christos OP_A8_C (SIM_DESC sd, SIM_CPU *cpu)
   1371  1.1  christos {
   1372  1.5  christos   uint32 tmp = 0;
   1373  1.1  christos   trace_input ("jfs", OP_REGP, OP_VOID, OP_VOID);
   1374  1.1  christos   if ((PSR_F) == 1)
   1375  1.1  christos   {
   1376  1.1  christos      tmp = (GPR32 (OP[0])) & 0x3fffff; /* Use only 0 - 22 bits */
   1377  1.1  christos      JMP (tmp << 1); /* Set PC's 1 - 23 bits and clear 0th bit*/
   1378  1.1  christos   }
   1379  1.6  christos   trace_output_32 (sd, tmp);
   1380  1.1  christos }
   1381  1.1  christos 
   1382  1.1  christos /* jfc.  */
   1383  1.1  christos void
   1384  1.6  christos OP_A9_C (SIM_DESC sd, SIM_CPU *cpu)
   1385  1.1  christos {
   1386  1.5  christos   uint32 tmp = 0;
   1387  1.1  christos   trace_input ("jfc", OP_REGP, OP_VOID, OP_VOID);
   1388  1.1  christos   if ((PSR_F) == 0)
   1389  1.1  christos   {
   1390  1.1  christos      tmp = (GPR32 (OP[0])) & 0x3fffff; /* Use only 0 - 22 bits */
   1391  1.1  christos      JMP (tmp << 1); /* Set PC's 1 - 23 bits and clear 0th bit*/
   1392  1.1  christos   }
   1393  1.6  christos   trace_output_32 (sd, tmp);
   1394  1.1  christos }
   1395  1.1  christos 
   1396  1.1  christos /* jlo.  */
   1397  1.1  christos void
   1398  1.6  christos OP_AA_C (SIM_DESC sd, SIM_CPU *cpu)
   1399  1.1  christos {
   1400  1.5  christos   uint32 tmp = 0;
   1401  1.1  christos   trace_input ("jlo", OP_REGP, OP_VOID, OP_VOID);
   1402  1.1  christos   if (((PSR_Z) == 0) & ((PSR_L) == 0))
   1403  1.1  christos   {
   1404  1.1  christos      tmp = (GPR32 (OP[0])) & 0x3fffff; /* Use only 0 - 22 bits */
   1405  1.1  christos      JMP (tmp << 1); /* Set PC's 1 - 23 bits and clear 0th bit*/
   1406  1.1  christos   }
   1407  1.6  christos   trace_output_32 (sd, tmp);
   1408  1.1  christos }
   1409  1.1  christos 
   1410  1.1  christos /* jhs.  */
   1411  1.1  christos void
   1412  1.6  christos OP_AB_C (SIM_DESC sd, SIM_CPU *cpu)
   1413  1.1  christos {
   1414  1.5  christos   uint32 tmp = 0;
   1415  1.1  christos   trace_input ("jhs", OP_REGP, OP_VOID, OP_VOID);
   1416  1.1  christos   if (((PSR_Z) == 1) | ((PSR_L) == 1))
   1417  1.1  christos   {
   1418  1.1  christos      tmp = (GPR32 (OP[0])) & 0x3fffff; /* Use only 0 - 22 bits */
   1419  1.1  christos      JMP (tmp << 1); /* Set PC's 1 - 23 bits and clear 0th bit*/
   1420  1.1  christos   }
   1421  1.6  christos   trace_output_32 (sd, tmp);
   1422  1.1  christos }
   1423  1.1  christos 
   1424  1.1  christos /* jlt.  */
   1425  1.1  christos void
   1426  1.6  christos OP_AC_C (SIM_DESC sd, SIM_CPU *cpu)
   1427  1.1  christos {
   1428  1.5  christos   uint32 tmp = 0;
   1429  1.1  christos   trace_input ("jlt", OP_REGP, OP_VOID, OP_VOID);
   1430  1.1  christos   if (((PSR_Z) == 0) & ((PSR_N) == 0))
   1431  1.1  christos   {
   1432  1.1  christos      tmp = (GPR32 (OP[0])) & 0x3fffff; /* Use only 0 - 22 bits */
   1433  1.1  christos      JMP (tmp << 1); /* Set PC's 1 - 23 bits and clear 0th bit*/
   1434  1.1  christos   }
   1435  1.6  christos   trace_output_32 (sd, tmp);
   1436  1.1  christos }
   1437  1.1  christos 
   1438  1.1  christos /* jge.  */
   1439  1.1  christos void
   1440  1.6  christos OP_AD_C (SIM_DESC sd, SIM_CPU *cpu)
   1441  1.1  christos {
   1442  1.5  christos   uint32 tmp = 0;
   1443  1.1  christos   trace_input ("jge", OP_REGP, OP_VOID, OP_VOID);
   1444  1.1  christos   if (((PSR_Z) == 1) | ((PSR_N) == 1))
   1445  1.1  christos   {
   1446  1.1  christos      tmp = (GPR32 (OP[0])) & 0x3fffff; /* Use only 0 - 22 bits */
   1447  1.1  christos      JMP (tmp << 1); /* Set PC's 1 - 23 bits and clear 0th bit*/
   1448  1.1  christos   }
   1449  1.6  christos   trace_output_32 (sd, tmp);
   1450  1.1  christos }
   1451  1.1  christos 
   1452  1.1  christos /* jump.  */
   1453  1.1  christos void
   1454  1.6  christos OP_AE_C (SIM_DESC sd, SIM_CPU *cpu)
   1455  1.1  christos {
   1456  1.1  christos   uint32 tmp;
   1457  1.1  christos   trace_input ("jump", OP_REGP, OP_VOID, OP_VOID);
   1458  1.1  christos   tmp = GPR32 (OP[0]) /*& 0x3fffff*/; /* Use only 0 - 22 bits */
   1459  1.1  christos   JMP (tmp << 1); /* Set PC's 1 - 23 bits and clear 0th bit*/
   1460  1.6  christos   trace_output_32 (sd, tmp);
   1461  1.1  christos }
   1462  1.1  christos 
   1463  1.1  christos /* jusr.  */
   1464  1.1  christos void
   1465  1.6  christos OP_AF_C (SIM_DESC sd, SIM_CPU *cpu)
   1466  1.1  christos {
   1467  1.1  christos   uint32 tmp;
   1468  1.1  christos   trace_input ("jusr", OP_REGP, OP_VOID, OP_VOID);
   1469  1.1  christos   tmp = (GPR32 (OP[0])) & 0x3fffff; /* Use only 0 - 22 bits */
   1470  1.1  christos   JMP (tmp << 1); /* Set PC's 1 - 23 bits and clear 0th bit*/
   1471  1.1  christos   SET_PSR_U(1);
   1472  1.6  christos   trace_output_32 (sd, tmp);
   1473  1.1  christos }
   1474  1.1  christos 
   1475  1.1  christos /* seq.  */
   1476  1.1  christos void
   1477  1.6  christos OP_80_C (SIM_DESC sd, SIM_CPU *cpu)
   1478  1.1  christos {
   1479  1.1  christos   trace_input ("seq", OP_REG, OP_VOID, OP_VOID);
   1480  1.1  christos   if ((PSR_Z) == 1)
   1481  1.1  christos      SET_GPR (OP[0], 1);
   1482  1.1  christos   else
   1483  1.1  christos      SET_GPR (OP[0], 0);
   1484  1.6  christos   trace_output_void (sd);
   1485  1.1  christos }
   1486  1.1  christos /* sne.  */
   1487  1.1  christos void
   1488  1.6  christos OP_81_C (SIM_DESC sd, SIM_CPU *cpu)
   1489  1.1  christos {
   1490  1.1  christos   trace_input ("sne", OP_REG, OP_VOID, OP_VOID);
   1491  1.1  christos   if ((PSR_Z) == 0)
   1492  1.1  christos      SET_GPR (OP[0], 1);
   1493  1.1  christos   else
   1494  1.1  christos      SET_GPR (OP[0], 0);
   1495  1.6  christos   trace_output_void (sd);
   1496  1.1  christos }
   1497  1.1  christos 
   1498  1.1  christos /* scs.  */
   1499  1.1  christos void
   1500  1.6  christos OP_82_C (SIM_DESC sd, SIM_CPU *cpu)
   1501  1.1  christos {
   1502  1.1  christos   trace_input ("scs", OP_REG, OP_VOID, OP_VOID);
   1503  1.1  christos   if ((PSR_C) == 1)
   1504  1.1  christos      SET_GPR (OP[0], 1);
   1505  1.1  christos   else
   1506  1.1  christos      SET_GPR (OP[0], 0);
   1507  1.6  christos   trace_output_void (sd);
   1508  1.1  christos }
   1509  1.1  christos 
   1510  1.1  christos /* scc.  */
   1511  1.1  christos void
   1512  1.6  christos OP_83_C (SIM_DESC sd, SIM_CPU *cpu)
   1513  1.1  christos {
   1514  1.1  christos   trace_input ("scc", OP_REG, OP_VOID, OP_VOID);
   1515  1.1  christos   if ((PSR_C) == 0)
   1516  1.1  christos      SET_GPR (OP[0], 1);
   1517  1.1  christos   else
   1518  1.1  christos      SET_GPR (OP[0], 0);
   1519  1.6  christos   trace_output_void (sd);
   1520  1.1  christos }
   1521  1.1  christos 
   1522  1.1  christos /* shi.  */
   1523  1.1  christos void
   1524  1.6  christos OP_84_C (SIM_DESC sd, SIM_CPU *cpu)
   1525  1.1  christos {
   1526  1.1  christos   trace_input ("shi", OP_REG, OP_VOID, OP_VOID);
   1527  1.1  christos   if ((PSR_L) == 1)
   1528  1.1  christos      SET_GPR (OP[0], 1);
   1529  1.1  christos   else
   1530  1.1  christos      SET_GPR (OP[0], 0);
   1531  1.6  christos   trace_output_void (sd);
   1532  1.1  christos }
   1533  1.1  christos 
   1534  1.1  christos /* sls.  */
   1535  1.1  christos void
   1536  1.6  christos OP_85_C (SIM_DESC sd, SIM_CPU *cpu)
   1537  1.1  christos {
   1538  1.1  christos   trace_input ("sls", OP_REG, OP_VOID, OP_VOID);
   1539  1.1  christos   if ((PSR_L) == 0)
   1540  1.1  christos      SET_GPR (OP[0], 1);
   1541  1.1  christos   else
   1542  1.1  christos      SET_GPR (OP[0], 0);
   1543  1.6  christos   trace_output_void (sd);
   1544  1.1  christos }
   1545  1.1  christos 
   1546  1.1  christos /* sgt.  */
   1547  1.1  christos void
   1548  1.6  christos OP_86_C (SIM_DESC sd, SIM_CPU *cpu)
   1549  1.1  christos {
   1550  1.1  christos   trace_input ("sgt", OP_REG, OP_VOID, OP_VOID);
   1551  1.1  christos   if ((PSR_N) == 1)
   1552  1.1  christos      SET_GPR (OP[0], 1);
   1553  1.1  christos   else
   1554  1.1  christos      SET_GPR (OP[0], 0);
   1555  1.6  christos   trace_output_void (sd);
   1556  1.1  christos }
   1557  1.1  christos 
   1558  1.1  christos /* sle.  */
   1559  1.1  christos void
   1560  1.6  christos OP_87_C (SIM_DESC sd, SIM_CPU *cpu)
   1561  1.1  christos {
   1562  1.1  christos   trace_input ("sle", OP_REG, OP_VOID, OP_VOID);
   1563  1.1  christos   if ((PSR_N) == 0)
   1564  1.1  christos      SET_GPR (OP[0], 1);
   1565  1.1  christos   else
   1566  1.1  christos      SET_GPR (OP[0], 0);
   1567  1.6  christos   trace_output_void (sd);
   1568  1.1  christos }
   1569  1.1  christos 
   1570  1.1  christos /* sfs.  */
   1571  1.1  christos void
   1572  1.6  christos OP_88_C (SIM_DESC sd, SIM_CPU *cpu)
   1573  1.1  christos {
   1574  1.1  christos   trace_input ("sfs", OP_REG, OP_VOID, OP_VOID);
   1575  1.1  christos   if ((PSR_F) == 1)
   1576  1.1  christos      SET_GPR (OP[0], 1);
   1577  1.1  christos   else
   1578  1.1  christos      SET_GPR (OP[0], 0);
   1579  1.6  christos   trace_output_void (sd);
   1580  1.1  christos }
   1581  1.1  christos 
   1582  1.1  christos /* sfc.  */
   1583  1.1  christos void
   1584  1.6  christos OP_89_C (SIM_DESC sd, SIM_CPU *cpu)
   1585  1.1  christos {
   1586  1.1  christos   trace_input ("sfc", OP_REG, OP_VOID, OP_VOID);
   1587  1.1  christos   if ((PSR_F) == 0)
   1588  1.1  christos      SET_GPR (OP[0], 1);
   1589  1.1  christos   else
   1590  1.1  christos      SET_GPR (OP[0], 0);
   1591  1.6  christos   trace_output_void (sd);
   1592  1.1  christos }
   1593  1.1  christos 
   1594  1.1  christos 
   1595  1.1  christos /* slo.  */
   1596  1.1  christos void
   1597  1.6  christos OP_8A_C (SIM_DESC sd, SIM_CPU *cpu)
   1598  1.1  christos {
   1599  1.1  christos   trace_input ("slo", OP_REG, OP_VOID, OP_VOID);
   1600  1.1  christos   if (((PSR_Z) == 0) & ((PSR_L) == 0))
   1601  1.1  christos      SET_GPR (OP[0], 1);
   1602  1.1  christos   else
   1603  1.1  christos      SET_GPR (OP[0], 0);
   1604  1.6  christos   trace_output_void (sd);
   1605  1.1  christos }
   1606  1.1  christos 
   1607  1.1  christos /* shs.  */
   1608  1.1  christos void
   1609  1.6  christos OP_8B_C (SIM_DESC sd, SIM_CPU *cpu)
   1610  1.1  christos {
   1611  1.1  christos   trace_input ("shs", OP_REG, OP_VOID, OP_VOID);
   1612  1.1  christos   if ( ((PSR_Z) == 1) | ((PSR_L) == 1))
   1613  1.1  christos      SET_GPR (OP[0], 1);
   1614  1.1  christos   else
   1615  1.1  christos      SET_GPR (OP[0], 0);
   1616  1.6  christos   trace_output_void (sd);
   1617  1.1  christos }
   1618  1.1  christos 
   1619  1.1  christos /* slt.  */
   1620  1.1  christos void
   1621  1.6  christos OP_8C_C (SIM_DESC sd, SIM_CPU *cpu)
   1622  1.1  christos {
   1623  1.1  christos   trace_input ("slt", OP_REG, OP_VOID, OP_VOID);
   1624  1.1  christos   if (((PSR_Z) == 0) & ((PSR_N) == 0))
   1625  1.1  christos      SET_GPR (OP[0], 1);
   1626  1.1  christos   else
   1627  1.1  christos      SET_GPR (OP[0], 0);
   1628  1.6  christos   trace_output_void (sd);
   1629  1.1  christos }
   1630  1.1  christos 
   1631  1.1  christos /* sge.  */
   1632  1.1  christos void
   1633  1.6  christos OP_8D_C (SIM_DESC sd, SIM_CPU *cpu)
   1634  1.1  christos {
   1635  1.1  christos   trace_input ("sge", OP_REG, OP_VOID, OP_VOID);
   1636  1.1  christos   if (((PSR_Z) == 1) | ((PSR_N) == 1))
   1637  1.1  christos      SET_GPR (OP[0], 1);
   1638  1.1  christos   else
   1639  1.1  christos      SET_GPR (OP[0], 0);
   1640  1.6  christos   trace_output_void (sd);
   1641  1.1  christos }
   1642  1.1  christos 
   1643  1.1  christos /* cbitb.  */
   1644  1.1  christos void
   1645  1.6  christos OP_D7_9 (SIM_DESC sd, SIM_CPU *cpu)
   1646  1.1  christos {
   1647  1.1  christos   uint8 a = OP[0] & 0xff;
   1648  1.1  christos   uint32 addr = OP[1], tmp;
   1649  1.1  christos   trace_input ("cbitb", OP_CONSTANT4, OP_ABS20_OUTPUT, OP_VOID);
   1650  1.1  christos   tmp = RB (addr);
   1651  1.1  christos   SET_PSR_F (tmp & (1 << a));
   1652  1.1  christos   tmp = tmp & ~(1 << a);
   1653  1.1  christos   SB (addr, tmp);
   1654  1.6  christos   trace_output_32 (sd, tmp);
   1655  1.1  christos }
   1656  1.1  christos 
   1657  1.1  christos /* cbitb.  */
   1658  1.1  christos void
   1659  1.6  christos OP_107_14 (SIM_DESC sd, SIM_CPU *cpu)
   1660  1.1  christos {
   1661  1.1  christos   uint8 a = OP[0] & 0xff;
   1662  1.1  christos   uint32 addr = OP[1], tmp;
   1663  1.1  christos   trace_input ("cbitb", OP_CONSTANT4, OP_ABS24_OUTPUT, OP_VOID);
   1664  1.1  christos   tmp = RB (addr);
   1665  1.1  christos   SET_PSR_F (tmp & (1 << a));
   1666  1.1  christos   tmp = tmp & ~(1 << a);
   1667  1.1  christos   SB (addr, tmp);
   1668  1.6  christos   trace_output_32 (sd, tmp);
   1669  1.1  christos }
   1670  1.1  christos 
   1671  1.1  christos /* cbitb.  */
   1672  1.1  christos void
   1673  1.6  christos OP_68_8 (SIM_DESC sd, SIM_CPU *cpu)
   1674  1.1  christos {
   1675  1.1  christos   uint8 a = (OP[0]) & 0xff;
   1676  1.1  christos   uint32 addr = (GPR (OP[2])) + OP[1], tmp;
   1677  1.1  christos   trace_input ("cbitb", OP_CONSTANT4, OP_R_INDEX7_ABS20, OP_VOID);
   1678  1.1  christos   tmp = RB (addr);
   1679  1.1  christos   SET_PSR_F (tmp & (1 << a));
   1680  1.1  christos   tmp = tmp & ~(1 << a);
   1681  1.1  christos   SB (addr, tmp);
   1682  1.6  christos   trace_output_32 (sd, addr);
   1683  1.1  christos }
   1684  1.1  christos 
   1685  1.1  christos /* cbitb.  */
   1686  1.1  christos void
   1687  1.6  christos OP_1AA_A (SIM_DESC sd, SIM_CPU *cpu)
   1688  1.1  christos {
   1689  1.1  christos   uint8 a = (OP[0]) & 0xff;
   1690  1.1  christos   uint32 addr = (GPR32 (OP[2])) + OP[1], tmp;
   1691  1.1  christos   trace_input ("cbitb", OP_CONSTANT4, OP_RP_INDEX_DISP14, OP_VOID);
   1692  1.1  christos   tmp = RB (addr);
   1693  1.1  christos   SET_PSR_F (tmp & (1 << a));
   1694  1.1  christos   tmp = tmp & ~(1 << a);
   1695  1.1  christos   SB (addr, tmp);
   1696  1.6  christos   trace_output_32 (sd, addr);
   1697  1.1  christos }
   1698  1.1  christos 
   1699  1.1  christos /* cbitb.  */
   1700  1.1  christos void
   1701  1.6  christos OP_104_14 (SIM_DESC sd, SIM_CPU *cpu)
   1702  1.1  christos {
   1703  1.1  christos   uint8 a = (OP[0]) & 0xff;
   1704  1.1  christos   uint32 addr = (GPR (OP[2])) + OP[1], tmp;
   1705  1.1  christos   trace_input ("cbitb", OP_CONSTANT4, OP_R_BASE_DISPS20, OP_VOID);
   1706  1.1  christos   tmp = RB (addr);
   1707  1.1  christos   SET_PSR_F (tmp & (1 << a));
   1708  1.1  christos   tmp = tmp & ~(1 << a);
   1709  1.1  christos   SB (addr, tmp);
   1710  1.6  christos   trace_output_32 (sd, addr);
   1711  1.1  christos }
   1712  1.1  christos 
   1713  1.1  christos /* cbitb.  */
   1714  1.1  christos void
   1715  1.6  christos OP_D4_9 (SIM_DESC sd, SIM_CPU *cpu)
   1716  1.1  christos {
   1717  1.1  christos   uint8 a = (OP[0]) & 0xff;
   1718  1.1  christos   uint32 addr = (GPR32 (OP[2])) + OP[1], tmp;
   1719  1.1  christos   trace_input ("cbitb", OP_CONSTANT4, OP_RP_INDEX_DISP0, OP_VOID);
   1720  1.1  christos   tmp = RB (addr);
   1721  1.1  christos   SET_PSR_F (tmp & (1 << a));
   1722  1.1  christos   tmp = tmp & ~(1 << a);
   1723  1.1  christos   SB (addr, tmp);
   1724  1.6  christos   trace_output_32 (sd, addr);
   1725  1.1  christos }
   1726  1.1  christos 
   1727  1.1  christos /* cbitb.  */
   1728  1.1  christos void
   1729  1.6  christos OP_D6_9 (SIM_DESC sd, SIM_CPU *cpu)
   1730  1.1  christos {
   1731  1.1  christos   uint8 a = (OP[0]) & 0xff;
   1732  1.1  christos   uint32 addr = (GPR32 (OP[2])) + OP[1], tmp;
   1733  1.1  christos   trace_input ("cbitb", OP_CONSTANT4, OP_RP_BASE_DISP16, OP_VOID);
   1734  1.1  christos   tmp = RB (addr);
   1735  1.1  christos   SET_PSR_F (tmp & (1 << a));
   1736  1.1  christos   tmp = tmp & ~(1 << a);
   1737  1.1  christos   SB (addr, tmp);
   1738  1.6  christos   trace_output_32 (sd, addr);
   1739  1.1  christos 
   1740  1.1  christos }
   1741  1.1  christos 
   1742  1.1  christos /* cbitb.  */
   1743  1.1  christos void
   1744  1.6  christos OP_105_14 (SIM_DESC sd, SIM_CPU *cpu)
   1745  1.1  christos {
   1746  1.1  christos   uint8 a = (OP[0]) & 0xff;
   1747  1.1  christos   uint32 addr = (GPR32 (OP[2])) + OP[1], tmp;
   1748  1.1  christos   trace_input ("cbitb", OP_CONSTANT4, OP_RP_BASE_DISPS20, OP_VOID);
   1749  1.1  christos   tmp = RB (addr);
   1750  1.1  christos   SET_PSR_F (tmp & (1 << a));
   1751  1.1  christos   tmp = tmp & ~(1 << a);
   1752  1.1  christos   SB (addr, tmp);
   1753  1.6  christos   trace_output_32 (sd, addr);
   1754  1.1  christos }
   1755  1.1  christos 
   1756  1.1  christos /* cbitb.  */
   1757  1.1  christos void
   1758  1.6  christos OP_106_14 (SIM_DESC sd, SIM_CPU *cpu)
   1759  1.1  christos {
   1760  1.1  christos   uint8 a = (OP[0]) & 0xff;
   1761  1.1  christos   uint32 addr = (GPR32 (OP[2])) + OP[1], tmp;
   1762  1.1  christos   trace_input ("cbitb", OP_CONSTANT4, OP_RP_INDEX_DISPS20, OP_VOID);
   1763  1.1  christos   tmp = RB (addr);
   1764  1.1  christos   SET_PSR_F (tmp & (1 << a));
   1765  1.1  christos   tmp = tmp & ~(1 << a);
   1766  1.1  christos   SB (addr, tmp);
   1767  1.6  christos   trace_output_32 (sd, addr);
   1768  1.1  christos }
   1769  1.1  christos 
   1770  1.1  christos 
   1771  1.1  christos /* cbitw.  */
   1772  1.1  christos void
   1773  1.6  christos OP_6F_8 (SIM_DESC sd, SIM_CPU *cpu)
   1774  1.1  christos {
   1775  1.1  christos   uint16 a = OP[0];
   1776  1.1  christos   uint32 addr = OP[1], tmp;
   1777  1.1  christos   trace_input ("cbitw", OP_CONSTANT4, OP_ABS20_OUTPUT, OP_VOID);
   1778  1.1  christos   tmp = RW (addr);
   1779  1.1  christos   SET_PSR_F (tmp & (1 << a));
   1780  1.1  christos   tmp = tmp & ~(1 << a);
   1781  1.1  christos   SW (addr, tmp);
   1782  1.6  christos   trace_output_32 (sd, tmp);
   1783  1.1  christos }
   1784  1.1  christos 
   1785  1.1  christos /* cbitw.  */
   1786  1.1  christos void
   1787  1.6  christos OP_117_14 (SIM_DESC sd, SIM_CPU *cpu)
   1788  1.1  christos {
   1789  1.1  christos   uint16 a = OP[0];
   1790  1.1  christos   uint32 addr = OP[1], tmp;
   1791  1.1  christos   trace_input ("cbitw", OP_CONSTANT4, OP_ABS24_OUTPUT, OP_VOID);
   1792  1.1  christos   tmp = RW (addr);
   1793  1.1  christos   SET_PSR_F (tmp & (1 << a));
   1794  1.1  christos   tmp = tmp & ~(1 << a);
   1795  1.1  christos   SW (addr, tmp);
   1796  1.6  christos   trace_output_32 (sd, tmp);
   1797  1.1  christos }
   1798  1.1  christos 
   1799  1.1  christos /* cbitw.  */
   1800  1.1  christos void
   1801  1.6  christos OP_36_7 (SIM_DESC sd, SIM_CPU *cpu)
   1802  1.1  christos {
   1803  1.1  christos   uint32 addr;
   1804  1.1  christos   uint16 a = (OP[0]), tmp;
   1805  1.1  christos   trace_input ("cbitw", OP_CONSTANT4, OP_R_INDEX8_ABS20, OP_VOID);
   1806  1.1  christos 
   1807  1.1  christos   if (OP[1] == 0)
   1808  1.1  christos      addr = (GPR32 (12)) + OP[2];
   1809  1.1  christos   else
   1810  1.1  christos      addr = (GPR32 (13)) + OP[2];
   1811  1.1  christos 
   1812  1.1  christos   tmp = RW (addr);
   1813  1.1  christos   SET_PSR_F (tmp & (1 << a));
   1814  1.1  christos   tmp = tmp & ~(1 << a);
   1815  1.1  christos   SW (addr, tmp);
   1816  1.6  christos   trace_output_32 (sd, addr);
   1817  1.1  christos 
   1818  1.1  christos }
   1819  1.1  christos 
   1820  1.1  christos /* cbitw.  */
   1821  1.1  christos void
   1822  1.6  christos OP_1AB_A (SIM_DESC sd, SIM_CPU *cpu)
   1823  1.1  christos {
   1824  1.1  christos   uint16 a = (OP[0]);
   1825  1.1  christos   uint32 addr = (GPR32 (OP[2])) + OP[1], tmp;
   1826  1.1  christos   trace_input ("cbitw", OP_CONSTANT4, OP_RP_INDEX_DISP14, OP_VOID);
   1827  1.1  christos   tmp = RW (addr);
   1828  1.1  christos   SET_PSR_F (tmp & (1 << a));
   1829  1.1  christos   tmp = tmp & ~(1 << a);
   1830  1.1  christos   SW (addr, tmp);
   1831  1.6  christos   trace_output_32 (sd, addr);
   1832  1.1  christos }
   1833  1.1  christos 
   1834  1.1  christos /* cbitw.  */
   1835  1.1  christos void
   1836  1.6  christos OP_114_14 (SIM_DESC sd, SIM_CPU *cpu)
   1837  1.1  christos {
   1838  1.1  christos   uint16 a = (OP[0]);
   1839  1.1  christos   uint32 addr = (GPR (OP[2])) + OP[1], tmp;
   1840  1.1  christos   trace_input ("cbitw", OP_CONSTANT4, OP_R_BASE_DISPS20, OP_VOID);
   1841  1.1  christos   tmp = RW (addr);
   1842  1.1  christos   SET_PSR_F (tmp & (1 << a));
   1843  1.1  christos   tmp = tmp & ~(1 << a);
   1844  1.1  christos   SW (addr, tmp);
   1845  1.6  christos   trace_output_32 (sd, addr);
   1846  1.1  christos }
   1847  1.1  christos 
   1848  1.1  christos 
   1849  1.1  christos /* cbitw.  */
   1850  1.1  christos void
   1851  1.6  christos OP_6E_8 (SIM_DESC sd, SIM_CPU *cpu)
   1852  1.1  christos {
   1853  1.1  christos   uint16 a = (OP[0]);
   1854  1.1  christos   uint32 addr = (GPR32 (OP[2])) + OP[1], tmp;
   1855  1.1  christos   trace_input ("cbitw", OP_CONSTANT4, OP_RP_INDEX_DISP0, OP_VOID);
   1856  1.1  christos   tmp = RW (addr);
   1857  1.1  christos   SET_PSR_F (tmp & (1 << a));
   1858  1.1  christos   tmp = tmp & ~(1 << a);
   1859  1.1  christos   SW (addr, tmp);
   1860  1.6  christos   trace_output_32 (sd, addr);
   1861  1.1  christos }
   1862  1.1  christos 
   1863  1.1  christos /* cbitw.  */
   1864  1.1  christos void
   1865  1.6  christos OP_69_8 (SIM_DESC sd, SIM_CPU *cpu)
   1866  1.1  christos {
   1867  1.1  christos   uint16 a = (OP[0]);
   1868  1.1  christos   uint32 addr = (GPR32 (OP[2])) + OP[1], tmp;
   1869  1.1  christos   trace_input ("cbitw", OP_CONSTANT4, OP_RP_BASE_DISP16, OP_VOID);
   1870  1.1  christos   tmp = RW (addr);
   1871  1.1  christos   SET_PSR_F (tmp & (1 << a));
   1872  1.1  christos   tmp = tmp & ~(1 << a);
   1873  1.1  christos   SW (addr, tmp);
   1874  1.6  christos   trace_output_32 (sd, addr);
   1875  1.1  christos }
   1876  1.1  christos 
   1877  1.1  christos 
   1878  1.1  christos /* cbitw.  */
   1879  1.1  christos void
   1880  1.6  christos OP_115_14 (SIM_DESC sd, SIM_CPU *cpu)
   1881  1.1  christos {
   1882  1.1  christos   uint16 a = (OP[0]);
   1883  1.1  christos   uint32 addr = (GPR32 (OP[2])) + OP[1], tmp;
   1884  1.1  christos   trace_input ("cbitw", OP_CONSTANT4, OP_RP_BASE_DISPS20, OP_VOID);
   1885  1.1  christos   tmp = RW (addr);
   1886  1.1  christos   SET_PSR_F (tmp & (1 << a));
   1887  1.1  christos   tmp = tmp & ~(1 << a);
   1888  1.1  christos   SW (addr, tmp);
   1889  1.6  christos   trace_output_32 (sd, addr);
   1890  1.1  christos }
   1891  1.1  christos 
   1892  1.1  christos /* cbitw.  */
   1893  1.1  christos void
   1894  1.6  christos OP_116_14 (SIM_DESC sd, SIM_CPU *cpu)
   1895  1.1  christos {
   1896  1.1  christos   uint16 a = (OP[0]);
   1897  1.1  christos   uint32 addr = (GPR32 (OP[2])) + OP[1], tmp;
   1898  1.1  christos   trace_input ("cbitw", OP_CONSTANT4, OP_RP_INDEX_DISPS20, OP_VOID);
   1899  1.1  christos   tmp = RW (addr);
   1900  1.1  christos   SET_PSR_F (tmp & (1 << a));
   1901  1.1  christos   tmp = tmp & ~(1 << a);
   1902  1.1  christos   SW (addr, tmp);
   1903  1.6  christos   trace_output_32 (sd, addr);
   1904  1.1  christos }
   1905  1.1  christos 
   1906  1.1  christos /* sbitb.  */
   1907  1.1  christos void
   1908  1.6  christos OP_E7_9 (SIM_DESC sd, SIM_CPU *cpu)
   1909  1.1  christos {
   1910  1.1  christos   uint8 a = OP[0] & 0xff;
   1911  1.1  christos   uint32 addr = OP[1], tmp;
   1912  1.1  christos   trace_input ("sbitb", OP_CONSTANT4, OP_ABS20_OUTPUT, OP_VOID);
   1913  1.1  christos   tmp = RB (addr);
   1914  1.1  christos   SET_PSR_F (tmp & (1 << a));
   1915  1.1  christos   tmp = tmp | (1 << a);
   1916  1.1  christos   SB (addr, tmp);
   1917  1.6  christos   trace_output_32 (sd, tmp);
   1918  1.1  christos }
   1919  1.1  christos 
   1920  1.1  christos /* sbitb.  */
   1921  1.1  christos void
   1922  1.6  christos OP_10B_14 (SIM_DESC sd, SIM_CPU *cpu)
   1923  1.1  christos {
   1924  1.1  christos   uint8 a = OP[0] & 0xff;
   1925  1.1  christos   uint32 addr = OP[1], tmp;
   1926  1.1  christos   trace_input ("sbitb", OP_CONSTANT4, OP_ABS24_OUTPUT, OP_VOID);
   1927  1.1  christos   tmp = RB (addr);
   1928  1.1  christos   SET_PSR_F (tmp & (1 << a));
   1929  1.1  christos   tmp = tmp | (1 << a);
   1930  1.1  christos   SB (addr, tmp);
   1931  1.6  christos   trace_output_32 (sd, tmp);
   1932  1.1  christos }
   1933  1.1  christos 
   1934  1.1  christos /* sbitb.  */
   1935  1.1  christos void
   1936  1.6  christos OP_70_8 (SIM_DESC sd, SIM_CPU *cpu)
   1937  1.1  christos {
   1938  1.1  christos   uint8 a = OP[0] & 0xff;
   1939  1.1  christos   uint32 addr = (GPR (OP[2])) + OP[1], tmp;
   1940  1.1  christos   trace_input ("sbitb", OP_CONSTANT4, OP_R_INDEX7_ABS20, OP_VOID);
   1941  1.1  christos   tmp = RB (addr);
   1942  1.1  christos   SET_PSR_F (tmp & (1 << a));
   1943  1.1  christos   tmp = tmp | (1 << a);
   1944  1.1  christos   SB (addr, tmp);
   1945  1.6  christos   trace_output_32 (sd, tmp);
   1946  1.1  christos }
   1947  1.1  christos 
   1948  1.1  christos /* sbitb.  */
   1949  1.1  christos void
   1950  1.6  christos OP_1CA_A (SIM_DESC sd, SIM_CPU *cpu)
   1951  1.1  christos {
   1952  1.1  christos   uint8 a = OP[0] & 0xff;
   1953  1.1  christos   uint32 addr = (GPR32 (OP[2])) + OP[1], tmp;
   1954  1.1  christos   trace_input ("sbitb", OP_CONSTANT4, OP_RP_INDEX_DISP14, OP_VOID);
   1955  1.1  christos   tmp = RB (addr);
   1956  1.1  christos   SET_PSR_F (tmp & (1 << a));
   1957  1.1  christos   tmp = tmp | (1 << a);
   1958  1.1  christos   SB (addr, tmp);
   1959  1.6  christos   trace_output_32 (sd, tmp);
   1960  1.1  christos }
   1961  1.1  christos 
   1962  1.1  christos /* sbitb.  */
   1963  1.1  christos void
   1964  1.6  christos OP_108_14 (SIM_DESC sd, SIM_CPU *cpu)
   1965  1.1  christos {
   1966  1.1  christos   uint8 a = OP[0] & 0xff;
   1967  1.1  christos   uint32 addr = (GPR (OP[2])) + OP[1], tmp;
   1968  1.1  christos   trace_input ("sbitb", OP_CONSTANT4, OP_R_BASE_DISPS20, OP_VOID);
   1969  1.1  christos   tmp = RB (addr);
   1970  1.1  christos   SET_PSR_F (tmp & (1 << a));
   1971  1.1  christos   tmp = tmp | (1 << a);
   1972  1.1  christos   SB (addr, tmp);
   1973  1.6  christos   trace_output_32 (sd, tmp);
   1974  1.1  christos }
   1975  1.1  christos 
   1976  1.1  christos 
   1977  1.1  christos /* sbitb.  */
   1978  1.1  christos void
   1979  1.6  christos OP_E4_9 (SIM_DESC sd, SIM_CPU *cpu)
   1980  1.1  christos {
   1981  1.1  christos   uint8 a = OP[0] & 0xff;
   1982  1.1  christos   uint32 addr = (GPR32 (OP[2])) + OP[1], tmp;
   1983  1.1  christos   trace_input ("sbitb", OP_CONSTANT4, OP_RP_INDEX_DISP0, OP_VOID);
   1984  1.1  christos   tmp = RB (addr);
   1985  1.1  christos   SET_PSR_F (tmp & (1 << a));
   1986  1.1  christos   tmp = tmp | (1 << a);
   1987  1.1  christos   SB (addr, tmp);
   1988  1.6  christos   trace_output_32 (sd, tmp);
   1989  1.1  christos }
   1990  1.1  christos 
   1991  1.1  christos /* sbitb.  */
   1992  1.1  christos void
   1993  1.6  christos OP_E6_9 (SIM_DESC sd, SIM_CPU *cpu)
   1994  1.1  christos {
   1995  1.1  christos   uint8 a = OP[0] & 0xff;
   1996  1.1  christos   uint32 addr = (GPR32 (OP[2])) + OP[1], tmp;
   1997  1.1  christos   trace_input ("sbitb", OP_CONSTANT4, OP_RP_BASE_DISP16, OP_VOID);
   1998  1.1  christos   tmp = RB (addr);
   1999  1.1  christos   SET_PSR_F (tmp & (1 << a));
   2000  1.1  christos   tmp = tmp | (1 << a);
   2001  1.1  christos   SB (addr, tmp);
   2002  1.6  christos   trace_output_32 (sd, tmp);
   2003  1.1  christos }
   2004  1.1  christos 
   2005  1.1  christos 
   2006  1.1  christos /* sbitb.  */
   2007  1.1  christos void
   2008  1.6  christos OP_109_14 (SIM_DESC sd, SIM_CPU *cpu)
   2009  1.1  christos {
   2010  1.1  christos   uint8 a = OP[0] & 0xff;
   2011  1.1  christos   uint32 addr = (GPR32 (OP[2])) + OP[1], tmp;
   2012  1.1  christos   trace_input ("sbitb", OP_CONSTANT4, OP_RP_BASE_DISPS20, OP_VOID);
   2013  1.1  christos   tmp = RB (addr);
   2014  1.1  christos   SET_PSR_F (tmp & (1 << a));
   2015  1.1  christos   tmp = tmp | (1 << a);
   2016  1.1  christos   SB (addr, tmp);
   2017  1.6  christos   trace_output_32 (sd, tmp);
   2018  1.1  christos }
   2019  1.1  christos 
   2020  1.1  christos 
   2021  1.1  christos /* sbitb.  */
   2022  1.1  christos void
   2023  1.6  christos OP_10A_14 (SIM_DESC sd, SIM_CPU *cpu)
   2024  1.1  christos {
   2025  1.1  christos   uint8 a = OP[0] & 0xff;
   2026  1.1  christos   uint32 addr = (GPR32 (OP[2])) + OP[1], tmp;
   2027  1.1  christos   trace_input ("sbitb", OP_CONSTANT4, OP_RP_INDEX_DISPS20, OP_VOID);
   2028  1.1  christos   tmp = RB (addr);
   2029  1.1  christos   SET_PSR_F (tmp & (1 << a));
   2030  1.1  christos   tmp = tmp | (1 << a);
   2031  1.1  christos   SB (addr, tmp);
   2032  1.6  christos   trace_output_32 (sd, tmp);
   2033  1.1  christos }
   2034  1.1  christos 
   2035  1.1  christos 
   2036  1.1  christos /* sbitw.  */
   2037  1.1  christos void
   2038  1.6  christos OP_77_8 (SIM_DESC sd, SIM_CPU *cpu)
   2039  1.1  christos {
   2040  1.1  christos   uint16 a = OP[0];
   2041  1.1  christos   uint32 addr = OP[1], tmp;
   2042  1.1  christos   trace_input ("sbitw", OP_CONSTANT4, OP_ABS20_OUTPUT, OP_VOID);
   2043  1.1  christos   tmp = RW (addr);
   2044  1.1  christos   SET_PSR_F (tmp & (1 << a));
   2045  1.1  christos   tmp = tmp | (1 << a);
   2046  1.1  christos   SW (addr, tmp);
   2047  1.6  christos   trace_output_32 (sd, tmp);
   2048  1.1  christos }
   2049  1.1  christos 
   2050  1.1  christos /* sbitw.  */
   2051  1.1  christos void
   2052  1.6  christos OP_11B_14 (SIM_DESC sd, SIM_CPU *cpu)
   2053  1.1  christos {
   2054  1.1  christos   uint16 a = OP[0];
   2055  1.1  christos   uint32 addr = OP[1], tmp;
   2056  1.1  christos   trace_input ("sbitw", OP_CONSTANT4, OP_ABS24_OUTPUT, OP_VOID);
   2057  1.1  christos   tmp = RW (addr);
   2058  1.1  christos   SET_PSR_F (tmp & (1 << a));
   2059  1.1  christos   tmp = tmp | (1 << a);
   2060  1.1  christos   SW (addr, tmp);
   2061  1.6  christos   trace_output_32 (sd, tmp);
   2062  1.1  christos }
   2063  1.1  christos 
   2064  1.1  christos /* sbitw.  */
   2065  1.1  christos void
   2066  1.6  christos OP_3A_7 (SIM_DESC sd, SIM_CPU *cpu)
   2067  1.1  christos {
   2068  1.1  christos   uint32 addr;
   2069  1.1  christos   uint16 a = (OP[0]), tmp;
   2070  1.1  christos   trace_input ("sbitw", OP_CONSTANT4, OP_R_INDEX8_ABS20, OP_VOID);
   2071  1.1  christos 
   2072  1.1  christos   if (OP[1] == 0)
   2073  1.1  christos      addr = (GPR32 (12)) + OP[2];
   2074  1.1  christos   else
   2075  1.1  christos      addr = (GPR32 (13)) + OP[2];
   2076  1.1  christos 
   2077  1.1  christos   tmp = RW (addr);
   2078  1.1  christos   SET_PSR_F (tmp & (1 << a));
   2079  1.1  christos   tmp = tmp | (1 << a);
   2080  1.1  christos   SW (addr, tmp);
   2081  1.6  christos   trace_output_32 (sd, addr);
   2082  1.1  christos }
   2083  1.1  christos 
   2084  1.1  christos /* sbitw.  */
   2085  1.1  christos void
   2086  1.6  christos OP_1CB_A (SIM_DESC sd, SIM_CPU *cpu)
   2087  1.1  christos {
   2088  1.1  christos   uint16 a = (OP[0]);
   2089  1.1  christos   uint32 addr = (GPR32 (OP[2])) + OP[1], tmp;
   2090  1.1  christos   trace_input ("sbitw", OP_CONSTANT4, OP_RP_INDEX_DISP14, OP_VOID);
   2091  1.1  christos   tmp = RW (addr);
   2092  1.1  christos   SET_PSR_F (tmp & (1 << a));
   2093  1.1  christos   tmp = tmp | (1 << a);
   2094  1.1  christos   SW (addr, tmp);
   2095  1.6  christos   trace_output_32 (sd, addr);
   2096  1.1  christos }
   2097  1.1  christos 
   2098  1.1  christos /* sbitw.  */
   2099  1.1  christos void
   2100  1.6  christos OP_118_14 (SIM_DESC sd, SIM_CPU *cpu)
   2101  1.1  christos {
   2102  1.1  christos   uint16 a = (OP[0]);
   2103  1.1  christos   uint32 addr = (GPR (OP[2])) + OP[1], tmp;
   2104  1.1  christos   trace_input ("sbitw", OP_CONSTANT4, OP_R_BASE_DISPS20, OP_VOID);
   2105  1.1  christos   tmp = RW (addr);
   2106  1.1  christos   SET_PSR_F (tmp & (1 << a));
   2107  1.1  christos   tmp = tmp | (1 << a);
   2108  1.1  christos   SW (addr, tmp);
   2109  1.6  christos   trace_output_32 (sd, addr);
   2110  1.1  christos }
   2111  1.1  christos 
   2112  1.1  christos /* sbitw.  */
   2113  1.1  christos void
   2114  1.6  christos OP_76_8 (SIM_DESC sd, SIM_CPU *cpu)
   2115  1.1  christos {
   2116  1.1  christos   uint16 a = (OP[0]);
   2117  1.1  christos   uint32 addr = (GPR32 (OP[2])) + OP[1], tmp;
   2118  1.1  christos   trace_input ("sbitw", OP_CONSTANT4, OP_RP_INDEX_DISP0, OP_VOID);
   2119  1.1  christos   tmp = RW (addr);
   2120  1.1  christos   SET_PSR_F (tmp & (1 << a));
   2121  1.1  christos   tmp = tmp | (1 << a);
   2122  1.1  christos   SW (addr, tmp);
   2123  1.6  christos   trace_output_32 (sd, addr);
   2124  1.1  christos }
   2125  1.1  christos 
   2126  1.1  christos /* sbitw.  */
   2127  1.1  christos void
   2128  1.6  christos OP_71_8 (SIM_DESC sd, SIM_CPU *cpu)
   2129  1.1  christos {
   2130  1.1  christos   uint16 a = (OP[0]);
   2131  1.1  christos   uint32 addr = (GPR32 (OP[2])) + OP[1], tmp;
   2132  1.1  christos   trace_input ("sbitw", OP_CONSTANT4, OP_RP_BASE_DISP16, OP_VOID);
   2133  1.1  christos   tmp = RW (addr);
   2134  1.1  christos   SET_PSR_F (tmp & (1 << a));
   2135  1.1  christos   tmp = tmp | (1 << a);
   2136  1.1  christos   SW (addr, tmp);
   2137  1.6  christos   trace_output_32 (sd, addr);
   2138  1.1  christos }
   2139  1.1  christos 
   2140  1.1  christos /* sbitw.  */
   2141  1.1  christos void
   2142  1.6  christos OP_119_14 (SIM_DESC sd, SIM_CPU *cpu)
   2143  1.1  christos {
   2144  1.1  christos   uint16 a = (OP[0]);
   2145  1.1  christos   uint32 addr = (GPR32 (OP[2])) + OP[1], tmp;
   2146  1.1  christos   trace_input ("sbitw", OP_CONSTANT4, OP_RP_BASE_DISPS20, OP_VOID);
   2147  1.1  christos   tmp = RW (addr);
   2148  1.1  christos   SET_PSR_F (tmp & (1 << a));
   2149  1.1  christos   tmp = tmp | (1 << a);
   2150  1.1  christos   SW (addr, tmp);
   2151  1.6  christos   trace_output_32 (sd, addr);
   2152  1.1  christos }
   2153  1.1  christos 
   2154  1.1  christos /* sbitw.  */
   2155  1.1  christos void
   2156  1.6  christos OP_11A_14 (SIM_DESC sd, SIM_CPU *cpu)
   2157  1.1  christos {
   2158  1.1  christos   uint16 a = (OP[0]);
   2159  1.1  christos   uint32 addr = (GPR32 (OP[2])) + OP[1], tmp;
   2160  1.1  christos   trace_input ("sbitw", OP_CONSTANT4, OP_RP_INDEX_DISPS20, OP_VOID);
   2161  1.1  christos   tmp = RW (addr);
   2162  1.1  christos   SET_PSR_F (tmp & (1 << a));
   2163  1.1  christos   tmp = tmp | (1 << a);
   2164  1.1  christos   SW (addr, tmp);
   2165  1.6  christos   trace_output_32 (sd, addr);
   2166  1.1  christos }
   2167  1.1  christos 
   2168  1.1  christos 
   2169  1.1  christos /* tbitb.  */
   2170  1.1  christos void
   2171  1.6  christos OP_F7_9 (SIM_DESC sd, SIM_CPU *cpu)
   2172  1.1  christos {
   2173  1.1  christos   uint8 a = OP[0] & 0xff;
   2174  1.1  christos   uint32 addr = OP[1], tmp;
   2175  1.1  christos   trace_input ("tbitb", OP_CONSTANT4, OP_ABS20_OUTPUT, OP_VOID);
   2176  1.1  christos   tmp = RB (addr);
   2177  1.1  christos   SET_PSR_F (tmp & (1 << a));
   2178  1.6  christos   trace_output_32 (sd, tmp);
   2179  1.1  christos }
   2180  1.1  christos 
   2181  1.1  christos /* tbitb.  */
   2182  1.1  christos void
   2183  1.6  christos OP_10F_14 (SIM_DESC sd, SIM_CPU *cpu)
   2184  1.1  christos {
   2185  1.1  christos   uint8 a = OP[0] & 0xff;
   2186  1.1  christos   uint32 addr = OP[1], tmp;
   2187  1.1  christos   trace_input ("tbitb", OP_CONSTANT4, OP_ABS24_OUTPUT, OP_VOID);
   2188  1.1  christos   tmp = RB (addr);
   2189  1.1  christos   SET_PSR_F (tmp & (1 << a));
   2190  1.6  christos   trace_output_32 (sd, tmp);
   2191  1.1  christos }
   2192  1.1  christos 
   2193  1.1  christos /* tbitb.  */
   2194  1.1  christos void
   2195  1.6  christos OP_78_8 (SIM_DESC sd, SIM_CPU *cpu)
   2196  1.1  christos {
   2197  1.1  christos   uint8 a = (OP[0]) & 0xff;
   2198  1.1  christos   uint32 addr = (GPR (OP[2])) + OP[1], tmp;
   2199  1.1  christos   trace_input ("tbitb", OP_CONSTANT4, OP_R_INDEX7_ABS20, OP_VOID);
   2200  1.1  christos   tmp = RB (addr);
   2201  1.1  christos   SET_PSR_F (tmp & (1 << a));
   2202  1.6  christos   trace_output_32 (sd, addr);
   2203  1.1  christos }
   2204  1.1  christos 
   2205  1.1  christos /* tbitb.  */
   2206  1.1  christos void
   2207  1.6  christos OP_1EA_A (SIM_DESC sd, SIM_CPU *cpu)
   2208  1.1  christos {
   2209  1.1  christos   uint8 a = (OP[0]) & 0xff;
   2210  1.1  christos   uint32 addr = (GPR32 (OP[2])) + OP[1], tmp;
   2211  1.1  christos   trace_input ("tbitb", OP_CONSTANT4, OP_RP_INDEX_DISP14, OP_VOID);
   2212  1.1  christos   tmp = RB (addr);
   2213  1.1  christos   SET_PSR_F (tmp & (1 << a));
   2214  1.6  christos   trace_output_32 (sd, addr);
   2215  1.1  christos }
   2216  1.1  christos 
   2217  1.1  christos /* tbitb.  */
   2218  1.1  christos void
   2219  1.6  christos OP_10C_14 (SIM_DESC sd, SIM_CPU *cpu)
   2220  1.1  christos {
   2221  1.1  christos   uint8 a = (OP[0]) & 0xff;
   2222  1.1  christos   uint32 addr = (GPR (OP[2])) + OP[1], tmp;
   2223  1.1  christos   trace_input ("tbitb", OP_CONSTANT4, OP_R_BASE_DISPS20, OP_VOID);
   2224  1.1  christos   tmp = RB (addr);
   2225  1.1  christos   SET_PSR_F (tmp & (1 << a));
   2226  1.6  christos   trace_output_32 (sd, addr);
   2227  1.1  christos }
   2228  1.1  christos 
   2229  1.1  christos /* tbitb.  */
   2230  1.1  christos void
   2231  1.6  christos OP_F4_9 (SIM_DESC sd, SIM_CPU *cpu)
   2232  1.1  christos {
   2233  1.1  christos   uint8 a = (OP[0]) & 0xff;
   2234  1.1  christos   uint32 addr = (GPR32 (OP[2])) + OP[1], tmp;
   2235  1.1  christos   trace_input ("tbitb", OP_CONSTANT4, OP_RP_INDEX_DISP0, OP_VOID);
   2236  1.1  christos   tmp = RB (addr);
   2237  1.1  christos   SET_PSR_F (tmp & (1 << a));
   2238  1.6  christos   trace_output_32 (sd, addr);
   2239  1.1  christos }
   2240  1.1  christos 
   2241  1.1  christos /* tbitb.  */
   2242  1.1  christos void
   2243  1.6  christos OP_F6_9 (SIM_DESC sd, SIM_CPU *cpu)
   2244  1.1  christos {
   2245  1.1  christos   uint8 a = (OP[0]) & 0xff;
   2246  1.1  christos   uint32 addr = (GPR32 (OP[2])) + OP[1], tmp;
   2247  1.1  christos   trace_input ("tbitb", OP_CONSTANT4, OP_RP_BASE_DISP16, OP_VOID);
   2248  1.1  christos   tmp = RB (addr);
   2249  1.1  christos   SET_PSR_F (tmp & (1 << a));
   2250  1.6  christos   trace_output_32 (sd, addr);
   2251  1.1  christos }
   2252  1.1  christos 
   2253  1.1  christos /* tbitb.  */
   2254  1.1  christos void
   2255  1.6  christos OP_10D_14 (SIM_DESC sd, SIM_CPU *cpu)
   2256  1.1  christos {
   2257  1.1  christos   uint8 a = (OP[0]) & 0xff;
   2258  1.1  christos   uint32 addr = (GPR32 (OP[2])) + OP[1], tmp;
   2259  1.1  christos   trace_input ("tbitb", OP_CONSTANT4, OP_RP_BASE_DISPS20, OP_VOID);
   2260  1.1  christos   tmp = RB (addr);
   2261  1.1  christos   SET_PSR_F (tmp & (1 << a));
   2262  1.6  christos   trace_output_32 (sd, addr);
   2263  1.1  christos }
   2264  1.1  christos 
   2265  1.1  christos /* tbitb.  */
   2266  1.1  christos void
   2267  1.6  christos OP_10E_14 (SIM_DESC sd, SIM_CPU *cpu)
   2268  1.1  christos {
   2269  1.1  christos   uint8 a = (OP[0]) & 0xff;
   2270  1.1  christos   uint32 addr = (GPR32 (OP[2])) + OP[1], tmp;
   2271  1.1  christos   trace_input ("tbitb", OP_CONSTANT4, OP_RP_INDEX_DISPS20, OP_VOID);
   2272  1.1  christos   tmp = RB (addr);
   2273  1.1  christos   SET_PSR_F (tmp & (1 << a));
   2274  1.6  christos   trace_output_32 (sd, addr);
   2275  1.1  christos }
   2276  1.1  christos 
   2277  1.1  christos 
   2278  1.1  christos /* tbitw.  */
   2279  1.1  christos void
   2280  1.6  christos OP_7F_8 (SIM_DESC sd, SIM_CPU *cpu)
   2281  1.1  christos {
   2282  1.1  christos   uint16 a = OP[0];
   2283  1.1  christos   uint32 addr = OP[1], tmp;
   2284  1.1  christos   trace_input ("tbitw", OP_CONSTANT4, OP_ABS20_OUTPUT, OP_VOID);
   2285  1.1  christos   tmp = RW (addr);
   2286  1.1  christos   SET_PSR_F (tmp & (1 << a));
   2287  1.6  christos   trace_output_32 (sd, tmp);
   2288  1.1  christos }
   2289  1.1  christos 
   2290  1.1  christos /* tbitw.  */
   2291  1.1  christos void
   2292  1.6  christos OP_11F_14 (SIM_DESC sd, SIM_CPU *cpu)
   2293  1.1  christos {
   2294  1.1  christos   uint16 a = OP[0];
   2295  1.1  christos   uint32 addr = OP[1], tmp;
   2296  1.1  christos   trace_input ("tbitw", OP_CONSTANT4, OP_ABS24_OUTPUT, OP_VOID);
   2297  1.1  christos   tmp = RW (addr);
   2298  1.1  christos   SET_PSR_F (tmp & (1 << a));
   2299  1.6  christos   trace_output_32 (sd, tmp);
   2300  1.1  christos }
   2301  1.1  christos 
   2302  1.1  christos 
   2303  1.1  christos /* tbitw.  */
   2304  1.1  christos void
   2305  1.6  christos OP_3E_7 (SIM_DESC sd, SIM_CPU *cpu)
   2306  1.1  christos {
   2307  1.1  christos   uint32 addr;
   2308  1.1  christos   uint16 a = (OP[0]), tmp;
   2309  1.1  christos   trace_input ("tbitw", OP_CONSTANT4, OP_R_INDEX8_ABS20, OP_VOID);
   2310  1.1  christos 
   2311  1.1  christos   if (OP[1] == 0)
   2312  1.1  christos      addr = (GPR32 (12)) + OP[2];
   2313  1.1  christos   else
   2314  1.1  christos      addr = (GPR32 (13)) + OP[2];
   2315  1.1  christos 
   2316  1.1  christos   tmp = RW (addr);
   2317  1.1  christos   SET_PSR_F (tmp & (1 << a));
   2318  1.6  christos   trace_output_32 (sd, addr);
   2319  1.1  christos }
   2320  1.1  christos 
   2321  1.1  christos /* tbitw.  */
   2322  1.1  christos void
   2323  1.6  christos OP_1EB_A (SIM_DESC sd, SIM_CPU *cpu)
   2324  1.1  christos {
   2325  1.1  christos   uint16 a = (OP[0]);
   2326  1.1  christos   uint32 addr = (GPR32 (OP[2])) + OP[1], tmp;
   2327  1.1  christos   trace_input ("tbitw", OP_CONSTANT4, OP_RP_INDEX_DISP14, OP_VOID);
   2328  1.1  christos   tmp = RW (addr);
   2329  1.1  christos   SET_PSR_F (tmp & (1 << a));
   2330  1.6  christos   trace_output_32 (sd, addr);
   2331  1.1  christos }
   2332  1.1  christos 
   2333  1.1  christos /* tbitw.  */
   2334  1.1  christos void
   2335  1.6  christos OP_11C_14 (SIM_DESC sd, SIM_CPU *cpu)
   2336  1.1  christos {
   2337  1.1  christos   uint16 a = (OP[0]);
   2338  1.1  christos   uint32 addr = (GPR (OP[2])) + OP[1], tmp;
   2339  1.1  christos   trace_input ("tbitw", OP_CONSTANT4, OP_R_BASE_DISPS20, OP_VOID);
   2340  1.1  christos   tmp = RW (addr);
   2341  1.1  christos   SET_PSR_F (tmp & (1 << a));
   2342  1.6  christos   trace_output_32 (sd, addr);
   2343  1.1  christos }
   2344  1.1  christos 
   2345  1.1  christos /* tbitw.  */
   2346  1.1  christos void
   2347  1.6  christos OP_7E_8 (SIM_DESC sd, SIM_CPU *cpu)
   2348  1.1  christos {
   2349  1.1  christos   uint16 a = (OP[0]);
   2350  1.1  christos   uint32 addr = (GPR32 (OP[2])) + OP[1], tmp;
   2351  1.1  christos   trace_input ("tbitw", OP_CONSTANT4, OP_RP_INDEX_DISP0, OP_VOID);
   2352  1.1  christos   tmp = RW (addr);
   2353  1.1  christos   SET_PSR_F (tmp & (1 << a));
   2354  1.6  christos   trace_output_32 (sd, addr);
   2355  1.1  christos }
   2356  1.1  christos 
   2357  1.1  christos /* tbitw.  */
   2358  1.1  christos void
   2359  1.6  christos OP_79_8 (SIM_DESC sd, SIM_CPU *cpu)
   2360  1.1  christos {
   2361  1.1  christos   uint16 a = (OP[0]);
   2362  1.1  christos   uint32 addr = (GPR32 (OP[2])) + OP[1], tmp;
   2363  1.1  christos   trace_input ("tbitw", OP_CONSTANT4, OP_RP_BASE_DISP16, OP_VOID);
   2364  1.1  christos   tmp = RW (addr);
   2365  1.1  christos   SET_PSR_F (tmp & (1 << a));
   2366  1.6  christos   trace_output_32 (sd, addr);
   2367  1.1  christos }
   2368  1.1  christos 
   2369  1.1  christos /* tbitw.  */
   2370  1.1  christos void
   2371  1.6  christos OP_11D_14 (SIM_DESC sd, SIM_CPU *cpu)
   2372  1.1  christos {
   2373  1.1  christos   uint16 a = (OP[0]);
   2374  1.1  christos   uint32 addr = (GPR32 (OP[2])) + OP[1], tmp;
   2375  1.1  christos   trace_input ("tbitw", OP_CONSTANT4, OP_RP_BASE_DISPS20, OP_VOID);
   2376  1.1  christos   tmp = RW (addr);
   2377  1.1  christos   SET_PSR_F (tmp & (1 << a));
   2378  1.6  christos   trace_output_32 (sd, addr);
   2379  1.1  christos }
   2380  1.1  christos 
   2381  1.1  christos 
   2382  1.1  christos /* tbitw.  */
   2383  1.1  christos void
   2384  1.6  christos OP_11E_14 (SIM_DESC sd, SIM_CPU *cpu)
   2385  1.1  christos {
   2386  1.1  christos   uint16 a = (OP[0]);
   2387  1.1  christos   uint32 addr = (GPR32 (OP[2])) + OP[1], tmp;
   2388  1.1  christos   trace_input ("tbitw", OP_CONSTANT4, OP_RP_INDEX_DISPS20, OP_VOID);
   2389  1.1  christos   tmp = RW (addr);
   2390  1.1  christos   SET_PSR_F (tmp & (1 << a));
   2391  1.6  christos   trace_output_32 (sd, addr);
   2392  1.1  christos }
   2393  1.1  christos 
   2394  1.1  christos 
   2395  1.1  christos /* tbit.  */
   2396  1.1  christos void
   2397  1.6  christos OP_6_8 (SIM_DESC sd, SIM_CPU *cpu)
   2398  1.1  christos {
   2399  1.1  christos   uint16 a = OP[0];
   2400  1.1  christos   uint16 b = (GPR (OP[1]));
   2401  1.1  christos   trace_input ("tbit", OP_CONSTANT4, OP_REG, OP_VOID);
   2402  1.1  christos   SET_PSR_F (b & (1 << a));
   2403  1.6  christos   trace_output_16 (sd, b);
   2404  1.1  christos }
   2405  1.1  christos 
   2406  1.1  christos /* tbit.  */
   2407  1.1  christos void
   2408  1.6  christos OP_7_8 (SIM_DESC sd, SIM_CPU *cpu)
   2409  1.1  christos {
   2410  1.1  christos   uint16 a = GPR (OP[0]);
   2411  1.1  christos   uint16 b = (GPR (OP[1]));
   2412  1.1  christos   trace_input ("tbit", OP_REG, OP_REG, OP_VOID);
   2413  1.1  christos   SET_PSR_F (b & (1 << a));
   2414  1.6  christos   trace_output_16 (sd, b);
   2415  1.1  christos }
   2416  1.1  christos 
   2417  1.1  christos 
   2418  1.1  christos /* cmpb.  */
   2419  1.1  christos void
   2420  1.6  christos OP_50_8 (SIM_DESC sd, SIM_CPU *cpu)
   2421  1.1  christos {
   2422  1.1  christos   uint8 a = (OP[0]) & 0xFF;
   2423  1.1  christos   uint8 b = (GPR (OP[1])) & 0xFF;
   2424  1.1  christos   trace_input ("cmpb", OP_CONSTANT4, OP_REG, OP_VOID);
   2425  1.1  christos   SET_PSR_Z (a == b);
   2426  1.1  christos   SET_PSR_N ((int8)a > (int8)b);
   2427  1.1  christos   SET_PSR_L (a > b);
   2428  1.6  christos   trace_output_flag (sd);
   2429  1.1  christos }
   2430  1.1  christos 
   2431  1.1  christos /* cmpb.  */
   2432  1.1  christos void
   2433  1.6  christos OP_50B_C (SIM_DESC sd, SIM_CPU *cpu)
   2434  1.1  christos {
   2435  1.1  christos   uint8 a = (OP[0]) & 0xFF;
   2436  1.1  christos   uint8 b = (GPR (OP[1])) & 0xFF;
   2437  1.1  christos   trace_input ("cmpb", OP_CONSTANT16, OP_REG, OP_VOID);
   2438  1.1  christos   SET_PSR_Z (a == b);
   2439  1.1  christos   SET_PSR_N ((int8)a > (int8)b);
   2440  1.1  christos   SET_PSR_L (a > b);
   2441  1.6  christos   trace_output_flag (sd);
   2442  1.1  christos }
   2443  1.1  christos 
   2444  1.1  christos /* cmpb.  */
   2445  1.1  christos void
   2446  1.6  christos OP_51_8 (SIM_DESC sd, SIM_CPU *cpu)
   2447  1.1  christos {
   2448  1.1  christos   uint8 a = (GPR (OP[0])) & 0xFF;
   2449  1.1  christos   uint8 b = (GPR (OP[1])) & 0xFF;
   2450  1.1  christos   trace_input ("cmpb", OP_REG, OP_REG, OP_VOID);
   2451  1.1  christos   SET_PSR_Z (a == b);
   2452  1.1  christos   SET_PSR_N ((int8)a > (int8)b);
   2453  1.1  christos   SET_PSR_L (a > b);
   2454  1.6  christos   trace_output_flag (sd);
   2455  1.1  christos }
   2456  1.1  christos 
   2457  1.1  christos /* cmpw.  */
   2458  1.1  christos void
   2459  1.6  christos OP_52_8 (SIM_DESC sd, SIM_CPU *cpu)
   2460  1.1  christos {
   2461  1.1  christos   uint16 a = (OP[0]);
   2462  1.1  christos   uint16 b = GPR (OP[1]);
   2463  1.1  christos   trace_input ("cmpw", OP_CONSTANT4, OP_REG, OP_VOID);
   2464  1.1  christos   SET_PSR_Z (a == b);
   2465  1.1  christos   SET_PSR_N ((int16)a > (int16)b);
   2466  1.1  christos   SET_PSR_L (a > b);
   2467  1.6  christos   trace_output_flag (sd);
   2468  1.1  christos }
   2469  1.1  christos 
   2470  1.1  christos /* cmpw.  */
   2471  1.1  christos void
   2472  1.6  christos OP_52B_C (SIM_DESC sd, SIM_CPU *cpu)
   2473  1.1  christos {
   2474  1.1  christos   uint16 a = (OP[0]);
   2475  1.1  christos   uint16 b = GPR (OP[1]);
   2476  1.1  christos   trace_input ("cmpw", OP_CONSTANT16, OP_REG, OP_VOID);
   2477  1.1  christos   SET_PSR_Z (a == b);
   2478  1.1  christos   SET_PSR_N ((int16)a > (int16)b);
   2479  1.1  christos   SET_PSR_L (a > b);
   2480  1.6  christos   trace_output_flag (sd);
   2481  1.1  christos }
   2482  1.1  christos 
   2483  1.1  christos /* cmpw.  */
   2484  1.1  christos void
   2485  1.6  christos OP_53_8 (SIM_DESC sd, SIM_CPU *cpu)
   2486  1.1  christos {
   2487  1.1  christos   uint16 a = GPR (OP[0]) ;
   2488  1.1  christos   uint16 b = GPR (OP[1]) ;
   2489  1.1  christos   trace_input ("cmpw", OP_REG, OP_REG, OP_VOID);
   2490  1.1  christos   SET_PSR_Z (a == b);
   2491  1.1  christos   SET_PSR_N ((int16)a > (int16)b);
   2492  1.1  christos   SET_PSR_L (a > b);
   2493  1.6  christos   trace_output_flag (sd);
   2494  1.1  christos }
   2495  1.1  christos 
   2496  1.1  christos /* cmpd.  */
   2497  1.1  christos void
   2498  1.6  christos OP_56_8 (SIM_DESC sd, SIM_CPU *cpu)
   2499  1.1  christos {
   2500  1.1  christos   uint32 a = (OP[0]);
   2501  1.1  christos   uint32 b = GPR32 (OP[1]);
   2502  1.1  christos   trace_input ("cmpd", OP_CONSTANT4, OP_REGP, OP_VOID);
   2503  1.1  christos   SET_PSR_Z (a == b);
   2504  1.1  christos   SET_PSR_N ((int32)a > (int32)b);
   2505  1.1  christos   SET_PSR_L (a > b);
   2506  1.6  christos   trace_output_flag (sd);
   2507  1.1  christos }
   2508  1.1  christos 
   2509  1.1  christos /* cmpd.  */
   2510  1.1  christos void
   2511  1.6  christos OP_56B_C (SIM_DESC sd, SIM_CPU *cpu)
   2512  1.1  christos {
   2513  1.1  christos   uint32 a = (SEXT16(OP[0]));
   2514  1.1  christos   uint32 b = GPR32 (OP[1]);
   2515  1.1  christos   trace_input ("cmpd", OP_CONSTANT16, OP_REGP, OP_VOID);
   2516  1.1  christos   SET_PSR_Z (a == b);
   2517  1.1  christos   SET_PSR_N ((int32)a > (int32)b);
   2518  1.1  christos   SET_PSR_L (a > b);
   2519  1.6  christos   trace_output_flag (sd);
   2520  1.1  christos }
   2521  1.1  christos 
   2522  1.1  christos /* cmpd.  */
   2523  1.1  christos void
   2524  1.6  christos OP_57_8 (SIM_DESC sd, SIM_CPU *cpu)
   2525  1.1  christos {
   2526  1.1  christos   uint32 a = GPR32 (OP[0]) ;
   2527  1.1  christos   uint32 b = GPR32 (OP[1]) ;
   2528  1.1  christos   trace_input ("cmpd", OP_REGP, OP_REGP, OP_VOID);
   2529  1.1  christos   SET_PSR_Z (a == b);
   2530  1.1  christos   SET_PSR_N ((int32)a > (int32)b);
   2531  1.1  christos   SET_PSR_L (a > b);
   2532  1.6  christos   trace_output_flag (sd);
   2533  1.1  christos }
   2534  1.1  christos 
   2535  1.1  christos /* cmpd.  */
   2536  1.1  christos void
   2537  1.6  christos OP_9_C (SIM_DESC sd, SIM_CPU *cpu)
   2538  1.1  christos {
   2539  1.1  christos   uint32 a = (OP[0]);
   2540  1.1  christos   uint32 b = GPR32 (OP[1]);
   2541  1.1  christos   trace_input ("cmpd", OP_CONSTANT32, OP_REGP, OP_VOID);
   2542  1.1  christos   SET_PSR_Z (a == b);
   2543  1.1  christos   SET_PSR_N ((int32)a > (int32)b);
   2544  1.1  christos   SET_PSR_L (a > b);
   2545  1.6  christos   trace_output_flag (sd);
   2546  1.1  christos }
   2547  1.1  christos 
   2548  1.1  christos 
   2549  1.1  christos /* movb.  */
   2550  1.1  christos void
   2551  1.6  christos OP_58_8 (SIM_DESC sd, SIM_CPU *cpu)
   2552  1.1  christos {
   2553  1.1  christos   uint8 tmp = OP[0] & 0xFF;
   2554  1.5  christos   uint16 a = (GPR (OP[1])) & 0xFF00;
   2555  1.1  christos   trace_input ("movb", OP_CONSTANT4, OP_REG, OP_VOID);
   2556  1.1  christos   SET_GPR (OP[1], (a | tmp));
   2557  1.6  christos   trace_output_16 (sd, tmp);
   2558  1.1  christos }
   2559  1.1  christos 
   2560  1.1  christos /* movb.  */
   2561  1.1  christos void
   2562  1.6  christos OP_58B_C (SIM_DESC sd, SIM_CPU *cpu)
   2563  1.1  christos {
   2564  1.1  christos   uint8 tmp = OP[0] & 0xFF;
   2565  1.5  christos   uint16 a = (GPR (OP[1])) & 0xFF00;
   2566  1.1  christos   trace_input ("movb", OP_CONSTANT16, OP_REG, OP_VOID);
   2567  1.1  christos   SET_GPR (OP[1], (a | tmp));
   2568  1.6  christos   trace_output_16 (sd, tmp);
   2569  1.1  christos }
   2570  1.1  christos 
   2571  1.1  christos /* movb.  */
   2572  1.1  christos void
   2573  1.6  christos OP_59_8 (SIM_DESC sd, SIM_CPU *cpu)
   2574  1.1  christos {
   2575  1.1  christos   uint8 tmp = (GPR (OP[0])) & 0xFF;
   2576  1.5  christos   uint16 a = (GPR (OP[1])) & 0xFF00;
   2577  1.1  christos   trace_input ("movb", OP_REG, OP_REG, OP_VOID);
   2578  1.1  christos   SET_GPR (OP[1], (a | tmp));
   2579  1.6  christos   trace_output_16 (sd, tmp);
   2580  1.1  christos }
   2581  1.1  christos 
   2582  1.1  christos /* movw.  */
   2583  1.1  christos void
   2584  1.6  christos OP_5A_8 (SIM_DESC sd, SIM_CPU *cpu)
   2585  1.1  christos {
   2586  1.1  christos   uint16 tmp = OP[0];
   2587  1.1  christos   trace_input ("movw", OP_CONSTANT4_1, OP_REG, OP_VOID);
   2588  1.1  christos   SET_GPR (OP[1], (tmp & 0xffff));
   2589  1.6  christos   trace_output_16 (sd, tmp);
   2590  1.1  christos }
   2591  1.1  christos 
   2592  1.1  christos /* movw.  */
   2593  1.1  christos void
   2594  1.6  christos OP_5AB_C (SIM_DESC sd, SIM_CPU *cpu)
   2595  1.1  christos {
   2596  1.1  christos   int16 tmp = OP[0];
   2597  1.1  christos   trace_input ("movw", OP_CONSTANT16, OP_REG, OP_VOID);
   2598  1.1  christos   SET_GPR (OP[1], (tmp & 0xffff));
   2599  1.6  christos   trace_output_16 (sd, tmp);
   2600  1.1  christos }
   2601  1.1  christos 
   2602  1.1  christos /* movw.  */
   2603  1.1  christos void
   2604  1.6  christos OP_5B_8 (SIM_DESC sd, SIM_CPU *cpu)
   2605  1.1  christos {
   2606  1.1  christos   uint16 tmp = GPR (OP[0]);
   2607  1.5  christos   uint32 a = GPR32 (OP[1]);
   2608  1.1  christos   trace_input ("movw", OP_REG, OP_REGP, OP_VOID);
   2609  1.1  christos   a = (a & 0xffff0000) | tmp;
   2610  1.1  christos   SET_GPR32 (OP[1], a);
   2611  1.6  christos   trace_output_16 (sd, tmp);
   2612  1.1  christos }
   2613  1.1  christos 
   2614  1.1  christos /* movxb.  */
   2615  1.1  christos void
   2616  1.6  christos OP_5C_8 (SIM_DESC sd, SIM_CPU *cpu)
   2617  1.1  christos {
   2618  1.1  christos   uint8 tmp = (GPR (OP[0])) & 0xFF;
   2619  1.1  christos   trace_input ("movxb", OP_REG, OP_REG, OP_VOID);
   2620  1.1  christos   SET_GPR (OP[1], ((SEXT8(tmp)) & 0xffff));
   2621  1.6  christos   trace_output_16 (sd, tmp);
   2622  1.1  christos }
   2623  1.1  christos 
   2624  1.1  christos /* movzb.  */
   2625  1.1  christos void
   2626  1.6  christos OP_5D_8 (SIM_DESC sd, SIM_CPU *cpu)
   2627  1.1  christos {
   2628  1.1  christos   uint8 tmp = (GPR (OP[0])) & 0xFF;
   2629  1.1  christos   trace_input ("movzb", OP_REG, OP_REG, OP_VOID);
   2630  1.1  christos   SET_GPR (OP[1],  tmp);
   2631  1.6  christos   trace_output_16 (sd, tmp);
   2632  1.1  christos }
   2633  1.1  christos 
   2634  1.1  christos /* movxw.  */
   2635  1.1  christos void
   2636  1.6  christos OP_5E_8 (SIM_DESC sd, SIM_CPU *cpu)
   2637  1.1  christos {
   2638  1.1  christos   uint16 tmp = GPR (OP[0]);
   2639  1.1  christos   trace_input ("movxw", OP_REG, OP_REGP, OP_VOID);
   2640  1.1  christos   SET_GPR32 (OP[1], SEXT16(tmp));
   2641  1.6  christos   trace_output_16 (sd, tmp);
   2642  1.1  christos }
   2643  1.1  christos 
   2644  1.1  christos /* movzw.  */
   2645  1.1  christos void
   2646  1.6  christos OP_5F_8 (SIM_DESC sd, SIM_CPU *cpu)
   2647  1.1  christos {
   2648  1.1  christos   uint16 tmp = GPR (OP[0]);
   2649  1.1  christos   trace_input ("movzw", OP_REG, OP_REGP, OP_VOID);
   2650  1.1  christos   SET_GPR32 (OP[1], (tmp & 0x0000FFFF));
   2651  1.6  christos   trace_output_16 (sd, tmp);
   2652  1.1  christos }
   2653  1.1  christos 
   2654  1.1  christos /* movd.  */
   2655  1.1  christos void
   2656  1.6  christos OP_54_8 (SIM_DESC sd, SIM_CPU *cpu)
   2657  1.1  christos {
   2658  1.1  christos   int32 tmp = OP[0];
   2659  1.1  christos   trace_input ("movd", OP_CONSTANT4, OP_REGP, OP_VOID);
   2660  1.1  christos   SET_GPR32 (OP[1], tmp);
   2661  1.6  christos   trace_output_32 (sd, tmp);
   2662  1.1  christos }
   2663  1.1  christos 
   2664  1.1  christos /* movd.  */
   2665  1.1  christos void
   2666  1.6  christos OP_54B_C (SIM_DESC sd, SIM_CPU *cpu)
   2667  1.1  christos {
   2668  1.1  christos   int32 tmp = SEXT16(OP[0]);
   2669  1.1  christos   trace_input ("movd", OP_CONSTANT16, OP_REGP, OP_VOID);
   2670  1.1  christos   SET_GPR32 (OP[1], tmp);
   2671  1.6  christos   trace_output_32 (sd, tmp);
   2672  1.1  christos }
   2673  1.1  christos 
   2674  1.1  christos /* movd.  */
   2675  1.1  christos void
   2676  1.6  christos OP_55_8 (SIM_DESC sd, SIM_CPU *cpu)
   2677  1.1  christos {
   2678  1.1  christos   uint32 tmp = GPR32 (OP[0]);
   2679  1.1  christos   trace_input ("movd", OP_REGP, OP_REGP, OP_VOID);
   2680  1.1  christos   SET_GPR32 (OP[1], tmp);
   2681  1.6  christos   trace_output_32 (sd, tmp);
   2682  1.1  christos }
   2683  1.1  christos 
   2684  1.1  christos /* movd.  */
   2685  1.1  christos void
   2686  1.6  christos OP_5_8 (SIM_DESC sd, SIM_CPU *cpu)
   2687  1.1  christos {
   2688  1.1  christos   uint32 tmp = OP[0];
   2689  1.1  christos   trace_input ("movd", OP_CONSTANT20, OP_REGP, OP_VOID);
   2690  1.1  christos   SET_GPR32 (OP[1], tmp);
   2691  1.6  christos   trace_output_32 (sd, tmp);
   2692  1.1  christos }
   2693  1.1  christos 
   2694  1.1  christos /* movd.  */
   2695  1.1  christos void
   2696  1.6  christos OP_7_C (SIM_DESC sd, SIM_CPU *cpu)
   2697  1.1  christos {
   2698  1.1  christos   int32 tmp = OP[0];
   2699  1.1  christos   trace_input ("movd", OP_CONSTANT32, OP_REGP, OP_VOID);
   2700  1.1  christos   SET_GPR32 (OP[1], tmp);
   2701  1.6  christos   trace_output_32 (sd, tmp);
   2702  1.1  christos }
   2703  1.1  christos 
   2704  1.1  christos /* loadm.  */
   2705  1.1  christos void
   2706  1.6  christos OP_14_D (SIM_DESC sd, SIM_CPU *cpu)
   2707  1.1  christos {
   2708  1.1  christos   uint32 addr = GPR (0);
   2709  1.1  christos   uint16 count = OP[0], reg = 2, tmp;
   2710  1.1  christos   trace_input ("loadm", OP_CONSTANT4, OP_VOID, OP_VOID);
   2711  1.1  christos   if ((addr & 1))
   2712  1.1  christos     {
   2713  1.6  christos       trace_output_void (sd);
   2714  1.6  christos       EXCEPTION (SIM_SIGBUS);
   2715  1.1  christos     }
   2716  1.1  christos 
   2717  1.1  christos   while (count)
   2718  1.1  christos     {
   2719  1.1  christos       tmp = RW (addr);
   2720  1.1  christos       SET_GPR (reg, tmp);
   2721  1.1  christos       addr +=2;
   2722  1.1  christos       --count;
   2723  1.1  christos       reg++;
   2724  1.1  christos       if (reg == 6) reg = 8;
   2725  1.1  christos     };
   2726  1.1  christos 
   2727  1.1  christos   SET_GPR (0, addr);
   2728  1.6  christos   trace_output_void (sd);
   2729  1.1  christos }
   2730  1.1  christos 
   2731  1.1  christos 
   2732  1.1  christos /* loadmp.  */
   2733  1.1  christos void
   2734  1.6  christos OP_15_D (SIM_DESC sd, SIM_CPU *cpu)
   2735  1.1  christos {
   2736  1.1  christos   uint32 addr = GPR32 (0);
   2737  1.1  christos   uint16 count = OP[0], reg = 2, tmp;
   2738  1.1  christos   trace_input ("loadm", OP_CONSTANT4, OP_VOID, OP_VOID);
   2739  1.1  christos   if ((addr & 1))
   2740  1.1  christos     {
   2741  1.6  christos       trace_output_void (sd);
   2742  1.6  christos       EXCEPTION (SIM_SIGBUS);
   2743  1.1  christos     }
   2744  1.1  christos 
   2745  1.1  christos   while (count)
   2746  1.1  christos     {
   2747  1.1  christos       tmp = RW (addr);
   2748  1.1  christos       SET_GPR (reg, tmp);
   2749  1.1  christos       addr +=2;
   2750  1.1  christos       --count;
   2751  1.1  christos       reg++;
   2752  1.1  christos       if (reg == 6) reg = 8;
   2753  1.1  christos     };
   2754  1.1  christos 
   2755  1.1  christos   SET_GPR32 (0, addr);
   2756  1.6  christos   trace_output_void (sd);
   2757  1.1  christos }
   2758  1.1  christos 
   2759  1.1  christos 
   2760  1.1  christos /* loadb.  */
   2761  1.1  christos void
   2762  1.6  christos OP_88_8 (SIM_DESC sd, SIM_CPU *cpu)
   2763  1.1  christos {
   2764  1.1  christos   /* loadb ABS20, REG
   2765  1.1  christos    * ADDR = zext24(abs20) | remap (ie 0xF00000)
   2766  1.1  christos    * REG  = [ADDR]
   2767  1.1  christos    * NOTE: remap is
   2768  1.1  christos    * If (abs20 > 0xEFFFF) the resulting address is logically ORed
   2769  1.1  christos    * with 0xF00000 i.e. addresses from 1M-64k to 1M are re-mapped
   2770  1.1  christos    * by the core to 16M-64k to 16M. */
   2771  1.1  christos 
   2772  1.1  christos   uint16 tmp, a = (GPR (OP[1])) & 0xFF00;
   2773  1.1  christos   uint32 addr = OP[0];
   2774  1.1  christos   trace_input ("loadb", OP_ABS20, OP_REG, OP_VOID);
   2775  1.1  christos   if (addr > 0xEFFFF) addr |= 0xF00000;
   2776  1.1  christos   tmp = (RB (addr));
   2777  1.1  christos   SET_GPR (OP[1], (a | tmp));
   2778  1.6  christos   trace_output_16 (sd, tmp);
   2779  1.1  christos }
   2780  1.1  christos 
   2781  1.1  christos /* loadb.  */
   2782  1.1  christos void
   2783  1.6  christos OP_127_14 (SIM_DESC sd, SIM_CPU *cpu)
   2784  1.1  christos {
   2785  1.1  christos   /* loadb ABS24, REG
   2786  1.1  christos    * ADDR = abs24
   2787  1.1  christos    * REGR = [ADDR].   */
   2788  1.1  christos 
   2789  1.1  christos   uint16 tmp, a = (GPR (OP[1])) & 0xFF00;
   2790  1.1  christos   uint32 addr = OP[0];
   2791  1.1  christos   trace_input ("loadb", OP_ABS24, OP_REG, OP_VOID);
   2792  1.1  christos   tmp = (RB (addr));
   2793  1.1  christos   SET_GPR (OP[1], (a | tmp));
   2794  1.6  christos   trace_output_16 (sd, tmp);
   2795  1.1  christos }
   2796  1.1  christos 
   2797  1.1  christos /* loadb.  */
   2798  1.1  christos void
   2799  1.6  christos OP_45_7 (SIM_DESC sd, SIM_CPU *cpu)
   2800  1.1  christos {
   2801  1.1  christos   /* loadb [Rindex]ABS20   REG
   2802  1.1  christos    * ADDR = Rindex + zext24(disp20)
   2803  1.1  christos    * REGR = [ADDR].   */
   2804  1.1  christos 
   2805  1.1  christos   uint32 addr;
   2806  1.1  christos   uint16 tmp, a = (GPR (OP[2])) & 0xFF00;
   2807  1.1  christos   trace_input ("loadb", OP_R_INDEX8_ABS20, OP_REG, OP_VOID);
   2808  1.1  christos 
   2809  1.1  christos   if (OP[0] == 0)
   2810  1.1  christos      addr = (GPR32 (12)) + OP[1];
   2811  1.1  christos   else
   2812  1.1  christos      addr = (GPR32 (13)) + OP[1];
   2813  1.1  christos 
   2814  1.1  christos   tmp = (RB (addr));
   2815  1.1  christos   SET_GPR (OP[2], (a | tmp));
   2816  1.6  christos   trace_output_16 (sd, tmp);
   2817  1.1  christos }
   2818  1.1  christos 
   2819  1.1  christos 
   2820  1.1  christos /* loadb.  */
   2821  1.1  christos void
   2822  1.6  christos OP_B_4 (SIM_DESC sd, SIM_CPU *cpu)
   2823  1.1  christos {
   2824  1.1  christos   /* loadb DIPS4(REGP)   REG
   2825  1.1  christos    * ADDR = RPBASE + zext24(DISP4)
   2826  1.1  christos    * REG = [ADDR].  */
   2827  1.1  christos   uint16 tmp, a = (GPR (OP[2])) & 0xFF00;
   2828  1.1  christos   uint32 addr = (GPR32 (OP[1])) + OP[0];
   2829  1.1  christos   trace_input ("loadb", OP_RP_BASE_DISP4, OP_REG, OP_VOID);
   2830  1.1  christos   tmp = (RB (addr));
   2831  1.1  christos   SET_GPR (OP[2], (a | tmp));
   2832  1.6  christos   trace_output_16 (sd, tmp);
   2833  1.1  christos }
   2834  1.1  christos 
   2835  1.1  christos /* loadb.  */
   2836  1.1  christos void
   2837  1.6  christos OP_BE_8 (SIM_DESC sd, SIM_CPU *cpu)
   2838  1.1  christos {
   2839  1.1  christos   /* loadb [Rindex]disp0(RPbasex) REG
   2840  1.1  christos    * ADDR = Rpbasex + Rindex
   2841  1.1  christos    * REGR = [ADDR]   */
   2842  1.1  christos 
   2843  1.1  christos   uint32 addr;
   2844  1.1  christos   uint16 tmp, a = (GPR (OP[3])) & 0xFF00;
   2845  1.1  christos   trace_input ("loadb", OP_RP_INDEX_DISP0, OP_REG, OP_VOID);
   2846  1.1  christos 
   2847  1.1  christos   addr =  (GPR32 (OP[2])) + OP[1];
   2848  1.1  christos 
   2849  1.1  christos   if (OP[0] == 0)
   2850  1.1  christos      addr = (GPR32 (12)) + addr;
   2851  1.1  christos   else
   2852  1.1  christos      addr = (GPR32 (13)) + addr;
   2853  1.1  christos 
   2854  1.1  christos   tmp = (RB (addr));
   2855  1.1  christos   SET_GPR (OP[3], (a | tmp));
   2856  1.6  christos   trace_output_16 (sd, tmp);
   2857  1.1  christos }
   2858  1.1  christos 
   2859  1.1  christos /* loadb.  */
   2860  1.1  christos void
   2861  1.6  christos OP_219_A (SIM_DESC sd, SIM_CPU *cpu)
   2862  1.1  christos {
   2863  1.1  christos   /* loadb [Rindex]disp14(RPbasex) REG
   2864  1.1  christos    * ADDR = Rpbasex + Rindex + zext24(disp14)
   2865  1.1  christos    * REGR = [ADDR]   */
   2866  1.1  christos 
   2867  1.1  christos   uint32 addr;
   2868  1.1  christos   uint16 tmp, a = (GPR (OP[3])) & 0xFF00;
   2869  1.1  christos 
   2870  1.1  christos   addr =  (GPR32 (OP[2])) + OP[1];
   2871  1.1  christos 
   2872  1.1  christos   if (OP[0] == 0)
   2873  1.1  christos      addr = (GPR32 (12)) + addr;
   2874  1.1  christos   else
   2875  1.1  christos      addr = (GPR32 (13)) + addr;
   2876  1.1  christos 
   2877  1.1  christos   trace_input ("loadb", OP_RP_INDEX_DISP14, OP_REG, OP_VOID);
   2878  1.1  christos   tmp = (RB (addr));
   2879  1.1  christos   SET_GPR (OP[3], (a | tmp));
   2880  1.6  christos   trace_output_16 (sd, tmp);
   2881  1.1  christos }
   2882  1.1  christos 
   2883  1.1  christos 
   2884  1.1  christos /* loadb.  */
   2885  1.1  christos void
   2886  1.6  christos OP_184_14 (SIM_DESC sd, SIM_CPU *cpu)
   2887  1.1  christos {
   2888  1.1  christos   /* loadb DISPE20(REG)   REG
   2889  1.1  christos    * zext24(Rbase) + zext24(dispe20)
   2890  1.1  christos    * REG = [ADDR]   */
   2891  1.1  christos 
   2892  1.1  christos   uint16 tmp,a = (GPR (OP[2])) & 0xFF00;
   2893  1.1  christos   uint32 addr = OP[0] + (GPR (OP[1]));
   2894  1.1  christos   trace_input ("loadb", OP_R_BASE_DISPE20, OP_REG, OP_VOID);
   2895  1.1  christos   tmp = (RB (addr));
   2896  1.1  christos   SET_GPR (OP[2], (a | tmp));
   2897  1.6  christos   trace_output_16 (sd, tmp);
   2898  1.1  christos }
   2899  1.1  christos 
   2900  1.1  christos /* loadb.  */
   2901  1.1  christos void
   2902  1.6  christos OP_124_14 (SIM_DESC sd, SIM_CPU *cpu)
   2903  1.1  christos {
   2904  1.1  christos   /* loadb DISP20(REG)   REG
   2905  1.1  christos    * ADDR = zext24(Rbase) + zext24(disp20)
   2906  1.1  christos    * REG = [ADDR]                          */
   2907  1.1  christos 
   2908  1.1  christos   uint16 tmp,a = (GPR (OP[2])) & 0xFF00;
   2909  1.1  christos   uint32 addr = OP[0] + (GPR (OP[1]));
   2910  1.1  christos   trace_input ("loadb", OP_R_BASE_DISP20, OP_REG, OP_VOID);
   2911  1.1  christos   tmp = (RB (addr));
   2912  1.1  christos   SET_GPR (OP[2], (a | tmp));
   2913  1.6  christos   trace_output_16 (sd, tmp);
   2914  1.1  christos }
   2915  1.1  christos 
   2916  1.1  christos /* loadb.  */
   2917  1.1  christos void
   2918  1.6  christos OP_BF_8 (SIM_DESC sd, SIM_CPU *cpu)
   2919  1.1  christos {
   2920  1.1  christos   /* loadb disp16(REGP)   REG
   2921  1.1  christos    * ADDR = RPbase + zext24(disp16)
   2922  1.1  christos    * REGR = [ADDR]   */
   2923  1.1  christos 
   2924  1.1  christos   uint16 tmp,a = (GPR (OP[2])) & 0xFF00;
   2925  1.1  christos   uint32 addr = (GPR32 (OP[1])) + OP[0];
   2926  1.1  christos   trace_input ("loadb", OP_RP_BASE_DISP16, OP_REG, OP_VOID);
   2927  1.1  christos   tmp = (RB (addr));
   2928  1.1  christos   SET_GPR (OP[2], (a | tmp));
   2929  1.6  christos   trace_output_16 (sd, tmp);
   2930  1.1  christos }
   2931  1.1  christos 
   2932  1.1  christos /* loadb.  */
   2933  1.1  christos void
   2934  1.6  christos OP_125_14 (SIM_DESC sd, SIM_CPU *cpu)
   2935  1.1  christos {
   2936  1.1  christos   /* loadb disp20(REGP)   REG
   2937  1.1  christos    * ADDR = RPbase + zext24(disp20)
   2938  1.1  christos    * REGR = [ADDR]   */
   2939  1.1  christos   uint16 tmp,a = (GPR (OP[2])) & 0xFF00;
   2940  1.1  christos   uint32 addr =  (GPR32 (OP[1])) + OP[0];
   2941  1.1  christos   trace_input ("loadb", OP_RP_BASE_DISP20, OP_REG, OP_VOID);
   2942  1.1  christos   tmp = (RB (addr));
   2943  1.1  christos   SET_GPR (OP[2], (a | tmp));
   2944  1.6  christos   trace_output_16 (sd, tmp);
   2945  1.1  christos }
   2946  1.1  christos 
   2947  1.1  christos 
   2948  1.1  christos /* loadb.  */
   2949  1.1  christos void
   2950  1.6  christos OP_185_14 (SIM_DESC sd, SIM_CPU *cpu)
   2951  1.1  christos {
   2952  1.1  christos   /* loadb -disp20(REGP)   REG
   2953  1.1  christos    * ADDR = RPbase + zext24(-disp20)
   2954  1.1  christos    * REGR = [ADDR]   */
   2955  1.1  christos   uint16 tmp,a = (GPR (OP[2])) & 0xFF00;
   2956  1.1  christos   uint32 addr =  (GPR32 (OP[1])) + OP[1];
   2957  1.1  christos   trace_input ("loadb", OP_RP_BASE_DISPE20, OP_REG, OP_VOID);
   2958  1.1  christos   tmp = (RB (addr));
   2959  1.1  christos   SET_GPR (OP[2], (a | tmp));
   2960  1.6  christos   trace_output_16 (sd, tmp);
   2961  1.1  christos }
   2962  1.1  christos 
   2963  1.1  christos /* loadb.  */
   2964  1.1  christos void
   2965  1.6  christos OP_126_14 (SIM_DESC sd, SIM_CPU *cpu)
   2966  1.1  christos {
   2967  1.1  christos   /* loadb [Rindex]disp20(RPbasexb) REG
   2968  1.1  christos    * ADDR = RPbasex + Rindex + zext24(disp20)
   2969  1.1  christos    * REGR = [ADDR]   */
   2970  1.1  christos 
   2971  1.1  christos   uint32 addr;
   2972  1.1  christos   uint16 tmp, a = (GPR (OP[3])) & 0xFF00;
   2973  1.1  christos   trace_input ("loadb", OP_RP_INDEX_DISP20, OP_REG, OP_VOID);
   2974  1.1  christos 
   2975  1.1  christos   addr = (GPR32 (OP[2])) + OP[1];
   2976  1.1  christos 
   2977  1.1  christos   if (OP[0] == 0)
   2978  1.1  christos      addr = (GPR32 (12)) + addr;
   2979  1.1  christos   else
   2980  1.1  christos      addr = (GPR32 (13)) + addr;
   2981  1.1  christos 
   2982  1.1  christos   tmp = (RB (addr));
   2983  1.1  christos   SET_GPR (OP[3], (a | tmp));
   2984  1.6  christos   trace_output_16 (sd, tmp);
   2985  1.1  christos }
   2986  1.1  christos 
   2987  1.1  christos 
   2988  1.1  christos /* loadw.  */
   2989  1.1  christos void
   2990  1.6  christos OP_89_8 (SIM_DESC sd, SIM_CPU *cpu)
   2991  1.1  christos {
   2992  1.1  christos   /* loadw ABS20, REG
   2993  1.1  christos    * ADDR = zext24(abs20) | remap
   2994  1.1  christos    * REGR = [ADDR]
   2995  1.1  christos    * NOTE: remap is
   2996  1.1  christos    * If (abs20 > 0xEFFFF) the resulting address is logically ORed
   2997  1.1  christos    * with 0xF00000 i.e. addresses from 1M-64k to 1M are re-mapped
   2998  1.1  christos    * by the core to 16M-64k to 16M. */
   2999  1.1  christos 
   3000  1.1  christos   uint16 tmp;
   3001  1.1  christos   uint32 addr = OP[0];
   3002  1.1  christos   trace_input ("loadw", OP_ABS20, OP_REG, OP_VOID);
   3003  1.1  christos   if (addr > 0xEFFFF) addr |= 0xF00000;
   3004  1.1  christos   tmp = (RW (addr));
   3005  1.1  christos   SET_GPR (OP[1], tmp);
   3006  1.6  christos   trace_output_16 (sd, tmp);
   3007  1.1  christos }
   3008  1.1  christos 
   3009  1.1  christos 
   3010  1.1  christos /* loadw.  */
   3011  1.1  christos void
   3012  1.6  christos OP_12F_14 (SIM_DESC sd, SIM_CPU *cpu)
   3013  1.1  christos {
   3014  1.1  christos   /* loadw ABS24, REG
   3015  1.1  christos    * ADDR = abs24
   3016  1.1  christos    * REGR = [ADDR]  */
   3017  1.1  christos   uint16 tmp;
   3018  1.1  christos   uint32 addr = OP[0];
   3019  1.1  christos   trace_input ("loadw", OP_ABS24, OP_REG, OP_VOID);
   3020  1.1  christos   tmp = (RW (addr));
   3021  1.1  christos   SET_GPR (OP[1], tmp);
   3022  1.6  christos   trace_output_16 (sd, tmp);
   3023  1.1  christos }
   3024  1.1  christos 
   3025  1.1  christos /* loadw.  */
   3026  1.1  christos void
   3027  1.6  christos OP_47_7 (SIM_DESC sd, SIM_CPU *cpu)
   3028  1.1  christos {
   3029  1.1  christos   /* loadw [Rindex]ABS20   REG
   3030  1.1  christos    * ADDR = Rindex + zext24(disp20)
   3031  1.1  christos    * REGR = [ADDR]  */
   3032  1.1  christos 
   3033  1.1  christos   uint32 addr;
   3034  1.1  christos   uint16 tmp;
   3035  1.1  christos   trace_input ("loadw", OP_R_INDEX8_ABS20, OP_REG, OP_VOID);
   3036  1.1  christos 
   3037  1.1  christos   if (OP[0] == 0)
   3038  1.1  christos      addr = (GPR32 (12)) + OP[1];
   3039  1.1  christos   else
   3040  1.1  christos      addr = (GPR32 (13)) + OP[1];
   3041  1.1  christos 
   3042  1.1  christos   tmp = (RW (addr));
   3043  1.1  christos   SET_GPR (OP[2], tmp);
   3044  1.6  christos   trace_output_16 (sd, tmp);
   3045  1.1  christos }
   3046  1.1  christos 
   3047  1.1  christos 
   3048  1.1  christos /* loadw.  */
   3049  1.1  christos void
   3050  1.6  christos OP_9_4 (SIM_DESC sd, SIM_CPU *cpu)
   3051  1.1  christos {
   3052  1.1  christos   /* loadw DIPS4(REGP)   REGP
   3053  1.1  christos    * ADDR = RPBASE + zext24(DISP4)
   3054  1.1  christos    * REGP = [ADDR].  */
   3055  1.1  christos   uint16 tmp;
   3056  1.1  christos   uint32 addr, a;
   3057  1.1  christos   trace_input ("loadw", OP_RP_BASE_DISP4, OP_REG, OP_VOID);
   3058  1.1  christos   addr = (GPR32 (OP[1])) + OP[0];
   3059  1.1  christos   tmp =  (RW (addr));
   3060  1.1  christos   if (OP[2] > 11)
   3061  1.1  christos    {
   3062  1.1  christos     a = (GPR32 (OP[2])) & 0xffff0000;
   3063  1.1  christos     SET_GPR32 (OP[2], (a | tmp));
   3064  1.1  christos    }
   3065  1.1  christos   else
   3066  1.1  christos     SET_GPR (OP[2], tmp);
   3067  1.1  christos 
   3068  1.6  christos   trace_output_16 (sd, tmp);
   3069  1.1  christos }
   3070  1.1  christos 
   3071  1.1  christos 
   3072  1.1  christos /* loadw.  */
   3073  1.1  christos void
   3074  1.6  christos OP_9E_8 (SIM_DESC sd, SIM_CPU *cpu)
   3075  1.1  christos {
   3076  1.1  christos   /* loadw [Rindex]disp0(RPbasex) REG
   3077  1.1  christos    * ADDR = Rpbasex + Rindex
   3078  1.1  christos    * REGR = [ADDR]   */
   3079  1.1  christos 
   3080  1.1  christos   uint32 addr;
   3081  1.1  christos   uint16 tmp;
   3082  1.1  christos   trace_input ("loadw", OP_RP_INDEX_DISP0, OP_REG, OP_VOID);
   3083  1.1  christos 
   3084  1.1  christos   addr = (GPR32 (OP[2])) + OP[1];
   3085  1.1  christos 
   3086  1.1  christos   if (OP[0] == 0)
   3087  1.1  christos     addr = (GPR32 (12)) + addr;
   3088  1.1  christos   else
   3089  1.1  christos     addr = (GPR32 (13)) + addr;
   3090  1.1  christos 
   3091  1.1  christos   tmp = RW (addr);
   3092  1.1  christos   SET_GPR (OP[3], tmp);
   3093  1.6  christos   trace_output_16 (sd, tmp);
   3094  1.1  christos }
   3095  1.1  christos 
   3096  1.1  christos 
   3097  1.1  christos /* loadw.  */
   3098  1.1  christos void
   3099  1.6  christos OP_21B_A (SIM_DESC sd, SIM_CPU *cpu)
   3100  1.1  christos {
   3101  1.1  christos   /* loadw [Rindex]disp14(RPbasex) REG
   3102  1.1  christos    * ADDR = Rpbasex + Rindex + zext24(disp14)
   3103  1.1  christos    * REGR = [ADDR]   */
   3104  1.1  christos 
   3105  1.1  christos   uint32 addr;
   3106  1.1  christos   uint16 tmp;
   3107  1.1  christos   trace_input ("loadw", OP_RP_INDEX_DISP14, OP_REG, OP_VOID);
   3108  1.1  christos   addr =  (GPR32 (OP[2])) + OP[1];
   3109  1.1  christos 
   3110  1.1  christos   if (OP[0] == 0)
   3111  1.1  christos      addr = (GPR32 (12)) + addr;
   3112  1.1  christos   else
   3113  1.1  christos      addr = (GPR32 (13)) + addr;
   3114  1.1  christos 
   3115  1.1  christos   tmp = (RW (addr));
   3116  1.1  christos   SET_GPR (OP[3], tmp);
   3117  1.6  christos   trace_output_16 (sd, tmp);
   3118  1.1  christos }
   3119  1.1  christos 
   3120  1.1  christos /* loadw.  */
   3121  1.1  christos void
   3122  1.6  christos OP_18C_14 (SIM_DESC sd, SIM_CPU *cpu)
   3123  1.1  christos {
   3124  1.1  christos   /* loadw dispe20(REG)   REGP
   3125  1.1  christos    * REGP = [DISPE20+[REG]]   */
   3126  1.1  christos 
   3127  1.1  christos   uint16 tmp;
   3128  1.1  christos   uint32 addr, a;
   3129  1.1  christos   trace_input ("loadw", OP_R_BASE_DISPE20, OP_REGP, OP_VOID);
   3130  1.1  christos   addr = OP[0] + (GPR (OP[1]));
   3131  1.1  christos   tmp = (RW (addr));
   3132  1.1  christos   if (OP[2] > 11)
   3133  1.1  christos    {
   3134  1.1  christos     a = (GPR32 (OP[2])) & 0xffff0000;
   3135  1.1  christos     SET_GPR32 (OP[2], (a | tmp));
   3136  1.1  christos    }
   3137  1.1  christos   else
   3138  1.1  christos     SET_GPR (OP[2], tmp);
   3139  1.1  christos 
   3140  1.6  christos   trace_output_16 (sd, tmp);
   3141  1.1  christos }
   3142  1.1  christos 
   3143  1.1  christos 
   3144  1.1  christos /* loadw.  */
   3145  1.1  christos void
   3146  1.6  christos OP_12C_14 (SIM_DESC sd, SIM_CPU *cpu)
   3147  1.1  christos {
   3148  1.1  christos   /* loadw DISP20(REG)   REGP
   3149  1.1  christos    * ADDR = zext24(Rbase) + zext24(disp20)
   3150  1.1  christos    * REGP = [ADDR]                          */
   3151  1.1  christos 
   3152  1.1  christos   uint16 tmp;
   3153  1.1  christos   uint32 addr, a;
   3154  1.1  christos   trace_input ("loadw", OP_R_BASE_DISP20, OP_REGP, OP_VOID);
   3155  1.1  christos   addr = OP[0] + (GPR (OP[1]));
   3156  1.1  christos   tmp = (RW (addr));
   3157  1.1  christos   if (OP[2] > 11)
   3158  1.1  christos    {
   3159  1.1  christos     a = (GPR32 (OP[2])) & 0xffff0000;
   3160  1.1  christos     SET_GPR32 (OP[2], (a | tmp));
   3161  1.1  christos    }
   3162  1.1  christos   else
   3163  1.1  christos     SET_GPR (OP[2], tmp);
   3164  1.1  christos 
   3165  1.6  christos   trace_output_16 (sd, tmp);
   3166  1.1  christos }
   3167  1.1  christos 
   3168  1.1  christos /* loadw.  */
   3169  1.1  christos void
   3170  1.6  christos OP_9F_8 (SIM_DESC sd, SIM_CPU *cpu)
   3171  1.1  christos {
   3172  1.1  christos   /* loadw disp16(REGP)   REGP
   3173  1.1  christos    * ADDR = RPbase + zext24(disp16)
   3174  1.1  christos    * REGP = [ADDR]   */
   3175  1.1  christos   uint16 tmp;
   3176  1.1  christos   uint32 addr, a;
   3177  1.1  christos   trace_input ("loadw", OP_RP_BASE_DISP16, OP_REGP, OP_VOID);
   3178  1.1  christos   addr = (GPR32 (OP[1])) + OP[0];
   3179  1.1  christos   tmp = (RW (addr));
   3180  1.1  christos   if (OP[2] > 11)
   3181  1.1  christos    {
   3182  1.1  christos     a = (GPR32 (OP[2])) & 0xffff0000;
   3183  1.1  christos     SET_GPR32 (OP[2], (a | tmp));
   3184  1.1  christos    }
   3185  1.1  christos   else
   3186  1.1  christos     SET_GPR (OP[2], tmp);
   3187  1.1  christos 
   3188  1.6  christos   trace_output_16 (sd, tmp);
   3189  1.1  christos }
   3190  1.1  christos 
   3191  1.1  christos /* loadw.  */
   3192  1.1  christos void
   3193  1.6  christos OP_12D_14 (SIM_DESC sd, SIM_CPU *cpu)
   3194  1.1  christos {
   3195  1.1  christos   /* loadw disp20(REGP)   REGP
   3196  1.1  christos    * ADDR = RPbase + zext24(disp20)
   3197  1.1  christos    * REGP = [ADDR]   */
   3198  1.1  christos   uint16 tmp;
   3199  1.1  christos   uint32 addr, a;
   3200  1.1  christos   trace_input ("loadw", OP_RP_BASE_DISP20, OP_REG, OP_VOID);
   3201  1.1  christos   addr = (GPR32 (OP[1])) + OP[0];
   3202  1.1  christos   tmp = (RW (addr));
   3203  1.1  christos   if (OP[2] > 11)
   3204  1.1  christos    {
   3205  1.1  christos     a = (GPR32 (OP[2])) & 0xffff0000;
   3206  1.1  christos     SET_GPR32 (OP[2], (a | tmp));
   3207  1.1  christos    }
   3208  1.1  christos   else
   3209  1.1  christos     SET_GPR (OP[2], tmp);
   3210  1.1  christos 
   3211  1.6  christos   trace_output_16 (sd, tmp);
   3212  1.1  christos }
   3213  1.1  christos 
   3214  1.1  christos /* loadw.  */
   3215  1.1  christos void
   3216  1.6  christos OP_18D_14 (SIM_DESC sd, SIM_CPU *cpu)
   3217  1.1  christos {
   3218  1.1  christos   /* loadw -disp20(REGP)   REG
   3219  1.1  christos    * ADDR = RPbase + zext24(-disp20)
   3220  1.1  christos    * REGR = [ADDR]   */
   3221  1.1  christos 
   3222  1.1  christos   uint16 tmp;
   3223  1.1  christos   uint32 addr, a;
   3224  1.1  christos   trace_input ("loadw", OP_RP_BASE_DISPE20, OP_REG, OP_VOID);
   3225  1.1  christos   addr = (GPR32 (OP[1])) + OP[0];
   3226  1.1  christos   tmp = (RB (addr));
   3227  1.1  christos   if (OP[2] > 11)
   3228  1.1  christos    {
   3229  1.1  christos     a = (GPR32 (OP[2])) & 0xffff0000;
   3230  1.1  christos     SET_GPR32 (OP[2], (a | tmp));
   3231  1.1  christos    }
   3232  1.1  christos   else
   3233  1.1  christos     SET_GPR (OP[2], tmp);
   3234  1.1  christos 
   3235  1.6  christos   trace_output_16 (sd, tmp);
   3236  1.1  christos }
   3237  1.1  christos 
   3238  1.1  christos 
   3239  1.1  christos /* loadw.  */
   3240  1.1  christos void
   3241  1.6  christos OP_12E_14 (SIM_DESC sd, SIM_CPU *cpu)
   3242  1.1  christos {
   3243  1.1  christos   /* loadw [Rindex]disp20(RPbasexb) REG
   3244  1.1  christos    * ADDR = RPbasex + Rindex + zext24(disp20)
   3245  1.1  christos    * REGR = [ADDR]   */
   3246  1.1  christos 
   3247  1.1  christos   uint32 addr;
   3248  1.1  christos   uint16 tmp;
   3249  1.1  christos   trace_input ("loadw", OP_RP_INDEX_DISP20, OP_REG, OP_VOID);
   3250  1.1  christos 
   3251  1.1  christos   if (OP[0] == 0)
   3252  1.1  christos      addr = (GPR32 (12)) + OP[1] + (GPR32 (OP[2]));
   3253  1.1  christos   else
   3254  1.1  christos      addr = (GPR32 (13)) + OP[1] + (GPR32 (OP[2]));
   3255  1.1  christos 
   3256  1.1  christos   tmp = (RW (addr));
   3257  1.1  christos   SET_GPR (OP[3], tmp);
   3258  1.6  christos   trace_output_16 (sd, tmp);
   3259  1.1  christos }
   3260  1.1  christos 
   3261  1.1  christos 
   3262  1.1  christos /* loadd.  */
   3263  1.1  christos void
   3264  1.6  christos OP_87_8 (SIM_DESC sd, SIM_CPU *cpu)
   3265  1.1  christos {
   3266  1.1  christos   /* loadd ABS20, REGP
   3267  1.1  christos    * ADDR = zext24(abs20) | remap
   3268  1.1  christos    * REGP = [ADDR]
   3269  1.1  christos    * NOTE: remap is
   3270  1.1  christos    * If (abs20 > 0xEFFFF) the resulting address is logically ORed
   3271  1.1  christos    * with 0xF00000 i.e. addresses from 1M-64k to 1M are re-mapped
   3272  1.1  christos    * by the core to 16M-64k to 16M. */
   3273  1.1  christos 
   3274  1.1  christos   uint32 addr, tmp;
   3275  1.1  christos   addr = OP[0];
   3276  1.1  christos   trace_input ("loadd", OP_ABS20, OP_REGP, OP_VOID);
   3277  1.1  christos   if (addr > 0xEFFFF) addr |= 0xF00000;
   3278  1.1  christos   tmp = RLW (addr);
   3279  1.1  christos   tmp = ((tmp << 16) & 0xffff)| ((tmp >> 16) & 0xffff);
   3280  1.1  christos   SET_GPR32 (OP[1], tmp);
   3281  1.6  christos   trace_output_32 (sd, tmp);
   3282  1.1  christos }
   3283  1.1  christos 
   3284  1.1  christos /* loadd.  */
   3285  1.1  christos void
   3286  1.6  christos OP_12B_14 (SIM_DESC sd, SIM_CPU *cpu)
   3287  1.1  christos {
   3288  1.1  christos   /* loadd ABS24, REGP
   3289  1.1  christos    * ADDR = abs24
   3290  1.1  christos    * REGP = [ADDR]  */
   3291  1.1  christos 
   3292  1.1  christos   uint32 addr = OP[0];
   3293  1.1  christos   uint32 tmp;
   3294  1.1  christos   trace_input ("loadd", OP_ABS24, OP_REGP, OP_VOID);
   3295  1.1  christos   tmp = RLW (addr);
   3296  1.1  christos   tmp = ((tmp & 0xffff) << 16)| ((tmp >> 16) & 0xffff);
   3297  1.1  christos   SET_GPR32 (OP[1],tmp);
   3298  1.6  christos   trace_output_32 (sd, tmp);
   3299  1.1  christos }
   3300  1.1  christos 
   3301  1.1  christos 
   3302  1.1  christos /* loadd.  */
   3303  1.1  christos void
   3304  1.6  christos OP_46_7 (SIM_DESC sd, SIM_CPU *cpu)
   3305  1.1  christos {
   3306  1.1  christos   /* loadd [Rindex]ABS20   REGP
   3307  1.1  christos    * ADDR = Rindex + zext24(disp20)
   3308  1.1  christos    * REGP = [ADDR]  */
   3309  1.1  christos 
   3310  1.1  christos   uint32 addr, tmp;
   3311  1.1  christos   trace_input ("loadd", OP_R_INDEX8_ABS20, OP_REGP, OP_VOID);
   3312  1.1  christos 
   3313  1.1  christos   if (OP[0] == 0)
   3314  1.1  christos      addr = (GPR32 (12)) + OP[1];
   3315  1.1  christos   else
   3316  1.1  christos      addr = (GPR32 (13)) + OP[1];
   3317  1.1  christos 
   3318  1.1  christos   tmp = RLW (addr);
   3319  1.1  christos   tmp = ((tmp & 0xffff) << 16)| ((tmp >> 16) & 0xffff);
   3320  1.1  christos   SET_GPR32 (OP[2], tmp);
   3321  1.6  christos   trace_output_32 (sd, tmp);
   3322  1.1  christos }
   3323  1.1  christos 
   3324  1.1  christos 
   3325  1.1  christos /* loadd.  */
   3326  1.1  christos void
   3327  1.6  christos OP_A_4 (SIM_DESC sd, SIM_CPU *cpu)
   3328  1.1  christos {
   3329  1.1  christos   /* loadd dips4(regp)   REGP
   3330  1.1  christos    * ADDR = Rpbase + zext24(disp4)
   3331  1.1  christos    * REGP = [ADDR] */
   3332  1.1  christos 
   3333  1.1  christos   uint32 tmp, addr = (GPR32 (OP[1])) + OP[0];
   3334  1.1  christos   trace_input ("loadd", OP_RP_BASE_DISP4, OP_REGP, OP_VOID);
   3335  1.1  christos   tmp = RLW (addr);
   3336  1.1  christos   tmp = ((tmp & 0xffff) << 16)| ((tmp >> 16) & 0xffff);
   3337  1.1  christos   SET_GPR32 (OP[2], tmp);
   3338  1.6  christos   trace_output_32 (sd, tmp);
   3339  1.1  christos }
   3340  1.1  christos 
   3341  1.1  christos 
   3342  1.1  christos /* loadd.  */
   3343  1.1  christos void
   3344  1.6  christos OP_AE_8 (SIM_DESC sd, SIM_CPU *cpu)
   3345  1.1  christos {
   3346  1.1  christos   /* loadd [Rindex]disp0(RPbasex) REGP
   3347  1.1  christos    * ADDR = Rpbasex + Rindex
   3348  1.1  christos    * REGP = [ADDR]   */
   3349  1.1  christos 
   3350  1.1  christos   uint32 addr, tmp;
   3351  1.1  christos   trace_input ("loadd", OP_RP_INDEX_DISP0, OP_REGP, OP_VOID);
   3352  1.1  christos 
   3353  1.1  christos   if (OP[0] == 0)
   3354  1.1  christos      addr = (GPR32 (12)) + (GPR32 (OP[2])) + OP[1];
   3355  1.1  christos   else
   3356  1.1  christos      addr = (GPR32 (13)) + (GPR32 (OP[2])) + OP[1];
   3357  1.1  christos 
   3358  1.1  christos   tmp = RLW (addr);
   3359  1.1  christos   tmp = ((tmp & 0xffff) << 16)| ((tmp >> 16) & 0xffff);
   3360  1.1  christos   SET_GPR32 (OP[3], tmp);
   3361  1.6  christos   trace_output_32 (sd, tmp);
   3362  1.1  christos }
   3363  1.1  christos 
   3364  1.1  christos 
   3365  1.1  christos /* loadd.  */
   3366  1.1  christos void
   3367  1.6  christos OP_21A_A (SIM_DESC sd, SIM_CPU *cpu)
   3368  1.1  christos {
   3369  1.1  christos   /* loadd [Rindex]disp14(RPbasex) REGP
   3370  1.1  christos    * ADDR = Rpbasex + Rindex + zext24(disp14)
   3371  1.1  christos    * REGR = [ADDR]   */
   3372  1.1  christos 
   3373  1.1  christos   uint32 addr, tmp;
   3374  1.1  christos   trace_input ("loadd", OP_RP_INDEX_DISP14, OP_REGP, OP_VOID);
   3375  1.1  christos 
   3376  1.1  christos   if (OP[0] == 0)
   3377  1.1  christos      addr = (GPR32 (12)) + OP[1] + (GPR32 (OP[2]));
   3378  1.1  christos   else
   3379  1.1  christos      addr = (GPR32 (13)) + OP[1] + (GPR32 (OP[2]));
   3380  1.1  christos 
   3381  1.1  christos   tmp = RLW (addr);
   3382  1.1  christos   tmp = ((tmp & 0xffff) << 16)| ((tmp >> 16) & 0xffff);
   3383  1.1  christos   SET_GPR (OP[3],tmp);
   3384  1.6  christos   trace_output_32 (sd, tmp);
   3385  1.1  christos }
   3386  1.1  christos 
   3387  1.1  christos 
   3388  1.1  christos /* loadd.  */
   3389  1.1  christos void
   3390  1.6  christos OP_188_14 (SIM_DESC sd, SIM_CPU *cpu)
   3391  1.1  christos {
   3392  1.1  christos   /* loadd dispe20(REG)   REG
   3393  1.1  christos    * zext24(Rbase) + zext24(dispe20)
   3394  1.1  christos    * REG = [ADDR]   */
   3395  1.1  christos 
   3396  1.1  christos   uint32 tmp, addr = OP[0] + (GPR (OP[1]));
   3397  1.1  christos   trace_input ("loadd", OP_R_BASE_DISPE20, OP_REGP, OP_VOID);
   3398  1.1  christos   tmp = RLW (addr);
   3399  1.1  christos   tmp = ((tmp & 0xffff) << 16)| ((tmp >> 16) & 0xffff);
   3400  1.1  christos   SET_GPR32 (OP[2], tmp);
   3401  1.6  christos   trace_output_32 (sd, tmp);
   3402  1.1  christos }
   3403  1.1  christos 
   3404  1.1  christos 
   3405  1.1  christos /* loadd.  */
   3406  1.1  christos void
   3407  1.6  christos OP_128_14 (SIM_DESC sd, SIM_CPU *cpu)
   3408  1.1  christos {
   3409  1.1  christos   /* loadd DISP20(REG)   REG
   3410  1.1  christos    * ADDR = zext24(Rbase) + zext24(disp20)
   3411  1.1  christos    * REG = [ADDR]                          */
   3412  1.1  christos 
   3413  1.1  christos   uint32 tmp, addr = OP[0] + (GPR (OP[1]));
   3414  1.1  christos   trace_input ("loadd", OP_R_BASE_DISP20, OP_REGP, OP_VOID);
   3415  1.1  christos   tmp = RLW (addr);
   3416  1.1  christos   tmp = ((tmp & 0xffff) << 16)| ((tmp >> 16) & 0xffff);
   3417  1.1  christos   SET_GPR32 (OP[2], tmp);
   3418  1.6  christos   trace_output_32 (sd, tmp);
   3419  1.1  christos }
   3420  1.1  christos 
   3421  1.1  christos /* loadd.  */
   3422  1.1  christos void
   3423  1.6  christos OP_AF_8 (SIM_DESC sd, SIM_CPU *cpu)
   3424  1.1  christos {
   3425  1.1  christos   /* loadd disp16(REGP)   REGP
   3426  1.1  christos    * ADDR = RPbase + zext24(disp16)
   3427  1.1  christos    * REGR = [ADDR]   */
   3428  1.1  christos   uint32 tmp, addr = OP[0] + (GPR32 (OP[1]));
   3429  1.1  christos   trace_input ("loadd", OP_RP_BASE_DISP16, OP_REGP, OP_VOID);
   3430  1.1  christos   tmp = RLW (addr);
   3431  1.1  christos   tmp = ((tmp & 0xffff) << 16)| ((tmp >> 16) & 0xffff);
   3432  1.1  christos   SET_GPR32 (OP[2], tmp);
   3433  1.6  christos   trace_output_32 (sd, tmp);
   3434  1.1  christos }
   3435  1.1  christos 
   3436  1.1  christos 
   3437  1.1  christos /* loadd.  */
   3438  1.1  christos void
   3439  1.6  christos OP_129_14 (SIM_DESC sd, SIM_CPU *cpu)
   3440  1.1  christos {
   3441  1.1  christos   /* loadd disp20(REGP)   REGP
   3442  1.1  christos    * ADDR = RPbase + zext24(disp20)
   3443  1.1  christos    * REGP = [ADDR]   */
   3444  1.1  christos   uint32 tmp, addr = OP[0] + (GPR32 (OP[1]));
   3445  1.1  christos   trace_input ("loadd", OP_RP_BASE_DISP20, OP_REGP, OP_VOID);
   3446  1.1  christos   tmp = RLW (addr);
   3447  1.1  christos   tmp = ((tmp & 0xffff) << 16)| ((tmp >> 16) & 0xffff);
   3448  1.1  christos   SET_GPR32 (OP[2], tmp);
   3449  1.6  christos   trace_output_32 (sd, tmp);
   3450  1.1  christos }
   3451  1.1  christos 
   3452  1.1  christos /* loadd.  */
   3453  1.1  christos void
   3454  1.6  christos OP_189_14 (SIM_DESC sd, SIM_CPU *cpu)
   3455  1.1  christos {
   3456  1.1  christos   /* loadd -disp20(REGP)   REGP
   3457  1.1  christos    * ADDR = RPbase + zext24(-disp20)
   3458  1.1  christos    * REGP = [ADDR]   */
   3459  1.1  christos 
   3460  1.1  christos   uint32 tmp, addr = OP[0] + (GPR32 (OP[1]));
   3461  1.1  christos   trace_input ("loadd", OP_RP_BASE_DISPE20, OP_REGP, OP_VOID);
   3462  1.1  christos   tmp = RLW (addr);
   3463  1.1  christos   tmp = ((tmp & 0xffff) << 16)| ((tmp >> 16) & 0xffff);
   3464  1.1  christos   SET_GPR32 (OP[2], tmp);
   3465  1.6  christos   trace_output_32 (sd, tmp);
   3466  1.1  christos }
   3467  1.1  christos 
   3468  1.1  christos /* loadd.  */
   3469  1.1  christos void
   3470  1.6  christos OP_12A_14 (SIM_DESC sd, SIM_CPU *cpu)
   3471  1.1  christos {
   3472  1.1  christos   /* loadd [Rindex]disp20(RPbasexb) REGP
   3473  1.1  christos    * ADDR = RPbasex + Rindex + zext24(disp20)
   3474  1.1  christos    * REGP = [ADDR]   */
   3475  1.1  christos 
   3476  1.1  christos   uint32 addr, tmp;
   3477  1.1  christos   trace_input ("loadd", OP_RP_INDEX_DISP20, OP_REGP, OP_VOID);
   3478  1.1  christos 
   3479  1.1  christos   if (OP[0] == 0)
   3480  1.1  christos      addr = (GPR32 (12)) + OP[1] + (GPR32 (OP[2]));
   3481  1.1  christos   else
   3482  1.1  christos      addr = (GPR32 (13)) + OP[1] + (GPR32 (OP[2]));
   3483  1.1  christos 
   3484  1.1  christos   tmp = RLW (addr);
   3485  1.1  christos   tmp = ((tmp << 16) & 0xffff)| ((tmp >> 16) & 0xffff);
   3486  1.1  christos   SET_GPR32 (OP[3], tmp);
   3487  1.6  christos   trace_output_32 (sd, tmp);
   3488  1.1  christos }
   3489  1.1  christos 
   3490  1.1  christos 
   3491  1.1  christos /* storb.  */
   3492  1.1  christos void
   3493  1.6  christos OP_C8_8 (SIM_DESC sd, SIM_CPU *cpu)
   3494  1.1  christos {
   3495  1.1  christos   /* storb REG, ABS20
   3496  1.1  christos    * ADDR = zext24(abs20) | remap
   3497  1.1  christos    * [ADDR] = REGR
   3498  1.1  christos    * NOTE: remap is
   3499  1.1  christos    * If (abs20 > 0xEFFFF) the resulting address is logically ORed
   3500  1.1  christos    * with 0xF00000 i.e. addresses from 1M-64k to 1M are re-mapped
   3501  1.1  christos    * by the core to 16M-64k to 16M. */
   3502  1.1  christos 
   3503  1.1  christos   uint8 a = ((GPR (OP[0])) & 0xff);
   3504  1.1  christos   uint32 addr =  OP[1];
   3505  1.1  christos   trace_input ("storb", OP_REG, OP_ABS20_OUTPUT, OP_VOID);
   3506  1.1  christos   SB (addr, a);
   3507  1.6  christos   trace_output_32 (sd, addr);
   3508  1.1  christos }
   3509  1.1  christos 
   3510  1.1  christos /* storb.  */
   3511  1.1  christos void
   3512  1.6  christos OP_137_14 (SIM_DESC sd, SIM_CPU *cpu)
   3513  1.1  christos {
   3514  1.1  christos   /* storb REG, ABS24
   3515  1.1  christos    * ADDR = abs24
   3516  1.1  christos    * [ADDR] = REGR.  */
   3517  1.1  christos 
   3518  1.1  christos   uint8 a = ((GPR (OP[0])) & 0xff);
   3519  1.1  christos   uint32 addr =  OP[1];
   3520  1.1  christos   trace_input ("storb", OP_REG, OP_ABS24_OUTPUT, OP_VOID);
   3521  1.1  christos   SB (addr, a);
   3522  1.6  christos   trace_output_32 (sd, addr);
   3523  1.1  christos }
   3524  1.1  christos 
   3525  1.1  christos /* storb.  */
   3526  1.1  christos void
   3527  1.6  christos OP_65_7 (SIM_DESC sd, SIM_CPU *cpu)
   3528  1.1  christos {
   3529  1.1  christos   /* storb REG, [Rindex]ABS20
   3530  1.1  christos    * ADDR = Rindex + zext24(disp20)
   3531  1.1  christos    * [ADDR] = REGR  */
   3532  1.1  christos 
   3533  1.1  christos   uint32 addr;
   3534  1.1  christos   uint8 a = ((GPR (OP[0])) & 0xff);
   3535  1.1  christos   trace_input ("storb", OP_REG, OP_R_INDEX8_ABS20, OP_VOID);
   3536  1.1  christos 
   3537  1.1  christos   if (OP[1] == 0)
   3538  1.1  christos      addr = (GPR32 (12)) + OP[2];
   3539  1.1  christos   else
   3540  1.1  christos      addr = (GPR32 (13)) + OP[2];
   3541  1.1  christos 
   3542  1.1  christos   SB (addr, a);
   3543  1.6  christos   trace_output_32 (sd, addr);
   3544  1.1  christos }
   3545  1.1  christos 
   3546  1.1  christos /* storb.  */
   3547  1.1  christos void
   3548  1.6  christos OP_F_4 (SIM_DESC sd, SIM_CPU *cpu)
   3549  1.1  christos {
   3550  1.1  christos   /* storb REG, DIPS4(REGP)
   3551  1.1  christos    * ADDR = RPBASE + zext24(DISP4)
   3552  1.1  christos    * [ADDR]  = REG.  */
   3553  1.1  christos 
   3554  1.1  christos   uint16 a = ((GPR (OP[0])) & 0xff);
   3555  1.5  christos   uint32 addr = (GPR32 (OP[2])) + OP[1];
   3556  1.1  christos   trace_input ("storb", OP_REG, OP_RP_BASE_DISPE4, OP_VOID);
   3557  1.1  christos   SB (addr, a);
   3558  1.6  christos   trace_output_32 (sd, addr);
   3559  1.1  christos }
   3560  1.1  christos 
   3561  1.1  christos /* storb.  */
   3562  1.1  christos void
   3563  1.6  christos OP_FE_8 (SIM_DESC sd, SIM_CPU *cpu)
   3564  1.1  christos {
   3565  1.1  christos   /* storb [Rindex]disp0(RPbasex) REG
   3566  1.1  christos    * ADDR = Rpbasex + Rindex
   3567  1.1  christos    * [ADDR] = REGR   */
   3568  1.1  christos 
   3569  1.1  christos   uint32 addr;
   3570  1.1  christos   uint8 a = ((GPR (OP[0])) & 0xff);
   3571  1.1  christos   trace_input ("storb", OP_REG, OP_RP_INDEX_DISP0, OP_VOID);
   3572  1.1  christos 
   3573  1.1  christos   if (OP[1] == 0)
   3574  1.1  christos      addr = (GPR32 (12)) + (GPR32 (OP[3])) + OP[2];
   3575  1.1  christos   else
   3576  1.1  christos      addr = (GPR32 (13)) + (GPR32 (OP[3])) + OP[2];
   3577  1.1  christos 
   3578  1.1  christos   SB (addr, a);
   3579  1.6  christos   trace_output_32 (sd, addr);
   3580  1.1  christos }
   3581  1.1  christos 
   3582  1.1  christos /* storb.  */
   3583  1.1  christos void
   3584  1.6  christos OP_319_A (SIM_DESC sd, SIM_CPU *cpu)
   3585  1.1  christos {
   3586  1.1  christos   /* storb REG, [Rindex]disp14(RPbasex)
   3587  1.1  christos    * ADDR = Rpbasex + Rindex + zext24(disp14)
   3588  1.1  christos    * [ADDR] = REGR  */
   3589  1.1  christos 
   3590  1.1  christos   uint8 a = ((GPR (OP[0])) & 0xff);
   3591  1.5  christos   uint32 addr = (GPR32 (OP[2])) + OP[1];
   3592  1.1  christos   trace_input ("storb", OP_REG, OP_RP_INDEX_DISP14, OP_VOID);
   3593  1.1  christos   SB (addr, a);
   3594  1.6  christos   trace_output_32 (sd, addr);
   3595  1.1  christos }
   3596  1.1  christos 
   3597  1.1  christos /* storb.  */
   3598  1.1  christos void
   3599  1.6  christos OP_194_14 (SIM_DESC sd, SIM_CPU *cpu)
   3600  1.1  christos {
   3601  1.1  christos   /* storb REG, DISPE20(REG)
   3602  1.1  christos    * zext24(Rbase) + zext24(dispe20)
   3603  1.1  christos    * [ADDR] = REG  */
   3604  1.1  christos 
   3605  1.1  christos   uint8 a = ((GPR (OP[0])) & 0xff);
   3606  1.5  christos   uint32 addr = OP[1] + (GPR (OP[2]));
   3607  1.1  christos   trace_input ("storb", OP_REG, OP_R_BASE_DISPE20, OP_VOID);
   3608  1.1  christos   SB (addr, a);
   3609  1.6  christos   trace_output_32 (sd, addr);
   3610  1.1  christos }
   3611  1.1  christos 
   3612  1.1  christos /* storb.  */
   3613  1.1  christos void
   3614  1.6  christos OP_134_14 (SIM_DESC sd, SIM_CPU *cpu)
   3615  1.1  christos {
   3616  1.1  christos   /* storb REG, DISP20(REG)
   3617  1.1  christos    * ADDR = zext24(Rbase) + zext24(disp20)
   3618  1.1  christos    * [ADDR] = REG                          */
   3619  1.1  christos 
   3620  1.1  christos   uint8 a = (GPR (OP[0]) & 0xff);
   3621  1.5  christos   uint32 addr = OP[1] + (GPR (OP[2]));
   3622  1.1  christos   trace_input ("storb", OP_REG, OP_R_BASE_DISPS20, OP_VOID);
   3623  1.1  christos   SB (addr, a);
   3624  1.6  christos   trace_output_32 (sd, addr);
   3625  1.1  christos }
   3626  1.1  christos 
   3627  1.1  christos /* storb.  */
   3628  1.1  christos void
   3629  1.6  christos OP_FF_8 (SIM_DESC sd, SIM_CPU *cpu)
   3630  1.1  christos {
   3631  1.1  christos   /* storb REG, disp16(REGP)
   3632  1.1  christos    * ADDR = RPbase + zext24(disp16)
   3633  1.1  christos    * [ADDR] = REGP   */
   3634  1.1  christos 
   3635  1.1  christos   uint8 a = ((GPR (OP[0])) & 0xff);
   3636  1.5  christos   uint32 addr = (GPR32 (OP[2])) + OP[1];
   3637  1.1  christos   trace_input ("storb", OP_REG, OP_RP_BASE_DISP16, OP_VOID);
   3638  1.1  christos   SB (addr, a);
   3639  1.6  christos   trace_output_32 (sd, addr);
   3640  1.1  christos }
   3641  1.1  christos 
   3642  1.1  christos /* storb.  */
   3643  1.1  christos void
   3644  1.6  christos OP_135_14 (SIM_DESC sd, SIM_CPU *cpu)
   3645  1.1  christos {
   3646  1.1  christos   /* storb REG, disp20(REGP)
   3647  1.1  christos    * ADDR = RPbase + zext24(disp20)
   3648  1.1  christos    * [ADDR] = REGP   */
   3649  1.1  christos 
   3650  1.1  christos   uint8 a = ((GPR (OP[0])) & 0xff);
   3651  1.5  christos   uint32 addr = (GPR32 (OP[2])) + OP[1];
   3652  1.1  christos   trace_input ("storb", OP_REG, OP_RP_BASE_DISPS20, OP_VOID);
   3653  1.1  christos   SB (addr, a);
   3654  1.6  christos   trace_output_32 (sd, addr);
   3655  1.1  christos }
   3656  1.1  christos 
   3657  1.1  christos /* storb.  */
   3658  1.1  christos void
   3659  1.6  christos OP_195_14 (SIM_DESC sd, SIM_CPU *cpu)
   3660  1.1  christos {
   3661  1.1  christos   /* storb REG, -disp20(REGP)
   3662  1.1  christos    * ADDR = RPbase + zext24(-disp20)
   3663  1.1  christos    * [ADDR] = REGP  */
   3664  1.1  christos 
   3665  1.1  christos   uint8 a = (GPR (OP[0]) & 0xff);
   3666  1.5  christos   uint32 addr = (GPR32 (OP[2])) + OP[1];
   3667  1.1  christos   trace_input ("storb", OP_REG, OP_RP_BASE_DISPE20, OP_VOID);
   3668  1.1  christos   SB (addr, a);
   3669  1.6  christos   trace_output_32 (sd, addr);
   3670  1.1  christos }
   3671  1.1  christos 
   3672  1.1  christos /* storb.  */
   3673  1.1  christos void
   3674  1.6  christos OP_136_14 (SIM_DESC sd, SIM_CPU *cpu)
   3675  1.1  christos {
   3676  1.1  christos   /* storb REG, [Rindex]disp20(RPbase)
   3677  1.1  christos    * ADDR = RPbasex + Rindex + zext24(disp20)
   3678  1.1  christos    * [ADDR] = REGP   */
   3679  1.1  christos 
   3680  1.1  christos   uint8 a = (GPR (OP[0])) & 0xff;
   3681  1.5  christos   uint32 addr = (GPR32 (OP[2])) + OP[1];
   3682  1.1  christos   trace_input ("storb", OP_REG, OP_RP_INDEX_DISPS20, OP_VOID);
   3683  1.1  christos   SB (addr, a);
   3684  1.6  christos   trace_output_32 (sd, addr);
   3685  1.1  christos }
   3686  1.1  christos 
   3687  1.1  christos /* STR_IMM instructions.  */
   3688  1.1  christos /* storb . */
   3689  1.1  christos void
   3690  1.6  christos OP_81_8 (SIM_DESC sd, SIM_CPU *cpu)
   3691  1.1  christos {
   3692  1.1  christos   uint8 a = (OP[0]) & 0xff;
   3693  1.5  christos   uint32 addr = OP[1];
   3694  1.1  christos   trace_input ("storb", OP_CONSTANT4, OP_ABS20_OUTPUT, OP_VOID);
   3695  1.1  christos   SB (addr, a);
   3696  1.6  christos   trace_output_32 (sd, addr);
   3697  1.1  christos }
   3698  1.1  christos 
   3699  1.1  christos /* storb.  */
   3700  1.1  christos void
   3701  1.6  christos OP_123_14 (SIM_DESC sd, SIM_CPU *cpu)
   3702  1.1  christos {
   3703  1.1  christos   uint8 a = (OP[0]) & 0xff;
   3704  1.5  christos   uint32 addr = OP[1];
   3705  1.1  christos   trace_input ("storb", OP_CONSTANT4, OP_ABS24_OUTPUT, OP_VOID);
   3706  1.1  christos   SB (addr, a);
   3707  1.6  christos   trace_output_32 (sd, addr);
   3708  1.1  christos }
   3709  1.1  christos 
   3710  1.1  christos /* storb.  */
   3711  1.1  christos void
   3712  1.6  christos OP_42_7 (SIM_DESC sd, SIM_CPU *cpu)
   3713  1.1  christos {
   3714  1.1  christos   uint32 addr;
   3715  1.1  christos   uint8 a = (OP[0]) & 0xff;
   3716  1.1  christos   trace_input ("storb", OP_CONSTANT4, OP_R_INDEX8_ABS20, OP_VOID);
   3717  1.1  christos 
   3718  1.1  christos   if (OP[1] == 0)
   3719  1.1  christos      addr = (GPR32 (12)) + OP[2];
   3720  1.1  christos   else
   3721  1.1  christos      addr = (GPR32 (13)) + OP[2];
   3722  1.1  christos 
   3723  1.1  christos   SB (addr, a);
   3724  1.6  christos   trace_output_32 (sd, addr);
   3725  1.1  christos }
   3726  1.1  christos 
   3727  1.1  christos /* storb.  */
   3728  1.1  christos void
   3729  1.6  christos OP_218_A (SIM_DESC sd, SIM_CPU *cpu)
   3730  1.1  christos {
   3731  1.1  christos   uint8 a = (OP[0]) & 0xff;
   3732  1.5  christos   uint32 addr = (GPR32 (OP[2])) + OP[1];
   3733  1.1  christos   trace_input ("storb", OP_CONSTANT4, OP_RP_BASE_DISP14, OP_VOID);
   3734  1.1  christos   SB (addr, a);
   3735  1.6  christos   trace_output_32 (sd, addr);
   3736  1.1  christos }
   3737  1.1  christos 
   3738  1.1  christos /* storb.  */
   3739  1.1  christos void
   3740  1.6  christos OP_82_8 (SIM_DESC sd, SIM_CPU *cpu)
   3741  1.1  christos {
   3742  1.1  christos   uint8 a = (OP[0]) & 0xff;
   3743  1.5  christos   uint32 addr = (GPR32 (OP[2])) + OP[1];
   3744  1.1  christos   trace_input ("storb", OP_CONSTANT4, OP_RP_INDEX_DISP0, OP_VOID);
   3745  1.1  christos   SB (addr, a);
   3746  1.6  christos   trace_output_32 (sd, addr);
   3747  1.1  christos }
   3748  1.1  christos 
   3749  1.1  christos /* storb.  */
   3750  1.1  christos void
   3751  1.6  christos OP_120_14 (SIM_DESC sd, SIM_CPU *cpu)
   3752  1.1  christos {
   3753  1.1  christos   uint8 a = (OP[0]) & 0xff;
   3754  1.5  christos   uint32 addr = (GPR (OP[2])) + OP[1];
   3755  1.1  christos   trace_input ("storb", OP_CONSTANT4, OP_R_BASE_DISPS20, OP_VOID);
   3756  1.1  christos   SB (addr, a);
   3757  1.6  christos   trace_output_32 (sd, addr);
   3758  1.1  christos }
   3759  1.1  christos 
   3760  1.1  christos /* storb.  */
   3761  1.1  christos void
   3762  1.6  christos OP_83_8 (SIM_DESC sd, SIM_CPU *cpu)
   3763  1.1  christos {
   3764  1.1  christos   uint8 a = (OP[0]) & 0xff;
   3765  1.5  christos   uint32 addr = (GPR32 (OP[2])) + OP[1];
   3766  1.1  christos   trace_input ("storb", OP_CONSTANT4, OP_RP_BASE_DISP16, OP_VOID);
   3767  1.1  christos   SB (addr, a);
   3768  1.6  christos   trace_output_32 (sd, addr);
   3769  1.1  christos }
   3770  1.1  christos 
   3771  1.1  christos /* storb.  */
   3772  1.1  christos void
   3773  1.6  christos OP_121_14 (SIM_DESC sd, SIM_CPU *cpu)
   3774  1.1  christos {
   3775  1.1  christos   uint8 a = (OP[0]) & 0xff;
   3776  1.5  christos   uint32 addr = (GPR32 (OP[2])) + OP[1];
   3777  1.1  christos   trace_input ("storb", OP_CONSTANT4, OP_RP_BASE_DISPS20, OP_VOID);
   3778  1.1  christos   SB (addr, a);
   3779  1.6  christos   trace_output_32 (sd, addr);
   3780  1.1  christos }
   3781  1.1  christos 
   3782  1.1  christos /* storb.  */
   3783  1.1  christos void
   3784  1.6  christos OP_122_14 (SIM_DESC sd, SIM_CPU *cpu)
   3785  1.1  christos {
   3786  1.1  christos   uint8 a = (OP[0]) & 0xff;
   3787  1.5  christos   uint32 addr = (GPR32 (OP[2])) + OP[1];
   3788  1.1  christos   trace_input ("storb", OP_CONSTANT4, OP_RP_INDEX_DISPS20, OP_VOID);
   3789  1.1  christos   SB (addr, a);
   3790  1.6  christos   trace_output_32 (sd, addr);
   3791  1.1  christos }
   3792  1.1  christos /* endif for STR_IMM.  */
   3793  1.1  christos 
   3794  1.1  christos /* storw . */
   3795  1.1  christos void
   3796  1.6  christos OP_C9_8 (SIM_DESC sd, SIM_CPU *cpu)
   3797  1.1  christos {
   3798  1.1  christos   uint16 a = GPR (OP[0]);
   3799  1.5  christos   uint32 addr =  OP[1];
   3800  1.1  christos   trace_input ("storw", OP_REG, OP_ABS20_OUTPUT, OP_VOID);
   3801  1.1  christos   SW (addr, a);
   3802  1.6  christos   trace_output_32 (sd, addr);
   3803  1.1  christos }
   3804  1.1  christos 
   3805  1.1  christos /* storw.  */
   3806  1.1  christos void
   3807  1.6  christos OP_13F_14 (SIM_DESC sd, SIM_CPU *cpu)
   3808  1.1  christos {
   3809  1.1  christos   uint16 a = GPR (OP[0]);
   3810  1.5  christos   uint32 addr =  OP[1];
   3811  1.1  christos   trace_input ("storw", OP_REG, OP_ABS24_OUTPUT, OP_VOID);
   3812  1.1  christos   SW (addr, a);
   3813  1.6  christos   trace_output_32 (sd, addr);
   3814  1.1  christos }
   3815  1.1  christos 
   3816  1.1  christos /* storw.  */
   3817  1.1  christos void
   3818  1.6  christos OP_67_7 (SIM_DESC sd, SIM_CPU *cpu)
   3819  1.1  christos {
   3820  1.1  christos   uint32 addr;
   3821  1.1  christos   uint16 a = GPR (OP[0]);
   3822  1.1  christos   trace_input ("storw", OP_REG, OP_R_INDEX8_ABS20, OP_VOID);
   3823  1.1  christos 
   3824  1.1  christos   if (OP[1] == 0)
   3825  1.1  christos      addr = (GPR32 (12)) + OP[2];
   3826  1.1  christos   else
   3827  1.1  christos      addr = (GPR32 (13)) + OP[2];
   3828  1.1  christos 
   3829  1.1  christos   SW (addr, a);
   3830  1.6  christos   trace_output_32 (sd, addr);
   3831  1.1  christos }
   3832  1.1  christos 
   3833  1.1  christos 
   3834  1.1  christos /* storw.  */
   3835  1.1  christos void
   3836  1.6  christos OP_D_4 (SIM_DESC sd, SIM_CPU *cpu)
   3837  1.1  christos {
   3838  1.1  christos   uint16 a = (GPR (OP[0]));
   3839  1.5  christos   uint32 addr = (GPR32 (OP[2])) + OP[1];
   3840  1.1  christos   trace_input ("storw", OP_REGP, OP_RP_BASE_DISPE4, OP_VOID);
   3841  1.1  christos   SW (addr, a);
   3842  1.6  christos   trace_output_32 (sd, addr);
   3843  1.1  christos }
   3844  1.1  christos 
   3845  1.1  christos /* storw.  */
   3846  1.1  christos void
   3847  1.6  christos OP_DE_8 (SIM_DESC sd, SIM_CPU *cpu)
   3848  1.1  christos {
   3849  1.1  christos   uint16 a = GPR (OP[0]);
   3850  1.5  christos   uint32 addr = (GPR32 (OP[2])) + OP[1];
   3851  1.1  christos   trace_input ("storw", OP_REG, OP_RP_INDEX_DISP0, OP_VOID);
   3852  1.1  christos   SW (addr, a);
   3853  1.6  christos   trace_output_32 (sd, addr);
   3854  1.1  christos }
   3855  1.1  christos 
   3856  1.1  christos /* storw.  */
   3857  1.1  christos void
   3858  1.6  christos OP_31B_A (SIM_DESC sd, SIM_CPU *cpu)
   3859  1.1  christos {
   3860  1.1  christos   uint16 a = GPR (OP[0]);
   3861  1.5  christos   uint32 addr = (GPR32 (OP[2])) + OP[1];
   3862  1.1  christos   trace_input ("storw", OP_REG, OP_RP_INDEX_DISP14, OP_VOID);
   3863  1.1  christos   SW (addr, a);
   3864  1.6  christos   trace_output_32 (sd, addr);
   3865  1.1  christos }
   3866  1.1  christos 
   3867  1.1  christos /* storw.  */
   3868  1.1  christos void
   3869  1.6  christos OP_19C_14 (SIM_DESC sd, SIM_CPU *cpu)
   3870  1.1  christos {
   3871  1.1  christos   uint16 a = (GPR (OP[0]));
   3872  1.5  christos   uint32 addr = (GPR32 (OP[2])) + OP[1];
   3873  1.1  christos   trace_input ("storw", OP_REGP, OP_RP_BASE_DISPE20, OP_VOID);
   3874  1.1  christos   SW (addr, a);
   3875  1.6  christos   trace_output_32 (sd, addr);
   3876  1.1  christos }
   3877  1.1  christos 
   3878  1.1  christos /* storw.  */
   3879  1.1  christos void
   3880  1.6  christos OP_13C_14 (SIM_DESC sd, SIM_CPU *cpu)
   3881  1.1  christos {
   3882  1.1  christos   uint16 a = (GPR (OP[0]));
   3883  1.5  christos   uint32 addr = (GPR (OP[2])) + OP[1];
   3884  1.1  christos   trace_input ("storw", OP_REG, OP_R_BASE_DISPS20, OP_VOID);
   3885  1.1  christos   SW (addr, a);
   3886  1.6  christos   trace_output_32 (sd, addr);
   3887  1.1  christos }
   3888  1.1  christos 
   3889  1.1  christos /* storw.  */
   3890  1.1  christos void
   3891  1.6  christos OP_DF_8 (SIM_DESC sd, SIM_CPU *cpu)
   3892  1.1  christos {
   3893  1.1  christos   uint16 a = (GPR (OP[0]));
   3894  1.5  christos   uint32 addr = (GPR32 (OP[2])) + OP[1];
   3895  1.1  christos   trace_input ("storw", OP_REG, OP_RP_BASE_DISP16, OP_VOID);
   3896  1.1  christos   SW (addr, a);
   3897  1.6  christos   trace_output_32 (sd, addr);
   3898  1.1  christos }
   3899  1.1  christos 
   3900  1.1  christos /* storw.  */
   3901  1.1  christos void
   3902  1.6  christos OP_13D_14 (SIM_DESC sd, SIM_CPU *cpu)
   3903  1.1  christos {
   3904  1.1  christos   uint16 a = (GPR (OP[0]));
   3905  1.5  christos   uint32 addr = (GPR32 (OP[2])) + OP[1];
   3906  1.1  christos   trace_input ("storw", OP_REG, OP_RP_BASE_DISPS20, OP_VOID);
   3907  1.1  christos   SW (addr, a);
   3908  1.6  christos   trace_output_32 (sd, addr);
   3909  1.1  christos }
   3910  1.1  christos 
   3911  1.1  christos /* storw.  */
   3912  1.1  christos void
   3913  1.6  christos OP_19D_14 (SIM_DESC sd, SIM_CPU *cpu)
   3914  1.1  christos {
   3915  1.1  christos   uint16 a = (GPR (OP[0]));
   3916  1.5  christos   uint32 addr = (GPR32 (OP[2])) + OP[1];
   3917  1.1  christos   trace_input ("storw", OP_REG, OP_RP_BASE_DISPE20, OP_VOID);
   3918  1.1  christos   SW (addr, a);
   3919  1.6  christos   trace_output_32 (sd, addr);
   3920  1.1  christos }
   3921  1.1  christos 
   3922  1.1  christos /* storw.  */
   3923  1.1  christos void
   3924  1.6  christos OP_13E_14 (SIM_DESC sd, SIM_CPU *cpu)
   3925  1.1  christos {
   3926  1.1  christos   uint16 a = (GPR (OP[0]));
   3927  1.5  christos   uint32 addr = (GPR32 (OP[2])) + OP[1];
   3928  1.1  christos   trace_input ("storw", OP_REG, OP_RP_INDEX_DISPS20, OP_VOID);
   3929  1.1  christos   SW (addr, a);
   3930  1.6  christos   trace_output_32 (sd, addr);
   3931  1.1  christos }
   3932  1.1  christos 
   3933  1.1  christos /* STORE-w IMM instruction *****/
   3934  1.1  christos /* storw . */
   3935  1.1  christos void
   3936  1.6  christos OP_C1_8 (SIM_DESC sd, SIM_CPU *cpu)
   3937  1.1  christos {
   3938  1.1  christos   uint16 a = OP[0];
   3939  1.5  christos   uint32 addr = OP[1];
   3940  1.1  christos   trace_input ("storw", OP_CONSTANT4, OP_ABS20_OUTPUT, OP_VOID);
   3941  1.1  christos   SW (addr, a);
   3942  1.6  christos   trace_output_32 (sd, addr);
   3943  1.1  christos }
   3944  1.1  christos 
   3945  1.1  christos /* storw.  */
   3946  1.1  christos void
   3947  1.6  christos OP_133_14 (SIM_DESC sd, SIM_CPU *cpu)
   3948  1.1  christos {
   3949  1.1  christos   uint16 a = OP[0];
   3950  1.5  christos   uint32 addr = OP[1];
   3951  1.1  christos   trace_input ("storw", OP_CONSTANT4, OP_ABS24_OUTPUT, OP_VOID);
   3952  1.1  christos   SW (addr, a);
   3953  1.6  christos   trace_output_32 (sd, addr);
   3954  1.1  christos }
   3955  1.1  christos 
   3956  1.1  christos /* storw.  */
   3957  1.1  christos void
   3958  1.6  christos OP_62_7 (SIM_DESC sd, SIM_CPU *cpu)
   3959  1.1  christos {
   3960  1.1  christos   uint32 addr;
   3961  1.1  christos   uint16 a = OP[0];
   3962  1.1  christos   trace_input ("storw", OP_CONSTANT4, OP_R_INDEX8_ABS20, OP_VOID);
   3963  1.1  christos 
   3964  1.1  christos   if (OP[1] == 0)
   3965  1.1  christos      addr = (GPR32 (12)) + OP[2];
   3966  1.1  christos   else
   3967  1.1  christos      addr = (GPR32 (13)) + OP[2];
   3968  1.1  christos 
   3969  1.1  christos   SW (addr, a);
   3970  1.6  christos   trace_output_32 (sd, addr);
   3971  1.1  christos }
   3972  1.1  christos 
   3973  1.1  christos /* storw.  */
   3974  1.1  christos void
   3975  1.6  christos OP_318_A (SIM_DESC sd, SIM_CPU *cpu)
   3976  1.1  christos {
   3977  1.1  christos   uint16 a = OP[0];
   3978  1.5  christos   uint32 addr = (GPR32 (OP[2])) + OP[1];
   3979  1.1  christos   trace_input ("storw", OP_CONSTANT4, OP_RP_BASE_DISP14, OP_VOID);
   3980  1.1  christos   SW (addr, a);
   3981  1.6  christos   trace_output_32 (sd, addr);
   3982  1.1  christos }
   3983  1.1  christos 
   3984  1.1  christos /* storw.  */
   3985  1.1  christos void
   3986  1.6  christos OP_C2_8 (SIM_DESC sd, SIM_CPU *cpu)
   3987  1.1  christos {
   3988  1.1  christos   uint16 a = OP[0];
   3989  1.5  christos   uint32 addr = (GPR32 (OP[2])) + OP[1];
   3990  1.1  christos   trace_input ("storw", OP_CONSTANT4, OP_RP_INDEX_DISP0, OP_VOID);
   3991  1.1  christos   SW (addr, a);
   3992  1.6  christos   trace_output_32 (sd, addr);
   3993  1.1  christos }
   3994  1.1  christos 
   3995  1.1  christos /* storw.  */
   3996  1.1  christos void
   3997  1.6  christos OP_130_14 (SIM_DESC sd, SIM_CPU *cpu)
   3998  1.1  christos {
   3999  1.1  christos   uint16 a = OP[0];
   4000  1.5  christos   uint32 addr = (GPR32 (OP[2])) + OP[1];
   4001  1.1  christos   trace_input ("storw", OP_CONSTANT4, OP_R_BASE_DISPS20, OP_VOID);
   4002  1.1  christos   SW (addr, a);
   4003  1.6  christos   trace_output_32 (sd, addr);
   4004  1.1  christos }
   4005  1.1  christos 
   4006  1.1  christos /* storw.  */
   4007  1.1  christos void
   4008  1.6  christos OP_C3_8 (SIM_DESC sd, SIM_CPU *cpu)
   4009  1.1  christos {
   4010  1.1  christos   uint16 a = OP[0];
   4011  1.5  christos   uint32 addr = (GPR32 (OP[2])) + OP[1];
   4012  1.1  christos   trace_input ("storw", OP_CONSTANT4, OP_RP_BASE_DISP16, OP_VOID);
   4013  1.1  christos   SW (addr, a);
   4014  1.6  christos   trace_output_32 (sd, addr);
   4015  1.1  christos }
   4016  1.1  christos 
   4017  1.1  christos 
   4018  1.1  christos /* storw.  */
   4019  1.1  christos void
   4020  1.6  christos OP_131_14 (SIM_DESC sd, SIM_CPU *cpu)
   4021  1.1  christos {
   4022  1.1  christos   uint16 a = OP[0];
   4023  1.5  christos   uint32 addr = (GPR32 (OP[2])) + OP[1];
   4024  1.1  christos   trace_input ("storw", OP_CONSTANT4, OP_RP_BASE_DISPS20, OP_VOID);
   4025  1.1  christos   SW (addr, a);
   4026  1.6  christos   trace_output_32 (sd, addr);
   4027  1.1  christos }
   4028  1.1  christos 
   4029  1.1  christos /* storw.  */
   4030  1.1  christos void
   4031  1.6  christos OP_132_14 (SIM_DESC sd, SIM_CPU *cpu)
   4032  1.1  christos {
   4033  1.1  christos   uint16 a = OP[0];
   4034  1.5  christos   uint32 addr = (GPR32 (OP[2])) + OP[1];
   4035  1.1  christos   trace_input ("storw", OP_CONSTANT4, OP_RP_INDEX_DISPS20, OP_VOID);
   4036  1.1  christos   SW (addr, a);
   4037  1.6  christos   trace_output_32 (sd, addr);
   4038  1.1  christos }
   4039  1.1  christos 
   4040  1.1  christos 
   4041  1.1  christos /* stord.  */
   4042  1.1  christos void
   4043  1.6  christos OP_C7_8 (SIM_DESC sd, SIM_CPU *cpu)
   4044  1.1  christos {
   4045  1.1  christos   uint32 a = GPR32 (OP[0]);
   4046  1.5  christos   uint32 addr = OP[1];
   4047  1.1  christos   trace_input ("stord", OP_REGP, OP_ABS20_OUTPUT, OP_VOID);
   4048  1.1  christos   SLW (addr, a);
   4049  1.6  christos   trace_output_32 (sd, addr);
   4050  1.1  christos }
   4051  1.1  christos 
   4052  1.1  christos /* stord.  */
   4053  1.1  christos void
   4054  1.6  christos OP_13B_14 (SIM_DESC sd, SIM_CPU *cpu)
   4055  1.1  christos {
   4056  1.1  christos   uint32 a = GPR32 (OP[0]);
   4057  1.5  christos   uint32 addr = OP[1];
   4058  1.1  christos   trace_input ("stord", OP_REGP, OP_ABS24_OUTPUT, OP_VOID);
   4059  1.1  christos   SLW (addr, a);
   4060  1.6  christos   trace_output_32 (sd, addr);
   4061  1.1  christos }
   4062  1.1  christos 
   4063  1.1  christos /* stord.  */
   4064  1.1  christos void
   4065  1.6  christos OP_66_7 (SIM_DESC sd, SIM_CPU *cpu)
   4066  1.1  christos {
   4067  1.1  christos   uint32 addr, a = GPR32 (OP[0]);
   4068  1.1  christos   trace_input ("stord", OP_REGP, OP_R_INDEX8_ABS20, OP_VOID);
   4069  1.1  christos 
   4070  1.1  christos   if (OP[1] == 0)
   4071  1.1  christos      addr = (GPR32 (12)) + OP[2];
   4072  1.1  christos   else
   4073  1.1  christos      addr = (GPR32 (13)) + OP[2];
   4074  1.1  christos 
   4075  1.1  christos   SLW (addr, a);
   4076  1.6  christos   trace_output_32 (sd, addr);
   4077  1.1  christos }
   4078  1.1  christos 
   4079  1.1  christos /* stord.  */
   4080  1.1  christos void
   4081  1.6  christos OP_E_4 (SIM_DESC sd, SIM_CPU *cpu)
   4082  1.1  christos {
   4083  1.1  christos   uint32 a = GPR32 (OP[0]);
   4084  1.5  christos   uint32 addr = (GPR32 (OP[2])) + OP[1];
   4085  1.1  christos   trace_input ("stord", OP_REGP, OP_RP_BASE_DISPE4, OP_VOID);
   4086  1.1  christos   SLW (addr, a);
   4087  1.6  christos   trace_output_32 (sd, addr);
   4088  1.1  christos }
   4089  1.1  christos 
   4090  1.1  christos /* stord.  */
   4091  1.1  christos void
   4092  1.6  christos OP_EE_8 (SIM_DESC sd, SIM_CPU *cpu)
   4093  1.1  christos {
   4094  1.1  christos   uint32 a = GPR32 (OP[0]);
   4095  1.5  christos   uint32 addr = (GPR32 (OP[2])) + OP[1];
   4096  1.1  christos   trace_input ("stord", OP_REGP, OP_RP_INDEX_DISP0, OP_VOID);
   4097  1.1  christos   SLW (addr, a);
   4098  1.6  christos   trace_output_32 (sd, addr);
   4099  1.1  christos }
   4100  1.1  christos 
   4101  1.1  christos /* stord.  */
   4102  1.1  christos void
   4103  1.6  christos OP_31A_A (SIM_DESC sd, SIM_CPU *cpu)
   4104  1.1  christos {
   4105  1.1  christos   uint32 a = GPR32 (OP[0]);
   4106  1.5  christos   uint32 addr = (GPR32 (OP[2])) + OP[1];
   4107  1.1  christos   trace_input ("stord", OP_REGP, OP_RP_INDEX_DISP14, OP_VOID);
   4108  1.1  christos   SLW (addr, a);
   4109  1.6  christos   trace_output_32 (sd, addr);
   4110  1.1  christos }
   4111  1.1  christos 
   4112  1.1  christos /* stord.  */
   4113  1.1  christos void
   4114  1.6  christos OP_198_14 (SIM_DESC sd, SIM_CPU *cpu)
   4115  1.1  christos {
   4116  1.1  christos   uint32 a = GPR32 (OP[0]);
   4117  1.5  christos   uint32 addr = (GPR32 (OP[2])) + OP[1];
   4118  1.1  christos   trace_input ("stord", OP_REGP, OP_R_BASE_DISPE20, OP_VOID);
   4119  1.1  christos   SLW (addr, a);
   4120  1.6  christos   trace_output_32 (sd, addr);
   4121  1.1  christos }
   4122  1.1  christos 
   4123  1.1  christos /* stord.  */
   4124  1.1  christos void
   4125  1.6  christos OP_138_14 (SIM_DESC sd, SIM_CPU *cpu)
   4126  1.1  christos {
   4127  1.1  christos   uint32 a = GPR32 (OP[0]);
   4128  1.5  christos   uint32 addr = (GPR32 (OP[2])) + OP[1];
   4129  1.1  christos   trace_input ("stord", OP_REGP, OP_R_BASE_DISPS20, OP_VOID);
   4130  1.1  christos   SLW (addr, a);
   4131  1.6  christos   trace_output_32 (sd, addr);
   4132  1.1  christos }
   4133  1.1  christos 
   4134  1.1  christos /* stord.  */
   4135  1.1  christos void
   4136  1.6  christos OP_EF_8 (SIM_DESC sd, SIM_CPU *cpu)
   4137  1.1  christos {
   4138  1.1  christos   uint32 a = GPR32 (OP[0]);
   4139  1.5  christos   uint32 addr = (GPR32 (OP[2])) + OP[1];
   4140  1.1  christos   trace_input ("stord", OP_REGP, OP_RP_BASE_DISP16, OP_VOID);
   4141  1.1  christos   SLW (addr, a);
   4142  1.6  christos   trace_output_32 (sd, addr);
   4143  1.1  christos }
   4144  1.1  christos 
   4145  1.1  christos /* stord.  */
   4146  1.1  christos void
   4147  1.6  christos OP_139_14 (SIM_DESC sd, SIM_CPU *cpu)
   4148  1.1  christos {
   4149  1.1  christos   uint32 a = GPR32 (OP[0]);
   4150  1.5  christos   uint32 addr = (GPR32 (OP[2])) + OP[1];
   4151  1.1  christos   trace_input ("stord", OP_REGP, OP_RP_BASE_DISPS20, OP_VOID);
   4152  1.1  christos   SLW (addr, a);
   4153  1.6  christos   trace_output_32 (sd, addr);
   4154  1.1  christos }
   4155  1.1  christos 
   4156  1.1  christos /* stord.  */
   4157  1.1  christos void
   4158  1.6  christos OP_199_14 (SIM_DESC sd, SIM_CPU *cpu)
   4159  1.1  christos {
   4160  1.1  christos   uint32 a = GPR32 (OP[0]);
   4161  1.5  christos   uint32 addr = (GPR32 (OP[2])) + OP[1];
   4162  1.1  christos   trace_input ("stord", OP_REGP, OP_RP_BASE_DISPE20, OP_VOID);
   4163  1.1  christos   SLW (addr, a);
   4164  1.6  christos   trace_output_32 (sd, addr);
   4165  1.1  christos }
   4166  1.1  christos 
   4167  1.1  christos /* stord.  */
   4168  1.1  christos void
   4169  1.6  christos OP_13A_14 (SIM_DESC sd, SIM_CPU *cpu)
   4170  1.1  christos {
   4171  1.1  christos   uint32 a = GPR32 (OP[0]);
   4172  1.5  christos   uint32 addr = (GPR32 (OP[2])) + OP[1];
   4173  1.1  christos   trace_input ("stord", OP_REGP, OP_RP_INDEX_DISPS20, OP_VOID);
   4174  1.1  christos   SLW (addr, a);
   4175  1.6  christos   trace_output_32 (sd, addr);
   4176  1.1  christos }
   4177  1.1  christos 
   4178  1.1  christos /* macqu.  */
   4179  1.1  christos void
   4180  1.6  christos OP_14D_14 (SIM_DESC sd, SIM_CPU *cpu)
   4181  1.1  christos {
   4182  1.1  christos   int32 tmp;
   4183  1.1  christos   int16 src1, src2;
   4184  1.1  christos   trace_input ("macuw", OP_REG, OP_REG, OP_REGP);
   4185  1.1  christos   src1 = GPR (OP[0]);
   4186  1.1  christos   src2 = GPR (OP[1]);
   4187  1.1  christos   tmp = src1 * src2;
   4188  1.1  christos   /*REVISIT FOR SATURATION and Q FORMAT. */
   4189  1.1  christos   SET_GPR32 (OP[2], tmp);
   4190  1.6  christos   trace_output_32 (sd, tmp);
   4191  1.1  christos }
   4192  1.1  christos 
   4193  1.1  christos /* macuw.  */
   4194  1.1  christos void
   4195  1.6  christos OP_14E_14 (SIM_DESC sd, SIM_CPU *cpu)
   4196  1.1  christos {
   4197  1.1  christos   uint32 tmp;
   4198  1.1  christos   uint16 src1, src2;
   4199  1.1  christos   trace_input ("macuw", OP_REG, OP_REG, OP_REGP);
   4200  1.1  christos   src1 = GPR (OP[0]);
   4201  1.1  christos   src2 = GPR (OP[1]);
   4202  1.1  christos   tmp = src1 * src2;
   4203  1.1  christos   /*REVISIT FOR SATURATION. */
   4204  1.1  christos   SET_GPR32 (OP[2], tmp);
   4205  1.6  christos   trace_output_32 (sd, tmp);
   4206  1.1  christos }
   4207  1.1  christos 
   4208  1.1  christos /* macsw.  */
   4209  1.1  christos void
   4210  1.6  christos OP_14F_14 (SIM_DESC sd, SIM_CPU *cpu)
   4211  1.1  christos {
   4212  1.1  christos   int32 tmp;
   4213  1.1  christos   int16 src1, src2;
   4214  1.1  christos   trace_input ("macsw", OP_REG, OP_REG, OP_REGP);
   4215  1.1  christos   src1 = GPR (OP[0]);
   4216  1.1  christos   src2 = GPR (OP[1]);
   4217  1.1  christos   tmp = src1 * src2;
   4218  1.1  christos   /*REVISIT FOR SATURATION. */
   4219  1.1  christos   SET_GPR32 (OP[2], tmp);
   4220  1.6  christos   trace_output_32 (sd, tmp);
   4221  1.1  christos }
   4222  1.1  christos 
   4223  1.1  christos 
   4224  1.1  christos /* mulb.  */
   4225  1.1  christos void
   4226  1.6  christos OP_64_8 (SIM_DESC sd, SIM_CPU *cpu)
   4227  1.1  christos {
   4228  1.1  christos   int16 tmp;
   4229  1.1  christos   int8 a = (OP[0]) & 0xff;
   4230  1.1  christos   int8 b = (GPR (OP[1])) & 0xff;
   4231  1.1  christos   trace_input ("mulb", OP_CONSTANT4_1, OP_REG, OP_VOID);
   4232  1.1  christos   tmp = (a * b) & 0xff;
   4233  1.1  christos   SET_GPR (OP[1], (tmp | ((GPR (OP[1])) & 0xff00)));
   4234  1.6  christos   trace_output_16 (sd, tmp);
   4235  1.1  christos }
   4236  1.1  christos 
   4237  1.1  christos /* mulb.  */
   4238  1.1  christos void
   4239  1.6  christos OP_64B_C (SIM_DESC sd, SIM_CPU *cpu)
   4240  1.1  christos {
   4241  1.1  christos   int16 tmp;
   4242  1.1  christos   int8 a = (OP[0]) & 0xff, b = (GPR (OP[1])) & 0xff;
   4243  1.1  christos   trace_input ("mulb", OP_CONSTANT4, OP_REG, OP_VOID);
   4244  1.1  christos   tmp = (a * b) & 0xff;
   4245  1.1  christos   SET_GPR (OP[1], (tmp | ((GPR (OP[1])) & 0xff00)));
   4246  1.6  christos   trace_output_16 (sd, tmp);
   4247  1.1  christos }
   4248  1.1  christos 
   4249  1.1  christos 
   4250  1.1  christos /* mulb.  */
   4251  1.1  christos void
   4252  1.6  christos OP_65_8 (SIM_DESC sd, SIM_CPU *cpu)
   4253  1.1  christos {
   4254  1.1  christos   int16 tmp;
   4255  1.1  christos   int8 a = (GPR (OP[0])) & 0xff, b = (GPR (OP[1])) & 0xff;
   4256  1.1  christos   trace_input ("mulb", OP_REG, OP_REG, OP_VOID);
   4257  1.1  christos   tmp = (a * b) & 0xff;
   4258  1.1  christos   SET_GPR (OP[1], (tmp | ((GPR (OP[1])) & 0xff00)));
   4259  1.6  christos   trace_output_16 (sd, tmp);
   4260  1.1  christos }
   4261  1.1  christos 
   4262  1.1  christos 
   4263  1.1  christos /* mulw.  */
   4264  1.1  christos void
   4265  1.6  christos OP_66_8 (SIM_DESC sd, SIM_CPU *cpu)
   4266  1.1  christos {
   4267  1.1  christos   int32 tmp;
   4268  1.1  christos   uint16 a = OP[0];
   4269  1.1  christos   int16 b = (GPR (OP[1]));
   4270  1.1  christos   trace_input ("mulw", OP_CONSTANT4_1, OP_REG, OP_VOID);
   4271  1.1  christos   tmp = (a * b) & 0xffff;
   4272  1.1  christos   SET_GPR (OP[1], tmp);
   4273  1.6  christos   trace_output_32 (sd, tmp);
   4274  1.1  christos }
   4275  1.1  christos 
   4276  1.1  christos /* mulw.  */
   4277  1.1  christos void
   4278  1.6  christos OP_66B_C (SIM_DESC sd, SIM_CPU *cpu)
   4279  1.1  christos {
   4280  1.1  christos   int32 tmp;
   4281  1.1  christos   int16 a = OP[0], b = (GPR (OP[1]));
   4282  1.1  christos   trace_input ("mulw", OP_CONSTANT4, OP_REG, OP_VOID);
   4283  1.1  christos   tmp = (a * b) & 0xffff;
   4284  1.1  christos   SET_GPR (OP[1], tmp);
   4285  1.6  christos   trace_output_32 (sd, tmp);
   4286  1.1  christos }
   4287  1.1  christos 
   4288  1.1  christos 
   4289  1.1  christos /* mulw.  */
   4290  1.1  christos void
   4291  1.6  christos OP_67_8 (SIM_DESC sd, SIM_CPU *cpu)
   4292  1.1  christos {
   4293  1.1  christos   int32 tmp;
   4294  1.1  christos   int16 a = (GPR (OP[0])), b = (GPR (OP[1]));
   4295  1.1  christos   trace_input ("mulw", OP_REG, OP_REG, OP_VOID);
   4296  1.1  christos   tmp = (a * b) & 0xffff;
   4297  1.1  christos   SET_GPR (OP[1], tmp);
   4298  1.6  christos   trace_output_32 (sd, tmp);
   4299  1.1  christos }
   4300  1.1  christos 
   4301  1.1  christos 
   4302  1.1  christos /* mulsb.  */
   4303  1.1  christos void
   4304  1.6  christos OP_B_8 (SIM_DESC sd, SIM_CPU *cpu)
   4305  1.1  christos {
   4306  1.1  christos   int16 tmp;
   4307  1.1  christos   int8 a = (GPR (OP[0])) & 0xff, b = (GPR (OP[1])) & 0xff;
   4308  1.1  christos   trace_input ("mulsb", OP_REG, OP_REG, OP_VOID);
   4309  1.1  christos   tmp = a * b;
   4310  1.1  christos   SET_GPR (OP[1], tmp);
   4311  1.6  christos   trace_output_32 (sd, tmp);
   4312  1.1  christos }
   4313  1.1  christos 
   4314  1.1  christos /* mulsw.  */
   4315  1.1  christos void
   4316  1.6  christos OP_62_8 (SIM_DESC sd, SIM_CPU *cpu)
   4317  1.1  christos {
   4318  1.1  christos   int32 tmp;
   4319  1.1  christos   int16 a = (GPR (OP[0])), b = (GPR (OP[1]));
   4320  1.1  christos   trace_input ("mulsw", OP_REG, OP_REGP, OP_VOID);
   4321  1.1  christos   tmp = a * b;
   4322  1.1  christos   SET_GPR32 (OP[1], tmp);
   4323  1.6  christos   trace_output_32 (sd, tmp);
   4324  1.1  christos }
   4325  1.1  christos 
   4326  1.1  christos /* muluw.  */
   4327  1.1  christos void
   4328  1.6  christos OP_63_8 (SIM_DESC sd, SIM_CPU *cpu)
   4329  1.1  christos {
   4330  1.1  christos   uint32 tmp;
   4331  1.1  christos   uint16 a = (GPR (OP[0])), b = (GPR (OP[1]));
   4332  1.1  christos   trace_input ("muluw", OP_REG, OP_REGP, OP_VOID);
   4333  1.1  christos   tmp = a * b;
   4334  1.1  christos   SET_GPR32 (OP[1], tmp);
   4335  1.6  christos   trace_output_32 (sd, tmp);
   4336  1.1  christos }
   4337  1.1  christos 
   4338  1.1  christos 
   4339  1.1  christos /* nop.  */
   4340  1.1  christos void
   4341  1.6  christos OP_2C00_10 (SIM_DESC sd, SIM_CPU *cpu)
   4342  1.1  christos {
   4343  1.1  christos   trace_input ("nop", OP_VOID, OP_VOID, OP_VOID);
   4344  1.1  christos 
   4345  1.1  christos #if 0
   4346  1.1  christos   ins_type_counters[ (int)State.ins_type ]--;	/* don't count nops as normal instructions */
   4347  1.1  christos   switch (State.ins_type)
   4348  1.1  christos     {
   4349  1.1  christos     default:
   4350  1.1  christos       ins_type_counters[ (int)INS_UNKNOWN ]++;
   4351  1.1  christos       break;
   4352  1.1  christos 
   4353  1.1  christos     }
   4354  1.6  christos   EXCEPTION (SIM_SIGTRAP);
   4355  1.1  christos #endif
   4356  1.6  christos   trace_output_void (sd);
   4357  1.1  christos }
   4358  1.1  christos 
   4359  1.1  christos 
   4360  1.1  christos /* orb.  */
   4361  1.1  christos void
   4362  1.6  christos OP_24_8 (SIM_DESC sd, SIM_CPU *cpu)
   4363  1.1  christos {
   4364  1.1  christos   uint8 tmp, a = (OP[0]) & 0xff, b = (GPR (OP[1])) & 0xff;
   4365  1.1  christos   trace_input ("orb", OP_CONSTANT4, OP_REG, OP_VOID);
   4366  1.1  christos   tmp = a | b;
   4367  1.1  christos   SET_GPR (OP[1], ((GPR (OP[1]) | tmp)));
   4368  1.6  christos   trace_output_16 (sd, tmp);
   4369  1.1  christos }
   4370  1.1  christos 
   4371  1.1  christos /* orb.  */
   4372  1.1  christos void
   4373  1.6  christos OP_24B_C (SIM_DESC sd, SIM_CPU *cpu)
   4374  1.1  christos {
   4375  1.1  christos   uint8 tmp, a = (OP[0]) & 0xff, b = (GPR (OP[1])) & 0xff;
   4376  1.1  christos   trace_input ("orb", OP_CONSTANT16, OP_REG, OP_VOID);
   4377  1.1  christos   tmp = a | b;
   4378  1.1  christos   SET_GPR (OP[1], ((GPR (OP[1]) | tmp)));
   4379  1.6  christos   trace_output_16 (sd, tmp);
   4380  1.1  christos }
   4381  1.1  christos 
   4382  1.1  christos /* orb.  */
   4383  1.1  christos void
   4384  1.6  christos OP_25_8 (SIM_DESC sd, SIM_CPU *cpu)
   4385  1.1  christos {
   4386  1.1  christos   uint8 tmp, a = (GPR (OP[0])) & 0xff, b = (GPR (OP[1])) & 0xff;
   4387  1.1  christos   trace_input ("orb", OP_REG, OP_REG, OP_VOID);
   4388  1.1  christos   tmp = a | b;
   4389  1.1  christos   SET_GPR (OP[1], ((GPR (OP[1]) | tmp)));
   4390  1.6  christos   trace_output_16 (sd, tmp);
   4391  1.1  christos }
   4392  1.1  christos 
   4393  1.1  christos /* orw.  */
   4394  1.1  christos void
   4395  1.6  christos OP_26_8 (SIM_DESC sd, SIM_CPU *cpu)
   4396  1.1  christos {
   4397  1.1  christos   uint16 tmp, a = (OP[0]), b = (GPR (OP[1]));
   4398  1.1  christos   trace_input ("orw", OP_CONSTANT4, OP_REG, OP_VOID);
   4399  1.1  christos   tmp = a | b;
   4400  1.1  christos   SET_GPR (OP[1], tmp);
   4401  1.6  christos   trace_output_16 (sd, tmp);
   4402  1.1  christos }
   4403  1.1  christos 
   4404  1.1  christos 
   4405  1.1  christos /* orw.  */
   4406  1.1  christos void
   4407  1.6  christos OP_26B_C (SIM_DESC sd, SIM_CPU *cpu)
   4408  1.1  christos {
   4409  1.1  christos   uint16 tmp, a = (OP[0]), b = (GPR (OP[1]));
   4410  1.1  christos   trace_input ("orw", OP_CONSTANT16, OP_REG, OP_VOID);
   4411  1.1  christos   tmp = a | b;
   4412  1.1  christos   SET_GPR (OP[1], tmp);
   4413  1.6  christos   trace_output_16 (sd, tmp);
   4414  1.1  christos }
   4415  1.1  christos 
   4416  1.1  christos /* orw.  */
   4417  1.1  christos void
   4418  1.6  christos OP_27_8 (SIM_DESC sd, SIM_CPU *cpu)
   4419  1.1  christos {
   4420  1.1  christos   uint16 tmp, a = (GPR (OP[0])), b = (GPR (OP[1]));
   4421  1.1  christos   trace_input ("orw", OP_REG, OP_REG, OP_VOID);
   4422  1.1  christos   tmp = a | b;
   4423  1.1  christos   SET_GPR (OP[1], tmp);
   4424  1.6  christos   trace_output_16 (sd, tmp);
   4425  1.1  christos }
   4426  1.1  christos 
   4427  1.1  christos 
   4428  1.1  christos /* lshb.  */
   4429  1.1  christos void
   4430  1.6  christos OP_13_9 (SIM_DESC sd, SIM_CPU *cpu)
   4431  1.1  christos {
   4432  1.1  christos   uint16 a = OP[0];
   4433  1.1  christos   uint16 tmp, b = (GPR (OP[1])) & 0xFF;
   4434  1.1  christos   trace_input ("lshb", OP_CONSTANT4, OP_REG, OP_VOID);
   4435  1.1  christos   /* A positive count specifies a shift to the left;
   4436  1.1  christos    * A negative count specifies a shift to the right. */
   4437  1.1  christos   if (sign_flag)
   4438  1.1  christos     tmp = b >> a;
   4439  1.1  christos   else
   4440  1.1  christos     tmp = b << a;
   4441  1.1  christos 
   4442  1.1  christos   sign_flag = 0; /* Reset sign_flag.  */
   4443  1.1  christos 
   4444  1.1  christos   SET_GPR (OP[1], ((tmp & 0xFF) | ((GPR (OP[1])) & 0xFF00)));
   4445  1.6  christos   trace_output_16 (sd, tmp);
   4446  1.1  christos }
   4447  1.1  christos 
   4448  1.1  christos /* lshb.  */
   4449  1.1  christos void
   4450  1.6  christos OP_44_8 (SIM_DESC sd, SIM_CPU *cpu)
   4451  1.1  christos {
   4452  1.1  christos   uint16 a = (GPR (OP[0])) & 0xff;
   4453  1.1  christos   uint16 tmp, b = (GPR (OP[1])) & 0xFF;
   4454  1.1  christos   trace_input ("lshb", OP_REG, OP_REG, OP_VOID);
   4455  1.1  christos   if (a & ((long)1 << 3))
   4456  1.1  christos     {
   4457  1.1  christos       sign_flag = 1;
   4458  1.1  christos       a = ~(a) + 1;
   4459  1.1  christos     }
   4460  1.1  christos   a = (unsigned int) (a & 0x7);
   4461  1.1  christos 
   4462  1.1  christos   /* A positive count specifies a shift to the left;
   4463  1.1  christos    * A negative count specifies a shift to the right. */
   4464  1.1  christos   if (sign_flag)
   4465  1.1  christos     tmp = b >> a;
   4466  1.1  christos   else
   4467  1.1  christos     tmp = b << a;
   4468  1.1  christos 
   4469  1.1  christos   sign_flag = 0; /* Reset sign_flag.  */
   4470  1.1  christos   SET_GPR (OP[1], ((tmp & 0xFF) | ((GPR (OP[1])) & 0xFF00)));
   4471  1.6  christos   trace_output_16 (sd, tmp);
   4472  1.1  christos }
   4473  1.1  christos 
   4474  1.1  christos /* lshw.  */
   4475  1.1  christos void
   4476  1.6  christos OP_46_8 (SIM_DESC sd, SIM_CPU *cpu)
   4477  1.1  christos {
   4478  1.1  christos   uint16 tmp, b = GPR (OP[1]);
   4479  1.1  christos   int16 a = GPR (OP[0]);
   4480  1.1  christos   trace_input ("lshw", OP_REG, OP_REG, OP_VOID);
   4481  1.1  christos   if (a & ((long)1 << 4))
   4482  1.1  christos     {
   4483  1.1  christos       sign_flag = 1;
   4484  1.1  christos       a = ~(a) + 1;
   4485  1.1  christos     }
   4486  1.1  christos   a = (unsigned int) (a & 0xf);
   4487  1.1  christos 
   4488  1.1  christos   /* A positive count specifies a shift to the left;
   4489  1.1  christos    * A negative count specifies a shift to the right. */
   4490  1.1  christos   if (sign_flag)
   4491  1.1  christos     tmp = b >> a;
   4492  1.1  christos   else
   4493  1.1  christos     tmp = b << a;
   4494  1.1  christos 
   4495  1.1  christos   sign_flag = 0; /* Reset sign_flag.  */
   4496  1.1  christos   SET_GPR (OP[1], (tmp & 0xffff));
   4497  1.6  christos   trace_output_16 (sd, tmp);
   4498  1.1  christos }
   4499  1.1  christos 
   4500  1.1  christos /* lshw.  */
   4501  1.1  christos void
   4502  1.6  christos OP_49_8 (SIM_DESC sd, SIM_CPU *cpu)
   4503  1.1  christos {
   4504  1.1  christos   uint16 tmp, b = GPR (OP[1]);
   4505  1.1  christos   uint16 a = OP[0];
   4506  1.1  christos   trace_input ("lshw", OP_CONSTANT5, OP_REG, OP_VOID);
   4507  1.1  christos   /* A positive count specifies a shift to the left;
   4508  1.1  christos    * A negative count specifies a shift to the right. */
   4509  1.1  christos   if (sign_flag)
   4510  1.1  christos     tmp = b >> a;
   4511  1.1  christos   else
   4512  1.1  christos     tmp = b << a;
   4513  1.1  christos 
   4514  1.1  christos   sign_flag = 0; /* Reset sign_flag.  */
   4515  1.1  christos   SET_GPR (OP[1], (tmp & 0xffff));
   4516  1.6  christos   trace_output_16 (sd, tmp);
   4517  1.1  christos }
   4518  1.1  christos 
   4519  1.1  christos /* lshd.  */
   4520  1.1  christos void
   4521  1.6  christos OP_25_7 (SIM_DESC sd, SIM_CPU *cpu)
   4522  1.1  christos {
   4523  1.1  christos   uint32 tmp, b = GPR32 (OP[1]);
   4524  1.1  christos   uint16 a = OP[0];
   4525  1.1  christos   trace_input ("lshd", OP_CONSTANT6, OP_REGP, OP_VOID);
   4526  1.1  christos   /* A positive count specifies a shift to the left;
   4527  1.1  christos    * A negative count specifies a shift to the right. */
   4528  1.1  christos   if (sign_flag)
   4529  1.1  christos     tmp = b >> a;
   4530  1.1  christos   else
   4531  1.1  christos     tmp = b << a;
   4532  1.1  christos 
   4533  1.1  christos   sign_flag = 0; /* Reset sign flag.  */
   4534  1.1  christos 
   4535  1.1  christos   SET_GPR32 (OP[1], tmp);
   4536  1.6  christos   trace_output_32 (sd, tmp);
   4537  1.1  christos }
   4538  1.1  christos 
   4539  1.1  christos /* lshd.  */
   4540  1.1  christos void
   4541  1.6  christos OP_47_8 (SIM_DESC sd, SIM_CPU *cpu)
   4542  1.1  christos {
   4543  1.1  christos   uint32 tmp, b = GPR32 (OP[1]);
   4544  1.1  christos   uint16 a = GPR (OP[0]);
   4545  1.1  christos   trace_input ("lshd", OP_REG, OP_REGP, OP_VOID);
   4546  1.1  christos   if (a & ((long)1 << 5))
   4547  1.1  christos     {
   4548  1.1  christos       sign_flag = 1;
   4549  1.1  christos       a = ~(a) + 1;
   4550  1.1  christos     }
   4551  1.1  christos   a = (unsigned int) (a & 0x1f);
   4552  1.1  christos   /* A positive count specifies a shift to the left;
   4553  1.1  christos    * A negative count specifies a shift to the right. */
   4554  1.1  christos   if (sign_flag)
   4555  1.1  christos     tmp = b >> a;
   4556  1.1  christos   else
   4557  1.1  christos     tmp = b << a;
   4558  1.1  christos 
   4559  1.1  christos   sign_flag = 0; /* Reset sign flag.  */
   4560  1.1  christos 
   4561  1.1  christos   SET_GPR32 (OP[1], tmp);
   4562  1.6  christos   trace_output_32 (sd, tmp);
   4563  1.1  christos }
   4564  1.1  christos 
   4565  1.1  christos /* ashub.  */
   4566  1.1  christos void
   4567  1.6  christos OP_80_9 (SIM_DESC sd, SIM_CPU *cpu)
   4568  1.1  christos {
   4569  1.1  christos   uint16 a = OP[0];
   4570  1.1  christos   int8 tmp, b = (GPR (OP[1])) & 0xFF;
   4571  1.1  christos   trace_input ("ashub", OP_CONSTANT4, OP_REG, OP_VOID);
   4572  1.1  christos   /* A positive count specifies a shift to the left;
   4573  1.1  christos    * A negative count specifies a shift to the right. */
   4574  1.1  christos   if (sign_flag)
   4575  1.1  christos     tmp = b >> a;
   4576  1.1  christos   else
   4577  1.1  christos     tmp = b << a;
   4578  1.1  christos 
   4579  1.1  christos   sign_flag = 0; /* Reset sign flag.  */
   4580  1.1  christos 
   4581  1.1  christos   SET_GPR (OP[1], ((tmp & 0xFF) | ((GPR (OP[1])) & 0xff00)));
   4582  1.6  christos   trace_output_16 (sd, tmp);
   4583  1.1  christos }
   4584  1.1  christos 
   4585  1.1  christos /* ashub.  */
   4586  1.1  christos void
   4587  1.6  christos OP_81_9 (SIM_DESC sd, SIM_CPU *cpu)
   4588  1.1  christos {
   4589  1.1  christos   uint16 a = OP[0];
   4590  1.1  christos   int8 tmp, b = (GPR (OP[1])) & 0xFF;
   4591  1.1  christos   trace_input ("ashub", OP_CONSTANT4, OP_REG, OP_VOID);
   4592  1.1  christos   /* A positive count specifies a shift to the left;
   4593  1.1  christos    * A negative count specifies a shift to the right. */
   4594  1.1  christos   if (sign_flag)
   4595  1.1  christos     tmp = b >> a;
   4596  1.1  christos   else
   4597  1.1  christos     tmp = b << a;
   4598  1.1  christos 
   4599  1.1  christos   sign_flag = 0; /* Reset sign flag.  */
   4600  1.1  christos 
   4601  1.1  christos   SET_GPR (OP[1], ((tmp & 0xFF) | ((GPR (OP[1])) & 0xFF00)));
   4602  1.6  christos   trace_output_16 (sd, tmp);
   4603  1.1  christos }
   4604  1.1  christos 
   4605  1.1  christos 
   4606  1.1  christos /* ashub.  */
   4607  1.1  christos void
   4608  1.6  christos OP_41_8 (SIM_DESC sd, SIM_CPU *cpu)
   4609  1.1  christos {
   4610  1.1  christos   int16 a = (GPR (OP[0]));
   4611  1.1  christos   int8 tmp, b = (GPR (OP[1])) & 0xFF;
   4612  1.1  christos   trace_input ("ashub", OP_REG, OP_REG, OP_VOID);
   4613  1.1  christos 
   4614  1.1  christos   if (a & ((long)1 << 3))
   4615  1.1  christos     {
   4616  1.1  christos       sign_flag = 1;
   4617  1.1  christos       a = ~(a) + 1;
   4618  1.1  christos     }
   4619  1.1  christos   a = (unsigned int) (a & 0x7);
   4620  1.1  christos 
   4621  1.1  christos   /* A positive count specifies a shift to the left;
   4622  1.1  christos    * A negative count specifies a shift to the right. */
   4623  1.1  christos   if (sign_flag)
   4624  1.1  christos     tmp = b >> a;
   4625  1.1  christos   else
   4626  1.1  christos     tmp = b << a;
   4627  1.1  christos 
   4628  1.1  christos   sign_flag = 0; /* Reset sign flag.  */
   4629  1.1  christos 
   4630  1.1  christos   SET_GPR (OP[1], ((tmp & 0xFF) | ((GPR (OP[1])) & 0xFF00)));
   4631  1.6  christos   trace_output_16 (sd, tmp);
   4632  1.1  christos }
   4633  1.1  christos 
   4634  1.1  christos 
   4635  1.1  christos /* ashuw.  */
   4636  1.1  christos void
   4637  1.6  christos OP_42_8 (SIM_DESC sd, SIM_CPU *cpu)
   4638  1.1  christos {
   4639  1.1  christos   int16 tmp, b = GPR (OP[1]);
   4640  1.1  christos   uint16 a = OP[0];
   4641  1.1  christos   trace_input ("ashuw", OP_CONSTANT5, OP_REG, OP_VOID);
   4642  1.1  christos   /* A positive count specifies a shift to the left;
   4643  1.1  christos    * A negative count specifies a shift to the right. */
   4644  1.1  christos   if (sign_flag)
   4645  1.1  christos     tmp = b >> a;
   4646  1.1  christos   else
   4647  1.1  christos     tmp = b << a;
   4648  1.1  christos 
   4649  1.1  christos   sign_flag = 0; /* Reset sign flag.  */
   4650  1.1  christos 
   4651  1.1  christos   SET_GPR (OP[1], (tmp & 0xffff));
   4652  1.6  christos   trace_output_16 (sd, tmp);
   4653  1.1  christos }
   4654  1.1  christos 
   4655  1.1  christos /* ashuw.  */
   4656  1.1  christos void
   4657  1.6  christos OP_43_8 (SIM_DESC sd, SIM_CPU *cpu)
   4658  1.1  christos {
   4659  1.1  christos   int16 tmp, b = GPR (OP[1]);
   4660  1.1  christos   uint16 a = OP[0];
   4661  1.1  christos   trace_input ("ashuw", OP_CONSTANT5, OP_REG, OP_VOID);
   4662  1.1  christos   /* A positive count specifies a shift to the left;
   4663  1.1  christos    * A negative count specifies a shift to the right. */
   4664  1.1  christos   if (sign_flag)
   4665  1.1  christos     tmp = b >> a;
   4666  1.1  christos   else
   4667  1.1  christos     tmp = b << a;
   4668  1.1  christos 
   4669  1.1  christos   sign_flag = 0; /* Reset sign flag.  */
   4670  1.1  christos   SET_GPR (OP[1], (tmp & 0xffff));
   4671  1.6  christos   trace_output_16 (sd, tmp);
   4672  1.1  christos }
   4673  1.1  christos 
   4674  1.1  christos /* ashuw.  */
   4675  1.1  christos void
   4676  1.6  christos OP_45_8 (SIM_DESC sd, SIM_CPU *cpu)
   4677  1.1  christos {
   4678  1.1  christos   int16 tmp;
   4679  1.1  christos   int16 a = GPR (OP[0]), b = GPR (OP[1]);
   4680  1.1  christos   trace_input ("ashuw", OP_REG, OP_REG, OP_VOID);
   4681  1.1  christos 
   4682  1.1  christos   if (a & ((long)1 << 4))
   4683  1.1  christos     {
   4684  1.1  christos       sign_flag = 1;
   4685  1.1  christos       a = ~(a) + 1;
   4686  1.1  christos     }
   4687  1.1  christos   a = (unsigned int) (a & 0xf);
   4688  1.1  christos   /* A positive count specifies a shift to the left;
   4689  1.1  christos    * A negative count specifies a shift to the right. */
   4690  1.1  christos 
   4691  1.1  christos   if (sign_flag)
   4692  1.1  christos     tmp = b >> a;
   4693  1.1  christos   else
   4694  1.1  christos     tmp = b << a;
   4695  1.1  christos 
   4696  1.1  christos   sign_flag = 0; /* Reset sign flag.  */
   4697  1.1  christos   SET_GPR (OP[1], (tmp & 0xffff));
   4698  1.6  christos   trace_output_16 (sd, tmp);
   4699  1.1  christos }
   4700  1.1  christos 
   4701  1.1  christos /* ashud.  */
   4702  1.1  christos void
   4703  1.6  christos OP_26_7 (SIM_DESC sd, SIM_CPU *cpu)
   4704  1.1  christos {
   4705  1.1  christos   int32 tmp,b = GPR32 (OP[1]);
   4706  1.1  christos   uint32 a = OP[0];
   4707  1.1  christos   trace_input ("ashud", OP_CONSTANT6, OP_REGP, OP_VOID);
   4708  1.1  christos   /* A positive count specifies a shift to the left;
   4709  1.1  christos    * A negative count specifies a shift to the right. */
   4710  1.1  christos   if (sign_flag)
   4711  1.1  christos     tmp = b >> a;
   4712  1.1  christos   else
   4713  1.1  christos     tmp = b << a;
   4714  1.1  christos 
   4715  1.1  christos   sign_flag = 0; /* Reset sign flag.  */
   4716  1.1  christos   SET_GPR32 (OP[1], tmp);
   4717  1.6  christos   trace_output_32 (sd, tmp);
   4718  1.1  christos }
   4719  1.1  christos 
   4720  1.1  christos /* ashud.  */
   4721  1.1  christos void
   4722  1.6  christos OP_27_7 (SIM_DESC sd, SIM_CPU *cpu)
   4723  1.1  christos {
   4724  1.1  christos   int32 tmp;
   4725  1.1  christos   int32 a = OP[0], b = GPR32 (OP[1]);
   4726  1.1  christos   trace_input ("ashud", OP_CONSTANT6, OP_REGP, OP_VOID);
   4727  1.1  christos   /* A positive count specifies a shift to the left;
   4728  1.1  christos    * A negative count specifies a shift to the right. */
   4729  1.1  christos   if (sign_flag)
   4730  1.1  christos     tmp = b >> a;
   4731  1.1  christos   else
   4732  1.1  christos     tmp = b << a;
   4733  1.1  christos 
   4734  1.1  christos   sign_flag = 0; /* Reset sign flag.  */
   4735  1.1  christos   SET_GPR32 (OP[1], tmp);
   4736  1.6  christos   trace_output_32 (sd, tmp);
   4737  1.1  christos }
   4738  1.1  christos 
   4739  1.1  christos /* ashud.  */
   4740  1.1  christos void
   4741  1.6  christos OP_48_8 (SIM_DESC sd, SIM_CPU *cpu)
   4742  1.1  christos {
   4743  1.1  christos   int32 tmp;
   4744  1.1  christos   int32 a = GPR32 (OP[0]), b = GPR32 (OP[1]);
   4745  1.1  christos   trace_input ("ashud", OP_REGP, OP_REGP, OP_VOID);
   4746  1.1  christos 
   4747  1.1  christos   if (a & ((long)1 << 5))
   4748  1.1  christos     {
   4749  1.1  christos       sign_flag = 1;
   4750  1.1  christos       a = ~(a) + 1;
   4751  1.1  christos     }
   4752  1.1  christos   a = (unsigned int) (a & 0x1f);
   4753  1.1  christos   /* A positive count specifies a shift to the left;
   4754  1.1  christos    * A negative count specifies a shift to the right. */
   4755  1.1  christos   if (sign_flag)
   4756  1.1  christos     tmp = b >> a;
   4757  1.1  christos   else
   4758  1.1  christos     tmp = b << a;
   4759  1.1  christos 
   4760  1.1  christos   sign_flag = 0; /* Reset sign flag.  */
   4761  1.1  christos   SET_GPR32 (OP[1], tmp);
   4762  1.6  christos   trace_output_32 (sd, tmp);
   4763  1.1  christos }
   4764  1.1  christos 
   4765  1.1  christos 
   4766  1.1  christos /* storm.  */
   4767  1.1  christos void
   4768  1.6  christos OP_16_D (SIM_DESC sd, SIM_CPU *cpu)
   4769  1.1  christos {
   4770  1.1  christos   uint32 addr = GPR (1);
   4771  1.1  christos   uint16 count = OP[0], reg = 2;
   4772  1.1  christos   trace_input ("storm", OP_CONSTANT4, OP_VOID, OP_VOID);
   4773  1.1  christos   if ((addr & 1))
   4774  1.1  christos     {
   4775  1.6  christos       trace_output_void (sd);
   4776  1.6  christos       EXCEPTION (SIM_SIGBUS);
   4777  1.1  christos     }
   4778  1.1  christos 
   4779  1.1  christos   while (count)
   4780  1.1  christos     {
   4781  1.1  christos       SW (addr, (GPR (reg)));
   4782  1.1  christos       addr +=2;
   4783  1.1  christos       --count;
   4784  1.1  christos       reg++;
   4785  1.1  christos       if (reg == 6) reg = 8;
   4786  1.1  christos     };
   4787  1.1  christos 
   4788  1.1  christos   SET_GPR (1, addr);
   4789  1.1  christos 
   4790  1.6  christos   trace_output_void (sd);
   4791  1.1  christos }
   4792  1.1  christos 
   4793  1.1  christos 
   4794  1.1  christos /* stormp.  */
   4795  1.1  christos void
   4796  1.6  christos OP_17_D (SIM_DESC sd, SIM_CPU *cpu)
   4797  1.1  christos {
   4798  1.1  christos   uint32 addr = GPR32 (6);
   4799  1.1  christos   uint16 count = OP[0], reg = 2;
   4800  1.1  christos   trace_input ("stormp", OP_CONSTANT4, OP_VOID, OP_VOID);
   4801  1.1  christos   if ((addr & 1))
   4802  1.1  christos     {
   4803  1.6  christos       trace_output_void (sd);
   4804  1.6  christos       EXCEPTION (SIM_SIGBUS);
   4805  1.1  christos     }
   4806  1.1  christos 
   4807  1.1  christos   while (count)
   4808  1.1  christos     {
   4809  1.1  christos       SW (addr, (GPR (reg)));
   4810  1.1  christos       addr +=2;
   4811  1.1  christos       --count;
   4812  1.1  christos       reg++;
   4813  1.1  christos       if (reg == 6) reg = 8;
   4814  1.1  christos     };
   4815  1.1  christos 
   4816  1.1  christos   SET_GPR32 (6, addr);
   4817  1.6  christos   trace_output_void (sd);
   4818  1.1  christos }
   4819  1.1  christos 
   4820  1.1  christos /* subb.  */
   4821  1.1  christos void
   4822  1.6  christos OP_38_8 (SIM_DESC sd, SIM_CPU *cpu)
   4823  1.1  christos {
   4824  1.1  christos   uint8 a = OP[0];
   4825  1.1  christos   uint8 b = (GPR (OP[1])) & 0xff;
   4826  1.1  christos   uint16 tmp = (~a + 1 + b) & 0xff;
   4827  1.1  christos   trace_input ("subb", OP_CONSTANT4, OP_REG, OP_VOID);
   4828  1.1  christos   /* see ../common/sim-alu.h for a more extensive discussion on how to
   4829  1.1  christos      compute the carry/overflow bits. */
   4830  1.1  christos   SET_PSR_C (tmp > 0xff);
   4831  1.1  christos   SET_PSR_F (((a & 0x80) != (b & 0x80)) && ((b & 0x80) != (tmp & 0x80)));
   4832  1.1  christos   SET_GPR (OP[1], (tmp | ((GPR (OP[1])) & 0xff00)));
   4833  1.6  christos   trace_output_16 (sd, tmp);
   4834  1.1  christos }
   4835  1.1  christos 
   4836  1.1  christos /* subb.  */
   4837  1.1  christos void
   4838  1.6  christos OP_38B_C (SIM_DESC sd, SIM_CPU *cpu)
   4839  1.1  christos {
   4840  1.1  christos   uint8 a = OP[0] & 0xFF;
   4841  1.1  christos   uint8 b = (GPR (OP[1])) & 0xFF;
   4842  1.1  christos   uint16 tmp = (~a + 1 + b) & 0xFF;
   4843  1.1  christos   trace_input ("subb", OP_CONSTANT16, OP_REG, OP_VOID);
   4844  1.1  christos   /* see ../common/sim-alu.h for a more extensive discussion on how to
   4845  1.1  christos      compute the carry/overflow bits. */
   4846  1.1  christos   SET_PSR_C (tmp > 0xff);
   4847  1.1  christos   SET_PSR_F (((a & 0x80) != (b & 0x80)) && ((b & 0x80) != (tmp & 0x80)));
   4848  1.1  christos   SET_GPR (OP[1], (tmp | ((GPR (OP[1])) & 0xff00)));
   4849  1.6  christos   trace_output_16 (sd, tmp);
   4850  1.1  christos }
   4851  1.1  christos 
   4852  1.1  christos /* subb.  */
   4853  1.1  christos void
   4854  1.6  christos OP_39_8 (SIM_DESC sd, SIM_CPU *cpu)
   4855  1.1  christos {
   4856  1.1  christos   uint8 a = (GPR (OP[0])) & 0xFF;
   4857  1.1  christos   uint8 b = (GPR (OP[1])) & 0xFF;
   4858  1.1  christos   uint16 tmp = (~a + 1 + b) & 0xff;
   4859  1.1  christos   trace_input ("subb", OP_REG, OP_REG, OP_VOID);
   4860  1.1  christos   /* see ../common/sim-alu.h for a more extensive discussion on how to
   4861  1.1  christos      compute the carry/overflow bits. */
   4862  1.1  christos   SET_PSR_C (tmp > 0xff);
   4863  1.1  christos   SET_PSR_F (((a & 0x80) != (b & 0x80)) && ((b & 0x80) != (tmp & 0x80)));
   4864  1.1  christos   SET_GPR (OP[1], (tmp | ((GPR (OP[1])) & 0xff00)));
   4865  1.6  christos   trace_output_16 (sd, tmp);
   4866  1.1  christos }
   4867  1.1  christos 
   4868  1.1  christos /* subw.  */
   4869  1.1  christos void
   4870  1.6  christos OP_3A_8 (SIM_DESC sd, SIM_CPU *cpu)
   4871  1.1  christos {
   4872  1.1  christos   uint16 a = OP[0];
   4873  1.1  christos   uint16 b = GPR (OP[1]);
   4874  1.1  christos   uint16 tmp = (~a + 1 + b);
   4875  1.1  christos   trace_input ("subw", OP_CONSTANT4, OP_REG, OP_VOID);
   4876  1.1  christos   /* see ../common/sim-alu.h for a more extensive discussion on how to
   4877  1.1  christos      compute the carry/overflow bits. */
   4878  1.1  christos   SET_PSR_C (tmp > 0xffff);
   4879  1.1  christos   SET_PSR_F (((a & 0x8000) != (b & 0x8000)) && ((b & 0x8000) != (tmp & 0x8000)));
   4880  1.1  christos   SET_GPR (OP[1], tmp);
   4881  1.6  christos   trace_output_16 (sd, tmp);
   4882  1.1  christos }
   4883  1.1  christos 
   4884  1.1  christos /* subw.  */
   4885  1.1  christos void
   4886  1.6  christos OP_3AB_C (SIM_DESC sd, SIM_CPU *cpu)
   4887  1.1  christos {
   4888  1.1  christos   uint16 a = OP[0];
   4889  1.1  christos   uint16 b = GPR (OP[1]);
   4890  1.1  christos   uint32 tmp = (~a + 1 + b);
   4891  1.1  christos   trace_input ("subw", OP_CONSTANT16, OP_REG, OP_VOID);
   4892  1.1  christos   /* see ../common/sim-alu.h for a more extensive discussion on how to
   4893  1.1  christos      compute the carry/overflow bits. */
   4894  1.1  christos   SET_PSR_C (tmp > 0xffff);
   4895  1.1  christos   SET_PSR_F (((a & 0x8000) != (b & 0x8000)) && ((b & 0x8000) != (tmp & 0x8000)));
   4896  1.1  christos   SET_GPR (OP[1], tmp & 0xffff);
   4897  1.6  christos   trace_output_16 (sd, tmp);
   4898  1.1  christos }
   4899  1.1  christos 
   4900  1.1  christos /* subw.  */
   4901  1.1  christos void
   4902  1.6  christos OP_3B_8 (SIM_DESC sd, SIM_CPU *cpu)
   4903  1.1  christos {
   4904  1.1  christos   uint16 a = GPR (OP[0]);
   4905  1.1  christos   uint16 b = GPR (OP[1]);
   4906  1.1  christos   uint32 tmp = (~a + 1 + b);
   4907  1.1  christos   trace_input ("subw", OP_REG, OP_REG, OP_VOID);
   4908  1.1  christos   /* see ../common/sim-alu.h for a more extensive discussion on how to
   4909  1.1  christos      compute the carry/overflow bits. */
   4910  1.1  christos   SET_PSR_C (tmp > 0xffff);
   4911  1.1  christos   SET_PSR_F (((a & 0x8000) != (b & 0x8000)) && ((b & 0x8000) != (tmp & 0x8000)));
   4912  1.1  christos   SET_GPR (OP[1], tmp & 0xffff);
   4913  1.6  christos   trace_output_16 (sd, tmp);
   4914  1.1  christos }
   4915  1.1  christos 
   4916  1.1  christos /* subcb.  */
   4917  1.1  christos void
   4918  1.6  christos OP_3C_8 (SIM_DESC sd, SIM_CPU *cpu)
   4919  1.1  christos {
   4920  1.1  christos   uint8 a = OP[0];
   4921  1.1  christos   uint8 b = (GPR (OP[1])) & 0xff;
   4922  1.1  christos   //uint16 tmp1 = a + 1;
   4923  1.1  christos   uint16 tmp1 = a + (PSR_C);
   4924  1.1  christos   uint16 tmp = (~tmp1 + 1 + b);
   4925  1.1  christos   trace_input ("subcb", OP_CONSTANT4, OP_REG, OP_VOID);
   4926  1.1  christos   /* see ../common/sim-alu.h for a more extensive discussion on how to
   4927  1.1  christos      compute the carry/overflow bits. */
   4928  1.1  christos   SET_PSR_C (tmp > 0xff);
   4929  1.1  christos   SET_PSR_F (((a & 0x80) != (b & 0x80)) && ((b & 0x80) != (tmp & 0x80)));
   4930  1.1  christos   SET_GPR (OP[1], tmp);
   4931  1.6  christos   trace_output_16 (sd, tmp);
   4932  1.1  christos }
   4933  1.1  christos 
   4934  1.1  christos /* subcb.  */
   4935  1.1  christos void
   4936  1.6  christos OP_3CB_C (SIM_DESC sd, SIM_CPU *cpu)
   4937  1.1  christos {
   4938  1.1  christos   uint16 a = OP[0];
   4939  1.1  christos   uint16 b = (GPR (OP[1])) & 0xff;
   4940  1.1  christos   //uint16 tmp1 = a + 1;
   4941  1.1  christos   uint16 tmp1 = a + (PSR_C);
   4942  1.1  christos   uint16 tmp = (~tmp1 + 1 + b);
   4943  1.1  christos   trace_input ("subcb", OP_CONSTANT16, OP_REG, OP_VOID);
   4944  1.1  christos   /* see ../common/sim-alu.h for a more extensive discussion on how to
   4945  1.1  christos      compute the carry/overflow bits. */
   4946  1.1  christos   SET_PSR_C (tmp > 0xff);
   4947  1.1  christos   SET_PSR_F (((a & 0x80) != (b & 0x80)) && ((b & 0x80) != (tmp & 0x80)));
   4948  1.1  christos   SET_GPR (OP[1], tmp);
   4949  1.6  christos   trace_output_16 (sd, tmp);
   4950  1.1  christos }
   4951  1.1  christos 
   4952  1.1  christos /* subcb.  */
   4953  1.1  christos void
   4954  1.6  christos OP_3D_8 (SIM_DESC sd, SIM_CPU *cpu)
   4955  1.1  christos {
   4956  1.1  christos   uint16 a = (GPR (OP[0])) & 0xff;
   4957  1.1  christos   uint16 b = (GPR (OP[1])) & 0xff;
   4958  1.1  christos   uint16 tmp1 = a + (PSR_C);
   4959  1.1  christos   uint16 tmp = (~tmp1 + 1 + b);
   4960  1.1  christos   trace_input ("subcb", OP_REG, OP_REG, OP_VOID);
   4961  1.1  christos   /* see ../common/sim-alu.h for a more extensive discussion on how to
   4962  1.1  christos      compute the carry/overflow bits. */
   4963  1.1  christos   SET_PSR_C (tmp > 0xff);
   4964  1.1  christos   SET_PSR_F (((a & 0x80) != (b & 0x80)) && ((b & 0x80) != (tmp & 0x80)));
   4965  1.1  christos   SET_GPR (OP[1], tmp);
   4966  1.6  christos   trace_output_16 (sd, tmp);
   4967  1.1  christos }
   4968  1.1  christos 
   4969  1.1  christos /* subcw.  */
   4970  1.1  christos void
   4971  1.6  christos OP_3E_8 (SIM_DESC sd, SIM_CPU *cpu)
   4972  1.1  christos {
   4973  1.1  christos   uint16 a = OP[0], b = (GPR (OP[1]));
   4974  1.1  christos   uint16 tmp1 = a + (PSR_C);
   4975  1.1  christos   uint16 tmp = (~tmp1 + 1  + b);
   4976  1.1  christos   trace_input ("subcw", OP_CONSTANT4, OP_REG, OP_VOID);
   4977  1.1  christos   /* see ../common/sim-alu.h for a more extensive discussion on how to
   4978  1.1  christos      compute the carry/overflow bits. */
   4979  1.1  christos   SET_PSR_C (tmp > 0xffff);
   4980  1.1  christos   SET_PSR_F (((a & 0x8000) != (b & 0x8000)) && ((b & 0x8000) != (tmp & 0x8000)));
   4981  1.1  christos   SET_GPR (OP[1], tmp);
   4982  1.6  christos   trace_output_16 (sd, tmp);
   4983  1.1  christos }
   4984  1.1  christos 
   4985  1.1  christos /* subcw.  */
   4986  1.1  christos void
   4987  1.6  christos OP_3EB_C (SIM_DESC sd, SIM_CPU *cpu)
   4988  1.1  christos {
   4989  1.1  christos   int16 a = OP[0];
   4990  1.1  christos   uint16 b = GPR (OP[1]);
   4991  1.1  christos   uint16 tmp1 = a + (PSR_C);
   4992  1.1  christos   uint16 tmp = (~tmp1 + 1  + b);
   4993  1.1  christos   trace_input ("subcw", OP_CONSTANT16, OP_REG, OP_VOID);
   4994  1.1  christos   /* see ../common/sim-alu.h for a more extensive discussion on how to
   4995  1.1  christos      compute the carry/overflow bits. */
   4996  1.1  christos   SET_PSR_C (tmp > 0xffff);
   4997  1.1  christos   SET_PSR_F (((a & 0x8000) != (b & 0x8000)) && ((b & 0x8000) != (tmp & 0x8000)));
   4998  1.1  christos   SET_GPR (OP[1], tmp);
   4999  1.6  christos   trace_output_16 (sd, tmp);
   5000  1.1  christos }
   5001  1.1  christos 
   5002  1.1  christos /* subcw.  */
   5003  1.1  christos void
   5004  1.6  christos OP_3F_8 (SIM_DESC sd, SIM_CPU *cpu)
   5005  1.1  christos {
   5006  1.1  christos   uint16 a = (GPR (OP[0])), b = (GPR (OP[1]));
   5007  1.1  christos   uint16 tmp1 = a + (PSR_C);
   5008  1.1  christos   uint16 tmp = (~tmp1 + 1  + b);
   5009  1.1  christos   trace_input ("subcw", OP_REG, OP_REG, OP_VOID);
   5010  1.1  christos   /* see ../common/sim-alu.h for a more extensive discussion on how to
   5011  1.1  christos      compute the carry/overflow bits. */
   5012  1.1  christos   SET_PSR_C (tmp > 0xffff);
   5013  1.1  christos   SET_PSR_F (((a & 0x8000) != (b & 0x8000)) && ((b & 0x8000) != (tmp & 0x8000)));
   5014  1.1  christos   SET_GPR (OP[1], tmp);
   5015  1.6  christos   trace_output_16 (sd, tmp);
   5016  1.1  christos }
   5017  1.1  christos 
   5018  1.1  christos /* subd.  */
   5019  1.1  christos void
   5020  1.6  christos OP_3_C (SIM_DESC sd, SIM_CPU *cpu)
   5021  1.1  christos {
   5022  1.1  christos   int32 a = OP[0];
   5023  1.1  christos   uint32 b = GPR32 (OP[1]);
   5024  1.1  christos   uint32 tmp = (~a + 1 + b);
   5025  1.1  christos   trace_input ("subd", OP_CONSTANT32, OP_REGP, OP_VOID);
   5026  1.1  christos   /* see ../common/sim-alu.h for a more extensive discussion on how to
   5027  1.1  christos      compute the carry/overflow bits. */
   5028  1.1  christos   SET_PSR_C (tmp > 0xffffffff);
   5029  1.1  christos   SET_PSR_F (((a & 0x80000000) != (b & 0x80000000)) &&
   5030  1.1  christos 	     ((b & 0x80000000) != (tmp & 0x80000000)));
   5031  1.1  christos   SET_GPR32 (OP[1], tmp);
   5032  1.6  christos   trace_output_32 (sd, tmp);
   5033  1.1  christos }
   5034  1.1  christos 
   5035  1.1  christos /* subd.  */
   5036  1.1  christos void
   5037  1.6  christos OP_14C_14 (SIM_DESC sd, SIM_CPU *cpu)
   5038  1.1  christos {
   5039  1.1  christos   uint32 a = GPR32 (OP[0]);
   5040  1.1  christos   uint32 b = GPR32 (OP[1]);
   5041  1.1  christos   uint32 tmp = (~a + 1 + b);
   5042  1.1  christos   trace_input ("subd", OP_REGP, OP_REGP, OP_VOID);
   5043  1.1  christos   /* see ../common/sim-alu.h for a more extensive discussion on how to
   5044  1.1  christos      compute the carry/overflow bits. */
   5045  1.1  christos   SET_PSR_C (tmp > 0xffffffff);
   5046  1.1  christos   SET_PSR_F (((a & 0x80000000) != (b & 0x80000000)) &&
   5047  1.1  christos 	     ((b & 0x80000000) != (tmp & 0x80000000)));
   5048  1.1  christos   SET_GPR32 (OP[1], tmp);
   5049  1.6  christos   trace_output_32 (sd, tmp);
   5050  1.1  christos }
   5051  1.1  christos 
   5052  1.1  christos /* excp.  */
   5053  1.1  christos void
   5054  1.6  christos OP_C_C (SIM_DESC sd, SIM_CPU *cpu)
   5055  1.1  christos {
   5056  1.6  christos   host_callback *cb = STATE_CALLBACK (sd);
   5057  1.1  christos   uint32 tmp;
   5058  1.1  christos   uint16 a;
   5059  1.1  christos   trace_input ("excp", OP_CONSTANT4, OP_VOID, OP_VOID);
   5060  1.1  christos   switch (OP[0])
   5061  1.1  christos     {
   5062  1.1  christos     default:
   5063  1.1  christos #if (DEBUG & DEBUG_TRAP) == 0
   5064  1.1  christos       {
   5065  1.1  christos #if 0
   5066  1.1  christos 	uint16 vec = OP[0] + TRAP_VECTOR_START;
   5067  1.1  christos 	SET_BPC (PC + 1);
   5068  1.1  christos 	SET_BPSR (PSR);
   5069  1.1  christos 	SET_PSR (PSR & PSR_SM_BIT);
   5070  1.1  christos 	JMP (vec);
   5071  1.1  christos 	break;
   5072  1.1  christos #endif
   5073  1.1  christos       }
   5074  1.1  christos #else			/* if debugging use trap to print registers */
   5075  1.1  christos       {
   5076  1.1  christos 	int i;
   5077  1.1  christos 	static int first_time = 1;
   5078  1.1  christos 
   5079  1.1  christos 	if (first_time)
   5080  1.1  christos 	  {
   5081  1.1  christos 	    first_time = 0;
   5082  1.6  christos 	    sim_io_printf (sd, "Trap  #     PC ");
   5083  1.1  christos 	    for (i = 0; i < 16; i++)
   5084  1.6  christos 	      sim_io_printf (sd, "  %sr%d", (i > 9) ? "" : " ", i);
   5085  1.6  christos 	    sim_io_printf (sd, "         a0         a1 f0 f1 c\n");
   5086  1.1  christos 	  }
   5087  1.1  christos 
   5088  1.6  christos 	sim_io_printf (sd, "Trap %2d 0x%.4x:", (int)OP[0], (int)PC);
   5089  1.1  christos 
   5090  1.1  christos 	for (i = 0; i < 16; i++)
   5091  1.6  christos 	  sim_io_printf (sd, " %.4x", (int) GPR (i));
   5092  1.1  christos 
   5093  1.1  christos 	for (i = 0; i < 2; i++)
   5094  1.6  christos 	  sim_io_printf (sd, " %.2x%.8lx",
   5095  1.1  christos 					     ((int)(ACC (i) >> 32) & 0xff),
   5096  1.1  christos 					     ((unsigned long) ACC (i)) & 0xffffffff);
   5097  1.1  christos 
   5098  1.6  christos 	sim_io_printf (sd, "  %d  %d %d\n",
   5099  1.1  christos 					   PSR_F != 0, PSR_F != 0, PSR_C != 0);
   5100  1.6  christos 	sim_io_flush_stdout (sd);
   5101  1.1  christos 	break;
   5102  1.1  christos       }
   5103  1.1  christos #endif
   5104  1.1  christos     case 8:			/* new system call trap */
   5105  1.1  christos       /* Trap 8 is used for simulating low-level I/O */
   5106  1.1  christos       {
   5107  1.1  christos 	unsigned32 result = 0;
   5108  1.1  christos 	errno = 0;
   5109  1.1  christos 
   5110  1.1  christos /* Registers passed to trap 0.  */
   5111  1.1  christos 
   5112  1.1  christos #define FUNC   GPR (0)	/* function number.  */
   5113  1.1  christos #define PARM1  GPR (2)	/* optional parm 1.  */
   5114  1.1  christos #define PARM2  GPR (3)	/* optional parm 2.  */
   5115  1.1  christos #define PARM3  GPR (4)	/* optional parm 3.  */
   5116  1.1  christos #define PARM4  GPR (5)	/* optional parm 4.  */
   5117  1.1  christos 
   5118  1.1  christos /* Registers set by trap 0 */
   5119  1.1  christos 
   5120  1.1  christos #define RETVAL(X)   do { result = (0xffff & (X));SET_GPR (0, result);} while (0)
   5121  1.1  christos #define RETVAL32(X) do { result = (X); SET_GPR32 (0, result);} while (0)
   5122  1.1  christos #define RETERR(X) SET_GPR (4, (X))		/* return error code.  */
   5123  1.1  christos 
   5124  1.1  christos /* Turn a pointer in a register into a pointer into real memory. */
   5125  1.1  christos 
   5126  1.6  christos #define MEMPTR(x) sim_core_trans_addr (sd, cpu, read_map, x)
   5127  1.1  christos 
   5128  1.1  christos 	switch (FUNC)
   5129  1.1  christos 	  {
   5130  1.1  christos #if !defined(__GO32__) && !defined(_WIN32)
   5131  1.1  christos #ifdef TARGET_SYS_fork
   5132  1.1  christos 	  case TARGET_SYS_fork:
   5133  1.1  christos 	    trace_input ("<fork>", OP_VOID, OP_VOID, OP_VOID);
   5134  1.1  christos 	    RETVAL (fork ());
   5135  1.6  christos 	    trace_output_16 (sd, result);
   5136  1.1  christos 	    break;
   5137  1.1  christos #endif
   5138  1.1  christos 
   5139  1.1  christos #define getpid() 47
   5140  1.1  christos 	  case TARGET_SYS_getpid:
   5141  1.1  christos 	    trace_input ("<getpid>", OP_VOID, OP_VOID, OP_VOID);
   5142  1.1  christos 	    RETVAL (getpid ());
   5143  1.6  christos 	    trace_output_16 (sd, result);
   5144  1.1  christos 	    break;
   5145  1.1  christos 
   5146  1.1  christos 	  case TARGET_SYS_kill:
   5147  1.1  christos 	    trace_input ("<kill>", OP_REG, OP_REG, OP_VOID);
   5148  1.1  christos 	    if (PARM1 == getpid ())
   5149  1.1  christos 	      {
   5150  1.6  christos 		trace_output_void (sd);
   5151  1.6  christos 		EXCEPTION (PARM2);
   5152  1.1  christos 	      }
   5153  1.1  christos 	    else
   5154  1.1  christos 	      {
   5155  1.1  christos 		int os_sig = -1;
   5156  1.1  christos 		switch (PARM2)
   5157  1.1  christos 		  {
   5158  1.1  christos #ifdef SIGHUP
   5159  1.1  christos 		  case 1: os_sig = SIGHUP;	break;
   5160  1.1  christos #endif
   5161  1.1  christos #ifdef SIGINT
   5162  1.1  christos 		  case 2: os_sig = SIGINT;	break;
   5163  1.1  christos #endif
   5164  1.1  christos #ifdef SIGQUIT
   5165  1.1  christos 		  case 3: os_sig = SIGQUIT;	break;
   5166  1.1  christos #endif
   5167  1.1  christos #ifdef SIGILL
   5168  1.1  christos 		  case 4: os_sig = SIGILL;	break;
   5169  1.1  christos #endif
   5170  1.1  christos #ifdef SIGTRAP
   5171  1.1  christos 		  case 5: os_sig = SIGTRAP;	break;
   5172  1.1  christos #endif
   5173  1.1  christos #ifdef SIGABRT
   5174  1.1  christos 		  case 6: os_sig = SIGABRT;	break;
   5175  1.1  christos #elif defined(SIGIOT)
   5176  1.1  christos 		  case 6: os_sig = SIGIOT;	break;
   5177  1.1  christos #endif
   5178  1.1  christos #ifdef SIGEMT
   5179  1.1  christos 		  case 7: os_sig = SIGEMT;	break;
   5180  1.1  christos #endif
   5181  1.1  christos #ifdef SIGFPE
   5182  1.1  christos 		  case 8: os_sig = SIGFPE;	break;
   5183  1.1  christos #endif
   5184  1.1  christos #ifdef SIGKILL
   5185  1.1  christos 		  case 9: os_sig = SIGKILL;	break;
   5186  1.1  christos #endif
   5187  1.1  christos #ifdef SIGBUS
   5188  1.1  christos 		  case 10: os_sig = SIGBUS;	break;
   5189  1.1  christos #endif
   5190  1.1  christos #ifdef SIGSEGV
   5191  1.1  christos 		  case 11: os_sig = SIGSEGV;	break;
   5192  1.1  christos #endif
   5193  1.1  christos #ifdef SIGSYS
   5194  1.1  christos 		  case 12: os_sig = SIGSYS;	break;
   5195  1.1  christos #endif
   5196  1.1  christos #ifdef SIGPIPE
   5197  1.1  christos 		  case 13: os_sig = SIGPIPE;	break;
   5198  1.1  christos #endif
   5199  1.1  christos #ifdef SIGALRM
   5200  1.1  christos 		  case 14: os_sig = SIGALRM;	break;
   5201  1.1  christos #endif
   5202  1.1  christos #ifdef SIGTERM
   5203  1.1  christos 		  case 15: os_sig = SIGTERM;	break;
   5204  1.1  christos #endif
   5205  1.1  christos #ifdef SIGURG
   5206  1.1  christos 		  case 16: os_sig = SIGURG;	break;
   5207  1.1  christos #endif
   5208  1.1  christos #ifdef SIGSTOP
   5209  1.1  christos 		  case 17: os_sig = SIGSTOP;	break;
   5210  1.1  christos #endif
   5211  1.1  christos #ifdef SIGTSTP
   5212  1.1  christos 		  case 18: os_sig = SIGTSTP;	break;
   5213  1.1  christos #endif
   5214  1.1  christos #ifdef SIGCONT
   5215  1.1  christos 		  case 19: os_sig = SIGCONT;	break;
   5216  1.1  christos #endif
   5217  1.1  christos #ifdef SIGCHLD
   5218  1.1  christos 		  case 20: os_sig = SIGCHLD;	break;
   5219  1.1  christos #elif defined(SIGCLD)
   5220  1.1  christos 		  case 20: os_sig = SIGCLD;	break;
   5221  1.1  christos #endif
   5222  1.1  christos #ifdef SIGTTIN
   5223  1.1  christos 		  case 21: os_sig = SIGTTIN;	break;
   5224  1.1  christos #endif
   5225  1.1  christos #ifdef SIGTTOU
   5226  1.1  christos 		  case 22: os_sig = SIGTTOU;	break;
   5227  1.1  christos #endif
   5228  1.1  christos #ifdef SIGIO
   5229  1.1  christos 		  case 23: os_sig = SIGIO;	break;
   5230  1.1  christos #elif defined (SIGPOLL)
   5231  1.1  christos 		  case 23: os_sig = SIGPOLL;	break;
   5232  1.1  christos #endif
   5233  1.1  christos #ifdef SIGXCPU
   5234  1.1  christos 		  case 24: os_sig = SIGXCPU;	break;
   5235  1.1  christos #endif
   5236  1.1  christos #ifdef SIGXFSZ
   5237  1.1  christos 		  case 25: os_sig = SIGXFSZ;	break;
   5238  1.1  christos #endif
   5239  1.1  christos #ifdef SIGVTALRM
   5240  1.1  christos 		  case 26: os_sig = SIGVTALRM;	break;
   5241  1.1  christos #endif
   5242  1.1  christos #ifdef SIGPROF
   5243  1.1  christos 		  case 27: os_sig = SIGPROF;	break;
   5244  1.1  christos #endif
   5245  1.1  christos #ifdef SIGWINCH
   5246  1.1  christos 		  case 28: os_sig = SIGWINCH;	break;
   5247  1.1  christos #endif
   5248  1.1  christos #ifdef SIGLOST
   5249  1.1  christos 		  case 29: os_sig = SIGLOST;	break;
   5250  1.1  christos #endif
   5251  1.1  christos #ifdef SIGUSR1
   5252  1.1  christos 		  case 30: os_sig = SIGUSR1;	break;
   5253  1.1  christos #endif
   5254  1.1  christos #ifdef SIGUSR2
   5255  1.1  christos 		  case 31: os_sig = SIGUSR2;	break;
   5256  1.1  christos #endif
   5257  1.1  christos 		  }
   5258  1.1  christos 
   5259  1.1  christos 		if (os_sig == -1)
   5260  1.1  christos 		  {
   5261  1.6  christos 		    trace_output_void (sd);
   5262  1.6  christos 		    sim_io_printf (sd, "Unknown signal %d\n", PARM2);
   5263  1.6  christos 		    sim_io_flush_stdout (sd);
   5264  1.6  christos 		    EXCEPTION (SIM_SIGILL);
   5265  1.1  christos 		  }
   5266  1.1  christos 		else
   5267  1.1  christos 		  {
   5268  1.1  christos 		    RETVAL (kill (PARM1, PARM2));
   5269  1.6  christos 		    trace_output_16 (sd, result);
   5270  1.1  christos 		  }
   5271  1.1  christos 	      }
   5272  1.1  christos 	    break;
   5273  1.1  christos 
   5274  1.1  christos #ifdef TARGET_SYS_execve
   5275  1.1  christos 	  case TARGET_SYS_execve:
   5276  1.1  christos 	    trace_input ("<execve>", OP_VOID, OP_VOID, OP_VOID);
   5277  1.1  christos 	    RETVAL (execve (MEMPTR (PARM1), (char **) MEMPTR (PARM2<<16|PARM3),
   5278  1.1  christos 			     (char **)MEMPTR (PARM4)));
   5279  1.6  christos 	    trace_output_16 (sd, result);
   5280  1.1  christos 	    break;
   5281  1.1  christos #endif
   5282  1.1  christos 
   5283  1.1  christos #ifdef TARGET_SYS_execv
   5284  1.1  christos 	  case TARGET_SYS_execv:
   5285  1.1  christos 	    trace_input ("<execv>", OP_VOID, OP_VOID, OP_VOID);
   5286  1.1  christos 	    RETVAL (execve (MEMPTR (PARM1), (char **) MEMPTR (PARM2), NULL));
   5287  1.6  christos 	    trace_output_16 (sd, result);
   5288  1.1  christos 	    break;
   5289  1.1  christos #endif
   5290  1.1  christos 
   5291  1.1  christos #ifdef TARGET_SYS_pipe
   5292  1.1  christos 	  case TARGET_SYS_pipe:
   5293  1.1  christos 	    {
   5294  1.1  christos 	      reg_t buf;
   5295  1.1  christos 	      int host_fd[2];
   5296  1.1  christos 
   5297  1.1  christos 	      trace_input ("<pipe>", OP_VOID, OP_VOID, OP_VOID);
   5298  1.1  christos 	      buf = PARM1;
   5299  1.1  christos 	      RETVAL (pipe (host_fd));
   5300  1.1  christos 	      SW (buf, host_fd[0]);
   5301  1.1  christos 	      buf += sizeof(uint16);
   5302  1.1  christos 	      SW (buf, host_fd[1]);
   5303  1.6  christos 	      trace_output_16 (sd, result);
   5304  1.1  christos 	    }
   5305  1.1  christos 	  break;
   5306  1.1  christos #endif
   5307  1.1  christos 
   5308  1.1  christos #ifdef TARGET_SYS_wait
   5309  1.1  christos 	  case TARGET_SYS_wait:
   5310  1.1  christos 	    {
   5311  1.1  christos 	      int status;
   5312  1.1  christos 	      trace_input ("<wait>", OP_REG, OP_VOID, OP_VOID);
   5313  1.1  christos 	      RETVAL (wait (&status));
   5314  1.1  christos 	      if (PARM1)
   5315  1.1  christos 		SW (PARM1, status);
   5316  1.6  christos 	      trace_output_16 (sd, result);
   5317  1.1  christos 	    }
   5318  1.1  christos 	  break;
   5319  1.1  christos #endif
   5320  1.1  christos #else
   5321  1.1  christos 	  case TARGET_SYS_getpid:
   5322  1.1  christos 	    trace_input ("<getpid>", OP_VOID, OP_VOID, OP_VOID);
   5323  1.1  christos 	    RETVAL (1);
   5324  1.6  christos 	    trace_output_16 (sd, result);
   5325  1.1  christos 	    break;
   5326  1.1  christos 
   5327  1.1  christos 	  case TARGET_SYS_kill:
   5328  1.1  christos 	    trace_input ("<kill>", OP_REG, OP_REG, OP_VOID);
   5329  1.6  christos 	    trace_output_void (sd);
   5330  1.6  christos 	    EXCEPTION (PARM2);
   5331  1.1  christos 	    break;
   5332  1.1  christos #endif
   5333  1.1  christos 
   5334  1.1  christos 	  case TARGET_SYS_read:
   5335  1.1  christos 	    trace_input ("<read>", OP_REG, OP_MEMREF, OP_REG);
   5336  1.6  christos 	    RETVAL (cb->read (cb, PARM1,
   5337  1.6  christos 			      MEMPTR (((unsigned long)PARM3 << 16)
   5338  1.6  christos 				      | ((unsigned long)PARM2)), PARM4));
   5339  1.6  christos 	    trace_output_16 (sd, result);
   5340  1.1  christos 	    break;
   5341  1.1  christos 
   5342  1.1  christos 	  case TARGET_SYS_write:
   5343  1.1  christos 	    trace_input ("<write>", OP_REG, OP_MEMREF, OP_REG);
   5344  1.6  christos 	    RETVAL ((int)cb->write (cb, PARM1,
   5345  1.6  christos 				    MEMPTR (((unsigned long)PARM3 << 16)
   5346  1.6  christos 					    | PARM2), PARM4));
   5347  1.6  christos 	    trace_output_16 (sd, result);
   5348  1.1  christos 	    break;
   5349  1.1  christos 
   5350  1.1  christos 	  case TARGET_SYS_lseek:
   5351  1.1  christos 	    trace_input ("<lseek>", OP_REG, OP_REGP, OP_REG);
   5352  1.6  christos 	    RETVAL32 (cb->lseek (cb, PARM1, ((((long) PARM3) << 16) | PARM2),
   5353  1.6  christos 				 PARM4));
   5354  1.6  christos 	    trace_output_32 (sd, result);
   5355  1.1  christos 	    break;
   5356  1.1  christos 
   5357  1.1  christos 	  case TARGET_SYS_close:
   5358  1.1  christos 	    trace_input ("<close>", OP_REG, OP_VOID, OP_VOID);
   5359  1.6  christos 	    RETVAL (cb->close (cb, PARM1));
   5360  1.6  christos 	    trace_output_16 (sd, result);
   5361  1.1  christos 	    break;
   5362  1.1  christos 
   5363  1.1  christos 	  case TARGET_SYS_open:
   5364  1.1  christos 	    trace_input ("<open>", OP_MEMREF, OP_REG, OP_VOID);
   5365  1.6  christos 	    RETVAL32 (cb->open (cb, MEMPTR ((((unsigned long)PARM2) << 16)
   5366  1.6  christos 					    | PARM1), PARM3));
   5367  1.6  christos 	    trace_output_32 (sd, result);
   5368  1.1  christos 	    break;
   5369  1.1  christos 
   5370  1.1  christos #ifdef TARGET_SYS_rename
   5371  1.1  christos 	  case TARGET_SYS_rename:
   5372  1.1  christos 	    trace_input ("<rename>", OP_MEMREF, OP_MEMREF, OP_VOID);
   5373  1.6  christos 	    RETVAL (cb->rename (cb, MEMPTR ((((unsigned long)PARM2) << 16) | PARM1),
   5374  1.6  christos 				    MEMPTR ((((unsigned long)PARM4) << 16) | PARM3)));
   5375  1.6  christos 	    trace_output_16 (sd, result);
   5376  1.1  christos 	    break;
   5377  1.1  christos #endif
   5378  1.1  christos 
   5379  1.1  christos 	  case 0x408: /* REVISIT: Added a dummy getenv call. */
   5380  1.1  christos 	    trace_input ("<getenv>", OP_MEMREF, OP_MEMREF, OP_VOID);
   5381  1.5  christos 	    RETVAL32 (0);
   5382  1.6  christos 	    trace_output_32 (sd, result);
   5383  1.1  christos 	    break;
   5384  1.1  christos 
   5385  1.1  christos 	  case TARGET_SYS_exit:
   5386  1.1  christos 	    trace_input ("<exit>", OP_VOID, OP_VOID, OP_VOID);
   5387  1.6  christos 	    trace_output_void (sd);
   5388  1.6  christos 	    sim_engine_halt (sd, cpu, NULL, PC, sim_exited, GPR (2));
   5389  1.1  christos 	    break;
   5390  1.1  christos 
   5391  1.1  christos 	  case TARGET_SYS_unlink:
   5392  1.1  christos 	    trace_input ("<unlink>", OP_MEMREF, OP_VOID, OP_VOID);
   5393  1.6  christos 	    RETVAL (cb->unlink (cb, MEMPTR (((unsigned long)PARM2 << 16) | PARM1)));
   5394  1.6  christos 	    trace_output_16 (sd, result);
   5395  1.1  christos 	    break;
   5396  1.1  christos 
   5397  1.1  christos 
   5398  1.1  christos #ifdef TARGET_SYS_stat
   5399  1.1  christos 	  case TARGET_SYS_stat:
   5400  1.1  christos 	    trace_input ("<stat>", OP_VOID, OP_VOID, OP_VOID);
   5401  1.1  christos 	    /* stat system call.  */
   5402  1.1  christos 	    {
   5403  1.1  christos 	      struct stat host_stat;
   5404  1.1  christos 	      reg_t buf;
   5405  1.1  christos 
   5406  1.1  christos 	      RETVAL (stat (MEMPTR ((((unsigned long)PARM2) << 16)|PARM1), &host_stat));
   5407  1.1  christos 
   5408  1.1  christos 	      buf = PARM2;
   5409  1.1  christos 
   5410  1.1  christos 	      /* The hard-coded offsets and sizes were determined by using
   5411  1.1  christos 	       * the CR16 compiler on a test program that used struct stat.
   5412  1.1  christos 	       */
   5413  1.1  christos 	      SW  (buf,    host_stat.st_dev);
   5414  1.1  christos 	      SW  (buf+2,  host_stat.st_ino);
   5415  1.1  christos 	      SW  (buf+4,  host_stat.st_mode);
   5416  1.1  christos 	      SW  (buf+6,  host_stat.st_nlink);
   5417  1.1  christos 	      SW  (buf+8,  host_stat.st_uid);
   5418  1.1  christos 	      SW  (buf+10, host_stat.st_gid);
   5419  1.1  christos 	      SW  (buf+12, host_stat.st_rdev);
   5420  1.1  christos 	      SLW (buf+16, host_stat.st_size);
   5421  1.1  christos 	      SLW (buf+20, host_stat.st_atime);
   5422  1.1  christos 	      SLW (buf+28, host_stat.st_mtime);
   5423  1.1  christos 	      SLW (buf+36, host_stat.st_ctime);
   5424  1.1  christos 	    }
   5425  1.6  christos 	    trace_output_16 (sd, result);
   5426  1.1  christos 	    break;
   5427  1.1  christos #endif
   5428  1.1  christos 
   5429  1.1  christos #ifdef TARGET_SYS_chown
   5430  1.1  christos 	  case TARGET_SYS_chown:
   5431  1.1  christos 	    trace_input ("<chown>", OP_VOID, OP_VOID, OP_VOID);
   5432  1.1  christos 	    RETVAL (chown (MEMPTR (PARM1), PARM2, PARM3));
   5433  1.6  christos 	    trace_output_16 (sd, result);
   5434  1.1  christos 	    break;
   5435  1.1  christos #endif
   5436  1.1  christos 
   5437  1.1  christos 	  case TARGET_SYS_chmod:
   5438  1.1  christos 	    trace_input ("<chmod>", OP_VOID, OP_VOID, OP_VOID);
   5439  1.1  christos 	    RETVAL (chmod (MEMPTR (PARM1), PARM2));
   5440  1.6  christos 	    trace_output_16 (sd, result);
   5441  1.1  christos 	    break;
   5442  1.1  christos 
   5443  1.1  christos #ifdef TARGET_SYS_utime
   5444  1.1  christos 	  case TARGET_SYS_utime:
   5445  1.1  christos 	    trace_input ("<utime>", OP_REG, OP_REG, OP_REG);
   5446  1.1  christos 	    /* Cast the second argument to void *, to avoid type mismatch
   5447  1.1  christos 	       if a prototype is present.  */
   5448  1.1  christos 	    RETVAL (utime (MEMPTR (PARM1), (void *) MEMPTR (PARM2)));
   5449  1.6  christos 	    trace_output_16 (sd, result);
   5450  1.1  christos 	    break;
   5451  1.1  christos #endif
   5452  1.1  christos 
   5453  1.1  christos #ifdef TARGET_SYS_time
   5454  1.1  christos 	  case TARGET_SYS_time:
   5455  1.1  christos 	    trace_input ("<time>", OP_VOID, OP_VOID, OP_REG);
   5456  1.1  christos 	    RETVAL32 (time (NULL));
   5457  1.6  christos 	    trace_output_32 (sd, result);
   5458  1.1  christos 	    break;
   5459  1.1  christos #endif
   5460  1.1  christos 
   5461  1.1  christos 	  default:
   5462  1.1  christos 	    a = OP[0];
   5463  1.1  christos 	    switch (a)
   5464  1.1  christos 	    {
   5465  1.1  christos 	      case TRAP_BREAKPOINT:
   5466  1.1  christos 		tmp = (PC);
   5467  1.1  christos 		JMP(tmp);
   5468  1.6  christos 		trace_output_void (sd);
   5469  1.6  christos 		EXCEPTION (SIM_SIGTRAP);
   5470  1.1  christos 		break;
   5471  1.1  christos 	      case SIGTRAP:  /* supervisor call ?  */
   5472  1.6  christos 		trace_output_void (sd);
   5473  1.6  christos 		sim_engine_halt (sd, cpu, NULL, PC, sim_exited, GPR (2));
   5474  1.1  christos 		break;
   5475  1.1  christos 	      default:
   5476  1.6  christos 		cb->error (cb, "Unknown syscall %d", FUNC);
   5477  1.1  christos 		break;
   5478  1.1  christos 	    }
   5479  1.1  christos 	  }
   5480  1.1  christos 	if ((uint16) result == (uint16) -1)
   5481  1.6  christos 	  RETERR (cb->get_errno (cb));
   5482  1.1  christos 	else
   5483  1.1  christos 	  RETERR (0);
   5484  1.1  christos 	break;
   5485  1.1  christos       }
   5486  1.1  christos     }
   5487  1.1  christos }
   5488  1.1  christos 
   5489  1.1  christos 
   5490  1.1  christos /* push.  */
   5491  1.1  christos void
   5492  1.6  christos OP_3_9 (SIM_DESC sd, SIM_CPU *cpu)
   5493  1.1  christos {
   5494  1.1  christos   uint16 a = OP[0] + 1, b = OP[1], c = OP[2], i = 0;
   5495  1.1  christos   uint32 tmp, sp_addr = (GPR32 (15)) - (a * 2) - 4, is_regp = 0;
   5496  1.1  christos   trace_input ("push", OP_CONSTANT3, OP_REG, OP_REG);
   5497  1.1  christos 
   5498  1.1  christos   for (; i < a; ++i)
   5499  1.1  christos     {
   5500  1.1  christos       if ((b+i) <= 11)
   5501  1.1  christos         {
   5502  1.1  christos           SW (sp_addr, (GPR (b+i)));
   5503  1.1  christos           sp_addr +=2;
   5504  1.1  christos 	}
   5505  1.1  christos        else
   5506  1.1  christos 	{
   5507  1.1  christos 	  if (is_regp == 0)
   5508  1.1  christos 	    tmp = (GPR32 (b+i));
   5509  1.1  christos 	  else
   5510  1.1  christos 	    tmp = (GPR32 (b+i-1));
   5511  1.1  christos 
   5512  1.1  christos 	  if ((a-i) > 1)
   5513  1.1  christos 	    {
   5514  1.1  christos               SLW (sp_addr, tmp);
   5515  1.1  christos               sp_addr +=4;
   5516  1.1  christos 	    }
   5517  1.1  christos 	  else
   5518  1.1  christos 	    {
   5519  1.1  christos               SW (sp_addr, tmp);
   5520  1.1  christos               sp_addr +=2;
   5521  1.1  christos 	    }
   5522  1.1  christos 	  ++i;
   5523  1.1  christos 	  is_regp = 1;
   5524  1.1  christos 	}
   5525  1.1  christos     }
   5526  1.1  christos 
   5527  1.1  christos   sp_addr +=4;
   5528  1.1  christos 
   5529  1.1  christos   /* Store RA address.  */
   5530  1.1  christos   tmp = (GPR32 (14));
   5531  1.1  christos   SLW(sp_addr,tmp);
   5532  1.1  christos 
   5533  1.1  christos   sp_addr = (GPR32 (15)) - (a * 2) - 4;
   5534  1.1  christos   SET_GPR32 (15, sp_addr);     /* Update SP address.  */
   5535  1.1  christos 
   5536  1.6  christos   trace_output_void (sd);
   5537  1.1  christos }
   5538  1.1  christos 
   5539  1.1  christos /* push.  */
   5540  1.1  christos void
   5541  1.6  christos OP_1_8 (SIM_DESC sd, SIM_CPU *cpu)
   5542  1.1  christos {
   5543  1.1  christos   uint32 sp_addr, tmp, is_regp = 0;
   5544  1.1  christos   uint16 a = OP[0] + 1, b = OP[1], c = OP[2], i = 0;
   5545  1.1  christos   trace_input ("push", OP_CONSTANT3, OP_REG, OP_VOID);
   5546  1.1  christos 
   5547  1.1  christos   if (c == 1)
   5548  1.1  christos     sp_addr = (GPR32 (15)) - (a * 2) - 4;
   5549  1.1  christos   else
   5550  1.1  christos     sp_addr = (GPR32 (15)) - (a * 2);
   5551  1.1  christos 
   5552  1.1  christos   for (; i < a; ++i)
   5553  1.1  christos     {
   5554  1.1  christos       if ((b+i) <= 11)
   5555  1.1  christos         {
   5556  1.1  christos           SW (sp_addr, (GPR (b+i)));
   5557  1.1  christos           sp_addr +=2;
   5558  1.1  christos 	}
   5559  1.1  christos        else
   5560  1.1  christos 	{
   5561  1.1  christos 	  if (is_regp == 0)
   5562  1.1  christos 	    tmp = (GPR32 (b+i));
   5563  1.1  christos 	  else
   5564  1.1  christos 	    tmp = (GPR32 (b+i-1));
   5565  1.1  christos 
   5566  1.1  christos 	  if ((a-i) > 1)
   5567  1.1  christos 	    {
   5568  1.1  christos               SLW (sp_addr, tmp);
   5569  1.1  christos               sp_addr +=4;
   5570  1.1  christos 	    }
   5571  1.1  christos 	  else
   5572  1.1  christos 	    {
   5573  1.1  christos               SW (sp_addr, tmp);
   5574  1.1  christos               sp_addr +=2;
   5575  1.1  christos 	    }
   5576  1.1  christos 	  ++i;
   5577  1.1  christos 	  is_regp = 1;
   5578  1.1  christos 	}
   5579  1.1  christos     }
   5580  1.1  christos 
   5581  1.1  christos   if (c == 1)
   5582  1.1  christos    {
   5583  1.1  christos       /* Store RA address.  */
   5584  1.1  christos       tmp = (GPR32 (14));
   5585  1.1  christos       SLW(sp_addr,tmp);
   5586  1.1  christos       sp_addr = (GPR32 (15)) - (a * 2) - 4;
   5587  1.1  christos     }
   5588  1.1  christos   else
   5589  1.1  christos      sp_addr = (GPR32 (15)) - (a * 2);
   5590  1.1  christos 
   5591  1.1  christos   SET_GPR32 (15, sp_addr);     /* Update SP address.  */
   5592  1.1  christos 
   5593  1.6  christos   trace_output_void (sd);
   5594  1.1  christos }
   5595  1.1  christos 
   5596  1.1  christos 
   5597  1.1  christos /* push.   */
   5598  1.1  christos void
   5599  1.6  christos OP_11E_10 (SIM_DESC sd, SIM_CPU *cpu)
   5600  1.1  christos {
   5601  1.1  christos   uint32 sp_addr = (GPR32 (15)), tmp;
   5602  1.1  christos   trace_input ("push", OP_VOID, OP_VOID, OP_VOID);
   5603  1.1  christos   tmp = (GPR32 (14));
   5604  1.1  christos   SLW(sp_addr-4,tmp);                /* Store RA address.   */
   5605  1.1  christos   SET_GPR32 (15, (sp_addr - 4));     /* Update SP address.   */
   5606  1.6  christos   trace_output_void (sd);
   5607  1.1  christos }
   5608  1.1  christos 
   5609  1.1  christos 
   5610  1.1  christos /* pop.   */
   5611  1.1  christos void
   5612  1.6  christos OP_5_9 (SIM_DESC sd, SIM_CPU *cpu)
   5613  1.1  christos {
   5614  1.1  christos   uint16 a = OP[0] + 1, b = OP[1], c = OP[2], i = 0;
   5615  1.1  christos   uint32 tmp, sp_addr = (GPR32 (15)), is_regp = 0;;
   5616  1.1  christos   trace_input ("pop", OP_CONSTANT3, OP_REG, OP_REG);
   5617  1.1  christos 
   5618  1.1  christos   for (; i < a; ++i)
   5619  1.1  christos     {
   5620  1.1  christos       if ((b+i) <= 11)
   5621  1.1  christos 	{
   5622  1.1  christos           SET_GPR ((b+i), RW(sp_addr));
   5623  1.1  christos           sp_addr +=2;
   5624  1.1  christos 	}
   5625  1.1  christos       else
   5626  1.1  christos 	{
   5627  1.1  christos 	  if ((a-i) > 1)
   5628  1.1  christos 	    {
   5629  1.1  christos               tmp =  RLW(sp_addr);
   5630  1.1  christos               sp_addr +=4;
   5631  1.1  christos 	    }
   5632  1.1  christos 	  else
   5633  1.1  christos 	    {
   5634  1.1  christos               tmp =  RW(sp_addr);
   5635  1.1  christos               sp_addr +=2;
   5636  1.1  christos 
   5637  1.1  christos 	      if (is_regp == 0)
   5638  1.1  christos 		tmp = (tmp << 16) | (GPR32 (b+i));
   5639  1.1  christos 	      else
   5640  1.1  christos 		tmp = (tmp << 16) | (GPR32 (b+i-1));
   5641  1.1  christos 	    }
   5642  1.1  christos 
   5643  1.1  christos 	    if (is_regp == 0)
   5644  1.1  christos               SET_GPR32 ((b+i), (((tmp & 0xffff) << 16)
   5645  1.1  christos 			         | ((tmp >> 16) & 0xffff)));
   5646  1.1  christos 	     else
   5647  1.1  christos               SET_GPR32 ((b+i-1), (((tmp & 0xffff) << 16)
   5648  1.1  christos 			           | ((tmp >> 16) & 0xffff)));
   5649  1.1  christos 
   5650  1.1  christos 	  ++i;
   5651  1.1  christos 	  is_regp = 1;
   5652  1.1  christos 	}
   5653  1.1  christos     }
   5654  1.1  christos 
   5655  1.1  christos   tmp =  RLW(sp_addr);                /* store RA also.   */
   5656  1.1  christos   SET_GPR32 (14, (((tmp & 0xffff) << 16)| ((tmp >> 16) & 0xffff)));
   5657  1.1  christos 
   5658  1.1  christos   SET_GPR32 (15, (sp_addr + 4));     /* Update SP address.  */
   5659  1.1  christos 
   5660  1.6  christos   trace_output_void (sd);
   5661  1.1  christos }
   5662  1.1  christos 
   5663  1.1  christos /* pop.  */
   5664  1.1  christos void
   5665  1.6  christos OP_2_8 (SIM_DESC sd, SIM_CPU *cpu)
   5666  1.1  christos {
   5667  1.1  christos   uint16 a = OP[0] + 1, b = OP[1], c = OP[2], i = 0;
   5668  1.1  christos   uint32 tmp, sp_addr = (GPR32 (15)), is_regp = 0;
   5669  1.1  christos   trace_input ("pop", OP_CONSTANT3, OP_REG, OP_VOID);
   5670  1.1  christos 
   5671  1.1  christos   for (; i < a; ++i)
   5672  1.1  christos     {
   5673  1.1  christos       if ((b+i) <= 11)
   5674  1.1  christos 	{
   5675  1.1  christos           SET_GPR ((b+i), RW(sp_addr));
   5676  1.1  christos           sp_addr +=2;
   5677  1.1  christos 	}
   5678  1.1  christos       else
   5679  1.1  christos 	{
   5680  1.1  christos 	  if ((a-i) > 1)
   5681  1.1  christos 	    {
   5682  1.1  christos               tmp =  RLW(sp_addr);
   5683  1.1  christos               sp_addr +=4;
   5684  1.1  christos 	    }
   5685  1.1  christos 	  else
   5686  1.1  christos 	    {
   5687  1.1  christos               tmp =  RW(sp_addr);
   5688  1.1  christos               sp_addr +=2;
   5689  1.1  christos 
   5690  1.1  christos 	      if (is_regp == 0)
   5691  1.1  christos 		tmp = ((tmp << 16) & 0xffffffff) | (GPR32 (b+i));
   5692  1.1  christos 	      else
   5693  1.1  christos 		tmp = ((tmp << 16) & 0xffffffff) | (GPR32 (b+i-1));
   5694  1.1  christos 	    }
   5695  1.1  christos 
   5696  1.1  christos 	  if (is_regp == 0)
   5697  1.1  christos           SET_GPR32 ((b+i), (((tmp & 0xffff) << 16)| ((tmp >> 16) & 0xffff)));
   5698  1.1  christos 	  else
   5699  1.1  christos           SET_GPR32 ((b+i-1), (((tmp & 0xffff) << 16)| ((tmp >> 16) & 0xffff)));
   5700  1.1  christos 	  ++i;
   5701  1.1  christos 	  is_regp = 1;
   5702  1.1  christos 	}
   5703  1.1  christos     }
   5704  1.1  christos 
   5705  1.1  christos   if (c == 1)
   5706  1.1  christos     {
   5707  1.1  christos       tmp =  RLW(sp_addr);    /* Store RA Reg.  */
   5708  1.1  christos       SET_GPR32 (14, (((tmp & 0xffff) << 16)| ((tmp >> 16) & 0xffff)));
   5709  1.1  christos       sp_addr +=4;
   5710  1.1  christos     }
   5711  1.1  christos 
   5712  1.1  christos   SET_GPR32 (15, sp_addr); /* Update SP address.  */
   5713  1.1  christos 
   5714  1.6  christos   trace_output_void (sd);
   5715  1.1  christos }
   5716  1.1  christos 
   5717  1.1  christos /* pop.  */
   5718  1.1  christos void
   5719  1.6  christos OP_21E_10 (SIM_DESC sd, SIM_CPU *cpu)
   5720  1.1  christos {
   5721  1.1  christos   uint32 sp_addr = GPR32 (15);
   5722  1.1  christos   uint32 tmp;
   5723  1.1  christos   trace_input ("pop", OP_VOID, OP_VOID, OP_VOID);
   5724  1.1  christos 
   5725  1.1  christos   tmp =  RLW(sp_addr);
   5726  1.1  christos   SET_GPR32 (14, (((tmp & 0xffff) << 16)| ((tmp >> 16) & 0xffff)));
   5727  1.1  christos   SET_GPR32 (15, (sp_addr+4));    /* Update SP address.  */
   5728  1.1  christos 
   5729  1.6  christos   trace_output_void (sd);
   5730  1.1  christos }
   5731  1.1  christos 
   5732  1.1  christos /* popret.  */
   5733  1.1  christos void
   5734  1.6  christos OP_7_9 (SIM_DESC sd, SIM_CPU *cpu)
   5735  1.1  christos {
   5736  1.1  christos   uint16 a = OP[0], b = OP[1];
   5737  1.1  christos   trace_input ("popret", OP_CONSTANT3, OP_REG, OP_REG);
   5738  1.6  christos   OP_5_9 (sd, cpu);
   5739  1.1  christos   JMP(((GPR32(14)) << 1) & 0xffffff);
   5740  1.1  christos 
   5741  1.6  christos   trace_output_void (sd);
   5742  1.1  christos }
   5743  1.1  christos 
   5744  1.1  christos /* popret.  */
   5745  1.1  christos void
   5746  1.6  christos OP_3_8 (SIM_DESC sd, SIM_CPU *cpu)
   5747  1.1  christos {
   5748  1.1  christos   uint16 a = OP[0], b = OP[1];
   5749  1.1  christos   trace_input ("popret", OP_CONSTANT3, OP_REG, OP_VOID);
   5750  1.6  christos   OP_2_8 (sd, cpu);
   5751  1.1  christos   JMP(((GPR32(14)) << 1) & 0xffffff);
   5752  1.1  christos 
   5753  1.6  christos   trace_output_void (sd);
   5754  1.1  christos }
   5755  1.1  christos 
   5756  1.1  christos /* popret.  */
   5757  1.1  christos void
   5758  1.6  christos OP_31E_10 (SIM_DESC sd, SIM_CPU *cpu)
   5759  1.1  christos {
   5760  1.1  christos   uint32 tmp;
   5761  1.1  christos   trace_input ("popret", OP_VOID, OP_VOID, OP_VOID);
   5762  1.6  christos   OP_21E_10 (sd, cpu);
   5763  1.1  christos   tmp = (((GPR32(14)) << 1) & 0xffffff);
   5764  1.1  christos   /* If the resulting PC value is less than 0x00_0000 or greater
   5765  1.1  christos      than 0xFF_FFFF, this instruction causes an IAD trap.*/
   5766  1.1  christos 
   5767  1.1  christos   if ((tmp < 0x0) || (tmp > 0xFFFFFF))
   5768  1.1  christos     {
   5769  1.6  christos       trace_output_void (sd);
   5770  1.6  christos       EXCEPTION (SIM_SIGBUS);
   5771  1.1  christos     }
   5772  1.1  christos   else
   5773  1.1  christos     JMP (tmp);
   5774  1.1  christos 
   5775  1.6  christos   trace_output_32 (sd, tmp);
   5776  1.1  christos }
   5777  1.1  christos 
   5778  1.1  christos 
   5779  1.1  christos /* cinv[i].  */
   5780  1.1  christos void
   5781  1.6  christos OP_A_10 (SIM_DESC sd, SIM_CPU *cpu)
   5782  1.1  christos {
   5783  1.1  christos   trace_input ("cinv[i]", OP_VOID, OP_VOID, OP_VOID);
   5784  1.1  christos   SET_PSR_I (1);
   5785  1.6  christos   trace_output_void (sd);
   5786  1.1  christos }
   5787  1.1  christos 
   5788  1.1  christos /* cinv[i,u].  */
   5789  1.1  christos void
   5790  1.6  christos OP_B_10 (SIM_DESC sd, SIM_CPU *cpu)
   5791  1.1  christos {
   5792  1.1  christos   trace_input ("cinv[i,u]", OP_VOID, OP_VOID, OP_VOID);
   5793  1.1  christos   SET_PSR_I (1);
   5794  1.6  christos   trace_output_void (sd);
   5795  1.1  christos }
   5796  1.1  christos 
   5797  1.1  christos /* cinv[d].  */
   5798  1.1  christos void
   5799  1.6  christos OP_C_10 (SIM_DESC sd, SIM_CPU *cpu)
   5800  1.1  christos {
   5801  1.1  christos   trace_input ("cinv[d]", OP_VOID, OP_VOID, OP_VOID);
   5802  1.1  christos   SET_PSR_I (1);
   5803  1.6  christos   trace_output_void (sd);
   5804  1.1  christos }
   5805  1.1  christos 
   5806  1.1  christos /* cinv[d,u].  */
   5807  1.1  christos void
   5808  1.6  christos OP_D_10 (SIM_DESC sd, SIM_CPU *cpu)
   5809  1.1  christos {
   5810  1.1  christos   trace_input ("cinv[i,u]", OP_VOID, OP_VOID, OP_VOID);
   5811  1.1  christos   SET_PSR_I (1);
   5812  1.6  christos   trace_output_void (sd);
   5813  1.1  christos }
   5814  1.1  christos 
   5815  1.1  christos /* cinv[d,i].  */
   5816  1.1  christos void
   5817  1.6  christos OP_E_10 (SIM_DESC sd, SIM_CPU *cpu)
   5818  1.1  christos {
   5819  1.1  christos   trace_input ("cinv[d,i]", OP_VOID, OP_VOID, OP_VOID);
   5820  1.1  christos   SET_PSR_I (1);
   5821  1.6  christos   trace_output_void (sd);
   5822  1.1  christos }
   5823  1.1  christos 
   5824  1.1  christos /* cinv[d,i,u].  */
   5825  1.1  christos void
   5826  1.6  christos OP_F_10 (SIM_DESC sd, SIM_CPU *cpu)
   5827  1.1  christos {
   5828  1.1  christos   trace_input ("cinv[d,i,u]", OP_VOID, OP_VOID, OP_VOID);
   5829  1.1  christos   SET_PSR_I (1);
   5830  1.6  christos   trace_output_void (sd);
   5831  1.1  christos }
   5832  1.1  christos 
   5833  1.1  christos /* retx.  */
   5834  1.1  christos void
   5835  1.6  christos OP_3_10 (SIM_DESC sd, SIM_CPU *cpu)
   5836  1.1  christos {
   5837  1.1  christos   trace_input ("retx", OP_VOID, OP_VOID, OP_VOID);
   5838  1.1  christos   SET_PSR_I (1);
   5839  1.6  christos   trace_output_void (sd);
   5840  1.1  christos }
   5841  1.1  christos 
   5842  1.1  christos /* di.  */
   5843  1.1  christos void
   5844  1.6  christos OP_4_10 (SIM_DESC sd, SIM_CPU *cpu)
   5845  1.1  christos {
   5846  1.1  christos   trace_input ("di", OP_VOID, OP_VOID, OP_VOID);
   5847  1.1  christos   SET_PSR_I (1);
   5848  1.6  christos   trace_output_void (sd);
   5849  1.1  christos }
   5850  1.1  christos 
   5851  1.1  christos /* ei.  */
   5852  1.1  christos void
   5853  1.6  christos OP_5_10 (SIM_DESC sd, SIM_CPU *cpu)
   5854  1.1  christos {
   5855  1.1  christos   trace_input ("ei", OP_VOID, OP_VOID, OP_VOID);
   5856  1.1  christos   SET_PSR_I (1);
   5857  1.6  christos   trace_output_void (sd);
   5858  1.1  christos }
   5859  1.1  christos 
   5860  1.1  christos /* wait.  */
   5861  1.1  christos void
   5862  1.6  christos OP_6_10 (SIM_DESC sd, SIM_CPU *cpu)
   5863  1.1  christos {
   5864  1.1  christos   trace_input ("wait", OP_VOID, OP_VOID, OP_VOID);
   5865  1.6  christos   trace_output_void (sd);
   5866  1.6  christos   EXCEPTION (SIM_SIGTRAP);
   5867  1.1  christos }
   5868  1.1  christos 
   5869  1.1  christos /* ewait.  */
   5870  1.1  christos void
   5871  1.6  christos OP_7_10 (SIM_DESC sd, SIM_CPU *cpu)
   5872  1.1  christos {
   5873  1.1  christos   trace_input ("ewait", OP_VOID, OP_VOID, OP_VOID);
   5874  1.1  christos   SET_PSR_I (1);
   5875  1.6  christos   trace_output_void (sd);
   5876  1.1  christos }
   5877  1.1  christos 
   5878  1.1  christos /* xorb. */
   5879  1.1  christos void
   5880  1.6  christos OP_28_8 (SIM_DESC sd, SIM_CPU *cpu)
   5881  1.1  christos {
   5882  1.1  christos   uint8 tmp, a = (OP[0]) & 0xff, b = (GPR (OP[1])) & 0xff;
   5883  1.1  christos   trace_input ("xorb", OP_CONSTANT4, OP_REG, OP_VOID);
   5884  1.1  christos   tmp = a ^ b;
   5885  1.1  christos   SET_GPR (OP[1], (tmp | ((GPR (OP[1])) & 0xff00)));
   5886  1.6  christos   trace_output_16 (sd, tmp);
   5887  1.1  christos }
   5888  1.1  christos 
   5889  1.1  christos /* xorb.  */
   5890  1.1  christos void
   5891  1.6  christos OP_28B_C (SIM_DESC sd, SIM_CPU *cpu)
   5892  1.1  christos {
   5893  1.1  christos   uint8 tmp, a = (OP[0]) & 0xff, b = (GPR (OP[1])) & 0xff;
   5894  1.1  christos   trace_input ("xorb", OP_CONSTANT16, OP_REG, OP_VOID);
   5895  1.1  christos   tmp = a ^ b;
   5896  1.1  christos   SET_GPR (OP[1], (tmp | ((GPR (OP[1])) & 0xff00)));
   5897  1.6  christos   trace_output_16 (sd, tmp);
   5898  1.1  christos }
   5899  1.1  christos 
   5900  1.1  christos /* xorb.  */
   5901  1.1  christos void
   5902  1.6  christos OP_29_8 (SIM_DESC sd, SIM_CPU *cpu)
   5903  1.1  christos {
   5904  1.1  christos   uint8 tmp, a = (GPR (OP[0])) & 0xff, b = (GPR (OP[1])) & 0xff;
   5905  1.1  christos   trace_input ("xorb", OP_REG, OP_REG, OP_VOID);
   5906  1.1  christos   tmp = a ^ b;
   5907  1.1  christos   SET_GPR (OP[1], (tmp | ((GPR (OP[1])) & 0xff00)));
   5908  1.6  christos   trace_output_16 (sd, tmp);
   5909  1.1  christos }
   5910  1.1  christos 
   5911  1.1  christos /* xorw.  */
   5912  1.1  christos void
   5913  1.6  christos OP_2A_8 (SIM_DESC sd, SIM_CPU *cpu)
   5914  1.1  christos {
   5915  1.1  christos   uint16 tmp, a = (OP[0]), b = (GPR (OP[1]));
   5916  1.1  christos   trace_input ("xorw", OP_CONSTANT4, OP_REG, OP_VOID);
   5917  1.1  christos   tmp = a ^ b;
   5918  1.1  christos   SET_GPR (OP[1], tmp);
   5919  1.6  christos   trace_output_16 (sd, tmp);
   5920  1.1  christos }
   5921  1.1  christos 
   5922  1.1  christos /* xorw.  */
   5923  1.1  christos void
   5924  1.6  christos OP_2AB_C (SIM_DESC sd, SIM_CPU *cpu)
   5925  1.1  christos {
   5926  1.1  christos   uint16 tmp, a = (OP[0]), b = (GPR (OP[1]));
   5927  1.1  christos   trace_input ("xorw", OP_CONSTANT16, OP_REG, OP_VOID);
   5928  1.1  christos   tmp = a ^ b;
   5929  1.1  christos   SET_GPR (OP[1], tmp);
   5930  1.6  christos   trace_output_16 (sd, tmp);
   5931  1.1  christos }
   5932  1.1  christos 
   5933  1.1  christos /* xorw.  */
   5934  1.1  christos void
   5935  1.6  christos OP_2B_8 (SIM_DESC sd, SIM_CPU *cpu)
   5936  1.1  christos {
   5937  1.1  christos   uint16 tmp, a = (GPR (OP[0])), b = (GPR (OP[1]));
   5938  1.1  christos   trace_input ("xorw", OP_REG, OP_REG, OP_VOID);
   5939  1.1  christos   tmp = a ^ b;
   5940  1.1  christos   SET_GPR (OP[1], tmp);
   5941  1.6  christos   trace_output_16 (sd, tmp);
   5942  1.1  christos }
   5943  1.1  christos 
   5944  1.1  christos /*REVISIT FOR LPR/SPR . */
   5945  1.1  christos 
   5946  1.1  christos /* lpr.  */
   5947  1.1  christos void
   5948  1.6  christos OP_140_14 (SIM_DESC sd, SIM_CPU *cpu)
   5949  1.1  christos {
   5950  1.1  christos   uint16 a = GPR (OP[0]);
   5951  1.1  christos   trace_input ("lpr", OP_REG, OP_REG, OP_VOID);
   5952  1.1  christos   SET_CREG (OP[1], a);
   5953  1.6  christos   trace_output_16 (sd, a);
   5954  1.1  christos }
   5955  1.1  christos 
   5956  1.1  christos /* lprd.  */
   5957  1.1  christos void
   5958  1.6  christos OP_141_14 (SIM_DESC sd, SIM_CPU *cpu)
   5959  1.1  christos {
   5960  1.1  christos   uint32 a = GPR32 (OP[0]);
   5961  1.1  christos   trace_input ("lprd", OP_REGP, OP_REG, OP_VOID);
   5962  1.1  christos   SET_CREG (OP[1], a);
   5963  1.6  christos   trace_output_flag (sd);
   5964  1.1  christos }
   5965  1.1  christos 
   5966  1.1  christos /* spr.  */
   5967  1.1  christos void
   5968  1.6  christos OP_142_14 (SIM_DESC sd, SIM_CPU *cpu)
   5969  1.1  christos {
   5970  1.1  christos   uint16 a = CREG (OP[0]);
   5971  1.1  christos   trace_input ("spr", OP_REG, OP_REG, OP_VOID);
   5972  1.1  christos   SET_GPR (OP[1], a);
   5973  1.6  christos   trace_output_16 (sd, a);
   5974  1.1  christos }
   5975  1.1  christos 
   5976  1.1  christos /* sprd.  */
   5977  1.1  christos void
   5978  1.6  christos OP_143_14 (SIM_DESC sd, SIM_CPU *cpu)
   5979  1.1  christos {
   5980  1.1  christos   uint32 a = CREG (OP[0]);
   5981  1.1  christos   trace_input ("sprd", OP_REGP, OP_REGP, OP_VOID);
   5982  1.1  christos   SET_GPR32 (OP[1], a);
   5983  1.6  christos   trace_output_32 (sd, a);
   5984  1.1  christos }
   5985  1.1  christos 
   5986  1.1  christos /* null.  */
   5987  1.1  christos void
   5988  1.6  christos OP_0_20 (SIM_DESC sd, SIM_CPU *cpu)
   5989  1.1  christos {
   5990  1.1  christos   trace_input ("null", OP_VOID, OP_VOID, OP_VOID);
   5991  1.6  christos   sim_engine_halt (sd, cpu, NULL, PC, sim_exited, 0);
   5992  1.1  christos }
   5993