Home | History | Annotate | Line # | Download | only in v850
      1 :option:::insn-bit-size:16
      2 :option:::hi-bit-nr:15
      3 
      4 
      5 :option:::format-names:I,II,III,IV,V,VI,VII,VIII,IX,X
      6 :option:::format-names:XI,XII,XIII
      7 :option:::format-names:XIV,XV
      8 :option:::format-names:Z
      9 :option:::format-names:F_I
     10 :option:::format-names:C
     11 
     12 
     13 :model:::v850:v850:
     14 
     15 :option:::multi-sim:true
     16 :model:::v850e:v850e:
     17 :option:::multi-sim:true
     18 :model:::v850e1:v850e1:
     19 :option:::multi-sim:true
     20 :model:::v850e2:v850e2:
     21 :option:::multi-sim:true
     22 :model:::v850e2v3:v850e2v3:
     23 :option:::multi-sim:true
     24 :model:::v850e3v5:v850e3v5:
     25 
     26 // Cache macros
     27 
     28 :cache:::unsigned:reg1:RRRRR:(RRRRR)
     29 :cache:::unsigned:reg2:rrrrr:(rrrrr)
     30 :cache:::unsigned:reg3:wwwww:(wwwww)
     31 :cache:::unsigned:reg4:W,WWWW:(W + (WWWW << 1))
     32 
     33 :cache:::unsigned:vreg1:VVVVV:(VVVVV)
     34 :cache:::unsigned:vreg1:VVVV:(VVVV << 1)
     35 :cache:::unsigned:vreg2:vvvvv:(vvvvv)
     36 :cache:::unsigned:vreg2:vvvv:(vvvv << 1)
     37 :cache:::unsigned:vreg3:xxxx:(xxxx << 1)
     38 :cache:::unsigned:vreg3:xxxxx:(xxxxx)
     39 :cache:::unsigned:imm2:ii:(ii)
     40 :cache:::unsigned:imm1:i:(i)
     41 
     42 :cache:::unsigned:reg1e:RRRR:(RRRR << 1)
     43 :cache:::unsigned:reg2e:rrrr:(rrrr << 1)
     44 :cache:::unsigned:reg3e:wwww:(wwww << 1)
     45 :cache:::unsigned:reg4e:mmmm:(mmmm << 1)
     46 
     47 :cache:::unsigned:disp4:dddd:(dddd)
     48 :cache:::unsigned:disp5:dddd:(dddd << 1)
     49 :cache:::unsigned:disp7:ddddddd:ddddddd
     50 :cache:::unsigned:disp8:ddddddd:(ddddddd << 1)
     51 :cache:::unsigned:disp8:dddddd:(dddddd << 2)
     52 :cache:::unsigned:disp9:ddddd,ddd:SEXT32 ((ddddd << 4) + (ddd << 1), 9 - 1)
     53 :cache:::unsigned:disp16:dddddddddddddddd:EXTEND16 (dddddddddddddddd)
     54 :cache:::unsigned:disp16:ddddddddddddddd: EXTEND16 (ddddddddddddddd << 1)
     55 :cache:::unsigned:disp17:d,ddddddddddddddd:SEXT32 (((d <<16) + (ddddddddddddddd << 1)), 17 - 1)
     56 :cache:::unsigned:disp22:dddddd,ddddddddddddddd: SEXT32 ((dddddd << 16) + (ddddddddddddddd << 1), 22 - 1)
     57 :cache:::unsigned:disp23:ddddddd,dddddddddddddddd: SEXT32 ((ddddddd) + (dddddddddddddddd << 7), 23 - 1)
     58 :cache:::unsigned:disp23:dddddd,dddddddddddddddd: SEXT32 ((dddddd << 1) + (dddddddddddddddd << 7), 23 - 1)
     59 
     60 :cache:::unsigned:imm5:iiiii:SEXT32 (iiiii, 4)
     61 :cache:::unsigned:imm6:iiiiii:iiiiii
     62 :cache:::unsigned:imm9:iiiii,IIII:SEXT ((IIII << 5) + iiiii, 9 - 1)
     63 :cache:::unsigned:imm5:iiii:(32 - (iiii << 1))
     64 :cache:::unsigned:simm16:iiiiiiiiiiiiiiii:EXTEND16 (iiiiiiiiiiiiiiii)
     65 :cache:::unsigned:uimm16:iiiiiiiiiiiiiiii:iiiiiiiiiiiiiiii
     66 :cache:::unsigned:imm32:iiiiiiiiiiiiiiii,IIIIIIIIIIIIIIII:(iiiiiiiiiiiiiiii < 16 + IIIIIIIIIIIIIIII)
     67 :cache:::unsigned:uimm32:iiiiiiiiiiiiiiii,dddddddddddddddd:((iiiiiiiiiiiiiiii << 16) + dddddddddddddddd)
     68 
     69 :cache:::unsigned:vector:iiiii:iiiii
     70 
     71 :cache:::unsigned:list12:L,LLLLLLLLLLL:((L << 11) + LLLLLLLLLLL)
     72 :cache:::unsigned:list18:LLLL,LLLLLLLLLLLL:((LLLL << 12) + LLLLLLLLLLLL)
     73 
     74 :cache:::unsigned:bit3:bbb:bbb
     75 :cache:::unsigned:bit4:bbbb:bbbb
     76 :cache:::unsigned:bit13:B,BBB:((B << 3) + BBB)
     77 
     78 
     79 // What do we do with an illegal instruction?
     80 :internal::::illegal:
     81 {
     82   sim_io_eprintf (SD, "Illegal instruction at address 0x%lx\n",
     83 		  (unsigned long) cia);
     84   sim_engine_halt (SD, CPU, NULL, cia, sim_signalled, SIM_SIGILL);
     85 }
     86 
     87 
     88 
     89 // ADD
     90 rrrrr,001110,RRRRR:I:::add
     91 "add r<reg1>, r<reg2>"
     92 {
     93   COMPAT_1 (OP_1C0 ());
     94 }
     95 
     96 rrrrr,010010,iiiii:II:::add
     97 "add <imm5>,r<reg2>"
     98 {
     99   COMPAT_1 (OP_240 ());
    100 }
    101 
    102 
    103 
    104 // ADDI
    105 rrrrr,110000,RRRRR + iiiiiiiiiiiiiiii:VI:::addi
    106 "addi <simm16>, r<reg1>, r<reg2>"
    107 {
    108   COMPAT_2 (OP_600 ());
    109 }
    110 
    111 
    112 
    113 // ADF
    114 rrrrr,111111,RRRRR + wwwww,011101,cccc!13,0:XI:::adf
    115 *v850e2
    116 *v850e2v3
    117 *v850e3v5
    118 "adf %s<cccc>, r<reg1>, r<reg2>, r<reg3>"
    119 {
    120   int cond = condition_met (cccc);
    121   TRACE_ALU_INPUT3 (cond, GR[reg1], GR[reg2]);
    122   GR[reg3] = GR[reg1] + GR[reg2] + (cond ? 1 : 0);
    123   TRACE_ALU_RESULT1 (GR[reg3]);
    124 }
    125 
    126 
    127 
    128 // AND
    129 rrrrr,001010,RRRRR:I:::and
    130 "and r<reg1>, r<reg2>"
    131 {
    132   COMPAT_1 (OP_140 ());
    133 }
    134 
    135 
    136 
    137 // ANDI
    138 rrrrr,110110,RRRRR + iiiiiiiiiiiiiiii:VI:::andi
    139 "andi <uimm16>, r<reg1>, r<reg2>"
    140 {
    141   COMPAT_2 (OP_6C0 ());
    142 }
    143 
    144 
    145 
    146 // Map condition code to a string
    147 :%s::::cccc:int cccc
    148 {
    149   switch (cccc)
    150     {
    151     case 0xf: return "gt";
    152     case 0xe: return "ge";
    153     case 0x6: return "lt";
    154 
    155     case 0x7: return "le";
    156 
    157     case 0xb: return "h";
    158     case 0x9: return "nl";
    159     case 0x1: return "l";
    160 
    161     case 0x3: return "nh";
    162 
    163     case 0x2: return "e";
    164 
    165     case 0xa: return "ne";
    166 
    167     case 0x0: return "v";
    168     case 0x8: return "nv";
    169     case 0x4: return "n";
    170     case 0xc: return "p";
    171       /* case 0x1: return "c"; */
    172       /* case 0x9: return "nc"; */
    173       /* case 0x2: return "z"; */
    174       /* case 0xa: return "nz"; */
    175     case 0x5: return "r"; /* always */
    176     case 0xd: return "sa";
    177     }
    178   return "(null)";
    179 }
    180 
    181 
    182 // Bcond
    183 ddddd,1011,ddd,cccc:III:::Bcond
    184 "b%s<cccc> <disp9>"
    185 {
    186   int cond;
    187   if ((ddddd == 0x00) && (ddd == 0x00) && (cccc == 0x05)) {
    188     // Special case - treat "br *" like illegal instruction
    189     sim_engine_halt (SD, CPU, NULL, cia, sim_stopped, SIM_SIGTRAP);
    190   } else {
    191     cond = condition_met (cccc);
    192     if (cond)
    193       nia = cia + disp9;
    194     TRACE_BRANCH1 (cond);
    195   }
    196 }
    197 
    198 00000111111,d,cccc + ddddddddddddddd,1:VII:::Bcond
    199 "breakpoint":((disp17 == 0) && (cccc == 0x05))
    200 "b%s<cccc> <disp17>"
    201 *v850e2v3
    202 *v850e3v5
    203 {
    204   int cond;
    205   cond = condition_met (cccc);
    206   if (cond)
    207     nia = cia + disp17;
    208   TRACE_BRANCH_INPUT1 (cond);
    209   TRACE_BRANCH_RESULT (nia);
    210 }
    211 
    212 
    213 
    214 // BSH
    215 rrrrr,11111100000 + wwwww,01101000010:XII:::bsh
    216 *v850e
    217 *v850e1
    218 *v850e2
    219 *v850e2v3
    220 *v850e3v5
    221 "bsh r<reg2>, r<reg3>"
    222 {
    223   uint32_t value;
    224   TRACE_ALU_INPUT1 (GR[reg2]);
    225 
    226   value = (MOVED32 (GR[reg2], 23, 16, 31, 24)
    227 	   | MOVED32 (GR[reg2], 31, 24, 23, 16)
    228 	   | MOVED32 (GR[reg2], 7, 0, 15, 8)
    229 	   | MOVED32 (GR[reg2], 15, 8, 7, 0));
    230 
    231   GR[reg3] = value;
    232   PSW &= ~(PSW_Z | PSW_S | PSW_CY | PSW_OV);
    233   if ((value & 0xffff) == 0) PSW |= PSW_Z;
    234   if (value & 0x80000000) PSW |= PSW_S;
    235   if (((value & 0xff) == 0) || ((value & 0xff00) == 0)) PSW |= PSW_CY;
    236 
    237   TRACE_ALU_RESULT (GR[reg3]);
    238 }
    239 
    240 
    241 
    242 // BSW
    243 rrrrr,11111100000 + wwwww,01101000000:XII:::bsw
    244 *v850e
    245 *v850e1
    246 *v850e2
    247 *v850e2v3
    248 *v850e3v5
    249 "bsw r<reg2>, r<reg3>"
    250 {
    251 #define WORDHASNULLBYTE(x) (((x) - 0x01010101) & ~(x)&0x80808080)
    252   uint32_t value;
    253   TRACE_ALU_INPUT1 (GR[reg2]);
    254 
    255   value = GR[reg2];
    256   value >>= 24;
    257   value |= (GR[reg2] << 24);
    258   value |= ((GR[reg2] << 8) & 0x00ff0000);
    259   value |= ((GR[reg2] >> 8) & 0x0000ff00);
    260   GR[reg3] = value;
    261 
    262   PSW &= ~(PSW_Z | PSW_S | PSW_CY | PSW_OV);
    263 
    264   if (value == 0) PSW |= PSW_Z;
    265   if (value & 0x80000000) PSW |= PSW_S;
    266   if (WORDHASNULLBYTE (value)) PSW |= PSW_CY;
    267 
    268   TRACE_ALU_RESULT (GR[reg3]);
    269 }
    270 
    271 
    272 
    273 // CALLT
    274 0000001000,iiiiii:II:::callt
    275 *v850e
    276 *v850e1
    277 *v850e2
    278 *v850e2v3
    279 *v850e3v5
    280 "callt <imm6>"
    281 {
    282   uint32_t adr;
    283   uint32_t off;
    284   CTPC  = cia + 2;
    285   CTPSW = PSW;
    286   adr = (CTBP & ~1) + (imm6 << 1);
    287   off = load_mem (adr, 2) & ~1; /* Force alignment */
    288   nia = (CTBP & ~1) + off;
    289   TRACE_BRANCH3 (adr, CTBP, off);
    290 }
    291 
    292 
    293 
    294 // CAXI
    295 rrrrr,111111,RRRRR + wwwww,00011101110:IX:::caxi
    296 *v850e2
    297 *v850e2v3
    298 *v850e3v5
    299 "caxi [reg1], reg2, reg3"
    300 {
    301   unsigned int z,s,cy,ov;
    302   uint32_t addr;
    303   uint32_t token,result;
    304 
    305   addr = GR[reg1];
    306 
    307   if (mpu_load_mem_test (SD, addr, 4, reg1)
    308       && mpu_store_mem_test (SD, addr, 4, reg1))
    309     {
    310       token = load_data_mem (SD, addr, 4);
    311 
    312       TRACE_ALU_INPUT2 (token, GR[reg2]);
    313 
    314       result = GR[reg2] - token;
    315 
    316       z = (result == 0);
    317       s = (result & 0x80000000);
    318       cy = (GR[reg2] < token);
    319       ov = ((GR[reg2] & 0x80000000) != (token & 0x80000000)
    320 	    && (GR[reg2] & 0x80000000) != (result & 0x80000000));
    321 
    322       if (result == 0)
    323 	{
    324 	  store_data_mem (SD, addr, 4, GR[reg3]);
    325 	  GR[reg3] = token;
    326 	}
    327       else
    328 	{
    329 	  store_data_mem (SD, addr, 4, token);
    330 	  GR[reg3] = token;
    331 	}
    332   
    333       /* Set condition codes.  */
    334       PSW &= ~(PSW_Z | PSW_S | PSW_CY | PSW_OV);
    335       PSW |= ((z ? PSW_Z : 0) | (s ? PSW_S : 0)
    336 	      | (cy ? PSW_CY : 0) | (ov ? PSW_OV : 0));
    337 
    338       TRACE_ALU_RESULT1 (GR[reg3]);
    339     }
    340 }
    341 
    342 
    343 // CLR1
    344 10,bbb,111110,RRRRR + dddddddddddddddd:VIII:::clr1
    345 "clr1 <bit3>, <disp16>[r<reg1>]"
    346 {
    347   COMPAT_2 (OP_87C0 ());
    348 }
    349 
    350 rrrrr,111111,RRRRR + 0000000011100100:IX:::clr1
    351 *v850e
    352 *v850e1
    353 *v850e2
    354 *v850e2v3
    355 *v850e3v5
    356 "clr1 r<reg2>, [r<reg1>]"
    357 {
    358   COMPAT_2 (OP_E407E0 ());
    359 }
    360 
    361 
    362 
    363 // CTRET
    364 0000011111100000 + 0000000101000100:X:::ctret
    365 *v850e
    366 *v850e1
    367 *v850e2
    368 *v850e2v3
    369 *v850e3v5
    370 "ctret"
    371 {
    372   nia  = (CTPC & ~1);
    373   PSW = (CTPSW & V850_SIM_CPU (CPU)->psw_mask);
    374   TRACE_BRANCH1 (PSW);
    375 }
    376 
    377 
    378 
    379 // CMOV
    380 rrrrr,111111,RRRRR + wwwww,011001,cccc,0:XI:::cmov
    381 *v850e
    382 *v850e1
    383 *v850e2
    384 *v850e2v3
    385 *v850e3v5
    386 "cmov %s<cccc>, r<reg1>, r<reg2>, r<reg3>"
    387 {
    388   int cond = condition_met (cccc);
    389   TRACE_ALU_INPUT3 (cond, GR[reg1], GR[reg2]);
    390   GR[reg3] = cond ? GR[reg1] : GR[reg2];
    391   TRACE_ALU_RESULT (GR[reg3]);
    392 }
    393 
    394 rrrrr,111111,iiiii + wwwww,011000,cccc,0:XII:::cmov
    395 *v850e
    396 *v850e1
    397 *v850e2
    398 *v850e2v3
    399 *v850e3v5
    400 "cmov %s<cccc>, <imm5>, r<reg2>, r<reg3>"
    401 {
    402   int cond = condition_met (cccc);
    403   TRACE_ALU_INPUT3 (cond, imm5, GR[reg2]);
    404   GR[reg3] = cond ? imm5 : GR[reg2];
    405   TRACE_ALU_RESULT (GR[reg3]);
    406 }
    407 
    408 
    409 
    410 // CMP
    411 rrrrr,001111,RRRRR:I:::cmp
    412 "cmp r<reg1>, r<reg2>"
    413 {
    414   COMPAT_1 (OP_1E0 ());
    415 }
    416 
    417 rrrrr,010011,iiiii:II:::cmp
    418 "cmp <imm5>, r<reg2>"
    419 {
    420   COMPAT_1 (OP_260 ());
    421 }
    422 
    423 
    424 
    425 // DI
    426 0000011111100000 + 0000000101100000:X:::di
    427 "di"
    428 {
    429   COMPAT_2 (OP_16007E0 ());
    430 }
    431 
    432 
    433 
    434 // DISPOSE
    435 // 0000011001,iiiii,L + LLLLLLLLLLL,00000:XIII:::dispose
    436 // "dispose <imm5>, <list12>"
    437 0000011001,iiiii,L + LLLLLLLLLLL,RRRRR:XIII:::dispose
    438 *v850e
    439 *v850e1
    440 *v850e2
    441 *v850e2v3
    442 *v850e3v5
    443 "dispose <imm5>, <list12>":RRRRR == 0
    444 "dispose <imm5>, <list12>, [reg1]"
    445 {
    446   int i;
    447   SAVE_2;
    448       
    449   trace_input ("dispose", OP_PUSHPOP1, 0);
    450 
    451   SP += (OP[3] & 0x3e) << 1;
    452 
    453   /* Load the registers with lower number registers being retrieved
    454      from higher addresses.  */
    455   for (i = 12; i--;)
    456     if ((OP[3] & (1 << type1_regs[ i ])))
    457       {
    458 	State.regs[ 20 + i ] = load_mem (SP, 4);
    459 	SP += 4;
    460       }
    461   
    462   if ((OP[3] & 0x1f0000) != 0)
    463     {
    464       nia = State.regs[ (OP[3] >> 16) & 0x1f];
    465     }
    466   
    467   trace_output (OP_PUSHPOP1);
    468 }
    469 
    470 
    471 
    472 // DIV
    473 rrrrr,111111,RRRRR + wwwww,01011000000:XI:::div
    474 *v850e
    475 *v850e1
    476 *v850e2
    477 *v850e2v3
    478 *v850e3v5
    479 "div r<reg1>, r<reg2>, r<reg3>"
    480 {
    481   COMPAT_2 (OP_2C007E0 ());
    482 }
    483 
    484 
    485 // DIVH
    486 rrrrr!0,000010,RRRRR!0:I:::divh
    487 "divh r<reg1>, r<reg2>"
    488 {
    489   uint32_t ov, s, z;
    490   signed long int op0, op1, result;
    491 
    492   trace_input ("divh", OP_REG_REG, 0);
    493 
    494   PC = cia;
    495   OP[0] = instruction_0 & 0x1f;
    496   OP[1] = (instruction_0 >> 11) & 0x1f;
    497 
    498   /* Compute the result.  */
    499   op0 = EXTEND16 (State.regs[OP[0]]);
    500   op1 = State.regs[OP[1]];
    501   
    502   if (op0 == -1 && op1 == 0x80000000)
    503     {
    504       PSW &= ~PSW_Z;
    505       PSW |= PSW_OV | PSW_S;
    506       State.regs[OP[1]] = 0x80000000;
    507     }
    508   else if (op0 == 0)
    509     {
    510       PSW |= PSW_OV;
    511     }
    512   else
    513     {
    514       result = (int32_t) op1 / op0;
    515       ov = 0;
    516 
    517       /* Compute the condition codes.  */
    518       z = (result == 0);
    519       s = (result & 0x80000000);
    520   
    521       /* Store the result and condition codes.  */
    522       State.regs[OP[1]] = result;
    523       PSW &= ~(PSW_Z | PSW_S | PSW_OV);
    524       PSW |= ((z ? PSW_Z : 0) | (s ? PSW_S : 0) | (ov ? PSW_OV : 0));
    525     }
    526 
    527   trace_output (OP_REG_REG);
    528 
    529   PC += 2;
    530   nia = PC;
    531 }
    532 
    533 rrrrr,111111,RRRRR + wwwww,01010000000:XI:::divh
    534 *v850e
    535 *v850e1
    536 *v850e2
    537 *v850e2v3
    538 *v850e3v5
    539 "divh r<reg1>, r<reg2>, r<reg3>"
    540 {
    541   COMPAT_2 (OP_28007E0 ());
    542 }
    543 
    544 
    545 // DIVHU
    546 rrrrr,111111,RRRRR + wwwww,01010000010:XI:::divhu
    547 *v850e
    548 *v850e1
    549 *v850e2
    550 *v850e2v3
    551 *v850e3v5
    552 "divhu r<reg1>, r<reg2>, r<reg3>"
    553 {
    554   COMPAT_2 (OP_28207E0 ());
    555 }
    556 
    557 
    558 // DIVU
    559 rrrrr,111111,RRRRR + wwwww,01011000010:XI:::divu
    560 *v850e
    561 *v850e1
    562 *v850e2
    563 *v850e2v3
    564 *v850e3v5
    565 "divu r<reg1>, r<reg2>, r<reg3>"
    566 {
    567   COMPAT_2 (OP_2C207E0 ());
    568 }
    569 
    570 
    571 // DIVQ
    572 rrrrr,111111,RRRRR + wwwww,01011111100:XI:::divq
    573 *v850e2
    574 *v850e2v3
    575 *v850e3v5
    576 "divq r<reg1>, r<reg2>, r<reg3>"
    577 {
    578   unsigned int quotient;
    579   unsigned int remainder;
    580   unsigned int divide_by;
    581   unsigned int divide_this;
    582 
    583   TRACE_ALU_INPUT2 (GR[reg1], GR[reg2]);
    584 
    585   divide_by   = GR[reg1];
    586   divide_this = GR[reg2];
    587   v850_div (SD, divide_by, divide_this, &quotient, &remainder);
    588   GR[reg2] = quotient;
    589   GR[reg3] = remainder;
    590 
    591   TRACE_ALU_RESULT2 (GR[reg2], GR[reg3]);
    592 }
    593 
    594 
    595 // DIVQU
    596 rrrrr,111111,RRRRR + wwwww,01011111110:XI:::divqu
    597 *v850e2
    598 *v850e2v3
    599 *v850e3v5
    600 "divq r<reg1>, r<reg2>, r<reg3>"
    601 {
    602   unsigned int quotient;
    603   unsigned int remainder;
    604   unsigned int divide_by;
    605   unsigned int divide_this;
    606 
    607   TRACE_ALU_INPUT2 (GR[reg1], GR[reg2]);
    608   
    609   divide_by   = GR[reg1];
    610   divide_this = GR[reg2];
    611   v850_divu (SD, divide_by, divide_this, &quotient, &remainder);
    612   GR[reg2] = quotient;
    613   GR[reg3] = remainder;
    614 
    615   TRACE_ALU_RESULT2 (GR[reg2], GR[reg3]);
    616 }
    617 
    618 
    619 // EI
    620 1000011111100000 + 0000000101100000:X:::ei
    621 "ei"
    622 {
    623   COMPAT_2 (OP_16087E0 ());
    624 }
    625 
    626 
    627 
    628 // EIRET
    629 0000011111100000 + 0000000101001000:X:::eiret
    630 "eiret"
    631 *v850e2
    632 *v850e2v3
    633 *v850e3v5
    634 {
    635   TRACE_ALU_INPUT1 (MPM & MPM_AUE);
    636 
    637   nia = EIPC;	/* next PC */
    638   if (MPM & MPM_AUE)
    639     {
    640       PSW = EIPSW;
    641     }
    642   else
    643     {
    644       PSW = (PSW & (PSW_NPV | PSW_DMP | PSW_IMP))
    645 	| (EIPSW & ~(PSW_NPV | PSW_DMP | PSW_IMP));
    646     }
    647 
    648   TRACE_ALU_RESULT1 (PSW);
    649   TRACE_BRANCH_RESULT (nia);
    650 }
    651 
    652 
    653 
    654 // FERET
    655 0000011111100000 + 0000000101001010:X:::feret
    656 "feret"
    657 *v850e2
    658 *v850e2v3
    659 *v850e3v5
    660 {
    661   TRACE_ALU_INPUT1 (MPM & MPM_AUE);
    662 
    663   nia = FEPC;	/* next PC */
    664   if (MPM & MPM_AUE)
    665     {
    666       PSW = FEPSW;
    667     }
    668   else
    669     {
    670       PSW = (PSW & (PSW_NPV | PSW_DMP | PSW_IMP))
    671 	| (FEPSW & ~(PSW_NPV | PSW_DMP | PSW_IMP));
    672     }
    673 
    674   TRACE_ALU_RESULT1 (PSW);
    675   TRACE_BRANCH_RESULT (nia);
    676 }
    677 
    678 
    679 // FETRAP
    680 0,bbbb!0,00001000000:I:::fetrap
    681 "fetrap"
    682 *v850e2
    683 *v850e2v3
    684 *v850e3v5
    685 {
    686   TRACE_ALU_INPUT0 ();
    687 
    688   FEPC = PC + 2;
    689   FEPSW = PSW;
    690   ECR &= ~ECR_FECC;
    691   ECR |= (0x30 + bit4) << 16;
    692   FEIC = 0x30 + bit4;
    693   PSW |= PSW_EP | PSW_ID | PSW_NP;
    694   nia = 0x30;	/* next PC */
    695 
    696   TRACE_ALU_RESULT1 (PSW);
    697   TRACE_BRANCH_RESULT (nia);
    698 }
    699 
    700 
    701 // HALT
    702 0000011111100000 + 0000000100100000:X:::halt
    703 "halt"
    704 {
    705   COMPAT_2 (OP_12007E0 ());
    706 }
    707 
    708 
    709 
    710 // HSH
    711 rrrrr,11111100000 + wwwww,01101000110:XII:::hsh
    712 *v850e2
    713 *v850e2v3
    714 *v850e3v5
    715 "hsh r<reg2>, r<reg3>"
    716 {
    717   uint32_t value;
    718   TRACE_ALU_INPUT1 (GR[reg2]);
    719 
    720   value = 0xffff & GR[reg2];
    721   GR[reg3] = GR[reg2];
    722 
    723   PSW &= ~(PSW_Z | PSW_S | PSW_CY | PSW_OV);
    724 
    725   if (value == 0) { PSW |= PSW_Z; PSW |= PSW_CY; }
    726   if (value & 0x80000000) PSW |= PSW_S;
    727 
    728   TRACE_ALU_RESULT1 (GR[reg3]);
    729 }
    730 
    731 
    732 // HSW
    733 rrrrr,11111100000 + wwwww,01101000100:XII:::hsw
    734 *v850e
    735 *v850e1
    736 *v850e2
    737 *v850e2v3
    738 *v850e3v5
    739 "hsw r<reg2>, r<reg3>"
    740 {
    741   uint32_t value;
    742   TRACE_ALU_INPUT1 (GR[reg2]);
    743 
    744   value = GR[reg2];
    745   value >>= 16;
    746   value |= (GR[reg2] << 16);
    747   
    748   GR[reg3] = value;
    749 
    750   PSW &= ~(PSW_Z | PSW_S | PSW_CY | PSW_OV);
    751 
    752   if (value == 0) PSW |= PSW_Z;
    753   if (value & 0x80000000) PSW |= PSW_S;
    754   if (((value & 0xffff) == 0) || (value & 0xffff0000) == 0) PSW |= PSW_CY;
    755 
    756   TRACE_ALU_RESULT (GR[reg3]);
    757 }
    758 
    759 
    760 
    761 // JARL
    762 rrrrr!0,11110,dddddd + ddddddddddddddd,0:V:::jarl
    763 "jarl <disp22>, r<reg2>"
    764 {
    765   GR[reg2] = nia;
    766   nia = cia + disp22;
    767   TRACE_BRANCH1 (GR[reg2]);
    768 }
    769 
    770 00000010111,RRRRR!0 + iiiiiiiiiiiiiiii + IIIIIIIIIIIIIIII:VI:::jarl32
    771 *v850e2
    772 *v850e2v3
    773 *v850e3v5
    774 "jarl <imm32>, r<reg1>"
    775 {
    776   GR[reg1] = nia;
    777   nia = (cia + imm32) & ~1;
    778 
    779   TRACE_BRANCH_RESULT (nia);
    780 }
    781 
    782 
    783 11000111111,RRRRR + wwwww!0,00101100000:XI:::jarl_reg
    784 *v850e3v5
    785 "jarl [r<reg1>], r<reg3>"
    786 {
    787   GR[reg3] = nia;
    788   nia = GR[reg1];
    789   TRACE_BRANCH_RESULT (nia);
    790 }
    791 
    792 
    793 // JMP
    794 00000000011,RRRRR:I:::jmp
    795 "jmp [r<reg1>]"
    796 {
    797   nia = GR[reg1] & ~1;
    798   TRACE_BRANCH0 ();
    799 }
    800 
    801 00000110111,RRRRR + iiiiiiiiiiiiiiii + IIIIIIIIIIIIIIII:VI:::jmp32
    802 *v850e2
    803 *v850e2v3
    804 *v850e3v5
    805 "jmp <imm32>[r<reg1>]"
    806 {
    807   nia = (GR[reg1] + imm32) & ~1;
    808 
    809   TRACE_BRANCH_RESULT (nia);
    810 }
    811 
    812 
    813 // JR
    814 0000011110,dddddd + ddddddddddddddd,0:V:::jr
    815 "jr <disp22>"
    816 {
    817   nia = cia + disp22;
    818   TRACE_BRANCH0 ();
    819 }
    820 
    821 
    822 // JR32
    823 0000001011100000 + iiiiiiiiiiiiiiii + IIIIIIIIIIIIIIII:VI:::jr32
    824 *v850e2
    825 *v850e2v3
    826 *v850e3v5
    827 "jr <imm32>"
    828 {
    829   nia = (cia + imm32) & ~1;
    830 
    831   TRACE_BRANCH_RESULT (nia);
    832 }
    833 
    834 
    835 // LD
    836 rrrrr,111000,RRRRR + dddddddddddddddd:VII:::ld.b
    837 "ld.b <disp16>[r<reg1>], r<reg2>"
    838 {
    839   COMPAT_2 (OP_700 ());
    840 }
    841 
    842 00000111100,RRRRR+wwwww,ddddddd,0101+dddddddddddddddd:XIV:::ld.b
    843 "ld.b <disp23>[r<reg1>], r<reg3>"
    844 *v850e2v3
    845 *v850e3v5
    846 {
    847   uint32_t addr = GR[reg1] + disp23;
    848   uint32_t result = EXTEND8 (load_data_mem (SD, addr, 1));
    849   GR[reg3] = result;
    850   TRACE_LD (addr, result);
    851 }
    852 
    853 rrrrr,111001,RRRRR + ddddddddddddddd,0:VII:::ld.h
    854 "ld.h <disp16>[r<reg1>], r<reg2>"
    855 {
    856   COMPAT_2 (OP_720 ());
    857 }
    858 
    859 00000111100,RRRRR+wwwww,dddddd,00111+dddddddddddddddd:XIV:::ld.h
    860 *v850e2v3
    861 *v850e3v5
    862 "ld.h <disp23>[r<reg1>], r<reg3>"
    863 {
    864   uint32_t addr = GR[reg1] + disp23;
    865   uint32_t result = EXTEND16 (load_data_mem (SD, addr, 2));
    866   GR[reg3] = result;
    867   TRACE_LD (addr, result);
    868 }
    869 
    870 rrrrr,111001,RRRRR + ddddddddddddddd,1:VII:::ld.w
    871 "ld.w <disp16>[r<reg1>], r<reg2>"
    872 {
    873   COMPAT_2 (OP_10720 ());
    874 }
    875 
    876 00000111100,RRRRR+wwwww,dddddd,01001+dddddddddddddddd:XIV:::ld.w
    877 *v850e2v3
    878 *v850e3v5
    879 "ld.w <disp23>[r<reg1>], r<reg3>"
    880 {
    881   uint32_t addr = GR[reg1] + disp23;
    882   uint32_t result = load_data_mem (SD, addr, 4);
    883   GR[reg3] = result;
    884   TRACE_LD (addr, result);
    885 }
    886 
    887 00000111101,RRRRR+wwwww,dddddd,01001+dddddddddddddddd:XIV:::ld.dw
    888 *v850e3v5
    889 "ld.dw <disp23>[r<reg1>], r<reg3>"
    890 {
    891   uint32_t addr = GR[reg1] + disp23;
    892   uint32_t result = load_data_mem (SD, addr, 4);
    893   GR[reg3] = result;
    894   TRACE_LD (addr, result);
    895   result = load_data_mem (SD, addr + 4, 4);
    896   GR[reg3 + 1] = result;
    897   TRACE_LD (addr + 4, result);
    898 }
    899 
    900 rrrrr!0,11110,b,RRRRR + ddddddddddddddd,1:VII:::ld.bu
    901 *v850e
    902 *v850e1
    903 *v850e2
    904 *v850e2v3
    905 *v850e3v5
    906 "ld.bu <disp16>[r<reg1>], r<reg2>"
    907 {
    908   COMPAT_2 (OP_10780 ());
    909 }
    910 
    911 00000111101,RRRRR+wwwww,ddddddd,0101+dddddddddddddddd:XIV:::ld.bu
    912 *v850e2v3
    913 *v850e3v5
    914 "ld.bu <disp23>[r<reg1>], r<reg3>"
    915 { 
    916   uint32_t addr = GR[reg1] + disp23;
    917   uint32_t result = load_data_mem (SD, addr, 1);
    918   GR[reg3] = result;
    919   TRACE_LD (addr, result);
    920 }
    921 
    922 rrrrr!0,111111,RRRRR + ddddddddddddddd,1:VII:::ld.hu
    923 *v850e
    924 *v850e1
    925 *v850e2
    926 *v850e2v3
    927 *v850e3v5
    928 "ld.hu <disp16>[r<reg1>], r<reg2>"
    929 {
    930   COMPAT_2 (OP_107E0 ());
    931 }
    932 
    933 00000111101,RRRRR+wwwww,dddddd,00111+dddddddddddddddd:XIV:::ld.hu
    934 *v850e2v3
    935 *v850e3v5
    936 "ld.hu <disp23>[r<reg1>], r<reg3>"
    937 {
    938   uint32_t addr = GR[reg1] + disp23;
    939   uint32_t result = load_data_mem (SD, addr, 2);
    940   GR[reg3] = result;
    941   TRACE_LD (addr, result);
    942 }
    943 
    944 
    945 
    946 // LDSR
    947 regID,111111,RRRRR + selID,00000100000:IX:::ldsr
    948 "ldsr r<reg1>, s<regID>":(selID == 0)
    949 "ldsr r<reg1>, s<regID>, <selID>"
    950 {
    951   uint32_t sreg = GR[reg1];
    952   TRACE_ALU_INPUT1 (GR[reg1]);
    953 
    954   /* FIXME: For now we ignore the selID.  */
    955   if (idecode_issue == idecode_v850e3v5_issue && selID != 0)
    956     {
    957       V850_SIM_CPU (CPU)->reg.selID_sregs[selID][regID] = sreg;
    958     }
    959   else if ((   idecode_issue == idecode_v850e2_issue
    960             || idecode_issue == idecode_v850e3v5_issue
    961 	    || idecode_issue == idecode_v850e2v3_issue)
    962            && regID < 28)
    963     {
    964       int protect_p = (PSW & PSW_NPV) ? 1 : 0;
    965 
    966       switch (BSEL & 0xffff)
    967 	{
    968 	case 0x0000:
    969 	  if ((PSW & PSW_NPV)
    970 	      && ((regID >= 8 && regID <= 12)
    971 		  || (regID >= 22 && regID <= 27)
    972 		  || regID == PSW_REGNO))
    973 	    {
    974 	      protect_p = 0;
    975 	    }
    976 	  break;
    977 	case 0x1000:	/* MPU0 */
    978 	  break;
    979 	case 0x1001:	/* MPU1 */
    980 	  break;
    981 	case 0x2000:	/* FPU */
    982 	  if ((PSW & PSW_NPV)
    983 	      && ((/* regID >= 0 && */ regID <= 5)
    984 		  || regID == 8 
    985 		  || regID == 9 
    986 		  || regID == 10 
    987 		  || (regID >= 11 && regID <= 26)))
    988 	    {
    989 	      protect_p = 0;
    990 	    }
    991 	  break;
    992 	case 0xff00:
    993 	  if ((PSW & PSW_NPV)
    994 	       && (regID == 6 
    995 		   || regID == 7 
    996 		   || regID == 8 
    997 		   || regID == 9 
    998 		   || regID == 10 
    999 		   || (regID >= 11 && regID <= 15)
   1000 		   || regID == 18 
   1001 		   || regID == 19 
   1002 		   || (regID >= 21 && regID <= 27)))
   1003 	    {
   1004 	      protect_p = 0;
   1005 	    }
   1006 	  break;
   1007 	case 0xffff:
   1008 	  if ((PSW & PSW_NPV)
   1009 	       && (regID == 6 
   1010 		   || regID == 7 
   1011 		   || regID == 8 
   1012 		   || regID == 9 
   1013 		   || regID == 10 
   1014 		   || regID == 11 
   1015 		   || regID == 12 
   1016 		   || regID == 15 
   1017 		   || regID == 18 
   1018 		   || regID == 19 
   1019 		   || (regID >= 21 && regID <= 27)))
   1020 	    {
   1021 	      protect_p = 0;
   1022 	    }
   1023 	  break;
   1024 	}
   1025 
   1026       if (!protect_p)
   1027 	{
   1028 	  switch (BSEL & 0xffff)
   1029 	    {
   1030 	    case 0x0000:
   1031 	    case 0xff00:	/* user0 bank */
   1032 	    case 0xffff:	/* user1 bank */
   1033 	      if(regID == PSW_REGNO)
   1034 		{
   1035 		  SR[regID] = sreg & ((PSW & PSW_NPV) ? 0xf : ~0);
   1036 		}
   1037 	      else
   1038 		{
   1039 		  SR[regID] = sreg;
   1040 		}
   1041 	      break;
   1042 	    case 0x1000:
   1043 	      MPU0_SR[regID] = sreg;
   1044 	      break;
   1045 	    case 0x1001:
   1046 	      if (regID == MPC_REGNO)
   1047 		{
   1048 		  PPC &= ~PPC_PPE;
   1049 		  SPAL &= ~SPAL_SPE;
   1050 		  IPA0L &= ~IPA_IPE;
   1051 		  IPA1L &= ~IPA_IPE;
   1052 		  IPA2L &= ~IPA_IPE;
   1053 		  IPA3L &= ~IPA_IPE;
   1054 		  DPA0L &= ~DPA_DPE;
   1055 		  DPA1L &= ~DPA_DPE;
   1056 		  DCC &= ~(DCC_DCE0 | DCC_DCE1);
   1057 		}
   1058 	      else
   1059 		{
   1060 		  MPU1_SR[regID] = sreg;
   1061 		}
   1062 	      break;
   1063 	    case 0x2000:	/* FPU */
   1064 	      if (regID == FPST_REGNO)
   1065 		{
   1066 		  unsigned int val = FPSR & ~(FPSR_PR | FPSR_XC | FPSR_XP);
   1067 	      
   1068 		  val |= ((sreg & FPST_PR) ? FPSR_PR : 0)
   1069 		    | ((sreg & FPST_XCE) ? FPSR_XCE : 0)
   1070 		    | ((sreg & FPST_XCV) ? FPSR_XCV : 0)
   1071 		    | ((sreg & FPST_XCZ) ? FPSR_XCZ : 0)
   1072 		    | ((sreg & FPST_XCO) ? FPSR_XCO : 0)
   1073 		    | ((sreg & FPST_XCU) ? FPSR_XCU : 0)
   1074 		    | ((sreg & FPST_XCI) ? FPSR_XCI : 0)
   1075 		    | ((sreg & FPST_XPV) ? FPSR_XPV : 0)
   1076 		    | ((sreg & FPST_XPZ) ? FPSR_XPZ : 0)
   1077 		    | ((sreg & FPST_XPO) ? FPSR_XPO : 0)
   1078 		    | ((sreg & FPST_XPU) ? FPSR_XPU : 0)
   1079 		    | ((sreg & FPST_XPI) ? FPSR_XPI : 0);
   1080 		  FPSR = val;
   1081 		}
   1082 	      else if (regID == FPCFG_REGNO)
   1083 		{
   1084 		  unsigned int val = FPSR & ~(FPSR_RM | FPSR_XE);
   1085 
   1086 		  val |= (((sreg & FPCFG_RM) >> 7) << 18)
   1087 		    | ((sreg & FPCFG_XEV) ? FPSR_XEV : 0)
   1088 		    | ((sreg & FPCFG_XEZ) ? FPSR_XEZ : 0)
   1089 		    | ((sreg & FPCFG_XEO) ? FPSR_XEO : 0)
   1090 		    | ((sreg & FPCFG_XEU) ? FPSR_XEU : 0)
   1091 		    | ((sreg & FPCFG_XEI) ? FPSR_XEI : 0);
   1092 		  FPSR = val;
   1093 		}
   1094 
   1095 	      FPU_SR[regID] = sreg;
   1096 	      break;
   1097 	    }
   1098 	}
   1099     }
   1100   else
   1101     {
   1102       SR[regID] = sreg;
   1103     }
   1104  
   1105   TRACE_ALU_RESULT (sreg);
   1106 }
   1107 
   1108 
   1109 // MAC
   1110 rrrrr,111111,RRRRR + wwww,0011110,mmmm,0:XI:::mac
   1111 *v850e2
   1112 *v850e2v3
   1113 *v850e3v5
   1114 "mac r<reg1>, r<reg2>, r<reg3e>, r<reg4e>"
   1115 {
   1116   unsigned long op0;
   1117   unsigned long op1;
   1118   unsigned long op2;
   1119   unsigned long op2hi;
   1120   unsigned long lo;
   1121   unsigned long mid1;
   1122   unsigned long mid2;
   1123   unsigned long hi;
   1124   unsigned long RdLo;
   1125   unsigned long RdHi;
   1126   int           carry;
   1127   bfd_boolean sign;
   1128 
   1129   op0 = GR[reg1];
   1130   op1 = GR[reg2];
   1131   op2 = GR[reg3e];
   1132   op2hi = GR[reg3e+1];
   1133 
   1134   TRACE_ALU_INPUT4 (op0, op1, op2, op2hi);
   1135 
   1136   sign = (op0 ^ op1) & 0x80000000;
   1137 	  
   1138   if (((signed long) op0) < 0)
   1139     op0 = - op0;
   1140 	  
   1141   if (((signed long) op1) < 0)
   1142     op1 = - op1;
   1143       
   1144   /* We can split the 32x32 into four 16x16 operations. This ensures
   1145      that we do not lose precision on 32bit only hosts: */
   1146   lo   = ( (op0        & 0xFFFF) *  (op1        & 0xFFFF));
   1147   mid1 = ( (op0        & 0xFFFF) * ((op1 >> 16) & 0xFFFF));
   1148   mid2 = (((op0 >> 16) & 0xFFFF) *  (op1        & 0xFFFF));
   1149   hi   = (((op0 >> 16) & 0xFFFF) * ((op1 >> 16) & 0xFFFF));
   1150   
   1151   /* We now need to add all of these results together, taking care
   1152      to propagate the carries from the additions: */
   1153   RdLo = Add32 (lo, (mid1 << 16), & carry);
   1154   RdHi = carry;
   1155   RdLo = Add32 (RdLo, (mid2 << 16), & carry);
   1156   RdHi += (carry + ((mid1 >> 16) & 0xFFFF) + ((mid2 >> 16) & 0xFFFF) + hi);
   1157 
   1158   if (sign)
   1159     {
   1160       RdLo = ~ RdLo;
   1161       RdHi = ~ RdHi;
   1162       if (RdLo == 0xFFFFFFFF)
   1163 	{
   1164 	  RdLo = 0;
   1165 	  RdHi += 1;
   1166 	}
   1167       else
   1168 	RdLo += 1;
   1169     }
   1170 
   1171   RdLo = Add32 (RdLo, op2, & carry);
   1172   RdHi += carry + op2hi; 
   1173 
   1174   /* Store the result and condition codes.  */
   1175   GR[reg4e] = RdLo;
   1176   GR[reg4e + 1 ] = RdHi;
   1177 
   1178   TRACE_ALU_RESULT2 (RdLo, RdHi);
   1179 }
   1180 
   1181 
   1182 
   1183 // MACU
   1184 rrrrr,111111,RRRRR + wwww,0011111,mmmm,0:XI:::macu
   1185 *v850e2
   1186 *v850e2v3
   1187 *v850e3v5
   1188 "macu r<reg1>, r<reg2>, r<reg3e>, r<reg4e>"
   1189 {
   1190   unsigned long op0;
   1191   unsigned long op1;
   1192   unsigned long op2;
   1193   unsigned long op2hi;
   1194   unsigned long lo;
   1195   unsigned long mid1;
   1196   unsigned long mid2;
   1197   unsigned long hi;
   1198   unsigned long RdLo;
   1199   unsigned long RdHi;
   1200   int           carry;
   1201   
   1202   op0 = GR[reg1];
   1203   op1 = GR[reg2];
   1204   op2 = GR[reg3e];
   1205   op2hi = GR[reg3e + 1];
   1206 
   1207   TRACE_ALU_INPUT4 (op0, op1, op2, op2hi);
   1208 
   1209   /* We can split the 32x32 into four 16x16 operations. This ensures
   1210      that we do not lose precision on 32bit only hosts: */
   1211   lo   = ( (op0        & 0xFFFF) *  (op1        & 0xFFFF));
   1212   mid1 = ( (op0        & 0xFFFF) * ((op1 >> 16) & 0xFFFF));
   1213   mid2 = (((op0 >> 16) & 0xFFFF) *  (op1        & 0xFFFF));
   1214   hi   = (((op0 >> 16) & 0xFFFF) * ((op1 >> 16) & 0xFFFF));
   1215   
   1216   /* We now need to add all of these results together, taking care
   1217      to propagate the carries from the additions: */
   1218   RdLo = Add32 (lo, (mid1 << 16), & carry);
   1219   RdHi = carry;
   1220   RdLo = Add32 (RdLo, (mid2 << 16), & carry);
   1221   RdHi += (carry + ((mid1 >> 16) & 0xFFFF) + ((mid2 >> 16) & 0xFFFF) + hi);
   1222 
   1223   RdLo = Add32 (RdLo, op2, & carry);
   1224   RdHi += carry + op2hi; 
   1225 
   1226   /* Store the result and condition codes.  */
   1227   GR[reg4e] = RdLo;
   1228   GR[reg4e+1] = RdHi;
   1229 
   1230   TRACE_ALU_RESULT2 (RdLo, RdHi);
   1231 }
   1232 
   1233 
   1234 
   1235 // MOV
   1236 rrrrr!0,000000,RRRRR:I:::mov
   1237 "mov r<reg1>, r<reg2>"
   1238 {
   1239   TRACE_ALU_INPUT0 ();
   1240   GR[reg2] = GR[reg1];
   1241   TRACE_ALU_RESULT (GR[reg2]);
   1242 }
   1243 
   1244 rrrrr!0,010000,iiiii:II:::mov
   1245 "mov <imm5>, r<reg2>"
   1246 {
   1247   COMPAT_1 (OP_200 ());
   1248 }
   1249 
   1250 00000110001,RRRRR + iiiiiiiiiiiiiiii + IIIIIIIIIIIIIIII:VI:::mov
   1251 *v850e
   1252 *v850e1
   1253 *v850e2
   1254 *v850e2v3
   1255 *v850e3v5
   1256 "mov <imm32>, r<reg1>"
   1257 {
   1258   SAVE_2;
   1259   trace_input ("mov", OP_IMM_REG, 4);
   1260   State.regs[ OP[0] ] = load_mem (PC + 2, 4);
   1261   trace_output (OP_IMM_REG);
   1262 }
   1263 
   1264 
   1265 
   1266 // MOVEA
   1267 rrrrr!0,110001,RRRRR + iiiiiiiiiiiiiiii:VI:::movea
   1268 "movea <simm16>, r<reg1>, r<reg2>"
   1269 {
   1270   TRACE_ALU_INPUT2 (GR[reg1], simm16);
   1271   GR[reg2] = GR[reg1] + simm16;
   1272   TRACE_ALU_RESULT (GR[reg2]);
   1273 }
   1274 
   1275 
   1276 
   1277 // MOVHI
   1278 rrrrr!0,110010,RRRRR + iiiiiiiiiiiiiiii:VI:::movhi
   1279 "movhi <uimm16>, r<reg1>, r<reg2>"
   1280 {
   1281   COMPAT_2 (OP_640 ());
   1282 }
   1283 
   1284 
   1285 
   1286 // MUL
   1287 rrrrr,111111,RRRRR + wwwww,01000100000:XI:::mul
   1288 *v850e
   1289 *v850e1
   1290 *v850e2
   1291 *v850e2v3
   1292 *v850e3v5
   1293 "mul r<reg1>, r<reg2>, r<reg3>"
   1294 {
   1295   COMPAT_2 (OP_22007E0 ());
   1296 }
   1297 
   1298 rrrrr,111111,iiiii + wwwww,01001,IIII,00:XII:::mul
   1299 *v850e
   1300 *v850e1
   1301 *v850e2
   1302 *v850e2v3
   1303 *v850e3v5
   1304 "mul <imm9>, r<reg2>, r<reg3>"
   1305 {
   1306   COMPAT_2 (OP_24007E0 ());
   1307 }
   1308 
   1309 
   1310 // MULH
   1311 rrrrr!0,000111,RRRRR:I:::mulh
   1312 "mulh r<reg1>, r<reg2>"
   1313 {
   1314   COMPAT_1 (OP_E0 ());
   1315 }
   1316 
   1317 rrrrr!0,010111,iiiii:II:::mulh
   1318 "mulh <imm5>, r<reg2>"
   1319 {
   1320   COMPAT_1 (OP_2E0 ());
   1321 }
   1322 
   1323 
   1324 
   1325 // MULHI
   1326 rrrrr!0,110111,RRRRR + iiiiiiiiiiiiiiii:VI:::mulhi
   1327 "mulhi <uimm16>, r<reg1>, r<reg2>"
   1328 {
   1329   COMPAT_2 (OP_6E0 ());
   1330 }
   1331 
   1332 
   1333 
   1334 // MULU
   1335 rrrrr,111111,RRRRR + wwwww,01000100010:XI:::mulu
   1336 *v850e
   1337 *v850e1
   1338 *v850e2
   1339 *v850e2v3
   1340 *v850e3v5
   1341 "mulu r<reg1>, r<reg2>, r<reg3>"
   1342 {
   1343   COMPAT_2 (OP_22207E0 ());
   1344 }
   1345 
   1346 rrrrr,111111,iiiii + wwwww,01001,IIII,10:XII:::mulu
   1347 *v850e
   1348 *v850e1
   1349 *v850e2
   1350 *v850e2v3
   1351 *v850e3v5
   1352 "mulu <imm9>, r<reg2>, r<reg3>"
   1353 {
   1354   COMPAT_2 (OP_24207E0 ());
   1355 }
   1356 
   1357 
   1358 
   1359 // NOP
   1360 0000000000000000:I:::nop
   1361 "nop"
   1362 {
   1363   /* do nothing, trace nothing */
   1364 }
   1365 
   1366 
   1367 
   1368 // NOT
   1369 rrrrr,000001,RRRRR:I:::not
   1370 "not r<reg1>, r<reg2>"
   1371 {
   1372   COMPAT_1 (OP_20 ());
   1373 }
   1374 
   1375 
   1376 
   1377 // NOT1
   1378 01,bbb,111110,RRRRR + dddddddddddddddd:VIII:::not1
   1379 "not1 <bit3>, <disp16>[r<reg1>]"
   1380 {
   1381   COMPAT_2 (OP_47C0 ());
   1382 }
   1383 
   1384 rrrrr,111111,RRRRR + 0000000011100010:IX:::not1
   1385 *v850e
   1386 *v850e1
   1387 *v850e2
   1388 *v850e2v3
   1389 *v850e3v5
   1390 "not1 r<reg2>, r<reg1>"
   1391 {
   1392   COMPAT_2 (OP_E207E0 ());
   1393 }
   1394 
   1395 
   1396 
   1397 // OR
   1398 rrrrr,001000,RRRRR:I:::or
   1399 "or r<reg1>, r<reg2>"
   1400 {
   1401   COMPAT_1 (OP_100 ());
   1402 }
   1403 
   1404 
   1405 
   1406 // ORI 
   1407 rrrrr,110100,RRRRR + iiiiiiiiiiiiiiii:VI:::ori
   1408 "ori <uimm16>, r<reg1>, r<reg2>"
   1409 {
   1410   COMPAT_2 (OP_680 ());
   1411 }
   1412 
   1413 
   1414 
   1415 // PREPARE
   1416 0000011110,iiiii,L + LLLLLLLLLLL,00001:XIII:::prepare
   1417 *v850e
   1418 *v850e1
   1419 *v850e2
   1420 *v850e2v3
   1421 *v850e3v5
   1422 "prepare <list12>, <imm5>"
   1423 {
   1424   int  i;
   1425   SAVE_2;
   1426   
   1427   trace_input ("prepare", OP_PUSHPOP1, 0);
   1428   
   1429   /* Store the registers with lower number registers being placed at
   1430      higher addresses.  */
   1431   for (i = 0; i < 12; i++)
   1432     if ((OP[3] & (1 << type1_regs[ i ])))
   1433       {
   1434 	SP -= 4;
   1435 	store_mem (SP, 4, State.regs[ 20 + i ]);
   1436       }
   1437   
   1438   SP -= (OP[3] & 0x3e) << 1;
   1439   
   1440   trace_output (OP_PUSHPOP1);
   1441 }
   1442 
   1443 
   1444 0000011110,iiiii,L + LLLLLLLLLLL,00011:XIII:::prepare00
   1445 *v850e
   1446 *v850e1
   1447 *v850e2
   1448 *v850e2v3
   1449 *v850e3v5
   1450 "prepare <list12>, <imm5>, sp"
   1451 {
   1452   COMPAT_2 (OP_30780 ());
   1453 }
   1454 
   1455 0000011110,iiiii,L + LLLLLLLLLLL,01011 + iiiiiiiiiiiiiiii:XIII:::prepare01
   1456 *v850e
   1457 *v850e1
   1458 *v850e2
   1459 *v850e2v3
   1460 *v850e3v5
   1461 "prepare <list12>, <imm5>, <uimm16>"
   1462 {
   1463   COMPAT_2 (OP_B0780 ());
   1464 }
   1465 
   1466 0000011110,iiiii,L + LLLLLLLLLLL,10011 + iiiiiiiiiiiiiiii:XIII:::prepare10
   1467 *v850e
   1468 *v850e1
   1469 *v850e2
   1470 *v850e2v3
   1471 *v850e3v5
   1472 "prepare <list12>, <imm5>, <uimm16>"
   1473 {
   1474   COMPAT_2 (OP_130780 ());
   1475 }
   1476 
   1477 0000011110,iiiii,L + LLLLLLLLLLL,11011 + iiiiiiiiiiiiiiii + dddddddddddddddd:XIII:::prepare11
   1478 *v850e
   1479 *v850e1
   1480 *v850e2
   1481 *v850e2v3
   1482 *v850e3v5
   1483 "prepare <list12>, <imm5>, <uimm32>"
   1484 {
   1485   COMPAT_2 (OP_1B0780 ());
   1486 }
   1487 
   1488 // RETI
   1489 0000011111100000 + 0000000101000000:X:::reti
   1490 "reti"
   1491 {
   1492   if ((PSW & PSW_EP))
   1493     {
   1494       nia = (EIPC & ~1);
   1495       PSW = EIPSW;
   1496     }
   1497   else if ((PSW & PSW_NP))
   1498     {
   1499       nia = (FEPC & ~1);
   1500       PSW = FEPSW;
   1501     }
   1502   else
   1503     {
   1504       nia = (EIPC & ~1);
   1505       PSW = EIPSW;
   1506     }
   1507   TRACE_BRANCH1 (PSW);
   1508 }
   1509 
   1510 
   1511 
   1512 // SAR
   1513 rrrrr,111111,RRRRR + 0000000010100000:IX:::sar
   1514 "sar r<reg1>, r<reg2>"
   1515 {
   1516   COMPAT_2 (OP_A007E0 ());
   1517 }
   1518 
   1519 rrrrr,010101,iiiii:II:::sar
   1520 "sar <imm5>, r<reg2>"
   1521 {
   1522   COMPAT_1 (OP_2A0 ());
   1523 }
   1524 
   1525 rrrrr,111111,RRRRR + wwwww,00010100010:XI:::sar
   1526 *v850e2
   1527 *v850e2v3
   1528 *v850e3v5
   1529 "sar r<reg1>, r<reg2>, r<reg3>"
   1530 {
   1531   TRACE_ALU_INPUT2 (GR[reg1], GR[reg2]);
   1532   v850_sar (SD, GR[reg1], GR[reg2], &GR[reg3]);
   1533   TRACE_ALU_RESULT1 (GR[reg3]);
   1534 }
   1535 
   1536 
   1537 // SASF
   1538 rrrrr,1111110,cccc+0000001000000000:IX:::sasf
   1539 *v850e
   1540 *v850e1
   1541 *v850e2
   1542 *v850e2v3
   1543 *v850e3v5
   1544 "sasf %s<cccc>, r<reg2>"
   1545 {
   1546   COMPAT_2 (OP_20007E0 ());
   1547 }
   1548 
   1549 
   1550 
   1551 // SATADD
   1552 rrrrr!0,000110,RRRRR:I:::satadd
   1553 "satadd r<reg1>, r<reg2>"
   1554 {
   1555   COMPAT_1 (OP_C0 ());
   1556 }
   1557 
   1558 rrrrr!0,010001,iiiii:II:::satadd
   1559 "satadd <imm5>, r<reg2>"
   1560 {
   1561   COMPAT_1 (OP_220 ());
   1562 }
   1563 
   1564 rrrrr,111111,RRRRR + wwwww,01110111010:XI:::satadd
   1565 *v850e2
   1566 *v850e2v3
   1567 *v850e3v5
   1568 "satadd r<reg1>, r<reg2>, r<reg3>"
   1569 {
   1570   TRACE_ALU_INPUT2 (GR[reg1], GR[reg2]);
   1571   v850_satadd (SD, GR[reg1], GR[reg2], &GR[reg3]);
   1572   TRACE_ALU_RESULT1 (GR[reg3]);
   1573 }
   1574 
   1575 
   1576 
   1577 // SATSUB
   1578 rrrrr!0,000101,RRRRR:I:::satsub
   1579 "satsub r<reg1>, r<reg2>"
   1580 {
   1581   COMPAT_1 (OP_A0 ());
   1582 }
   1583 
   1584 rrrrr,111111,RRRRR + wwwww,01110011010:XI:::satsub
   1585 *v850e2
   1586 *v850e2v3
   1587 *v850e3v5
   1588 "satsub r<reg1>, r<reg2>, r<reg3>"
   1589 {
   1590   TRACE_ALU_INPUT2 (GR[reg1], GR[reg2]);
   1591   v850_satsub (SD, GR[reg1], GR[reg2], &GR[reg3]);
   1592   TRACE_ALU_RESULT1 (GR[reg3]);
   1593 }
   1594 
   1595 
   1596 
   1597 // SATSUBI
   1598 rrrrr!0,110011,RRRRR + iiiiiiiiiiiiiiii:VI:::satsubi
   1599 "satsubi <simm16>, r<reg1>, r<reg2>"
   1600 {
   1601   COMPAT_2 (OP_660 ());
   1602 }
   1603 
   1604 
   1605 
   1606 // SATSUBR
   1607 rrrrr!0,000100,RRRRR:I:::satsubr
   1608 "satsubr r<reg1>, r<reg2>"
   1609 {
   1610   COMPAT_1 (OP_80 ());
   1611 }
   1612 
   1613 
   1614 
   1615 //SBF
   1616 rrrrr,111111,RRRRR + wwwww,011100,cccc!13,0:XI:::sbf
   1617 *v850e2
   1618 *v850e2v3
   1619 *v850e3v5
   1620 "sbf %s<cccc>, r<reg1>, r<reg2>, r<reg3>"
   1621 {
   1622   int cond = condition_met (cccc);
   1623   TRACE_ALU_INPUT3 (cond, GR[reg1], GR[reg2]);
   1624   GR[reg3] = GR[reg2] - GR[reg1] - (cond ? 1 : 0);
   1625   TRACE_ALU_RESULT1 (GR[reg3]);
   1626 }
   1627 
   1628 
   1629 
   1630 // SCH0L
   1631 rrrrr,11111100000 + wwwww,01101100100:IX:::sch0l
   1632 *v850e2
   1633 *v850e2v3
   1634 *v850e3v5
   1635 "sch0l r<reg2>, r<reg3>"
   1636 {
   1637   unsigned int pos, op0;
   1638 
   1639   TRACE_ALU_INPUT1 (GR[reg2]);
   1640 
   1641   op0 = GR[reg2];
   1642 
   1643   if (op0 == 0xffffffff)
   1644     {
   1645       PSW &= ~PSW_CY;
   1646       PSW &= ~PSW_OV;
   1647       PSW &= ~PSW_S;
   1648       PSW |= PSW_Z;
   1649       pos = 0;
   1650     }
   1651   else if (op0 == 0xfffffffe)
   1652     {
   1653       PSW |= PSW_CY;
   1654       PSW &= ~PSW_OV;
   1655       PSW &= ~PSW_S;
   1656       PSW &= ~PSW_Z;
   1657       pos = 32;
   1658     }
   1659   else
   1660     {
   1661       pos = 1;
   1662       while (op0 & 0x80000000) 
   1663 	{
   1664 	  op0 <<= 1; 
   1665 	  pos++;
   1666 	}
   1667       PSW &= ~PSW_CY;
   1668       PSW &= ~PSW_OV;
   1669       PSW &= ~PSW_S;
   1670       PSW &= ~PSW_Z;
   1671     }
   1672 
   1673   GR[reg3] = pos;
   1674 
   1675   TRACE_ALU_RESULT1 (GR[reg3]);
   1676 }
   1677 
   1678 
   1679 
   1680 // SCH0R
   1681 rrrrr,11111100000 + wwwww,01101100000:IX:::sch0r
   1682 *v850e2
   1683 *v850e2v3
   1684 *v850e3v5
   1685 "sch0r r<reg2>, r<reg3>"
   1686 {
   1687   unsigned int pos, op0;
   1688 
   1689   TRACE_ALU_INPUT1 (GR[reg2]);
   1690 
   1691   op0 = GR[reg2];
   1692 
   1693   if (op0 == 0xffffffff)
   1694     {
   1695       PSW &= ~PSW_CY;
   1696       PSW &= ~PSW_OV;
   1697       PSW &= ~PSW_S;
   1698       PSW |= PSW_Z;
   1699       pos = 0;
   1700     }
   1701   else if (op0 == 0x7fffffff)
   1702     {
   1703       PSW |= PSW_CY;
   1704       PSW &= ~PSW_OV;
   1705       PSW &= ~PSW_S;
   1706       PSW &= ~PSW_Z;
   1707       pos = 32;
   1708     }
   1709   else
   1710     {
   1711       pos = 1;
   1712       while (op0 & 0x00000001) 
   1713 	{
   1714 	  op0 >>= 1; 
   1715 	  pos++;
   1716 	}
   1717       PSW &= ~PSW_CY;
   1718       PSW &= ~PSW_OV;
   1719       PSW &= ~PSW_S;
   1720       PSW &= ~PSW_Z;
   1721     }
   1722 
   1723   GR[reg3] = pos;
   1724 
   1725   TRACE_ALU_RESULT1 (GR[reg3]);
   1726 }
   1727 
   1728 // SCH1L
   1729 rrrrr,11111100000 + wwwww,01101100110:IX:::sch1l
   1730 *v850e2
   1731 *v850e2v3
   1732 *v850e3v5
   1733 "sch1l r<reg2>, r<reg3>"
   1734 {
   1735   unsigned int pos, op0;
   1736 
   1737   TRACE_ALU_INPUT1 (GR[reg2]);
   1738 
   1739   op0 = GR[reg2];
   1740 
   1741   if (op0 == 0x00000000)
   1742     {
   1743       PSW &= ~PSW_CY;
   1744       PSW &= ~PSW_OV;
   1745       PSW &= ~PSW_S;
   1746       PSW |= PSW_Z;
   1747       pos = 0;
   1748     }
   1749   else if (op0 == 0x00000001)
   1750     {
   1751       PSW |= PSW_CY;
   1752       PSW &= ~PSW_OV;
   1753       PSW &= ~PSW_S;
   1754       PSW &= ~PSW_Z;
   1755       pos = 32;
   1756     }
   1757   else
   1758     {
   1759       pos = 1;
   1760       while (!(op0 & 0x80000000)) 
   1761 	{
   1762 	  op0 <<= 1; 
   1763 	  pos++;
   1764 	}
   1765       PSW &= ~PSW_CY;
   1766       PSW &= ~PSW_OV;
   1767       PSW &= ~PSW_S;
   1768       PSW &= ~PSW_Z;
   1769     }
   1770 
   1771   GR[reg3] = pos;
   1772 
   1773   TRACE_ALU_RESULT1 (GR[reg3]);
   1774 }
   1775 
   1776 // SCH1R
   1777 rrrrr,11111100000 + wwwww,01101100010:IX:::sch1r
   1778 *v850e2
   1779 *v850e2v3
   1780 *v850e3v5
   1781 "sch1r r<reg2>, r<reg3>"
   1782 {
   1783   unsigned int pos, op0;
   1784 
   1785   TRACE_ALU_INPUT1 (GR[reg2]);
   1786 
   1787   op0 = GR[reg2];
   1788 
   1789   if (op0 == 0x00000000)
   1790     {
   1791       PSW &= ~PSW_CY;
   1792       PSW &= ~PSW_OV;
   1793       PSW &= ~PSW_S;
   1794       PSW |= PSW_Z;
   1795       pos = 0;
   1796     }
   1797   else if (op0 == 0x80000000)
   1798     {
   1799       PSW |= PSW_CY;
   1800       PSW &= ~PSW_OV;
   1801       PSW &= ~PSW_S;
   1802       PSW &= ~PSW_Z;
   1803       pos = 32;
   1804     }
   1805   else
   1806     {
   1807       pos = 1;
   1808       while (!(op0 & 0x00000001)) 
   1809 	{
   1810 	  op0 >>= 1;
   1811 	  pos++;
   1812 	}
   1813       PSW &= ~PSW_CY;
   1814       PSW &= ~PSW_OV;
   1815       PSW &= ~PSW_S;
   1816       PSW &= ~PSW_Z;
   1817     }
   1818 
   1819   GR[reg3] = pos;
   1820 
   1821   TRACE_ALU_RESULT1 (GR[reg3]);
   1822 }
   1823 
   1824 //SHL
   1825 rrrrr,111111,RRRRR + wwwww,00011000010:XI:::shl
   1826 *v850e2
   1827 *v850e2v3
   1828 *v850e3v5
   1829 "shl r<reg1>, r<reg2>, r<reg3>"
   1830 {
   1831   TRACE_ALU_INPUT2 (GR[reg1], GR[reg2]);
   1832   v850_shl (SD, GR[reg1], GR[reg2], &GR[reg3]);
   1833   TRACE_ALU_RESULT1 (GR[reg3]);
   1834 }
   1835 
   1836 //SHR
   1837 rrrrr,111111,RRRRR + wwwww,00010000010:XI:::shr
   1838 *v850e2
   1839 *v850e2v3
   1840 *v850e3v5
   1841 "shr r<reg1>, r<reg2>, r<reg3>"
   1842 {
   1843   TRACE_ALU_INPUT2 (GR[reg1], GR[reg2]);
   1844   v850_shr (SD, GR[reg1], GR[reg2], &GR[reg3]);
   1845   TRACE_ALU_RESULT1 (GR[reg3]);
   1846 }
   1847 
   1848 
   1849 
   1850 // SETF
   1851 rrrrr,1111110,cccc + 0000000000000000:IX:::setf
   1852 "setf %s<cccc>, r<reg2>"
   1853 {
   1854   COMPAT_2 (OP_7E0 ());
   1855 }
   1856 
   1857 
   1858 
   1859 // SET1
   1860 00,bbb,111110,RRRRR + dddddddddddddddd:VIII:::set1
   1861 "set1 <bit3>, <disp16>[r<reg1>]"
   1862 {
   1863   COMPAT_2 (OP_7C0 ());
   1864 }
   1865 
   1866 rrrrr,111111,RRRRR + 0000000011100000:IX:::set1
   1867 *v850e
   1868 *v850e1
   1869 *v850e2
   1870 *v850e2v3
   1871 *v850e3v5
   1872 "set1 r<reg2>, [r<reg1>]"
   1873 {
   1874   COMPAT_2 (OP_E007E0 ());
   1875 }
   1876 
   1877 
   1878 
   1879 // SHL
   1880 rrrrr,111111,RRRRR + 0000000011000000:IX:::shl
   1881 "shl r<reg1>, r<reg2>"
   1882 {
   1883   COMPAT_2 (OP_C007E0 ());
   1884 }
   1885 
   1886 rrrrr,010110,iiiii:II:::shl
   1887 "shl <imm5>, r<reg2>"
   1888 {
   1889   COMPAT_1 (OP_2C0 ());
   1890 }
   1891 
   1892 
   1893 
   1894 // SHR
   1895 rrrrr,111111,RRRRR + 0000000010000000:IX:::shr
   1896 "shr r<reg1>, r<reg2>"
   1897 {
   1898   COMPAT_2 (OP_8007E0 ());
   1899 }
   1900 
   1901 rrrrr,010100,iiiii:II:::shr
   1902 "shr <imm5>, r<reg2>"
   1903 {
   1904   COMPAT_1 (OP_280 ());
   1905 }
   1906 
   1907 
   1908 
   1909 // SLD
   1910 rrrrr,0110,ddddddd:IV:::sld.b
   1911 "sld.bu <disp7>[ep], r<reg2>":(PSW & PSW_US)
   1912 "sld.b <disp7>[ep], r<reg2>"
   1913 {
   1914   uint32_t addr = EP + disp7;
   1915   uint32_t result = load_mem (addr, 1);
   1916   if (PSW & PSW_US)
   1917     {
   1918       GR[reg2] = result;
   1919       TRACE_LD_NAME ("sld.bu", addr, result);
   1920     }
   1921   else
   1922     {
   1923       result = EXTEND8 (result);
   1924       GR[reg2] = result;
   1925       TRACE_LD (addr, result);
   1926     }
   1927 }
   1928 
   1929 rrrrr,1000,ddddddd:IV:::sld.h
   1930 "sld.hu <disp8>[ep], r<reg2>":(PSW & PSW_US)
   1931 "sld.h <disp8>[ep], r<reg2>"
   1932 {
   1933   uint32_t addr = EP + disp8;
   1934   uint32_t result = load_mem (addr, 2);
   1935   if (PSW & PSW_US)
   1936     {
   1937       GR[reg2] = result;
   1938       TRACE_LD_NAME ("sld.hu", addr, result);
   1939     }
   1940   else
   1941     {
   1942       result = EXTEND16 (result);
   1943       GR[reg2] = result;
   1944       TRACE_LD (addr, result);
   1945     }
   1946 }
   1947 
   1948 rrrrr,1010,dddddd,0:IV:::sld.w
   1949 "sld.w <disp8>[ep], r<reg2>"
   1950 {
   1951   uint32_t addr = EP + disp8;
   1952   uint32_t result = load_mem (addr, 4);
   1953   GR[reg2] = result;
   1954   TRACE_LD (addr, result);
   1955 }
   1956 
   1957 rrrrr!0,0000110,dddd:IV:::sld.bu
   1958 *v850e
   1959 *v850e1
   1960 *v850e2
   1961 *v850e2v3
   1962 *v850e3v5
   1963 "sld.b <disp4>[ep], r<reg2>":(PSW & PSW_US)
   1964 "sld.bu <disp4>[ep], r<reg2>"
   1965 {
   1966   uint32_t addr = EP + disp4;
   1967   uint32_t result = load_mem (addr, 1);
   1968   if (PSW & PSW_US)
   1969     {
   1970       result = EXTEND8 (result);
   1971       GR[reg2] = result;
   1972       TRACE_LD_NAME ("sld.b", addr, result);
   1973     }
   1974   else
   1975     {
   1976       GR[reg2] = result;
   1977       TRACE_LD (addr, result);
   1978     }
   1979 }
   1980 
   1981 rrrrr!0,0000111,dddd:IV:::sld.hu
   1982 *v850e
   1983 *v850e1
   1984 *v850e2
   1985 *v850e2v3
   1986 *v850e3v5
   1987 "sld.h <disp5>[ep], r<reg2>":(PSW & PSW_US)
   1988 "sld.hu <disp5>[ep], r<reg2>"
   1989 {
   1990   uint32_t addr = EP + disp5;
   1991   uint32_t result = load_mem (addr, 2);
   1992   if (PSW & PSW_US)
   1993     {
   1994       result = EXTEND16 (result);
   1995       GR[reg2] = result;
   1996       TRACE_LD_NAME ("sld.h", addr, result);
   1997     }
   1998   else
   1999     {
   2000       GR[reg2] = result;
   2001       TRACE_LD (addr, result);
   2002     }
   2003 }
   2004 
   2005 
   2006 
   2007 // SST
   2008 rrrrr,0111,ddddddd:IV:::sst.b
   2009 "sst.b r<reg2>, <disp7>[ep]"
   2010 {
   2011   COMPAT_1 (OP_380 ());
   2012 }
   2013 
   2014 rrrrr,1001,ddddddd:IV:::sst.h
   2015 "sst.h r<reg2>, <disp8>[ep]"
   2016 {
   2017   COMPAT_1 (OP_480 ());
   2018 }
   2019 
   2020 rrrrr,1010,dddddd,1:IV:::sst.w
   2021 "sst.w r<reg2>, <disp8>[ep]"
   2022 {
   2023   COMPAT_1 (OP_501 ());
   2024 }
   2025 
   2026 // ST
   2027 rrrrr,111010,RRRRR + dddddddddddddddd:VII:::st.b
   2028 "st.b r<reg2>, <disp16>[r<reg1>]"
   2029 {
   2030   COMPAT_2 (OP_740 ());
   2031 }
   2032 
   2033 00000111100,RRRRR + wwwww,ddddddd,1101 + dddddddddddddddd:XIV:::st.b
   2034 *v850e2v3
   2035 *v850e3v5
   2036 "st.b r<reg3>, <disp23>[r<reg1>]"
   2037 {
   2038   uint32_t addr = GR[reg1] + disp23;
   2039   store_data_mem (SD, addr, 1, GR[reg3]);
   2040   TRACE_ST (addr, GR[reg3]);
   2041 }
   2042 
   2043 rrrrr,111011,RRRRR + ddddddddddddddd,0:VII:::st.h
   2044 "st.h r<reg2>, <disp16>[r<reg1>]"
   2045 {
   2046   COMPAT_2 (OP_760 ());
   2047 }
   2048 
   2049 00000111101,RRRRR+wwwww,dddddd,01101+dddddddddddddddd:XIV:::st.h
   2050 *v850e2v3
   2051 *v850e3v5
   2052 "st.h r<reg3>, <disp23>[r<reg1>]"
   2053 {
   2054   uint32_t addr = GR[reg1] + disp23;
   2055   store_data_mem (SD, addr, 2, GR[reg3]);
   2056   TRACE_ST (addr, GR[reg3]);
   2057 }
   2058 
   2059 rrrrr,111011,RRRRR + ddddddddddddddd,1:VII:::st.w
   2060 "st.w r<reg2>, <disp16>[r<reg1>]"
   2061 {
   2062   COMPAT_2 (OP_10760 ());
   2063 }
   2064 
   2065 00000111100,RRRRR+wwwww,dddddd,01111+dddddddddddddddd:XIV:::st.w
   2066 *v850e2v3
   2067 *v850e3v5
   2068 "st.w r<reg3>, <disp23>[r<reg1>]"
   2069 {
   2070   uint32_t addr = GR[reg1] + disp23;
   2071   store_data_mem (SD, addr, 4, GR[reg3]);
   2072   TRACE_ST (addr, GR[reg3]);
   2073 }
   2074 
   2075 00000111101,RRRRR+wwwww,dddddd,01111+dddddddddddddddd:XIV:::st.dw
   2076 *v850e3v5
   2077 "st.dw r<reg3>, <disp23>[r<reg1>]"
   2078 {
   2079   uint32_t addr = GR[reg1] + disp23;
   2080   store_data_mem (SD, addr, 4, GR[reg3]);
   2081   TRACE_ST (addr, GR[reg3]);
   2082   store_data_mem (SD, addr + 4, 4, GR[reg3 + 1]);
   2083   TRACE_ST (addr + 4, GR[reg3 + 1]);
   2084 }
   2085 
   2086 
   2087 // STSR
   2088 rrrrr,111111,regID + 0000000001000000:IX:::stsr
   2089 "stsr s<regID>, r<reg2>"
   2090 {
   2091   uint32_t sreg = 0;
   2092 
   2093   if ((idecode_issue == idecode_v850e2_issue
   2094        || idecode_issue == idecode_v850e3v5_issue
   2095        || idecode_issue == idecode_v850e2v3_issue)
   2096       && regID < 28)
   2097     {
   2098       switch (BSEL & 0xffff)
   2099 	{
   2100 	case 0x0000:
   2101 	case 0xff00:	/* USER 0 */
   2102 	case 0xffff:	/* USER 1 */
   2103 	  sreg = SR[regID];
   2104 	  break;
   2105 	case 0x1000:
   2106 	  sreg = MPU0_SR[regID];
   2107 	  break;
   2108 	case 0x1001:
   2109 	  sreg = MPU1_SR[regID];
   2110 	  break;
   2111 	case 0x2000:
   2112 	  if (regID == FPST_REGNO)
   2113 	    {
   2114 	      sreg = ((FPSR & FPSR_PR) ? FPST_PR : 0)
   2115 		| ((FPSR & FPSR_XCE) ? FPST_XCE : 0)
   2116 		| ((FPSR & FPSR_XCV) ? FPST_XCV : 0)
   2117 		| ((FPSR & FPSR_XCZ) ? FPST_XCZ : 0)
   2118 		| ((FPSR & FPSR_XCO) ? FPST_XCO : 0)
   2119 		| ((FPSR & FPSR_XCU) ? FPST_XCU : 0)
   2120 		| ((FPSR & FPSR_XCI) ? FPST_XCI : 0)
   2121 		| ((FPSR & FPSR_XPV) ? FPST_XPV : 0)
   2122 		| ((FPSR & FPSR_XPZ) ? FPST_XPZ : 0)
   2123 		| ((FPSR & FPSR_XPO) ? FPST_XPO : 0)
   2124 		| ((FPSR & FPSR_XPU) ? FPST_XPU : 0)
   2125 		| ((FPSR & FPSR_XPI) ? FPST_XPI : 0);
   2126 	    }
   2127 	  else if (regID == FPCFG_REGNO)
   2128 	    {
   2129 	      sreg = (((FPSR & FPSR_RM) >> 18) << 7)
   2130 		| ((FPSR & FPSR_XEV) ? FPCFG_XEV : 0)
   2131 		| ((FPSR & FPSR_XEZ) ? FPCFG_XEZ : 0)
   2132 		| ((FPSR & FPSR_XEO) ? FPCFG_XEO : 0)
   2133 		| ((FPSR & FPSR_XEU) ? FPCFG_XEU : 0)
   2134 		| ((FPSR & FPSR_XEI) ? FPCFG_XEI : 0);
   2135 	    }
   2136 	  else
   2137 	    {
   2138 	      sreg = FPU_SR[regID];
   2139 	    }
   2140 	  break;
   2141 	}
   2142     }
   2143   else
   2144     {
   2145       sreg = SR[regID];
   2146     }
   2147 
   2148   TRACE_ALU_INPUT1 (sreg);
   2149   GR[reg2] = sreg;
   2150   TRACE_ALU_RESULT (GR[reg2]);
   2151 }
   2152 
   2153 // SUB
   2154 rrrrr,001101,RRRRR:I:::sub
   2155 "sub r<reg1>, r<reg2>"
   2156 {
   2157   COMPAT_1 (OP_1A0 ());
   2158 }
   2159 
   2160 // SUBR
   2161 rrrrr,001100,RRRRR:I:::subr
   2162 "subr r<reg1>, r<reg2>"
   2163 {
   2164   COMPAT_1 (OP_180 ());
   2165 }
   2166 
   2167 // SWITCH
   2168 00000000010,RRRRR:I:::switch
   2169 *v850e
   2170 *v850e1
   2171 *v850e2
   2172 *v850e2v3
   2173 *v850e3v5
   2174 "switch r<reg1>"
   2175 {
   2176   unsigned long adr;
   2177   SAVE_1;
   2178   trace_input ("switch", OP_REG, 0);
   2179   adr = (cia + 2) + (State.regs[ reg1 ] << 1);
   2180   nia = (cia + 2) + (EXTEND16 (load_mem (adr, 2)) << 1);
   2181   trace_output (OP_REG);
   2182 }
   2183 
   2184 // SXB
   2185 00000000101,RRRRR:I:::sxb
   2186 *v850e
   2187 *v850e1
   2188 *v850e2
   2189 *v850e2v3
   2190 *v850e3v5
   2191 "sxb r<reg1>"
   2192 {
   2193   TRACE_ALU_INPUT1 (GR[reg1]);
   2194   GR[reg1] = EXTEND8 (GR[reg1]);
   2195   TRACE_ALU_RESULT (GR[reg1]);
   2196 }
   2197 
   2198 // SXH
   2199 00000000111,RRRRR:I:::sxh
   2200 *v850e
   2201 *v850e1
   2202 *v850e2
   2203 *v850e2v3
   2204 *v850e3v5
   2205 "sxh r<reg1>"
   2206 {
   2207   TRACE_ALU_INPUT1 (GR[reg1]);
   2208   GR[reg1] = EXTEND16 (GR[reg1]);
   2209   TRACE_ALU_RESULT (GR[reg1]);
   2210 }
   2211 
   2212 // TRAP
   2213 00000111111,iiiii + 0000000100000000:X:::trap
   2214 "trap <vector>"
   2215 {
   2216   COMPAT_2 (OP_10007E0 ());
   2217 }
   2218 
   2219 // TST
   2220 rrrrr,001011,RRRRR:I:::tst
   2221 "tst r<reg1>, r<reg2>"
   2222 {
   2223   COMPAT_1 (OP_160 ());
   2224 }
   2225 
   2226 // TST1
   2227 11,bbb,111110,RRRRR + dddddddddddddddd:VIII:::tst1
   2228 "tst1 <bit3>, <disp16>[r<reg1>]"
   2229 {
   2230   COMPAT_2 (OP_C7C0 ());
   2231 }
   2232 
   2233 rrrrr,111111,RRRRR + 0000000011100110:IX:::tst1
   2234 *v850e
   2235 *v850e1
   2236 *v850e2
   2237 *v850e2v3
   2238 *v850e3v5
   2239 "tst1 r<reg2>, [r<reg1>]"
   2240 {
   2241   COMPAT_2 (OP_E607E0 ());
   2242 }
   2243 
   2244 // XOR
   2245 rrrrr,001001,RRRRR:I:::xor
   2246 "xor r<reg1>, r<reg2>"
   2247 {
   2248   COMPAT_1 (OP_120 ());
   2249 }
   2250 
   2251 // XORI
   2252 rrrrr,110101,RRRRR + iiiiiiiiiiiiiiii:VI:::xori
   2253 "xori <uimm16>, r<reg1>, r<reg2>"
   2254 {
   2255   COMPAT_2 (OP_6A0 ());
   2256 }
   2257 
   2258 // ZXB
   2259 00000000100,RRRRR:I:::zxb
   2260 *v850e
   2261 *v850e1
   2262 *v850e2
   2263 *v850e2v3
   2264 *v850e3v5
   2265 "zxb r<reg1>"
   2266 {
   2267   TRACE_ALU_INPUT1 (GR[reg1]);
   2268   GR[reg1] = GR[reg1] & 0xff;
   2269   TRACE_ALU_RESULT (GR[reg1]);
   2270 }
   2271 
   2272 // ZXH
   2273 00000000110,RRRRR:I:::zxh
   2274 *v850e
   2275 *v850e1
   2276 *v850e2
   2277 *v850e2v3
   2278 *v850e3v5
   2279 "zxh r<reg1>"
   2280 {
   2281   TRACE_ALU_INPUT1 (GR[reg1]);
   2282   GR[reg1] = GR[reg1] & 0xffff;
   2283   TRACE_ALU_RESULT (GR[reg1]);
   2284 }
   2285 
   2286 // Right field must be zero so that it doesn't clash with DIVH
   2287 // Left field must be non-zero so that it doesn't clash with SWITCH
   2288 11111,000010,00000:I:::break
   2289 *v850
   2290 *v850e
   2291 {
   2292   sim_engine_halt (SD, CPU, NULL, cia, sim_stopped, SIM_SIGTRAP);
   2293 }
   2294 
   2295 11111,000010,00000:I:::dbtrap
   2296 *v850e1
   2297 *v850e2
   2298 *v850e2v3
   2299 *v850e3v5
   2300 "dbtrap"
   2301 {
   2302   if (STATE_OPEN_KIND (SD) == SIM_OPEN_DEBUG)
   2303     {
   2304       sim_engine_halt (SD, CPU, NULL, cia, sim_stopped, SIM_SIGTRAP);
   2305     }
   2306   else 
   2307     {
   2308       DBPC = cia + 2;
   2309       DBPSW = PSW;
   2310       PSW = PSW | (PSW_NP | PSW_EP | PSW_ID);
   2311       PC = 0x00000060;
   2312       nia = 0x00000060;
   2313       TRACE_BRANCH0 ();
   2314     }
   2315 }
   2316 
   2317 // New breakpoint: 0x7E0 0x7E0
   2318 00000,111111,00000 + 00000,11111,100000:X:::ilgop
   2319 {
   2320   sim_engine_halt (SD, CPU, NULL, cia, sim_stopped, SIM_SIGTRAP);
   2321 }
   2322 
   2323 // Return from debug trap: 0x146007e0
   2324 0000011111100000 + 0000000101000110:X:::dbret
   2325 *v850e1
   2326 *v850e2
   2327 *v850e2v3
   2328 *v850e3v5
   2329 "dbret"
   2330 {
   2331   nia = DBPC;
   2332   PSW = DBPSW;
   2333   TRACE_BRANCH1 (PSW);
   2334 }
   2335 
   2336 
   2337 //
   2338 // FLOAT
   2339 //
   2340 
   2341 // Map condition code to a string
   2342 :%s::::FFFF:int FFFF
   2343 {
   2344   switch (FFFF)
   2345     {
   2346     case 0: return "f";
   2347     case 1: return "un";
   2348     case 2: return "eq";
   2349     case 3: return "ueq";
   2350     case 4: return "olt";
   2351     case 5: return "ult";
   2352     case 6: return "ole";
   2353     case 7: return "ule";
   2354     case 8: return "sf";
   2355     case 9: return "ngle";
   2356     case 10: return "seq";
   2357     case 11: return "ngl";
   2358     case 12: return "lt";
   2359     case 13: return "nge";
   2360     case 14: return "le";
   2361     case 15: return "ngt";
   2362     }
   2363   return "(null)";
   2364 }
   2365 
   2366 // ABSF.D
   2367 rrrr,011111100000 + wwww,010001011000:F_I:::absf_d
   2368 *v850e2v3
   2369 *v850e3v5
   2370 "absf.d r<reg2e>, r<reg3e>"
   2371 {
   2372   sim_fpu ans, wop;
   2373   sim_fpu_status status;
   2374 
   2375   sim_fpu_232to (&wop, GR[reg2e+1], GR[reg2e]);
   2376   TRACE_FP_INPUT_FPU1 (&wop);
   2377 
   2378   status = sim_fpu_abs (&ans, &wop);
   2379   check_invalid_snan (SD, status, 1);
   2380 
   2381   sim_fpu_to232 (&GR[reg3e+1], &GR[reg3e], &ans);
   2382 
   2383   TRACE_FP_RESULT_FPU1 (&ans);
   2384 }
   2385 
   2386 // ABSF.S
   2387 rrrrr,11111100000 + wwwww,10001001000:F_I:::absf_s
   2388 *v850e2v3
   2389 *v850e3v5
   2390 "absf.s r<reg2>, r<reg3>"
   2391 {
   2392   sim_fpu ans, wop;
   2393   sim_fpu_status status;
   2394 
   2395   sim_fpu_32to (&wop, GR[reg2]);
   2396   TRACE_FP_INPUT_FPU1 (&wop);
   2397 
   2398   status = sim_fpu_abs (&ans, &wop);
   2399   check_invalid_snan (SD, status, 0);
   2400 
   2401   sim_fpu_to32 (&GR[reg3], &ans);
   2402   TRACE_FP_RESULT_FPU1 (&ans);
   2403 }
   2404 
   2405 // ADDF.D
   2406 rrrr,0111111,RRRR,0 + wwww,010001110000:F_I:::addf_d
   2407 *v850e2v3
   2408 *v850e3v5
   2409 "addf.d r<reg1e>, r<reg2e>, r<reg3e>"
   2410 {
   2411   sim_fpu ans, wop1, wop2;
   2412   sim_fpu_status status;
   2413 
   2414   sim_fpu_232to (&wop1, GR[reg1e+1], GR[reg1e]);
   2415   sim_fpu_232to (&wop2, GR[reg2e+1], GR[reg2e]);
   2416   TRACE_FP_INPUT_FPU2 (&wop1, &wop2);
   2417 
   2418   status = sim_fpu_add (&ans, &wop1, &wop2);
   2419   status |= sim_fpu_round_64 (&ans, FPSR_GET_ROUND(), sim_fpu_denorm_underflow_inexact);
   2420 
   2421   update_fpsr (SD, status, FPSR_XEV | FPSR_XEI | FPSR_XEO | FPSR_XEU, 1);
   2422 
   2423   sim_fpu_to232 (&GR[reg3e+1], &GR[reg3e], &ans);
   2424   TRACE_FP_RESULT_FPU1 (&ans);
   2425 }
   2426 
   2427 // ADDF.S
   2428 rrrrr,111111,RRRRR + wwwww,10001100000:F_I:::addf_s
   2429 *v850e2v3
   2430 *v850e3v5
   2431 "addf.s r<reg1>, r<reg2>, r<reg3>"
   2432 {
   2433   sim_fpu ans, wop1, wop2;
   2434   sim_fpu_status status;
   2435 
   2436   sim_fpu_32to (&wop1, GR[reg1]);
   2437   sim_fpu_32to (&wop2, GR[reg2]);
   2438   TRACE_FP_INPUT_FPU2 (&wop1, &wop2);
   2439 
   2440   status = sim_fpu_add (&ans, &wop1, &wop2);
   2441   status |= sim_fpu_round_32 (&ans, FPSR_GET_ROUND(), sim_fpu_denorm_underflow_inexact);
   2442 
   2443   update_fpsr (SD, status, FPSR_XEV | FPSR_XEI | FPSR_XEO | FPSR_XEU, 0);
   2444 
   2445   sim_fpu_to32 (&GR[reg3], &ans);
   2446   TRACE_FP_RESULT_FPU1 (&ans);
   2447 }
   2448 
   2449 // CMOVF.D
   2450 rrrr,0111111,RRRR,0 + wwww!0,01000001,bbb,0:F_I:::cmovf_d
   2451 *v850e2v3
   2452 *v850e3v5
   2453 "cmovf.d <bbb>, r<reg1e>, r<reg2e>, r<reg3e>"
   2454 {
   2455   unsigned int ophi,oplow;
   2456   sim_fpu ans, wop1, wop2;
   2457 
   2458   sim_fpu_232to (&wop1, GR[reg1e+1], GR[reg1e]);
   2459   sim_fpu_232to (&wop2, GR[reg2e+1], GR[reg2e]);
   2460   TRACE_FP_INPUT_BOOL1_FPU2 (TEST_FPCC(bbb), &wop1, &wop2);
   2461 
   2462   if (TEST_FPCC(bbb)) 
   2463     {
   2464       ophi = GR[reg1e+1];
   2465       oplow = GR[reg1e];
   2466       ans = wop1;
   2467     }
   2468   else
   2469     {
   2470       ophi = GR[reg2e+1];
   2471       oplow = GR[reg2e];
   2472       ans = wop2;
   2473     }
   2474 
   2475   GR[reg3e+1] = ophi;
   2476   GR[reg3e] = oplow;
   2477   TRACE_FP_RESULT_FPU1 (&ans);;
   2478 }
   2479 
   2480 // CMOVF.S
   2481 rrrrr,111111,RRRRR!0 + wwwww!0,1000000,bbb,0:F_I:::cmovf_s
   2482 *v850e2v3
   2483 *v850e3v5
   2484 "cmovf.d <bbb>, r<reg1>, r<reg2>, r<reg3>"
   2485 {
   2486   unsigned int op;
   2487   sim_fpu ans, wop1, wop2;
   2488 
   2489   sim_fpu_32to (&wop1, GR[reg1]);
   2490   sim_fpu_32to (&wop2, GR[reg2]);
   2491   TRACE_FP_INPUT_BOOL1_FPU2 (TEST_FPCC(bbb), &wop1, &wop2);
   2492 
   2493   if (TEST_FPCC(bbb)) 
   2494   {
   2495     op = GR[reg1];
   2496     ans = wop1;
   2497   }
   2498   else
   2499   {
   2500     op = GR[reg2];
   2501     ans = wop2;
   2502   }
   2503 
   2504   GR[reg3] = op;
   2505   TRACE_FP_RESULT_FPU1 (&ans);
   2506 }
   2507 
   2508 // CMPF.D
   2509 rrrr,0111111,RRRR,0 + 0,FFFF,1000011,bbb,0:F_I:::cmpf_d
   2510 *v850e2v3
   2511 *v850e3v5
   2512 "cmpf.d %s<FFFF>, r<reg2e>, r<reg1e>":(bbb == 0)
   2513 "cmpf.d %s<FFFF>, r<reg2e>, r<reg1e>, <bbb>"
   2514 {
   2515   int result;
   2516   sim_fpu wop1;
   2517   sim_fpu wop2;
   2518   
   2519   sim_fpu_232to (&wop1, GR[reg1e+1], GR[reg1e]);
   2520   sim_fpu_232to (&wop2, GR[reg2e+1], GR[reg2e]);
   2521   TRACE_FP_INPUT_FPU2 (&wop2, &wop1);
   2522 
   2523   result = v850_float_compare (SD, FFFF, wop2, wop1, 1);
   2524 
   2525   if (result)  
   2526     SET_FPCC(bbb);
   2527   else
   2528     CLEAR_FPCC(bbb);
   2529 
   2530   TRACE_FP_RESULT_BOOL (result);
   2531 }
   2532 
   2533 // CMPF.S
   2534 rrrrr,111111,RRRRR + 0,FFFF,1000010,bbb,0:F_I:::cmpf_s
   2535 *v850e2v3
   2536 *v850e3v5
   2537 "cmpf.s %s<FFFF>, r<reg2>, r<reg1>":(bbb == 0)
   2538 "cmpf.s %s<FFFF>, r<reg2>, r<reg1>, <bbb>"
   2539 {
   2540   int result; 
   2541   sim_fpu wop1;
   2542   sim_fpu wop2;
   2543 
   2544   sim_fpu_32to( &wop1, GR[reg1] );
   2545   sim_fpu_32to( &wop2, GR[reg2] );
   2546   TRACE_FP_INPUT_FPU2 (&wop2, &wop1);
   2547 
   2548   result = v850_float_compare (SD, FFFF, wop2, wop1, 0);
   2549 
   2550   if (result)  
   2551     SET_FPCC(bbb);
   2552   else
   2553     CLEAR_FPCC(bbb);
   2554 
   2555   TRACE_FP_RESULT_BOOL (result);
   2556 }
   2557 
   2558 // CVTF.DL
   2559 rrrr,011111100100 + wwww,010001010100:F_I:::cvtf_dl
   2560 *v850e2v3
   2561 *v850e3v5
   2562 "cvtf.dl r<reg2e>, r<reg3e>"
   2563 {
   2564   int64_t ans;
   2565   sim_fpu wop;
   2566   sim_fpu_status status;
   2567 
   2568   sim_fpu_232to (&wop, GR[reg2e+1], GR[reg2e]);
   2569   TRACE_FP_INPUT_FPU1 (&wop);
   2570 
   2571   status = sim_fpu_round_64 (&wop, FPSR_GET_ROUND(), sim_fpu_denorm_zero);
   2572   status |= sim_fpu_to64i (&ans, &wop, FPSR_GET_ROUND());
   2573 
   2574   check_cvt_fi (SD, status, 1);
   2575 
   2576   GR[reg3e] = ans;
   2577   GR[reg3e+1] = ans>>32L;
   2578   TRACE_FP_RESULT_WORD2 (GR[reg3e], GR[reg3e+1]);
   2579 }
   2580 
   2581 // CVTF.DS
   2582 rrrr,011111100011 + wwwww,10001010010:F_I:::cvtf_ds
   2583 *v850e2v3
   2584 *v850e3v5
   2585 "cvtf.ds r<reg2e>, r<reg3>"
   2586 {
   2587   sim_fpu wop;
   2588   sim_fpu_status status;
   2589 
   2590   sim_fpu_232to (&wop, GR[reg2e+1], GR[reg2e]);
   2591   TRACE_FP_INPUT_FPU1 (&wop);
   2592 
   2593   status = sim_fpu_round_32 (&wop, FPSR_GET_ROUND(), sim_fpu_denorm_underflow_inexact);
   2594 
   2595   check_cvt_fi (SD, status, 0);
   2596 
   2597   sim_fpu_to32 (&GR[reg3], &wop);
   2598   TRACE_FP_RESULT_FPU1 (&wop);
   2599 }
   2600 
   2601 // CVTF.DW
   2602 rrrr,011111100100 + wwwww,10001010000:F_I:::cvtf_dw
   2603 *v850e2v3
   2604 *v850e3v5
   2605 "cvtf.dw r<reg2e>, r<reg3>"
   2606 {
   2607   int32_t ans;
   2608   sim_fpu wop;
   2609   sim_fpu_status status;
   2610 
   2611   sim_fpu_232to (&wop, GR[reg2e+1], GR[reg2e]);
   2612   TRACE_FP_INPUT_FPU1 (&wop);
   2613 
   2614   status = sim_fpu_round_32 (&wop, FPSR_GET_ROUND(), sim_fpu_denorm_zero);
   2615   status |= sim_fpu_to32i (&ans, &wop, FPSR_GET_ROUND());
   2616 
   2617   check_cvt_fi (SD, status, 1);
   2618 
   2619   GR[reg3] = ans;
   2620   TRACE_FP_RESULT_WORD1 (ans);
   2621 }
   2622 
   2623 // CVTF.LD
   2624 rrrr,011111100001 + wwww,010001010010:F_I:::cvtf_ld
   2625 *v850e2v3
   2626 *v850e3v5
   2627 "cvtf.ld r<reg2e>, r<reg3e>"
   2628 {
   2629   int64_t op;
   2630   sim_fpu wop;
   2631   sim_fpu_status status;
   2632 
   2633   op = ((int64_t)GR[reg2e+1] << 32L) | GR[reg2e];
   2634   TRACE_FP_INPUT_WORD2 (GR[reg2e], GR[reg2e+1]);
   2635 
   2636   sim_fpu_i64to (&wop, op, FPSR_GET_ROUND());
   2637   status = sim_fpu_round_64 (&wop, FPSR_GET_ROUND(), sim_fpu_denorm_zero);
   2638 
   2639   check_cvt_if (SD, status, 1);
   2640 
   2641   sim_fpu_to232 (&GR[reg3e+1], &GR[reg3e], &wop);
   2642   TRACE_FP_RESULT_FPU1 (&wop);
   2643 }
   2644 
   2645 // CVTF.LS
   2646 rrrr,011111100001 + wwwww,10001000010:F_I:::cvtf_ls
   2647 *v850e2v3
   2648 *v850e3v5
   2649 "cvtf.ls r<reg2e>, r<reg3>"
   2650 {
   2651   int64_t op;
   2652   sim_fpu wop;
   2653   sim_fpu_status status;
   2654 
   2655   op = ((int64_t)GR[reg2e+1] << 32L) | GR[reg2e];
   2656   TRACE_FP_INPUT_WORD2 (GR[reg2e], GR[reg2e+1]);
   2657 
   2658   sim_fpu_i64to (&wop, op, FPSR_GET_ROUND());
   2659   status = sim_fpu_round_32 (&wop, FPSR_GET_ROUND(), sim_fpu_denorm_zero);
   2660 
   2661   check_cvt_if (SD, status, 0);
   2662 
   2663   sim_fpu_to32 (&GR[reg3], &wop);
   2664   TRACE_FP_RESULT_FPU1 (&wop);
   2665 }
   2666 
   2667 // CVTF.SD
   2668 rrrrr,11111100010 + wwww,010001010010:F_I:::cvtf_sd
   2669 *v850e2v3
   2670 *v850e3v5
   2671 "cvtf.sd r<reg2>, r<reg3e>"
   2672 {
   2673   sim_fpu wop;
   2674   sim_fpu_status status;
   2675 
   2676   sim_fpu_32to (&wop, GR[reg2]);
   2677   TRACE_FP_INPUT_FPU1 (&wop);
   2678   status = sim_fpu_round_64 (&wop, FPSR_GET_ROUND(), sim_fpu_denorm_underflow_inexact);
   2679 
   2680   check_cvt_ff (SD, status, 1);
   2681 
   2682   sim_fpu_to232 (&GR[reg3e+1], &GR[reg3e], &wop);
   2683   TRACE_FP_RESULT_FPU1 (&wop);
   2684 }
   2685 
   2686 // CVTF.SL
   2687 rrrrr,11111100100 + wwww,010001000100:F_I:::cvtf_sl
   2688 *v850e2v3
   2689 *v850e3v5
   2690 "cvtf.sl r<reg2>, r<reg3e>"
   2691 {
   2692   int64_t ans;
   2693   sim_fpu wop;
   2694   sim_fpu_status status;
   2695 
   2696   sim_fpu_32to (&wop, GR[reg2]);
   2697   TRACE_FP_INPUT_FPU1 (&wop);
   2698 
   2699   status = sim_fpu_round_64 (&wop, FPSR_GET_ROUND(), sim_fpu_denorm_zero);
   2700   status |= sim_fpu_to64i (&ans, &wop, FPSR_GET_ROUND());
   2701 
   2702   check_cvt_fi (SD, status, 0);
   2703 
   2704   GR[reg3e] = ans;
   2705   GR[reg3e+1] = ans >> 32L;
   2706   TRACE_FP_RESULT_WORD2 (GR[reg3e], GR[reg3e+1]);
   2707 }
   2708 
   2709 // CVTF.SW
   2710 rrrrr,11111100100 + wwwww,10001000000:F_I:::cvtf_sw
   2711 *v850e2v3
   2712 *v850e3v5
   2713 "cvtf.sw r<reg2>, r<reg3>"
   2714 {
   2715   int32_t ans;
   2716   sim_fpu wop;
   2717   sim_fpu_status status;
   2718 
   2719   sim_fpu_32to (&wop, GR[reg2]);
   2720   TRACE_FP_INPUT_FPU1 (&wop);
   2721 
   2722   status = sim_fpu_round_32 (&wop, FPSR_GET_ROUND(), sim_fpu_denorm_zero);
   2723   status |= sim_fpu_to32i (&ans, &wop, sim_fpu_round_zero);
   2724 
   2725   check_cvt_fi (SD, status, 0);
   2726 
   2727   GR[reg3] = ans;
   2728   TRACE_FP_RESULT_WORD1 (ans);
   2729 }
   2730 
   2731 // CVTF.WD
   2732 rrrrr,11111100000 + wwww,010001010010:F_I:::cvtf_wd
   2733 *v850e2v3
   2734 *v850e3v5
   2735 "cvtf.wd r<reg2>, r<reg3e>"
   2736 {
   2737   sim_fpu wop;
   2738   sim_fpu_status status;
   2739 
   2740   TRACE_FP_INPUT_WORD1 (GR[reg2]);
   2741   sim_fpu_i32to (&wop, GR[reg2], FPSR_GET_ROUND());
   2742   status = sim_fpu_round_64 (&wop, FPSR_GET_ROUND(), sim_fpu_denorm_zero);
   2743 
   2744   check_cvt_if (SD, status, 1);
   2745 
   2746   sim_fpu_to232 (&GR[reg3e+1], &GR[reg3e], &wop);
   2747   TRACE_FP_RESULT_FPU1 (&wop);
   2748 }
   2749 
   2750 // CVTF.WS
   2751 rrrrr,11111100000 + wwwww,10001000010:F_I:::cvtf_ws
   2752 *v850e2v3
   2753 *v850e3v5
   2754 "cvtf.ws r<reg2>, r<reg3>"
   2755 {
   2756   sim_fpu wop;
   2757   sim_fpu_status status;
   2758 
   2759   TRACE_FP_INPUT_WORD1 (GR[reg2]);
   2760   sim_fpu_i32to (&wop, GR[reg2], FPSR_GET_ROUND());
   2761   status = sim_fpu_round_32 (&wop, FPSR_GET_ROUND(), sim_fpu_denorm_zero);
   2762 
   2763   check_cvt_if (SD, status, 0);
   2764 
   2765   sim_fpu_to32 (&GR[reg3], &wop);
   2766   TRACE_FP_RESULT_FPU1 (&wop);
   2767 }
   2768 
   2769 // DIVF.D
   2770 rrrr,0111111,RRRR,0 + wwww,010001111110:F_I:::divf_d
   2771 *v850e2v3
   2772 *v850e3v5
   2773 "divf.d r<reg1e>, r<reg2e>, r<reg3e>"
   2774 {
   2775   sim_fpu ans, wop1, wop2;
   2776   sim_fpu_status status;
   2777 
   2778   sim_fpu_232to (&wop1, GR[reg1e+1], GR[reg1e]);
   2779   sim_fpu_232to (&wop2, GR[reg2e+1], GR[reg2e]);
   2780   TRACE_FP_INPUT_FPU2 (&wop1, &wop2);
   2781 
   2782   status = sim_fpu_div (&ans, &wop2, &wop1);
   2783   status |= sim_fpu_round_64 (&ans, FPSR_GET_ROUND(), sim_fpu_denorm_underflow_inexact);
   2784 
   2785   update_fpsr (SD, status, FPSR_XEV | FPSR_XEZ | FPSR_XEI | FPSR_XEO | FPSR_XEU, 1);
   2786 
   2787   sim_fpu_to232 (&GR[reg3e+1], &GR[reg3e], &ans);
   2788   TRACE_FP_RESULT_FPU1 (&ans);
   2789 }
   2790 
   2791 // DIVF.S
   2792 rrrrr,111111,RRRRR + wwwww,10001101110:F_I:::divf_s
   2793 *v850e2v3
   2794 *v850e3v5
   2795 "divf.s r<reg1>, r<reg2>, r<reg3>"
   2796 {
   2797   sim_fpu ans, wop1, wop2;
   2798   sim_fpu_status status;
   2799 
   2800   sim_fpu_32to (&wop1, GR[reg1]);
   2801   sim_fpu_32to (&wop2, GR[reg2]);
   2802   TRACE_FP_INPUT_FPU2 (&wop1, &wop2);
   2803 
   2804   status = sim_fpu_div (&ans, &wop2, &wop1);
   2805   status |= sim_fpu_round_32 (&ans, FPSR_GET_ROUND(), sim_fpu_denorm_underflow_inexact);
   2806 
   2807   update_fpsr (SD, status, FPSR_XEV | FPSR_XEZ | FPSR_XEI | FPSR_XEO | FPSR_XEU, 0);
   2808 
   2809   sim_fpu_to32 (&GR[reg3], &ans);
   2810   TRACE_FP_RESULT_FPU1 (&ans);
   2811 }
   2812 
   2813 // MADDF.S
   2814 rrrrr,111111,RRRRR + wwwww,101,W,00,WWWW,0:F_I:::maddf_s
   2815 *v850e2v3
   2816 "maddf.s r<reg1>, r<reg2>, r<reg3>, r<reg4>"
   2817 {
   2818   sim_fpu ans, wop1, wop2, wop3;
   2819   sim_fpu_status status;
   2820 
   2821   sim_fpu_32to (&wop1, GR[reg1]);
   2822   sim_fpu_32to (&wop2, GR[reg2]);
   2823   sim_fpu_32to (&wop3, GR[reg3]);
   2824   TRACE_FP_INPUT_FPU3 (&wop1, &wop2, &wop3);
   2825 
   2826   status = sim_fpu_mul (&ans, &wop1, &wop2);
   2827   wop1 = ans;
   2828   status |= sim_fpu_add (&ans, &wop1, &wop3);
   2829   status |= sim_fpu_round_64 (&ans, FPSR_GET_ROUND(), sim_fpu_denorm_underflow_inexact);
   2830 
   2831   update_fpsr (SD, status, FPSR_XEV | FPSR_XEI | FPSR_XEO | FPSR_XEU, 0);
   2832 
   2833   sim_fpu_to32 (&GR[reg4], &ans);
   2834   TRACE_FP_RESULT_FPU1 (&ans);
   2835 }
   2836 
   2837 // FMAF.S
   2838 rrrrr,111111,RRRRR + wwwww,10011100000:F_I:::fmaf_s
   2839 *v850e3v5
   2840 "fmaf.s r<reg1>, r<reg2>, r<reg3>"
   2841 {
   2842   sim_fpu ans, wop1, wop2, wop3;
   2843   sim_fpu_status status;
   2844 
   2845   sim_fpu_32to (&wop1, GR[reg1]);
   2846   sim_fpu_32to (&wop2, GR[reg2]);
   2847   sim_fpu_32to (&wop3, GR[reg3]);
   2848   TRACE_FP_INPUT_FPU3 (&wop1, &wop2, &wop3);
   2849 
   2850   status = sim_fpu_mul (&ans, &wop1, &wop2);
   2851   wop1 = ans;
   2852   status |= sim_fpu_add (&ans, &wop1, &wop3);
   2853   status |= sim_fpu_round_64 (&ans, FPSR_GET_ROUND(), sim_fpu_denorm_underflow_inexact);
   2854 
   2855   update_fpsr (SD, status, FPSR_XEV | FPSR_XEI | FPSR_XEO | FPSR_XEU, 0);
   2856 
   2857   sim_fpu_to32 (&GR[reg3], &ans);
   2858   TRACE_FP_RESULT_FPU1 (&ans);
   2859 }
   2860 
   2861 // MAXF.D
   2862 rrrr,0111111,RRRR,0 + wwww,010001111000:F_I:::maxf_d
   2863 *v850e2v3
   2864 *v850e3v5
   2865 "maxf.d r<reg1e>, r<reg2e>, r<reg3e>"
   2866 {
   2867   sim_fpu ans, wop1, wop2;
   2868 
   2869   sim_fpu_232to (&wop1, GR[reg1e+1], GR[reg1e]);
   2870   sim_fpu_232to (&wop2, GR[reg2e+1], GR[reg2e]);
   2871   TRACE_FP_INPUT_FPU2 (&wop1, &wop2);
   2872 
   2873   if (sim_fpu_is_nan(&wop1) || sim_fpu_is_nan(&wop2))
   2874     {
   2875       if (FPSR & FPSR_XEV)
   2876 	{
   2877 	  SignalExceptionFPE (SD, 1);
   2878 	}
   2879       else
   2880 	{
   2881 	  ans = sim_fpu_qnan;
   2882 	}
   2883     }
   2884   else if (FPSR & FPSR_FS
   2885 	   && ((sim_fpu_is_zero (&wop1) || sim_fpu_is_denorm (&wop1))
   2886 	       && (sim_fpu_is_zero (&wop2) || sim_fpu_is_denorm (&wop2)))) 
   2887     {
   2888       ans = sim_fpu_zero;
   2889     }
   2890   else
   2891     {
   2892       sim_fpu_max (&ans, &wop1, &wop2);
   2893     }
   2894   
   2895   sim_fpu_to232 (&GR[reg3e+1], &GR[reg3e], &ans);
   2896   TRACE_FP_RESULT_FPU1 (&ans);
   2897 }
   2898 
   2899 // MAXF.S
   2900 rrrrr,111111,RRRRR + wwwww,10001101000:F_I:::maxf_s
   2901 *v850e2v3
   2902 *v850e3v5
   2903 "maxf.s r<reg1>, r<reg2>, r<reg3>"
   2904 {
   2905   sim_fpu ans, wop1, wop2;
   2906 
   2907   sim_fpu_32to (&wop1, GR[reg1]);
   2908   sim_fpu_32to (&wop2, GR[reg2]);
   2909   TRACE_FP_INPUT_FPU2 (&wop1, &wop2);
   2910 
   2911   if (sim_fpu_is_nan(&wop1) || sim_fpu_is_nan(&wop2))
   2912     {
   2913       if (FPSR & FPSR_XEV)
   2914 	{
   2915 	  SignalExceptionFPE (SD, 0);
   2916 	}
   2917       else
   2918 	{
   2919 	  ans = sim_fpu_qnan;
   2920 	}
   2921     }
   2922   else if ((FPSR & FPSR_FS)
   2923 	   && ((sim_fpu_is_zero (&wop1) || sim_fpu_is_denorm (&wop1))
   2924 	       && (sim_fpu_is_zero (&wop2)|| sim_fpu_is_denorm (&wop2))))
   2925     {
   2926       ans = sim_fpu_zero;
   2927     }
   2928   else
   2929     {
   2930       sim_fpu_max (&ans, &wop1, &wop2);
   2931     }
   2932   
   2933   sim_fpu_to32 (&GR[reg3], &ans);
   2934   TRACE_FP_RESULT_FPU1 (&ans);
   2935 }
   2936 
   2937 // MINF.D
   2938 rrrr,0111111,RRRR,0 + wwww,010001111010:F_I:::minf_d
   2939 *v850e2v3
   2940 *v850e3v5
   2941 "minf.d r<reg1e>, r<reg2e>, r<reg3e>"
   2942 {
   2943   sim_fpu ans, wop1, wop2;
   2944 
   2945   sim_fpu_232to (&wop1, GR[reg1e+1], GR[reg1e]);
   2946   sim_fpu_232to (&wop2, GR[reg2e+1], GR[reg2e]);
   2947   TRACE_FP_INPUT_FPU2 (&wop1, &wop2);
   2948 
   2949   if (sim_fpu_is_nan(&wop1) || sim_fpu_is_nan(&wop2))
   2950     {
   2951       if (FPSR & FPSR_XEV)
   2952 	{
   2953 	  SignalExceptionFPE (SD, 1);
   2954 	}
   2955       else
   2956 	{
   2957 	  ans = sim_fpu_qnan;
   2958 	}
   2959     }
   2960   else if (FPSR & FPSR_FS
   2961 	   && ((sim_fpu_is_zero (&wop1) || sim_fpu_is_denorm (&wop1))
   2962 	       && (sim_fpu_is_zero (&wop2) || sim_fpu_is_denorm (&wop2)))) 
   2963     {
   2964       ans = sim_fpu_zero;
   2965     }
   2966   else
   2967     {
   2968       sim_fpu_min (&ans, &wop1, &wop2);
   2969     }
   2970   
   2971   sim_fpu_to232 (&GR[reg3e+1], &GR[reg3e], &ans);
   2972   TRACE_FP_RESULT_FPU1 (&ans);
   2973 }
   2974 
   2975 // MINF.S
   2976 rrrrr,111111,RRRRR + wwwww,10001101010:F_I:::minf_s
   2977 *v850e2v3
   2978 *v850e3v5
   2979 "minf.s r<reg1>, r<reg2>, r<reg3>"
   2980 {
   2981   sim_fpu ans, wop1, wop2;
   2982 
   2983   sim_fpu_32to (&wop1, GR[reg1]);
   2984   sim_fpu_32to (&wop2, GR[reg2]);
   2985   TRACE_FP_INPUT_FPU2 (&wop1, &wop2);
   2986 
   2987   if (sim_fpu_is_nan(&wop1) || sim_fpu_is_nan(&wop2))
   2988     {
   2989       if (FPSR & FPSR_XEV)
   2990 	{
   2991 	  SignalExceptionFPE (SD, 0);
   2992 	}
   2993       else
   2994 	{
   2995 	  ans = sim_fpu_qnan;
   2996 	}
   2997     }
   2998   else if (FPSR & FPSR_FS
   2999 	   && ((sim_fpu_is_zero (&wop1) || sim_fpu_is_denorm (&wop1))
   3000 	       && (sim_fpu_is_zero (&wop2) || sim_fpu_is_denorm (&wop2))))
   3001     {
   3002       ans = sim_fpu_zero;
   3003     }
   3004   else
   3005     {
   3006       sim_fpu_min (&ans, &wop1, &wop2);
   3007     }
   3008   
   3009   sim_fpu_to32 (&GR[reg3], &ans);
   3010   TRACE_FP_RESULT_FPU1 (&ans);
   3011 }
   3012 
   3013 // MSUBF.S
   3014 rrrrr,111111,RRRRR + wwwww,101,W,01,WWWW,0:F_I:::msubf_s
   3015 *v850e2v3
   3016 "msubf.s r<reg1>, r<reg2>, r<reg3>, r<reg4>"
   3017 {
   3018   sim_fpu ans, wop1, wop2, wop3;
   3019   sim_fpu_status status;
   3020 
   3021   sim_fpu_32to (&wop1, GR[reg1]);
   3022   sim_fpu_32to (&wop2, GR[reg2]);
   3023   sim_fpu_32to (&wop3, GR[reg3]);
   3024   TRACE_FP_INPUT_FPU3 (&wop1, &wop2, &wop3);
   3025 
   3026   status = sim_fpu_mul (&ans, &wop1, &wop2);
   3027   status |= sim_fpu_round_64 (&ans, FPSR_GET_ROUND(), sim_fpu_denorm_underflow_inexact);
   3028   wop1 = ans;
   3029   status |= sim_fpu_sub (&ans, &wop1, &wop3);
   3030   status |= sim_fpu_round_64 (&ans, FPSR_GET_ROUND(), sim_fpu_denorm_underflow_inexact);
   3031 
   3032   update_fpsr (SD, status, FPSR_XEV | FPSR_XEI | FPSR_XEO | FPSR_XEU, 0);
   3033 
   3034   sim_fpu_to32 (&GR[reg4], &ans);
   3035   TRACE_FP_RESULT_FPU1 (&ans);
   3036 }
   3037 
   3038 // FMSF.S
   3039 rrrrr,111111,RRRRR + wwwww,10011100010:F_I:::fmsf_s
   3040 *v850e3v5
   3041 "fmsf.s r<reg1>, r<reg2>, r<reg3>"
   3042 {
   3043   sim_fpu ans, wop1, wop2, wop3;
   3044   sim_fpu_status status;
   3045 
   3046   sim_fpu_32to (&wop1, GR[reg1]);
   3047   sim_fpu_32to (&wop2, GR[reg2]);
   3048   sim_fpu_32to (&wop3, GR[reg3]);
   3049   TRACE_FP_INPUT_FPU3 (&wop1, &wop2, &wop3);
   3050 
   3051   status = sim_fpu_mul (&ans, &wop1, &wop2);
   3052   status |= sim_fpu_round_64 (&ans, FPSR_GET_ROUND(), sim_fpu_denorm_underflow_inexact);
   3053   wop1 = ans;
   3054   status |= sim_fpu_sub (&ans, &wop1, &wop3);
   3055   status |= sim_fpu_round_64 (&ans, FPSR_GET_ROUND(), sim_fpu_denorm_underflow_inexact);
   3056 
   3057   update_fpsr (SD, status, FPSR_XEV | FPSR_XEI | FPSR_XEO | FPSR_XEU, 0);
   3058 
   3059   sim_fpu_to32 (&GR[reg3], &ans);
   3060   TRACE_FP_RESULT_FPU1 (&ans);
   3061 }
   3062 
   3063 // MULF.D
   3064 rrrr,0111111,RRRR,0 + wwww,010001110100:F_I:::mulf_d
   3065 *v850e2v3
   3066 *v850e3v5
   3067 "mulf.d r<reg1e>, r<reg2e>, r<reg3e>"
   3068 {
   3069   sim_fpu ans, wop1, wop2;
   3070   sim_fpu_status status;
   3071 
   3072   sim_fpu_232to (&wop1, GR[reg1e+1], GR[reg1e]);
   3073   sim_fpu_232to (&wop2, GR[reg2e+1], GR[reg2e]);
   3074   TRACE_FP_INPUT_FPU2 (&wop1, &wop2);
   3075 
   3076   status = sim_fpu_mul (&ans, &wop1, &wop2);
   3077   status |= sim_fpu_round_64 (&ans, FPSR_GET_ROUND(), sim_fpu_denorm_underflow_inexact);
   3078 
   3079   update_fpsr (SD, status, FPSR_XEV | FPSR_XEI | FPSR_XEO | FPSR_XEU, 1);
   3080 
   3081   sim_fpu_to232 (&GR[reg3e+1], &GR[reg3e], &ans);
   3082   TRACE_FP_RESULT_FPU1 (&ans);
   3083 }
   3084 
   3085 // MULF.S
   3086 rrrrr,111111,RRRRR + wwwww,10001100100:F_I:::mulf_s
   3087 *v850e2v3
   3088 *v850e3v5
   3089 "mulf.s r<reg1>, r<reg2>, r<reg3>"
   3090 {
   3091   sim_fpu ans, wop1, wop2;
   3092   sim_fpu_status status;
   3093 
   3094   sim_fpu_32to (&wop1, GR[reg1]);
   3095   sim_fpu_32to (&wop2, GR[reg2]);
   3096   TRACE_FP_INPUT_FPU2 (&wop1, &wop2);
   3097 
   3098   status = sim_fpu_mul (&ans, &wop1, &wop2);
   3099   status |= sim_fpu_round_32 (&ans, FPSR_GET_ROUND(), sim_fpu_denorm_underflow_inexact);
   3100 
   3101   update_fpsr (SD, status, FPSR_XEV | FPSR_XEI | FPSR_XEO | FPSR_XEU, 0);
   3102 
   3103   sim_fpu_to32 (&GR[reg3], &ans);
   3104   TRACE_FP_RESULT_FPU1 (&ans);
   3105 }
   3106 
   3107 // NEGF.D
   3108 rrrr,011111100001 + wwww,010001011000:F_I:::negf_d
   3109 *v850e2v3
   3110 *v850e3v5
   3111 "negf.d r<reg2e>, r<reg3e>"
   3112 {
   3113   sim_fpu ans, wop;
   3114   sim_fpu_status status;
   3115 
   3116   sim_fpu_232to (&wop, GR[reg2e+1], GR[reg2e]);
   3117   TRACE_FP_INPUT_FPU1 (&wop);
   3118 
   3119   status = sim_fpu_neg (&ans, &wop);
   3120 
   3121   check_invalid_snan (SD, status, 1);
   3122 
   3123   sim_fpu_to232 (&GR[reg3e+1], &GR[reg3e], &ans);
   3124   TRACE_FP_RESULT_FPU1 (&ans);
   3125 }
   3126 
   3127 // NEGF.S
   3128 rrrrr,11111100001 + wwwww,10001001000:F_I:::negf_s
   3129 *v850e2v3
   3130 *v850e3v5
   3131 "negf.s r<reg2>, r<reg3>"
   3132 {
   3133   sim_fpu ans, wop;
   3134   sim_fpu_status status;
   3135 
   3136   sim_fpu_32to (&wop, GR[reg2]);
   3137   TRACE_FP_INPUT_FPU1 (&wop);
   3138 
   3139   status = sim_fpu_neg (&ans, &wop);
   3140 
   3141   check_invalid_snan (SD, status, 0);
   3142 
   3143   sim_fpu_to32 (&GR[reg3], &ans);
   3144   TRACE_FP_RESULT_FPU1 (&ans);
   3145 }
   3146 
   3147 // NMADDF.S
   3148 rrrrr,111111,RRRRR + wwwww,101,W,10,WWWW,0:F_I:::nmaddf_s
   3149 *v850e2v3
   3150 "nmaddf.s r<reg1>, r<reg2>, r<reg3>, r<reg4>"
   3151 {
   3152   sim_fpu ans, wop1, wop2, wop3;
   3153   sim_fpu_status status;
   3154 
   3155   sim_fpu_32to (&wop1, GR[reg1]);
   3156   sim_fpu_32to (&wop2, GR[reg2]);
   3157   sim_fpu_32to (&wop3, GR[reg3]);
   3158   TRACE_FP_INPUT_FPU3 (&wop1, &wop2, &wop3);
   3159 
   3160   status = sim_fpu_mul (&ans, &wop1, &wop2);
   3161   wop1 = ans;
   3162   status |= sim_fpu_add (&ans, &wop1, &wop3);
   3163   status |= sim_fpu_round_64 (&ans, FPSR_GET_ROUND(), sim_fpu_denorm_underflow_inexact);
   3164   wop1 = ans;
   3165   status |= sim_fpu_neg (&ans, &wop1);
   3166 
   3167   update_fpsr (SD, status, FPSR_XEV | FPSR_XEI | FPSR_XEO | FPSR_XEU, 0);
   3168 
   3169   sim_fpu_to32 (&GR[reg4], &ans);
   3170   TRACE_FP_RESULT_FPU1 (&ans);
   3171 }
   3172 
   3173 // FNMAF.S
   3174 rrrrr,111111,RRRRR + wwwww,10011100100:F_I:::fnmaf_s
   3175 *v850e3v5
   3176 "fnmaf.s r<reg1>, r<reg2>, r<reg3>"
   3177 {
   3178   sim_fpu ans, wop1, wop2, wop3;
   3179   sim_fpu_status status;
   3180 
   3181   sim_fpu_32to (&wop1, GR[reg1]);
   3182   sim_fpu_32to (&wop2, GR[reg2]);
   3183   sim_fpu_32to (&wop3, GR[reg3]);
   3184   TRACE_FP_INPUT_FPU3 (&wop1, &wop2, &wop3);
   3185 
   3186   status = sim_fpu_mul (&ans, &wop1, &wop2);
   3187   wop1 = ans;
   3188   status |= sim_fpu_add (&ans, &wop1, &wop3);
   3189   status |= sim_fpu_round_64 (&ans, FPSR_GET_ROUND(), sim_fpu_denorm_underflow_inexact);
   3190   wop1 = ans;
   3191   status |= sim_fpu_neg (&ans, &wop1);
   3192 
   3193   update_fpsr (SD, status, FPSR_XEV | FPSR_XEI | FPSR_XEO | FPSR_XEU, 0);
   3194 
   3195   sim_fpu_to32 (&GR[reg3], &ans);
   3196   TRACE_FP_RESULT_FPU1 (&ans);
   3197 }
   3198 
   3199 // NMSUBF.S
   3200 rrrrr,111111,RRRRR + wwwww,101,W,11,WWWW,0:F_I:::nmsubf_s
   3201 *v850e2v3
   3202 "nmsubf.s r<reg1>, r<reg2>, r<reg3>, r<reg4>"
   3203 {
   3204   sim_fpu ans, wop1, wop2, wop3;
   3205   sim_fpu_status status;
   3206 
   3207   sim_fpu_32to (&wop1, GR[reg1]);
   3208   sim_fpu_32to (&wop2, GR[reg2]);
   3209   sim_fpu_32to (&wop3, GR[reg3]);
   3210   TRACE_FP_INPUT_FPU3 (&wop1, &wop2, &wop3);
   3211 
   3212   status = sim_fpu_mul (&ans, &wop1, &wop2);
   3213   status |= sim_fpu_round_64 (&ans, FPSR_GET_ROUND(), sim_fpu_denorm_underflow_inexact);
   3214   wop1 = ans;
   3215   status |= sim_fpu_sub (&ans, &wop1, &wop3);
   3216   status |= sim_fpu_round_64 (&ans, FPSR_GET_ROUND(), sim_fpu_denorm_underflow_inexact);
   3217   wop1 = ans;
   3218   status |= sim_fpu_neg (&ans, &wop1);
   3219 
   3220   update_fpsr (SD, status, FPSR_XEV | FPSR_XEI | FPSR_XEO | FPSR_XEU, 0);
   3221 
   3222   sim_fpu_to32 (&GR[reg4], &ans);
   3223   TRACE_FP_RESULT_FPU1 (&ans);
   3224 }
   3225 
   3226 // FNMSF.S
   3227 rrrrr,111111,RRRRR + wwwww,10011100110:F_I:::fnmsf_s
   3228 *v850e3v5
   3229 "fnmsf.s r<reg1>, r<reg2>, r<reg3>"
   3230 {
   3231   sim_fpu ans, wop1, wop2, wop3;
   3232   sim_fpu_status status;
   3233 
   3234   sim_fpu_32to (&wop1, GR[reg1]);
   3235   sim_fpu_32to (&wop2, GR[reg2]);
   3236   sim_fpu_32to (&wop3, GR[reg3]);
   3237   TRACE_FP_INPUT_FPU3 (&wop1, &wop2, &wop3);
   3238 
   3239   status = sim_fpu_mul (&ans, &wop1, &wop2);
   3240   status |= sim_fpu_round_64 (&ans, FPSR_GET_ROUND(), sim_fpu_denorm_underflow_inexact);
   3241   wop1 = ans;
   3242   status |= sim_fpu_sub (&ans, &wop1, &wop3);
   3243   status |= sim_fpu_round_64 (&ans, FPSR_GET_ROUND(), sim_fpu_denorm_underflow_inexact);
   3244   wop1 = ans;
   3245   status |= sim_fpu_neg (&ans, &wop1);
   3246 
   3247   update_fpsr (SD, status, FPSR_XEV | FPSR_XEI | FPSR_XEO | FPSR_XEU, 0);
   3248 
   3249   sim_fpu_to32 (&GR[reg3], &ans);
   3250   TRACE_FP_RESULT_FPU1 (&ans);
   3251 }
   3252 
   3253 // RECIPF.D
   3254 rrrr,011111100001 + wwww,010001011110:F_I:::recipf.d
   3255 *v850e2v3
   3256 *v850e3v5
   3257 "recipf.d r<reg2e>, r<reg3e>"
   3258 {
   3259   sim_fpu ans, wop;
   3260   sim_fpu_status status;
   3261 
   3262   sim_fpu_232to (&wop, GR[reg2e+1], GR[reg2e]);
   3263   TRACE_FP_INPUT_FPU1 (&wop);
   3264 
   3265   status = sim_fpu_div (&ans, &sim_fpu_one, &wop);
   3266   status |= sim_fpu_round_64 (&ans, FPSR_GET_ROUND(), sim_fpu_denorm_underflow_inexact);
   3267 
   3268   update_fpsr (SD, status, FPSR_XEV | FPSR_XEZ | FPSR_XEI | FPSR_XEO | FPSR_XEU, 1);
   3269 
   3270   sim_fpu_to232 (&GR[reg3e+1], &GR[reg3e], &ans);
   3271   TRACE_FP_RESULT_FPU1 (&ans);
   3272 }
   3273 
   3274 // RECIPF.S
   3275 rrrrr,11111100001 + wwwww,10001001110:F_I:::recipf.s
   3276 *v850e2v3
   3277 *v850e3v5
   3278 "recipf.s r<reg2>, r<reg3>"
   3279 {
   3280   sim_fpu ans, wop;
   3281   sim_fpu_status status;
   3282 
   3283   sim_fpu_32to (&wop, GR[reg2]);
   3284   TRACE_FP_INPUT_FPU1 (&wop);
   3285 
   3286   status = sim_fpu_div (&ans, &sim_fpu_one, &wop);
   3287   status |= sim_fpu_round_64 (&ans, FPSR_GET_ROUND(), sim_fpu_denorm_underflow_inexact);
   3288 
   3289   update_fpsr (SD, status, FPSR_XEV | FPSR_XEZ | FPSR_XEI | FPSR_XEO | FPSR_XEU, 0);
   3290 
   3291   sim_fpu_to32 (&GR[reg3], &ans);
   3292   TRACE_FP_RESULT_FPU1 (&ans);
   3293 }
   3294 
   3295 // RSQRTF.D
   3296 rrrr,011111100010 + wwww,010001011110:F_I:::rsqrtf.d
   3297 *v850e2v3
   3298 *v850e3v5
   3299 "rsqrtf.d r<reg2e>, r<reg3e>"
   3300 {
   3301   sim_fpu ans, wop;
   3302   sim_fpu_status status;
   3303 
   3304   sim_fpu_232to (&wop, GR[reg2e+1], GR[reg2e]);
   3305   TRACE_FP_INPUT_FPU1 (&wop);
   3306 
   3307   status = sim_fpu_sqrt (&ans, &wop);
   3308   status |= sim_fpu_round_64 (&ans, FPSR_GET_ROUND(), sim_fpu_denorm_underflow_inexact);
   3309   wop = ans;
   3310   status = sim_fpu_div (&ans, &sim_fpu_one, &wop);
   3311   status |= sim_fpu_round_64 (&ans, FPSR_GET_ROUND(), sim_fpu_denorm_underflow_inexact);
   3312 
   3313   update_fpsr (SD, status, FPSR_XEV | FPSR_XEZ | FPSR_XEI | FPSR_XEO | FPSR_XEU, 1);
   3314 
   3315   sim_fpu_to232 (&GR[reg3e+1], &GR[reg3e], &ans);
   3316   TRACE_FP_RESULT_FPU1 (&ans);
   3317 }
   3318 
   3319 // RSQRTF.S
   3320 rrrrr,11111100010 + wwwww,10001001110:F_I:::rsqrtf.s
   3321 *v850e2v3
   3322 *v850e3v5
   3323 "rsqrtf.s r<reg2>, r<reg3>"
   3324 {
   3325   sim_fpu ans, wop;
   3326   sim_fpu_status status;
   3327 
   3328   sim_fpu_32to (&wop, GR[reg2]);
   3329   TRACE_FP_INPUT_FPU1 (&wop);
   3330 
   3331   status = sim_fpu_sqrt (&ans, &wop);
   3332   status |= sim_fpu_round_32 (&ans, FPSR_GET_ROUND(), sim_fpu_denorm_underflow_inexact);
   3333   wop = ans;
   3334   status = sim_fpu_div (&ans, &sim_fpu_one, &wop);
   3335   status |= sim_fpu_round_32 (&ans, FPSR_GET_ROUND(), sim_fpu_denorm_underflow_inexact);
   3336 
   3337   update_fpsr (SD, status, FPSR_XEV | FPSR_XEZ | FPSR_XEI | FPSR_XEO | FPSR_XEU, 0);
   3338 
   3339   sim_fpu_to32 (&GR[reg3], &ans);
   3340   TRACE_FP_RESULT_FPU1 (&ans);
   3341 }
   3342 
   3343 // SQRTF.D
   3344 rrrr,011111100000 + wwww,010001011110:F_I:::sqrtf.d
   3345 *v850e2v3
   3346 *v850e3v5
   3347 "sqrtf.d r<reg2e>, r<reg3e>"
   3348 {
   3349   sim_fpu ans, wop;
   3350   sim_fpu_status status;
   3351 
   3352   sim_fpu_232to (&wop, GR[reg2e+1], GR[reg2e]);
   3353   TRACE_FP_INPUT_FPU1 (&wop);
   3354 
   3355   status = sim_fpu_sqrt (&ans, &wop);
   3356   status |= sim_fpu_round_64 (&ans, FPSR_GET_ROUND(), sim_fpu_denorm_underflow_inexact);
   3357 
   3358   update_fpsr (SD, status, FPSR_XEV | FPSR_XEI, 1);
   3359 
   3360   sim_fpu_to232 (&GR[reg3e+1], &GR[reg3e], &ans);
   3361   TRACE_FP_RESULT_FPU1 (&ans);
   3362 }
   3363 
   3364 // SQRTF.S
   3365 rrrrr,11111100000 + wwwww,10001001110:F_I:::sqrtf.s
   3366 *v850e2v3
   3367 *v850e3v5
   3368 "sqrtf.s r<reg2>, r<reg3>"
   3369 {
   3370   sim_fpu ans, wop;
   3371   sim_fpu_status status;
   3372 
   3373   sim_fpu_32to (&wop, GR[reg2]);
   3374   TRACE_FP_INPUT_FPU1 (&wop);
   3375 
   3376   status = sim_fpu_sqrt (&ans, &wop);
   3377   status |= sim_fpu_round_32 (&ans, FPSR_GET_ROUND(), sim_fpu_denorm_underflow_inexact);
   3378 
   3379   update_fpsr (SD, status, FPSR_XEV | FPSR_XEI, 0);
   3380 
   3381   sim_fpu_to32 (&GR[reg3], &ans);
   3382   TRACE_FP_RESULT_FPU1 (&ans);
   3383 }
   3384 
   3385 // SUBF.D
   3386 rrrr,0111111,RRRR,0 + wwww,010001110010:F_I:::subf.d
   3387 *v850e2v3
   3388 *v850e3v5
   3389 "subf.d r<reg1e>, r<reg2e>, r<reg3e>"
   3390 {
   3391   sim_fpu ans, wop1, wop2;
   3392   sim_fpu_status status;
   3393 
   3394   sim_fpu_232to (&wop1, GR[reg1e+1], GR[reg1e]);
   3395   sim_fpu_232to (&wop2, GR[reg2e+1], GR[reg2e]);
   3396   TRACE_FP_INPUT_FPU2 (&wop1, &wop2);
   3397 
   3398   status = sim_fpu_sub (&ans, &wop2, &wop1);
   3399   status |= sim_fpu_round_64 (&ans, FPSR_GET_ROUND(), sim_fpu_denorm_underflow_inexact);
   3400 
   3401   update_fpsr (SD, status, FPSR_XEV | FPSR_XEI | FPSR_XEO | FPSR_XEU, 1);
   3402 
   3403   sim_fpu_to232 (&GR[reg3e+1], &GR[reg3e], &ans);
   3404   TRACE_FP_RESULT_FPU1 (&ans);
   3405 }
   3406 
   3407 // SUBF.S
   3408 rrrrr,111111,RRRRR + wwwww,10001100010:F_I:::subf.s
   3409 *v850e2v3
   3410 *v850e3v5
   3411 "subf.s r<reg1>, r<reg2>, r<reg3>"
   3412 {
   3413   sim_fpu ans, wop1, wop2;
   3414   sim_fpu_status status;
   3415 
   3416   sim_fpu_32to (&wop1, GR[reg1]);
   3417   sim_fpu_32to (&wop2, GR[reg2]);
   3418   TRACE_FP_INPUT_FPU2 (&wop1, &wop2);
   3419 
   3420   status = sim_fpu_sub (&ans, &wop2, &wop1);
   3421   status |= sim_fpu_round_32 (&ans, FPSR_GET_ROUND(), sim_fpu_denorm_underflow_inexact);
   3422 
   3423   update_fpsr (SD, status, FPSR_XEV | FPSR_XEI | FPSR_XEO | FPSR_XEU, 0);
   3424 
   3425   sim_fpu_to32 (&GR[reg3], &ans);
   3426   TRACE_FP_RESULT_FPU1 (&ans);
   3427 }
   3428 
   3429 // TRFSR
   3430 0000011111100000 + 000001000000,bbb,0:F_I:::trfsr
   3431 *v850e2v3
   3432 *v850e3v5
   3433 "trfsr":(bbb == 0)
   3434 "trfsr <bbb>"
   3435 {
   3436   TRACE_ALU_INPUT1 (GET_FPCC());
   3437 
   3438   if (TEST_FPCC (bbb))
   3439     PSW |= PSW_Z;
   3440   else 
   3441     PSW &= ~PSW_Z;  
   3442 
   3443   TRACE_ALU_RESULT1 (PSW);
   3444 }
   3445 
   3446 // TRNCF.DL
   3447 rrrr,011111100001 + wwww,010001010100:F_I:::trncf_dl
   3448 *v850e2v3
   3449 *v850e3v5
   3450 "trncf.dl r<reg2e>, r<reg3e>"
   3451 {
   3452   int64_t ans;
   3453   sim_fpu wop;
   3454   sim_fpu_status status;
   3455 
   3456   sim_fpu_232to (&wop, GR[reg2e+1], GR[reg2e]);
   3457   TRACE_FP_INPUT_FPU1 (&wop);
   3458 
   3459   status = sim_fpu_to64i (&ans, &wop, sim_fpu_round_zero);
   3460 
   3461   check_cvt_fi (SD, status, 1);
   3462 
   3463   GR[reg3e] = ans;
   3464   GR[reg3e+1] = ans>>32L;
   3465   TRACE_FP_RESULT_WORD2 (GR[reg3e], GR[reg3e+1]);
   3466 }
   3467 
   3468 // TRNCF.DUL
   3469 rrrr,011111110001 + wwww,010001010100:F_I:::trncf_dul
   3470 *v850e2v3
   3471 *v850e3v5
   3472 "trncf.dul r<reg2e>, r<reg3e>"
   3473 {
   3474   uint64_t ans;
   3475   sim_fpu wop;
   3476   sim_fpu_status status;
   3477 
   3478   sim_fpu_232to (&wop, GR[reg2e+1], GR[reg2e]);
   3479   TRACE_FP_INPUT_FPU1 (&wop);
   3480 
   3481   status = sim_fpu_to64u (&ans, &wop, sim_fpu_round_zero);
   3482 
   3483   check_cvt_fi (SD, status, 1);
   3484 
   3485   GR[reg3e] = ans;
   3486   GR[reg3e+1] = ans>>32L;
   3487   TRACE_FP_RESULT_WORD2 (GR[reg3e], GR[reg3e+1]);
   3488 }
   3489 
   3490 // TRNCF.DW
   3491 rrrr,011111100001 + wwwww,10001010000:F_I:::trncf_dw
   3492 *v850e2v3
   3493 *v850e3v5
   3494 "trncf.dw r<reg2e>, r<reg3>"
   3495 {
   3496   int32_t ans;
   3497   sim_fpu wop;
   3498   sim_fpu_status status;
   3499 
   3500   sim_fpu_232to (&wop, GR[reg2e+1], GR[reg2e]);
   3501   TRACE_FP_INPUT_FPU1 (&wop);
   3502 
   3503   status = sim_fpu_to32i (&ans, &wop, sim_fpu_round_zero);
   3504 
   3505   check_cvt_fi (SD, status, 1);
   3506 
   3507   GR[reg3] = ans;
   3508   TRACE_FP_RESULT_WORD1 (ans);
   3509 }
   3510 
   3511 // TRNCF.DUW
   3512 rrrr,011111110001 + wwwww,10001010000:F_I:::trncf_duw
   3513 *v850e2v3
   3514 *v850e3v5
   3515 "trncf.duw r<reg2e>, r<reg3>"
   3516 {
   3517   uint32_t ans;
   3518   sim_fpu wop;
   3519   sim_fpu_status status;
   3520 
   3521   sim_fpu_232to (&wop, GR[reg2e+1], GR[reg2e]);
   3522   TRACE_FP_INPUT_FPU1 (&wop);
   3523 
   3524   status = sim_fpu_to32u (&ans, &wop, sim_fpu_round_zero);
   3525 
   3526   check_cvt_fi (SD, status, 1);
   3527 
   3528   GR[reg3] = ans;
   3529   TRACE_FP_RESULT_WORD1 (ans);
   3530 }
   3531 
   3532 // TRNCF.SL
   3533 rrrrr,11111100001 + wwww,010001000100:F_I:::trncf_sl
   3534 *v850e2v3
   3535 *v850e3v5
   3536 "trncf.sl r<reg2>, r<reg3e>"
   3537 {
   3538   int64_t ans;
   3539   sim_fpu wop;
   3540 
   3541   sim_fpu_32to (&wop, GR[reg2]);
   3542   TRACE_FP_INPUT_FPU1 (&wop);
   3543 
   3544   sim_fpu_to64i (&ans, &wop, sim_fpu_round_zero);
   3545 
   3546   GR[reg3e] = ans;
   3547   GR[reg3e+1] = ans >> 32L;
   3548   TRACE_FP_RESULT_WORD2 (GR[reg3e], GR[reg3e+1]);
   3549 }
   3550 
   3551 // TRNCF.SUL
   3552 rrrrr,11111110001 + wwww,010001000100:F_I:::trncf_sul
   3553 *v850e2v3
   3554 *v850e3v5
   3555 "trncf.sul r<reg2>, r<reg3e>"
   3556 {
   3557   uint64_t ans;
   3558   sim_fpu wop;
   3559 
   3560   sim_fpu_32to (&wop, GR[reg2]);
   3561   TRACE_FP_INPUT_FPU1 (&wop);
   3562 
   3563   sim_fpu_to64u (&ans, &wop, sim_fpu_round_zero);
   3564 
   3565   GR[reg3e] = ans;
   3566   GR[reg3e+1] = ans >> 32L;
   3567   TRACE_FP_RESULT_WORD2 (GR[reg3e], GR[reg3e+1]);
   3568 }
   3569 
   3570 // TRNCF.SW
   3571 rrrrr,11111100001 + wwwww,10001000000:F_I:::trncf_sw
   3572 *v850e2v3
   3573 *v850e3v5
   3574 "trncf.sw r<reg2>, r<reg3>"
   3575 {
   3576   int32_t ans;
   3577   sim_fpu wop;
   3578   sim_fpu_status status;
   3579 
   3580   sim_fpu_32to (&wop, GR[reg2]);
   3581   TRACE_FP_INPUT_FPU1 (&wop);
   3582 
   3583   status = sim_fpu_to32i (&ans, &wop, sim_fpu_round_zero);
   3584 
   3585   check_cvt_fi (SD, status, 0);
   3586 
   3587   GR[reg3] = ans;
   3588   TRACE_FP_RESULT_WORD1 (ans);
   3589 }
   3590 
   3591 // TRNCF.SUW
   3592 rrrrr,11111110001 + wwwww,10001000000:F_I:::trncf_suw
   3593 *v850e2v3
   3594 *v850e3v5
   3595 "trncf.suw r<reg2>, r<reg3>"
   3596 {
   3597   uint32_t ans;
   3598   sim_fpu wop;
   3599   sim_fpu_status status;
   3600 
   3601   sim_fpu_32to (&wop, GR[reg2]);
   3602   TRACE_FP_INPUT_FPU1 (&wop);
   3603 
   3604   status = sim_fpu_to32u (&ans, &wop, sim_fpu_round_zero);
   3605 
   3606   check_cvt_fi (SD, status, 0);
   3607 
   3608   GR[reg3] = ans;
   3609   TRACE_FP_RESULT_WORD1 (ans);
   3610 }
   3611 
   3612 // ROTL
   3613 rrrrr,111111,iiiii+wwwww,00011000100:VII:::rotl_imm
   3614 *v850e3v5
   3615 "rotl imm5, r<reg2>, r<reg3>"
   3616 {
   3617   TRACE_ALU_INPUT1 (GR[reg2]);
   3618   v850_rotl (SD, imm5, GR[reg2], & GR[reg3]);
   3619   TRACE_ALU_RESULT1 (GR[reg3]);
   3620 }
   3621 
   3622 rrrrr,111111,RRRRR+wwwww,00011000110:VII:::rotl
   3623 *v850e3v5
   3624 "rotl r<reg1>, r<reg2>, r<reg3>"
   3625 {
   3626   TRACE_ALU_INPUT2 (GR[reg1], GR[reg2]);
   3627   v850_rotl (SD, GR[reg1], GR[reg2], & GR[reg3]);
   3628   TRACE_ALU_RESULT1 (GR[reg3]);
   3629 }
   3630 
   3631 // BINS
   3632 rrrrr,111111,RRRRR+bbbb,B,0001001,BBB,0:IX:::bins_top
   3633 *v850e3v5
   3634 "bins r<reg1>, <bit13> + 16, <bit4> - <bit13> + 17, r<reg2>"
   3635 {
   3636   TRACE_ALU_INPUT1 (GR[reg1]);
   3637   v850_bins (SD, GR[reg1], bit13 + 16, bit4 + 16, & GR[reg2]);
   3638   TRACE_ALU_RESULT1 (GR[reg2]);
   3639 }
   3640 
   3641 rrrrr,111111,RRRRR+bbbb,B,0001011,BBB,0:IX:::bins_middle
   3642 *v850e3v5
   3643 "bins r<reg1>, <bit13>, <bit4> - <bit13> + 17, r<reg2>"
   3644 {
   3645   TRACE_ALU_INPUT1 (GR[reg1]);
   3646   v850_bins (SD, GR[reg1], bit13, bit4 + 16, & GR[reg2]);
   3647   TRACE_ALU_RESULT1 (GR[reg2]);
   3648 }
   3649 
   3650 rrrrr,111111,RRRRR+bbbb,B,0001101,BBB,0:IX:::bins_bottom
   3651 *v850e3v5
   3652 "bins r<reg1>, <bit13>, <bit4> - <bit13> + 1, r<reg2>"
   3653 {
   3654   TRACE_ALU_INPUT1 (GR[reg1]);
   3655   v850_bins (SD, GR[reg1], bit13, bit4, & GR[reg2]);
   3656   TRACE_ALU_RESULT1 (GR[reg2]);
   3657 }
   3658 
   3659 vvvvv,11111100100+xxxxx,11001111110:C:::cnvq15q30
   3660 *v850e3v5
   3661 "cnvq15q30 v<vreg2>, v<vreg3>"
   3662 {
   3663   reg64_t v;
   3664 
   3665   TRACE_ALU_INPUT1 (VR[vreg2]);
   3666 
   3667   if (VR[vreg2] & (1 << 15))
   3668     v = 0x0001ffffffff0000 | VR[vreg2];
   3669   else
   3670     v = VR[vreg2];
   3671   VR[vreg3] = v << 15;
   3672 
   3673   TRACE_ALU_RESULT1 (VR[vreg3]);
   3674 }
   3675 
   3676 vvvvv,11111100110+xxxxx,11001111110:C:::cnvq30q15
   3677 *v850e3v5
   3678 "cnvq30q15 v<vreg2>, v<vreg3>"
   3679 {
   3680   reg64_t v;
   3681 
   3682   TRACE_ALU_INPUT1 (VR[vreg2]);
   3683 
   3684   v = ROUND_Q62_Q15 (VR[vreg2]);
   3685   SAT16 (v);
   3686   VR[vreg3] &= 0xffffffffffff0000UL;
   3687   v         &=             0xffffUL;
   3688   VR[vreg3] |= v;
   3689 
   3690   TRACE_ALU_RESULT1 (VR[vreg3]);
   3691 }
   3692 
   3693 vvvvv,11111100101+xxxxx,11001111110:C:::cnvq31q62
   3694 *v850e3v5
   3695 "cnvq31q62 v<vreg2>, v<vreg3>"
   3696 {
   3697   reg64_t v;
   3698 
   3699   TRACE_ALU_INPUT1 (VR[vreg2]);
   3700 
   3701   if (VR[vreg2] & (1 << 31))
   3702     v = 0xffffffff00000000 | VR[vreg2];
   3703   else
   3704     v = VR[vreg2];
   3705   VR[vreg3] = v << 31;
   3706 
   3707   TRACE_ALU_RESULT1 (VR[vreg3]);
   3708 }
   3709 
   3710 vvvvv,11111100111+xxxxx,11001111110:C:::cnvq62q31
   3711 *v850e3v5
   3712 "cnvq62q31 v<vreg2>, v<vreg3>"
   3713 {
   3714   reg64_t v;
   3715 
   3716   TRACE_ALU_INPUT1 (VR[vreg2]);
   3717 
   3718   v = ROUND_Q62_Q31 (VR[vreg2]);
   3719   SAT32 (v);
   3720   VR[vreg3] &= 0xffffffff00000000UL;
   3721   v         &=         0xffffffffUL;
   3722   VR[vreg3] |= v;
   3723 
   3724   TRACE_ALU_RESULT1 (VR[vreg3]);
   3725 }
   3726 
   3727 vvvvv,111111100,ii+xxxxx,11011011100:C:::dup.h
   3728 *v850e3v5
   3729 "dup.h <imm2> v<vreg2>, v<vreg3>"
   3730 {
   3731   reg64_t v;
   3732 
   3733   TRACE_ALU_INPUT1 (VR[vreg2]);
   3734   switch (imm2)
   3735     {
   3736     case 0: v = VR[vreg2] & 0xffff; break;
   3737     case 1: v = (VR[vreg2] >> 16) & 0xffff; break;
   3738     case 2: v = (VR[vreg2] >> 32) & 0xffff; break;
   3739     case 3: v = (VR[vreg2] >> 48) & 0xffff; break;
   3740     default:
   3741       sim_engine_halt (SD, CPU, NULL, cia, sim_signalled, SIM_SIGILL);
   3742       v = 0;
   3743     }
   3744 
   3745   VR[vreg3] = v | (v << 16) | (v << 32) | (v << 48);
   3746   TRACE_ALU_RESULT1 (VR[vreg3]);
   3747 }
   3748 
   3749 vvvvv,1111111100,i+xxxxx,11011011110:C:::dup.w
   3750 *v850e3v5
   3751 "dup.w <imm1> v<vreg2>, v<vreg3>"
   3752 {
   3753   reg64_t v;
   3754 
   3755   TRACE_ALU_INPUT1 (VR[vreg2]);
   3756   switch (imm1)
   3757     {
   3758     case 0: v = VR[vreg2] & 0xffffffff; break;
   3759     case 1: v = (VR[vreg2] >> 32) & 0xffffffff; break;
   3760     default:
   3761       sim_engine_halt (SD, CPU, NULL, cia, sim_signalled, SIM_SIGILL);
   3762       v = 0;
   3763     }
   3764 
   3765   VR[vreg3] = v | (v << 32);
   3766   TRACE_ALU_RESULT1 (VR[vreg3]);
   3767 }
   3768 
   3769 vvvvv,11111101000+xxxxx,11001111110:C:::expq31
   3770 *v850e3v5
   3771 "expq31 v<vreg2>, v<vreg3>"
   3772 {
   3773   int i;
   3774   reg64_t v;
   3775 
   3776   TRACE_ALU_INPUT1 (VR[vreg2]);
   3777   v = VR[vreg2] & 0xffffffff;
   3778   if (v & (1 << 31))
   3779     {
   3780       if (v == 0x80000000)
   3781         i = 31;
   3782       else if (v == 0xffffffff)
   3783         i = 0;
   3784       else
   3785         for (i = 31; i; --i)
   3786           if ((v & (1 << i)) == 0)
   3787             break;
   3788     }
   3789   else
   3790     {
   3791       if (v == 0x7fffffff)
   3792         i = 31;
   3793       else if (v == 0x0)
   3794         i = 0;
   3795       else
   3796         for (i = 31; i; --i)
   3797           if (v & (1 << i))
   3798             break;
   3799     }
   3800   VR[vreg3] = 31 - i;
   3801   TRACE_ALU_RESULT1 (VR[vreg3]);
   3802 }
   3803 
   3804 rrrr,011111100000+0000011011011000:C:::modadd
   3805 *v850e3v5
   3806 "modadd r<reg2e>"
   3807 {
   3808   reg_t r;
   3809   int32_t inc;
   3810   reg_t max;
   3811 
   3812   TRACE_ALU_INPUT1 (GR[reg2e]);
   3813   r = GR[reg2e];
   3814   inc = r >> 16;
   3815   r = r & 0xffff;
   3816   max = GR[reg2e + 1];
   3817   max &= 0xffff;
   3818   r += inc;
   3819   if (inc > 0 && r > max)
   3820     r = 0;
   3821   else if (inc < 0 && r < 0)
   3822     r = max;
   3823   GR[reg2e] = (r & 0xffff) | (inc << 16);
   3824   TRACE_ALU_RESULT1 (GR[reg2e]);
   3825 }
   3826 
   3827 vvvvv,11111111000+wwwww,11011011010:C:::mov_dw_to_gr
   3828 *v850e3v5
   3829 "mov.dw v<vreg2>, r<reg3>"
   3830 {
   3831   TRACE_ALU_INPUT1 (VR[vreg2]);
   3832   GR[reg3] = VR[vreg2] & 0xffffffff;
   3833   GR[reg3 + 1] = VR[vreg2] >> 32;
   3834   TRACE_ALU_RESULT2 (GR[reg3], GR[reg3 + 1]);
   3835 }
   3836 
   3837 rrrrr,11111111100+xxxxx,11011011010:C:::mov_dw_to_vr
   3838 *v850e3v5
   3839 "mov.dw r<reg2>, v<vreg3>"
   3840 {
   3841   TRACE_ALU_INPUT2 (GR[reg2], GR[reg2 + 1]);
   3842   VR[vreg3] = GR[reg2 + 1];
   3843   VR[vreg3] <<= 32;
   3844   VR[vreg3] |= GR[reg2];
   3845   TRACE_ALU_RESULT1 (VR[vreg3]);
   3846 }
   3847 
   3848 vvvvv,111111000,ii+xxxxx,11011011100:C:::mov.h
   3849 *v850e3v5
   3850 "mov.h <imm2> v<vreg2>, v<vreg3>"
   3851 {
   3852   reg64_t v = VR[vreg2];
   3853   reg64_t mask = 0xffffUL;
   3854   int shift;
   3855 
   3856   TRACE_ALU_INPUT1 (VR[vreg2]);
   3857 
   3858   switch (imm2)
   3859     {
   3860     default:
   3861       sim_engine_halt (SD, CPU, NULL, cia, sim_signalled, SIM_SIGILL);
   3862     case 0: shift = 0; break;
   3863     case 1: shift = 16; break;
   3864     case 2: shift = 32; break;
   3865     case 3: shift = 48; break;
   3866     }
   3867 
   3868   v         &= mask;  
   3869   VR[vreg3] &= ~ (mask << shift);
   3870   VR[vreg3] |= (v << shift);
   3871     
   3872   TRACE_ALU_RESULT1 (VR[vreg3]);
   3873 }
   3874 
   3875 vvvvv,1111110000,i+xxxxx,11011011010:C:::mov.w.vreg_to_vreg
   3876 *v850e3v5
   3877 "mov.w <imm1> v<vreg2>, v<vreg3>"
   3878 {
   3879   reg64_t v = VR[vreg2];
   3880   reg64_t mask = 0xffffffffUL;
   3881   int shift;
   3882 
   3883   TRACE_ALU_INPUT1 (VR[vreg2]);
   3884   switch (imm1)
   3885     {
   3886     default:
   3887       sim_engine_halt (SD, CPU, NULL, cia, sim_signalled, SIM_SIGILL);
   3888     case 0: shift = 0; break;
   3889     case 1: shift = 32; break;
   3890     }
   3891 
   3892   v         &= mask;
   3893   VR[vreg3] &= ~ (mask << shift);
   3894   VR[vreg3] |= (v << shift);
   3895     
   3896   TRACE_ALU_RESULT1 (VR[vreg3]);
   3897 }
   3898 
   3899 rrrrr,1111111000,i+xxxxx,11011011010:C:::mov.w.reg_to_vreg
   3900 *v850e3v5
   3901 "mov.w <imm1> r<reg2>, v<vreg3>"
   3902 {
   3903   reg64_t v;
   3904   reg64_t mask = 0xffffffffUL;
   3905   int shift;
   3906 
   3907   TRACE_ALU_INPUT1 (GR[reg2]);
   3908   switch (imm1)
   3909     {
   3910     default:
   3911       sim_engine_halt (SD, CPU, NULL, cia, sim_signalled, SIM_SIGILL);
   3912     case 0: shift = 0; break;
   3913     case 1: shift = 32; break;
   3914     }
   3915 
   3916   v          = GR[reg2];
   3917   VR[vreg3] &= ~ (mask << shift);
   3918   VR[vreg3] |= (v << shift);
   3919     
   3920   TRACE_ALU_RESULT1 (VR[vreg3]);
   3921 }
   3922 
   3923 vvvvv,1111110100,i+wwwww,11011011010:C:::mov.w.vreg_to_reg
   3924 *v850e3v5
   3925 "mov.w <imm1> v<vreg2>, r<reg3>"
   3926 {
   3927   TRACE_ALU_INPUT1 (VR[vreg2]);
   3928 
   3929   switch (imm1)
   3930     {
   3931     default:
   3932       sim_engine_halt (SD, CPU, NULL, cia, sim_signalled, SIM_SIGILL);
   3933     case 0:
   3934       GR[reg3] = VR[vreg2];
   3935       break;
   3936     case 1:
   3937       GR[reg3] = VR[vreg2] >> 32;
   3938       break;
   3939     }
   3940     
   3941   TRACE_ALU_RESULT1 (GR[reg3]);
   3942 }
   3943 
   3944 vvvvv,111111,VVVVV+xxxxx,11001101010:C:::pki16i32
   3945 *v850e3v5
   3946 "pki16i32 v<vreg1>, v<vreg2>, v<vreg3>"
   3947 {
   3948   reg64_t v,t;
   3949 
   3950   TRACE_ALU_INPUT1 (VR[vreg1]);
   3951 
   3952   v = VR[vreg1];
   3953   VR[vreg2] = (SEXT32 (v, 16) & 0xffffffff);
   3954   v >>= 16;
   3955   t = SEXT32 (v, 16);
   3956   VR[vreg2] |= t << 32;
   3957   
   3958   v >>= 16;
   3959   VR[vreg3] = (SEXT32 (v, 16) & 0xffffffff);
   3960   v >>= 16;
   3961   t = SEXT32 (v, 16);
   3962   VR[vreg3] |= t << 32;
   3963 
   3964   TRACE_ALU_RESULT2 (VR[vreg2], VR[vreg3]);
   3965 }
   3966 
   3967 vvvvv,111111,VVVVV+xxxxx,11001100110:C:::pki16ui8
   3968 *v850e3v5
   3969 "pki16ui8 v<vreg1>, v<vreg2>, v<vreg3>"
   3970 {
   3971   TRACE_ALU_INPUT2 (VR[vreg1], VR[vreg2]);
   3972 
   3973   VR[vreg3] = VR[vreg1] & 0xff;
   3974   VR[vreg3] |= ((VR[vreg1] >>  8) & 0xff00);
   3975   VR[vreg3] |= ((VR[vreg1] >> 16) & 0xff0000);
   3976   VR[vreg3] |= ((VR[vreg1] >> 24) & 0xff000000);
   3977 
   3978   VR[vreg3] |= ((VR[vreg2] << 32) & 0xff00000000UL);
   3979   VR[vreg3] |= ((VR[vreg2] << 24) & 0xff0000000000UL);
   3980   VR[vreg3] |= ((VR[vreg2] << 16) & 0xff000000000000UL);
   3981   VR[vreg3] |= ((VR[vreg2] <<  8) & 0xff00000000000000UL);
   3982     
   3983   TRACE_ALU_RESULT1 (VR[vreg3]);
   3984 }
   3985 
   3986 vvvvv,111111,VVVVV+xxxxx,11001100100:C:::pki32i16
   3987 *v850e3v5
   3988 "pki32i16 v<vreg1>, v<vreg2>, v<vreg3>"
   3989 {
   3990   reg64_t v;
   3991 
   3992   TRACE_ALU_INPUT2 (VR[vreg1], VR[vreg2]);
   3993 
   3994   v = VR[vreg1] & 0xffffffff;
   3995   SAT16 (v);
   3996   VR[vreg3] = v & 0xffff;
   3997 
   3998   v = VR[vreg1] >> 32;
   3999   SAT16 (v);
   4000   VR[vreg3] |= ((v & 0xffff) << 16);
   4001   
   4002   v = VR[vreg2] & 0xffffffff;
   4003   SAT16 (v);
   4004   VR[vreg3] = ((v & 0xffff) << 32);
   4005 
   4006   v = VR[vreg2] >> 32;
   4007   SAT16 (v);
   4008   VR[vreg3] |= ((v & 0xffff) << 48);
   4009   
   4010   TRACE_ALU_RESULT1 (VR[vreg3]);
   4011 }
   4012 
   4013 vvvvv,111111,VVVVV+xxxxx,11001100010:C:::pki64i32
   4014 *v850e3v5
   4015 "pki64i32 v<vreg1>, v<vreg2>, v<vreg3>"
   4016 {
   4017   reg64_t v;
   4018 
   4019   TRACE_ALU_INPUT2 (VR[vreg1], VR[vreg2]);
   4020 
   4021   v = VR[vreg1];
   4022   SAT32 (v);
   4023   VR[vreg3] = v & 0xffffffff;
   4024 
   4025   v = VR[vreg2];
   4026   SAT32 (v);
   4027   VR[vreg3] |= v << 32;
   4028   
   4029   TRACE_ALU_RESULT1 (VR[vreg3]);
   4030 }
   4031 
   4032 vvvvv,111111,VVVVV+xxxxx,11001101000:C:::pkq15q31
   4033 *v850e3v5
   4034 "pkq15q31 v<vreg1>, v<vreg2>, v<vreg3>"
   4035 {
   4036   reg64_t v;
   4037 
   4038   TRACE_ALU_INPUT1 (VR[vreg1]);
   4039 
   4040   v = VR[vreg1];
   4041   VR[vreg2] = ((v & 0xffff) << 16);
   4042   VR[vreg2] |= ((v & 0xffff0000) << 32);
   4043 
   4044   VR[vreg3] = ((v & 0xffff00000000UL) >> 16);
   4045   VR[vreg3] |= ((v & 0xffff000000000000UL));
   4046 
   4047   TRACE_ALU_RESULT2 (VR[vreg2], VR[vreg3]);
   4048 }
   4049 
   4050 vvvvv,111111,VVVVV+xxxxx,11001011110:C:::pkq30q31
   4051 *v850e3v5
   4052 "pkq30q31 v<vreg1>, v<vreg2>, v<vreg3>"
   4053 {
   4054   reg64_t v;
   4055 
   4056   TRACE_ALU_INPUT2 (VR[vreg1], VR[vreg2]);
   4057 
   4058   v = VR[vreg1];
   4059   v <<= 1;
   4060   SAT32 (v);
   4061   VR[vreg3] = v & 0xffffffff;
   4062 
   4063   v = VR[vreg2];
   4064   v <<= 1;
   4065   SAT32 (v);
   4066   VR[vreg3] = v << 32;
   4067     
   4068   TRACE_ALU_RESULT1 (VR[vreg3]);
   4069 }
   4070 
   4071 vvvvv,111111,VVVVV+xxxxx,11001100000:C:::pkq31q15
   4072 *v850e3v5
   4073 "pkq31q15 v<vreg1>, v<vreg2>, v<vreg3>"
   4074 {
   4075   reg64_t v;
   4076 
   4077   TRACE_ALU_INPUT2 (VR[vreg1], VR[vreg2]);
   4078     
   4079   v = ROUND_Q31_Q15 (VR[vreg1] & 0xffffffff);
   4080   SAT16 (v);
   4081   VR[vreg3] = v & 0xffff;
   4082 
   4083   v = ROUND_Q31_Q15 (VR[vreg1] >> 32);
   4084   SAT16 (v);
   4085   VR[vreg3] |= (v & 0xffff) << 16;
   4086 
   4087   v = ROUND_Q31_Q15 (VR[vreg2] & 0xffffffff);
   4088   SAT16 (v);
   4089   VR[vreg3] |= (v & 0xffff) << 32;
   4090 
   4091   v = ROUND_Q31_Q15 (VR[vreg2] >> 32);
   4092   SAT16 (v);
   4093   VR[vreg3] |= (v & 0xffff) << 48;
   4094       
   4095   TRACE_ALU_RESULT1 (VR[vreg3]);
   4096 }
   4097 
   4098 vvvvv,111111,VVVVV+xxxxx,11001101100:C:::pkui8i16
   4099 *v850e3v5
   4100 "pkui8i16 v<vreg1>, v<vreg2>, v<vreg3>"
   4101 {
   4102   reg64_t v;
   4103 
   4104   TRACE_ALU_INPUT1 (VR[vreg1]);
   4105 
   4106   v = VR[vreg1];
   4107 
   4108   VR[vreg2] = v & 0x00ff;
   4109   VR[vreg2] |= (v << 8)  & 0x00ff0000;
   4110   VR[vreg2] |= (v << 16) & 0x00ff00000000UL;
   4111   VR[vreg2] |= (v << 24) & 0x00ff000000000000UL;
   4112 
   4113   VR[vreg3]  = (v >> 32) & 0x00ff;
   4114   VR[vreg3] |= (v >> 24) & 0x00ff0000;
   4115   VR[vreg3] |= (v >> 16) & 0x00ff00000000UL;
   4116   VR[vreg3] |= (v >>  8) & 0x00ff000000000000UL;
   4117         
   4118   TRACE_ALU_RESULT2 (VR[vreg2], VR[vreg3]);
   4119 }
   4120 
   4121 vvvvv,11111100000+xxxxx,11001111110:C:::vabs.h
   4122 *v850e3v5
   4123 "vabs.h v<vreg2>, v<vreg3>"
   4124 {
   4125   int shift;
   4126 
   4127   TRACE_ALU_INPUT1 (VR[vreg2]);
   4128 
   4129   VR[vreg3] = 0;
   4130   for (shift = 0; shift < 64; shift += 16);
   4131     {
   4132       reg64_t v;
   4133 
   4134       v = VR[vreg2] >> shift;
   4135       ABS16 (v);
   4136       VR[vreg3] |= v << shift;
   4137     }
   4138   
   4139   TRACE_ALU_RESULT1 (VR[vreg3]);
   4140 }
   4141 
   4142 vvvvv,11111100001+xxxxx,11001111110:C:::vabs.w
   4143 *v850e3v5
   4144 "vabs.w v<vreg2>, v<vreg3>"
   4145 {
   4146   reg64_t v;
   4147 
   4148   TRACE_ALU_INPUT1 (VR[vreg2]);
   4149 
   4150   v = VR[vreg2];
   4151   ABS32 (v);
   4152   VR[vreg3] = v;
   4153 
   4154   v = VR[vreg2] >> 32;
   4155   ABS32 (v);
   4156   VR[vreg3] |= v << 32;
   4157   
   4158   TRACE_ALU_RESULT1 (VR[vreg3]);
   4159 }
   4160 
   4161 vvvvv,111111,VVVVV+xxxxx,11001011000:C:::vadd.dw
   4162 *v850e3v5
   4163 "vadd.dw v<vreg1>, v<vreg2>, v<vreg3>"
   4164 {
   4165   TRACE_ALU_INPUT2 (VR[vreg1], VR[vreg2]);
   4166 
   4167   /* FIXME: saturation handling needed.  */
   4168   sim_engine_halt (SD, CPU, NULL, cia, sim_signalled, SIM_SIGILL);
   4169 
   4170   VR[vreg3] = VR[vreg1] + VR[vreg2];
   4171   
   4172   TRACE_ALU_RESULT1 (VR[vreg3]);
   4173 }
   4174  
   4175 vvvvv,111111,VVVVV+xxxxx,11000000000:C:::vadd.h
   4176 *v850e3v5
   4177 "vadd.h v<vreg1>, v<vreg2>, v<vreg3>"
   4178 {
   4179   TRACE_ALU_INPUT2 (VR[vreg1], VR[vreg2]);
   4180 
   4181   /* FIXME: Implementation needed.  */
   4182   sim_engine_halt (SD, CPU, NULL, cia, sim_signalled, SIM_SIGILL);
   4183 
   4184   TRACE_ALU_RESULT1 (VR[vreg3]);
   4185 }
   4186 
   4187 vvvvv,111111,VVVVV+xxxxx,11000000010:C:::vadd.w
   4188 *v850e3v5
   4189 "vadd.w v<vreg1>, v<vreg2>, v<vreg3>"
   4190 {
   4191   TRACE_ALU_INPUT2 (VR[vreg1], VR[vreg2]);
   4192 
   4193   /* FIXME: Implementation needed.  */
   4194   sim_engine_halt (SD, CPU, NULL, cia, sim_signalled, SIM_SIGILL);
   4195 
   4196   TRACE_ALU_RESULT1 (VR[vreg3]);
   4197 }
   4198 
   4199 vvvvv,111111,VVVVV+xxxxx,11000001000:C:::vadds.h
   4200 *v850e3v5
   4201 "vadds.h v<vreg1>, v<vreg2>, v<vreg3>"
   4202 {
   4203   TRACE_ALU_INPUT2 (VR[vreg1], VR[vreg2]);
   4204 
   4205   /* FIXME: Implementation needed.  */
   4206   sim_engine_halt (SD, CPU, NULL, cia, sim_signalled, SIM_SIGILL);
   4207 
   4208   TRACE_ALU_RESULT1 (VR[vreg3]);
   4209 }
   4210 
   4211 vvvvv,111111,VVVVV+xxxxx,11000001010:C:::vadds.w
   4212 *v850e3v5
   4213 "vadds.w v<vreg1>, v<vreg2>, v<vreg3>"
   4214 {
   4215   TRACE_ALU_INPUT2 (VR[vreg1], VR[vreg2]);
   4216 
   4217   /* FIXME: Implementation needed.  */
   4218   sim_engine_halt (SD, CPU, NULL, cia, sim_signalled, SIM_SIGILL);
   4219 
   4220   TRACE_ALU_RESULT1 (VR[vreg3]);
   4221 }
   4222 
   4223 vvvvv,111111,VVVVV+xxxxx,11000010000:C:::vaddsat.h
   4224 *v850e3v5
   4225 "vaddsat.h v<vreg1>, v<vreg2>, v<vreg3>"
   4226 {
   4227   TRACE_ALU_INPUT2 (VR[vreg1], VR[vreg2]);
   4228 
   4229   /* FIXME: Implementation needed.  */
   4230   sim_engine_halt (SD, CPU, NULL, cia, sim_signalled, SIM_SIGILL);
   4231 
   4232   TRACE_ALU_RESULT1 (VR[vreg3]);
   4233 }
   4234 
   4235 vvvvv,111111,VVVVV+xxxxx,11000010010:C:::vaddsat.w
   4236 *v850e3v5
   4237 "vaddsat.w v<vreg1>, v<vreg2>, v<vreg3>"
   4238 {
   4239   TRACE_ALU_INPUT2 (VR[vreg1], VR[vreg2]);
   4240 
   4241   /* FIXME: Implementation needed.  */
   4242   sim_engine_halt (SD, CPU, NULL, cia, sim_signalled, SIM_SIGILL);
   4243 
   4244   TRACE_ALU_RESULT1 (VR[vreg3]);
   4245 }
   4246 
   4247 vvvvv,111111,VVVVV+xxxxx,11010000000:C:::vand
   4248 *v850e3v5
   4249 "vand v<vreg1>, v<vreg2>, v<vreg3>"
   4250 {
   4251   TRACE_ALU_INPUT2 (VR[vreg1], VR[vreg2]);
   4252 
   4253   VR[vreg3] = VR[vreg1] & VR[vreg2];
   4254 
   4255   TRACE_ALU_RESULT1 (VR[vreg3]);
   4256 }
   4257 
   4258 vvvvv,111111,VVVVV+xxxxx,11001011100:C:::vbiq.h
   4259 *v850e3v5
   4260 "vbiq.h v<vreg1>, v<vreg2>, v<vreg3>"
   4261 {
   4262   TRACE_ALU_INPUT2 (VR[vreg1], VR[vreg2]);
   4263 
   4264   /* FIXME: Implementation needed.  */
   4265   sim_engine_halt (SD, CPU, NULL, cia, sim_signalled, SIM_SIGILL);
   4266 
   4267   TRACE_ALU_RESULT2 (VR[vreg2], VR[vreg3]);
   4268 }
   4269 
   4270 vvvvv,11111100111+xxxxx,11011011110:C:::vbswap.dw
   4271 *v850e3v5
   4272 "vbswap.dw v<vreg2>, v<vreg3>"
   4273 {
   4274   TRACE_ALU_INPUT1 (VR[vreg2]);
   4275 
   4276   /* FIXME: Implementation needed.  */
   4277   sim_engine_halt (SD, CPU, NULL, cia, sim_signalled, SIM_SIGILL);
   4278 
   4279   TRACE_ALU_RESULT1 (VR[vreg3]);
   4280 }
   4281 
   4282 vvvvv,11111100101+xxxxx,11011011110:C:::vbswap.h
   4283 *v850e3v5
   4284 "vbswap.h v<vreg2>, v<vreg3>"
   4285 {
   4286   TRACE_ALU_INPUT1 (VR[vreg2]);
   4287 
   4288   /* FIXME: Implementation needed.  */
   4289   sim_engine_halt (SD, CPU, NULL, cia, sim_signalled, SIM_SIGILL);
   4290 
   4291   TRACE_ALU_RESULT1 (VR[vreg3]);
   4292 }
   4293 
   4294 vvvvv,11111100110+xxxxx,11011011110:C:::vbswap.w
   4295 *v850e3v5
   4296 "vbswap.w v<vreg2>, v<vreg3>"
   4297 {
   4298   TRACE_ALU_INPUT1 (VR[vreg2]);
   4299 
   4300   /* FIXME: Implementation needed.  */
   4301   sim_engine_halt (SD, CPU, NULL, cia, sim_signalled, SIM_SIGILL);
   4302 
   4303   TRACE_ALU_RESULT1 (VR[vreg3]);
   4304 }
   4305 
   4306 vvvvv,111111,VVVVV+xxxxx,11001110000:C:::vcalc.h
   4307 *v850e3v5
   4308 "vcalc.h v<vreg1>,v<vreg2>, v<vreg3>"
   4309 {
   4310   TRACE_ALU_INPUT2 (VR[vreg1], VR[vreg2]);
   4311 
   4312   /* FIXME: Implementation needed.  */
   4313   sim_engine_halt (SD, CPU, NULL, cia, sim_signalled, SIM_SIGILL);
   4314 
   4315   TRACE_ALU_RESULT1 (VR[vreg3]);
   4316 }
   4317 
   4318 vvvvv,111111,VVVVV+xxxxx,11001110010:C:::vcalc.w
   4319 *v850e3v5
   4320 "vcalc.w v<vreg1>,v<vreg2>, v<vreg3>"
   4321 {
   4322   TRACE_ALU_INPUT2 (VR[vreg1], VR[vreg2]);
   4323 
   4324   /* FIXME: Implementation needed.  */
   4325   sim_engine_halt (SD, CPU, NULL, cia, sim_signalled, SIM_SIGILL);
   4326 
   4327   TRACE_ALU_RESULT1 (VR[vreg3]);
   4328 }
   4329 
   4330 vvvvv,111111,VVVVV+xxxxx,11010110000:C:::vcmov
   4331 *v850e3v5
   4332 "vcmov v<vreg1>, v<vreg2>, v<vreg3>"
   4333 {
   4334   TRACE_ALU_INPUT2 (VR[vreg1], VR[vreg2]);
   4335 
   4336   /* FIXME: Implementation needed.  */
   4337   sim_engine_halt (SD, CPU, NULL, cia, sim_signalled, SIM_SIGILL);
   4338 
   4339   TRACE_ALU_RESULT1 (VR[vreg3]);
   4340 }
   4341