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