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