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