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