Home | History | Annotate | Line # | Download | only in mips
      1       1.1  christos // -*- C -*-
      2       1.1  christos 
      3       1.1  christos // Simulator definition for the MIPS DSP REV 2 ASE.
      4  1.1.1.11  christos // Copyright (C) 2007-2025 Free Software Foundation, Inc.
      5       1.1  christos // Contributed by MIPS Technologies, Inc.
      6       1.1  christos // Written by Chao-ying Fu (fu (a] mips.com).
      7       1.1  christos //
      8   1.1.1.5  christos // This file is part of the MIPS sim
      9       1.1  christos //
     10       1.1  christos // This program is free software; you can redistribute it and/or modify
     11       1.1  christos // it under the terms of the GNU General Public License as published by
     12       1.1  christos // the Free Software Foundation; either version 3 of the License, or
     13       1.1  christos // (at your option) any later version.
     14       1.1  christos //
     15       1.1  christos // This program is distributed in the hope that it will be useful,
     16       1.1  christos // but WITHOUT ANY WARRANTY; without even the implied warranty of
     17       1.1  christos // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
     18       1.1  christos // GNU General Public License for more details.
     19       1.1  christos //
     20       1.1  christos // You should have received a copy of the GNU General Public License
     21       1.1  christos // along with this program.  If not, see <http://www.gnu.org/licenses/>.
     22       1.1  christos 
     23       1.1  christos 
     24       1.1  christos // op: 0 = ADD, 1 = SUB
     25       1.1  christos // sat: 0 = no saturation, 1 = saturation
     26       1.1  christos :function:::void:do_u_ph_op:int rd, int rs, int rt, int op, int sat
     27       1.1  christos {
     28       1.1  christos   int i;
     29   1.1.1.9  christos   uint32_t h0;
     30   1.1.1.9  christos   uint16_t h1, h2;
     31   1.1.1.9  christos   uint32_t v1 = GPR[rs];
     32   1.1.1.9  christos   uint32_t v2 = GPR[rt];
     33   1.1.1.9  christos   uint32_t result = 0;
     34       1.1  christos   for (i = 0; i < 32; i += 16, v1 >>= 16, v2 >>= 16)
     35       1.1  christos     {
     36   1.1.1.9  christos       h1 = (uint16_t)(v1 & 0xffff);
     37   1.1.1.9  christos       h2 = (uint16_t)(v2 & 0xffff);
     38       1.1  christos       if (op == 0) // ADD
     39   1.1.1.9  christos 	h0 = (uint32_t)h1 + (uint32_t)h2;
     40       1.1  christos       else // SUB
     41   1.1.1.9  christos 	h0 = (uint32_t)h1 - (uint32_t)h2;
     42   1.1.1.9  christos       if (op == 0 && (h0 > (uint32_t)0x0000ffff)) // ADD SAT
     43       1.1  christos 	{
     44       1.1  christos 	  DSPCR |= DSPCR_OUFLAG4;
     45       1.1  christos 	  if (sat == 1)
     46       1.1  christos 	    h0 = 0xffff;
     47       1.1  christos 	}
     48       1.1  christos       else if (op == 1 && h1 < h2) // SUB SAT
     49       1.1  christos 	{
     50       1.1  christos 	  DSPCR |= DSPCR_OUFLAG4;
     51       1.1  christos 	  if (sat == 1)
     52       1.1  christos 	    h0 = 0x0;
     53       1.1  christos 	}
     54   1.1.1.9  christos       result |= ((uint32_t)((uint16_t)h0) << i);
     55       1.1  christos     }
     56       1.1  christos   GPR[rd] = EXTEND32 (result);
     57       1.1  christos }
     58       1.1  christos 
     59       1.1  christos // op: 0 = ADD, 1 = SUB
     60       1.1  christos // round: 0 = no rounding, 1 = rounding
     61       1.1  christos :function:::void:do_uh_qb_op:int rd, int rs, int rt, int op, int round
     62       1.1  christos {
     63       1.1  christos   int i;
     64   1.1.1.9  christos   uint32_t h0;
     65   1.1.1.9  christos   uint8_t h1, h2;
     66   1.1.1.9  christos   uint32_t v1 = GPR[rs];
     67   1.1.1.9  christos   uint32_t v2 = GPR[rt];
     68   1.1.1.9  christos   uint32_t result = 0;
     69       1.1  christos   for (i = 0; i < 32; i += 8, v1 >>= 8, v2 >>= 8)
     70       1.1  christos     {
     71   1.1.1.9  christos       h1 = (uint8_t)(v1 & 0xff);
     72   1.1.1.9  christos       h2 = (uint8_t)(v2 & 0xff);
     73       1.1  christos       if (op == 0) // ADD
     74   1.1.1.9  christos 	h0 = (uint32_t)h1 + (uint32_t)h2;
     75       1.1  christos       else // SUB
     76   1.1.1.9  christos 	h0 = (uint32_t)h1 - (uint32_t)h2;
     77       1.1  christos       if (round == 1)
     78       1.1  christos 	h0 = (h0 + 1) >> 1;
     79       1.1  christos       else
     80       1.1  christos 	h0 = h0 >> 1;
     81   1.1.1.9  christos       result |= ((uint32_t)((uint8_t)h0) << i);
     82       1.1  christos     }
     83       1.1  christos   GPR[rd] = EXTEND32 (result);
     84       1.1  christos }
     85       1.1  christos 
     86       1.1  christos // op: 0 = EQ, 1 = LT, 2 = LE
     87       1.1  christos :function:::void:do_qb_cmpgdu:int rd, int rs, int rt, int op
     88       1.1  christos {
     89       1.1  christos   int i, j;
     90   1.1.1.9  christos   uint32_t v1 = GPR[rs];
     91   1.1.1.9  christos   uint32_t v2 = GPR[rt];
     92   1.1.1.9  christos   uint8_t h1, h2;
     93   1.1.1.9  christos   uint32_t result = 0;
     94   1.1.1.9  christos   uint32_t mask;
     95       1.1  christos   for (i = 0, j = 0; i < 32; i += 8, j++, v1 >>= 8, v2 >>= 8)
     96       1.1  christos     {
     97   1.1.1.9  christos       h1 = (uint8_t)(v1 & 0xff);
     98   1.1.1.9  christos       h2 = (uint8_t)(v2 & 0xff);
     99       1.1  christos       mask = ~(1 << (DSPCR_CCOND_SHIFT + j));
    100       1.1  christos       DSPCR &= mask;
    101       1.1  christos       if (op == 0) // EQ
    102       1.1  christos 	{
    103       1.1  christos 	  result |= ((h1 == h2) << j);
    104       1.1  christos 	  DSPCR |= ((h1 == h2) << (DSPCR_CCOND_SHIFT + j));
    105       1.1  christos 	}
    106       1.1  christos       else if (op == 1) // LT
    107       1.1  christos 	{
    108       1.1  christos 	  result |= ((h1 < h2) << j);
    109       1.1  christos 	  DSPCR |= ((h1 < h2) << (DSPCR_CCOND_SHIFT + j));
    110       1.1  christos 	}
    111       1.1  christos       else // LE
    112       1.1  christos 	{
    113       1.1  christos 	  result |= ((h1 <= h2) << j);
    114       1.1  christos 	  DSPCR |= ((h1 <= h2) << (DSPCR_CCOND_SHIFT + j));
    115       1.1  christos 	}
    116       1.1  christos     }
    117       1.1  christos   GPR[rd] = EXTEND32 (result);
    118       1.1  christos }
    119       1.1  christos 
    120       1.1  christos // op: 0 = DPA 1 = DPS
    121       1.1  christos :function:::void:do_w_ph_dot_product:int ac, int rs, int rt, int op
    122       1.1  christos {
    123       1.1  christos   int i;
    124   1.1.1.9  christos   uint32_t v1 = GPR[rs];
    125   1.1.1.9  christos   uint32_t v2 = GPR[rt];
    126   1.1.1.9  christos   int16_t h1, h2;
    127   1.1.1.9  christos   int32_t result;
    128   1.1.1.9  christos   uint32_t lo = DSPLO(ac);
    129   1.1.1.9  christos   uint32_t hi = DSPHI(ac);
    130   1.1.1.9  christos   int64_t prod = (int64_t)((((uint64_t)hi) << 32) + (uint64_t)lo);
    131       1.1  christos   for (i = 0; i < 32; i += 16, v1 >>= 16, v2 >>= 16)
    132       1.1  christos     {
    133   1.1.1.9  christos       h1 = (int16_t)(v1 & 0xffff);
    134   1.1.1.9  christos       h2 = (int16_t)(v2 & 0xffff);
    135   1.1.1.9  christos       result = (int32_t)h1 * (int32_t)h2;
    136       1.1  christos       if (op == 0) // DPA
    137   1.1.1.9  christos         prod += (int64_t)result;
    138       1.1  christos       else // DPS
    139   1.1.1.9  christos         prod -= (int64_t)result;
    140       1.1  christos     }
    141       1.1  christos   DSPLO(ac) = EXTEND32 (prod);
    142       1.1  christos   DSPHI(ac) = EXTEND32 (prod >> 32);
    143       1.1  christos }
    144       1.1  christos 
    145       1.1  christos // round: 0 = no rounding, 1 = rounding
    146       1.1  christos :function:::void:do_w_mulq:int rd, int rs, int rt, int round
    147       1.1  christos {
    148   1.1.1.9  christos   uint32_t v1 = GPR[rs];
    149   1.1.1.9  christos   uint32_t v2 = GPR[rt];
    150   1.1.1.9  christos   int32_t w1, w2;
    151   1.1.1.9  christos   int64_t prod;
    152   1.1.1.9  christos   uint32_t result;
    153   1.1.1.9  christos   w1 = (int32_t) v1;
    154   1.1.1.9  christos   w2 = (int32_t) v2;
    155   1.1.1.9  christos   if (w1 == (int32_t) 0x80000000 && w2 == (int32_t) 0x80000000)
    156       1.1  christos     {
    157       1.1  christos       DSPCR |= DSPCR_OUFLAG5;
    158       1.1  christos       prod = 0x7fffffff;
    159       1.1  christos     }
    160       1.1  christos   else
    161       1.1  christos     {
    162   1.1.1.9  christos       prod = ((int64_t) w1 * (int64_t) w2) << 1;
    163       1.1  christos       if (round == 1)
    164       1.1  christos 	prod += 0x0000000080000000LL;
    165       1.1  christos       prod = prod >> 32;
    166       1.1  christos     }
    167   1.1.1.9  christos   result = (uint32_t) prod;
    168       1.1  christos   GPR[rd] = EXTEND32 (result);
    169       1.1  christos }
    170       1.1  christos 
    171       1.1  christos // round: 0 = no rounding, 1 = rounding
    172       1.1  christos :function:::void:do_precr_sra:int rt, int rs, int sa, int round
    173       1.1  christos {
    174   1.1.1.9  christos   uint32_t v1 = GPR[rt];
    175   1.1.1.9  christos   uint32_t v2 = GPR[rs];
    176   1.1.1.9  christos   int32_t w1 = (int32_t) v1;
    177   1.1.1.9  christos   int32_t w2 = (int32_t) v2;
    178   1.1.1.9  christos   int32_t result;
    179       1.1  christos   if (sa != 0)
    180       1.1  christos     {
    181       1.1  christos       if (round == 1 && (w1 & (1 << (sa - 1))))
    182       1.1  christos 	w1 = (w1 >> sa) + 1;
    183       1.1  christos       else
    184       1.1  christos 	w1 = w1 >> sa;
    185       1.1  christos 
    186       1.1  christos       if (round == 1 && (w2 & (1 << (sa - 1))))
    187       1.1  christos 	w2 = (w2 >> sa) + 1;
    188       1.1  christos       else
    189       1.1  christos 	w2 = w2 >> sa;
    190       1.1  christos     }
    191       1.1  christos   result = (w1 << 16) | (w2 & 0xffff);
    192       1.1  christos   GPR[rt] = EXTEND32 (result);
    193       1.1  christos }
    194       1.1  christos 
    195       1.1  christos // round: 0 = no rounding, 1 = rounding
    196       1.1  christos :function:::void:do_qb_shra:int rd, int rt, int shift, int round
    197       1.1  christos {
    198  1.1.1.10  christos   int i;
    199   1.1.1.9  christos   int8_t q0;
    200   1.1.1.9  christos   uint32_t v1 = GPR[rt];
    201   1.1.1.9  christos   uint32_t result = 0;
    202       1.1  christos   for (i = 0; i < 32; i += 8, v1 >>= 8)
    203       1.1  christos     {
    204   1.1.1.9  christos       q0 = (int8_t)(v1 & 0xff);
    205       1.1  christos       if (shift != 0)
    206       1.1  christos  	{
    207       1.1  christos 	  if (round == 1 && (q0 & (1 << (shift - 1))))
    208       1.1  christos 	    q0 = (q0 >> shift) + 1;
    209       1.1  christos 	  else
    210       1.1  christos 	    q0 = q0 >> shift;
    211       1.1  christos  	}
    212   1.1.1.9  christos       result |= ((uint32_t)((uint8_t)q0) << i);
    213       1.1  christos     }
    214       1.1  christos   GPR[rd] = EXTEND32 (result);
    215       1.1  christos }
    216       1.1  christos 
    217       1.1  christos :function:::void:do_ph_shrl:int rd, int rt, int shift
    218       1.1  christos {
    219  1.1.1.10  christos   int i;
    220   1.1.1.9  christos   uint16_t h0;
    221   1.1.1.9  christos   uint32_t v1 = GPR[rt];
    222   1.1.1.9  christos   uint32_t result = 0;
    223       1.1  christos   for (i = 0; i < 32; i += 16, v1 >>= 16)
    224       1.1  christos     {
    225   1.1.1.9  christos       h0 = (uint16_t)(v1 & 0xffff);
    226       1.1  christos       h0 = h0 >> shift;
    227   1.1.1.9  christos       result |= ((uint32_t)h0 << i);
    228       1.1  christos     }
    229       1.1  christos   GPR[rd] = EXTEND32 (result);
    230       1.1  christos }
    231       1.1  christos 
    232       1.1  christos // op: 0 = ADD, 1 = SUB
    233       1.1  christos // round: 0 = no rounding, 1 = rounding
    234       1.1  christos :function:::void:do_qh_ph_op:int rd, int rs, int rt, int op, int round
    235       1.1  christos {
    236       1.1  christos   int i;
    237   1.1.1.9  christos   int32_t h0;
    238   1.1.1.9  christos   int16_t h1, h2;
    239   1.1.1.9  christos   uint32_t v1 = GPR[rs];
    240   1.1.1.9  christos   uint32_t v2 = GPR[rt];
    241   1.1.1.9  christos   uint32_t result = 0;
    242       1.1  christos   for (i = 0; i < 32; i += 16, v1 >>= 16, v2 >>= 16)
    243       1.1  christos     {
    244   1.1.1.9  christos       h1 = (int16_t)(v1 & 0xffff);
    245   1.1.1.9  christos       h2 = (int16_t)(v2 & 0xffff);
    246       1.1  christos       if (op == 0) // ADD
    247   1.1.1.9  christos 	h0 = (int32_t)h1 + (int32_t)h2;
    248       1.1  christos       else // SUB
    249   1.1.1.9  christos 	h0 = (int32_t)h1 - (int32_t)h2;
    250       1.1  christos       if (round == 1)
    251       1.1  christos 	h0 = (h0 + 1) >> 1;
    252       1.1  christos       else
    253       1.1  christos 	h0 = h0 >> 1;
    254   1.1.1.9  christos       result |= ((uint32_t)((uint16_t)h0) << i);
    255       1.1  christos     }
    256       1.1  christos   GPR[rd] = EXTEND32 (result);
    257       1.1  christos }
    258       1.1  christos 
    259       1.1  christos // op: 0 = ADD, 1 = SUB
    260       1.1  christos // round: 0 = no rounding, 1 = rounding
    261       1.1  christos :function:::void:do_qh_w_op:int rd, int rs, int rt, int op, int round
    262       1.1  christos {
    263   1.1.1.9  christos   int64_t v0;
    264   1.1.1.9  christos   int32_t v1 = (int32_t)GPR[rs];
    265   1.1.1.9  christos   int32_t v2 = (int32_t)GPR[rt];
    266       1.1  christos   if (op == 0) // ADD
    267   1.1.1.9  christos     v0 = (int64_t)v1 + (int64_t)v2;
    268       1.1  christos   else // SUB
    269   1.1.1.9  christos     v0 = (int64_t)v1 - (int64_t)v2;
    270       1.1  christos   if (round == 1)
    271       1.1  christos     v0 = (v0 + 1) >> 1;
    272       1.1  christos   else
    273       1.1  christos     v0 = v0 >> 1;
    274       1.1  christos   GPR[rd] = EXTEND32 (v0);
    275       1.1  christos }
    276       1.1  christos 
    277       1.1  christos // op: 0 = DPAX, 1 = DPSX
    278       1.1  christos :function:::void:do_x_w_ph_dot_product:int ac, int rs, int rt, int op
    279       1.1  christos {
    280       1.1  christos   int i;
    281   1.1.1.9  christos   uint32_t v1 = GPR[rs];
    282   1.1.1.9  christos   uint32_t v2 = GPR[rt];
    283   1.1.1.9  christos   int16_t h1, h2;
    284   1.1.1.9  christos   int32_t result;
    285   1.1.1.9  christos   uint32_t lo = DSPLO(ac);
    286   1.1.1.9  christos   uint32_t hi = DSPHI(ac);
    287   1.1.1.9  christos   int64_t prod = (int64_t)((((uint64_t)hi) << 32) + (uint64_t)lo);
    288       1.1  christos   for (i = 0; i < 32; i += 16, v1 >>= 16, v2 <<= 16)
    289       1.1  christos     {
    290   1.1.1.9  christos       h1 = (int16_t)(v1 & 0xffff);
    291   1.1.1.9  christos       h2 = (int16_t)((v2 & 0xffff0000) >> 16);
    292   1.1.1.9  christos       result = (int32_t)h1 * (int32_t)h2;
    293       1.1  christos       if (op == 0) // DPAX
    294   1.1.1.9  christos         prod += (int64_t)result;
    295       1.1  christos       else // DPSX
    296   1.1.1.9  christos         prod -= (int64_t)result;
    297       1.1  christos     }
    298       1.1  christos   DSPLO(ac) = EXTEND32 (prod);
    299       1.1  christos   DSPHI(ac) = EXTEND32 (prod >> 32);
    300       1.1  christos }
    301       1.1  christos 
    302       1.1  christos // op: 0 = DPAQX, 1 = DPSQX
    303       1.1  christos // sat: 0 = no saturation, 1 = saturation of the accumulator
    304       1.1  christos :function:::void:do_qx_w_ph_dot_product:int ac, int rs, int rt, int op, int sat
    305       1.1  christos {
    306       1.1  christos   int i;
    307   1.1.1.9  christos   uint32_t v1 = GPR[rs];
    308   1.1.1.9  christos   uint32_t v2 = GPR[rt];
    309   1.1.1.9  christos   int16_t h1, h2;
    310   1.1.1.9  christos   int32_t result;
    311   1.1.1.9  christos   uint32_t lo = DSPLO(ac);
    312   1.1.1.9  christos   uint32_t hi = DSPHI(ac);
    313   1.1.1.9  christos   int64_t prod = (int64_t)((((uint64_t)hi) << 32) + (uint64_t)lo);
    314   1.1.1.9  christos   int64_t max, min;
    315       1.1  christos   for (i = 0; i < 32; i += 16, v1 >>= 16, v2 <<= 16)
    316       1.1  christos     {
    317   1.1.1.9  christos       h1 = (int16_t)(v1 & 0xffff);
    318   1.1.1.9  christos       h2 = (int16_t)((v2 & 0xffff0000) >> 16);
    319   1.1.1.9  christos       if (h1 == (int16_t)0x8000 && h2 == (int16_t)0x8000)
    320       1.1  christos 	{
    321       1.1  christos 	  DSPCR |= (1 << (DSPCR_OUFLAG_SHIFT + ac));
    322       1.1  christos 	  result = 0x7fffffff;
    323       1.1  christos 	}
    324       1.1  christos       else
    325   1.1.1.9  christos 	result = ((int32_t)h1 * (int32_t)h2) << 1;
    326       1.1  christos       if (op == 0) // DPAQX
    327   1.1.1.9  christos         prod += (int64_t)result;
    328       1.1  christos       else // DPSQX
    329   1.1.1.9  christos         prod -= (int64_t)result;
    330       1.1  christos     }
    331       1.1  christos   // Saturation on the accumulator.
    332       1.1  christos   if (sat == 1)
    333       1.1  christos     {
    334   1.1.1.9  christos       max = (int64_t) 0x7fffffffLL;
    335   1.1.1.9  christos       min = (int64_t) 0xffffffff80000000LL;
    336       1.1  christos       if (prod > max)
    337       1.1  christos 	{
    338       1.1  christos 	  DSPCR |= (1 << (DSPCR_OUFLAG_SHIFT + ac));
    339       1.1  christos 	  prod = max;
    340       1.1  christos 	}
    341       1.1  christos       else if (prod < min)
    342       1.1  christos 	{
    343       1.1  christos 	  DSPCR |= (1 << (DSPCR_OUFLAG_SHIFT + ac));
    344       1.1  christos 	  prod = min;
    345       1.1  christos 	}
    346       1.1  christos     }
    347       1.1  christos   DSPLO(ac) = EXTEND32 (prod);
    348       1.1  christos   DSPHI(ac) = EXTEND32 (prod >> 32);
    349       1.1  christos }
    350       1.1  christos 
    351       1.1  christos 011111,00000,5.RT,5.RD,00001,010010:SPECIAL3:32::ABSQ_S.QB
    352       1.1  christos "absq_s.qb r<RD>, r<RT>"
    353       1.1  christos *dsp2:
    354       1.1  christos {
    355   1.1.1.5  christos   do_qb_s_absq (SD_, RD, RT);
    356       1.1  christos }
    357       1.1  christos 
    358       1.1  christos 011111,5.RS,5.RT,5.RD,01000,010000:SPECIAL3:32::ADDU.PH
    359       1.1  christos "addu.ph r<RD>, r<RS>, r<RT>"
    360       1.1  christos *dsp2:
    361       1.1  christos {
    362       1.1  christos   do_u_ph_op (SD_, RD, RS, RT, 0, 0);
    363       1.1  christos }
    364       1.1  christos 
    365       1.1  christos 011111,5.RS,5.RT,5.RD,01100,010000:SPECIAL3:32::ADDU_S.PH
    366       1.1  christos "addu_s.ph r<RD>, r<RS>, r<RT>"
    367       1.1  christos *dsp2:
    368       1.1  christos {
    369       1.1  christos   do_u_ph_op (SD_, RD, RS, RT, 0, 1);
    370       1.1  christos }
    371       1.1  christos 
    372       1.1  christos 011111,5.RS,5.RT,5.RD,00000,011000:SPECIAL3:32::ADDUH.QB
    373       1.1  christos "adduh.qb r<RD>, r<RS>, r<RT>"
    374       1.1  christos *dsp2:
    375       1.1  christos {
    376       1.1  christos   do_uh_qb_op (SD_, RD, RS, RT, 0, 0);
    377       1.1  christos }
    378       1.1  christos 
    379       1.1  christos 011111,5.RS,5.RT,5.RD,00010,011000:SPECIAL3:32::ADDUH_R.QB
    380       1.1  christos "adduh_r.qb r<RD>, r<RS>, r<RT>"
    381       1.1  christos *dsp2:
    382       1.1  christos {
    383       1.1  christos   do_uh_qb_op (SD_, RD, RS, RT, 0, 1);
    384       1.1  christos }
    385       1.1  christos 
    386       1.1  christos 011111,5.RS,5.RT,5.SA,00000,110001:SPECIAL3:32::APPEND
    387       1.1  christos "append r<RT>, r<RS>, <SA>"
    388       1.1  christos *dsp2:
    389       1.1  christos {
    390   1.1.1.5  christos   do_append (SD_, RT, RS, SA);
    391       1.1  christos }
    392       1.1  christos 
    393       1.1  christos 011111,5.RS,5.RT,000,2.BP,10000,110001:SPECIAL3:32::BALIGN
    394       1.1  christos "balign r<RT>, r<RS>, <BP>"
    395       1.1  christos *dsp2:
    396       1.1  christos {
    397   1.1.1.5  christos   do_balign (SD_, RT, RS, BP);
    398       1.1  christos }
    399       1.1  christos 
    400       1.1  christos 011111,5.RS,5.RT,5.RD,11000,010001:SPECIAL3:32::CMPGDU.EQ.QB
    401       1.1  christos "cmpgdu.eq.qb r<RD>, r<RS>, r<RT>"
    402       1.1  christos *dsp2:
    403       1.1  christos {
    404       1.1  christos   do_qb_cmpgdu (SD_, RD, RS, RT, 0);
    405       1.1  christos }
    406       1.1  christos 
    407       1.1  christos 011111,5.RS,5.RT,5.RD,11001,010001:SPECIAL3:32::CMPGDU.LT.QB
    408       1.1  christos "cmpgdu.lt.qb r<RD>, r<RS>, r<RT>"
    409       1.1  christos *dsp2:
    410       1.1  christos {
    411       1.1  christos   do_qb_cmpgdu (SD_, RD, RS, RT, 1);
    412       1.1  christos }
    413       1.1  christos 
    414       1.1  christos 011111,5.RS,5.RT,5.RD,11010,010001:SPECIAL3:32::CMPGDU.LE.QB
    415       1.1  christos "cmpgdu.le.qb r<RD>, r<RS>, r<RT>"
    416       1.1  christos *dsp2:
    417       1.1  christos {
    418       1.1  christos   do_qb_cmpgdu (SD_, RD, RS, RT, 2);
    419       1.1  christos }
    420       1.1  christos 
    421       1.1  christos 011111,5.RS,5.RT,000,2.AC,00000,110000:SPECIAL3:32::DPA.W.PH
    422       1.1  christos "dpa.w.ph ac<AC>, r<RS>, r<RT>"
    423       1.1  christos *dsp2:
    424       1.1  christos {
    425       1.1  christos   do_w_ph_dot_product (SD_, AC, RS, RT, 0);
    426       1.1  christos }
    427       1.1  christos 
    428       1.1  christos 011111,5.RS,5.RT,000,2.AC,00001,110000:SPECIAL3:32::DPS.W.PH
    429       1.1  christos "dps.w.ph ac<AC>, r<RS>, r<RT>"
    430       1.1  christos *dsp2:
    431       1.1  christos {
    432       1.1  christos   do_w_ph_dot_product (SD_, AC, RS, RT, 1);
    433       1.1  christos }
    434       1.1  christos 
    435       1.1  christos 011111,5.RS,5.RT,5.RD,01100,011000:SPECIAL3:32::MUL.PH
    436       1.1  christos "mul.ph r<RD>, r<RS>, r<RT>"
    437       1.1  christos *dsp2:
    438       1.1  christos {
    439       1.1  christos   do_ph_op (SD_, RD, RS, RT, 2, 0);
    440       1.1  christos }
    441       1.1  christos 
    442       1.1  christos 011111,5.RS,5.RT,5.RD,01110,011000:SPECIAL3:32::MUL_S.PH
    443       1.1  christos "mul_s.ph r<RD>, r<RS>, r<RT>"
    444       1.1  christos *dsp2:
    445       1.1  christos {
    446       1.1  christos   do_ph_op (SD_, RD, RS, RT, 2, 1);
    447       1.1  christos }
    448       1.1  christos 
    449       1.1  christos 011111,5.RS,5.RT,5.RD,10111,011000:SPECIAL3:32::MULQ_RS.W
    450       1.1  christos "mulq_rs.w r<RD>, r<RS>, r<RT>"
    451       1.1  christos *dsp2:
    452       1.1  christos {
    453       1.1  christos   do_w_mulq (SD_, RD, RS, RT, 1);
    454       1.1  christos }
    455       1.1  christos 
    456       1.1  christos 011111,5.RS,5.RT,5.RD,11110,010000:SPECIAL3:32::MULQ_S.PH
    457       1.1  christos "mulq_s.ph r<RD>, r<RS>, r<RT>"
    458       1.1  christos *dsp2:
    459       1.1  christos {
    460       1.1  christos   do_ph_mulq (SD_, RD, RS, RT, 0);
    461       1.1  christos }
    462       1.1  christos 
    463       1.1  christos 011111,5.RS,5.RT,5.RD,10110,011000:SPECIAL3:32::MULQ_S.W
    464       1.1  christos "mulq_s.w r<RD>, r<RS>, r<RT>"
    465       1.1  christos *dsp2:
    466       1.1  christos {
    467       1.1  christos   do_w_mulq (SD_, RD, RS, RT, 0);
    468       1.1  christos }
    469       1.1  christos 
    470       1.1  christos 011111,5.RS,5.RT,000,2.AC,00010,110000:SPECIAL3:32::MULSA.W.PH
    471       1.1  christos "mulsa.w.ph ac<AC>, r<RS>, r<RT>"
    472       1.1  christos *dsp2:
    473       1.1  christos {
    474   1.1.1.5  christos   do_ph_w_mulsa (SD_, AC, RS, RT);
    475       1.1  christos }
    476       1.1  christos 
    477       1.1  christos 011111,5.RS,5.RT,5.RD,01101,010001:SPECIAL3:32::PRECR.QB.PH
    478       1.1  christos "precr.qb.ph r<RD>, r<RS>, r<RT>"
    479       1.1  christos *dsp2:
    480       1.1  christos {
    481   1.1.1.5  christos   do_ph_qb_precr (SD_, RD, RS, RT);
    482       1.1  christos }
    483       1.1  christos 
    484       1.1  christos 011111,5.RS,5.RT,5.SA,11110,010001:SPECIAL3:32::PRECR_SRA.PH.W
    485       1.1  christos "precr_sra.ph.w r<RT>, r<RS>, <SA>"
    486       1.1  christos *dsp2:
    487       1.1  christos {
    488       1.1  christos   do_precr_sra (SD_, RT, RS, SA, 0);
    489       1.1  christos }
    490       1.1  christos 
    491       1.1  christos 011111,5.RS,5.RT,5.SA,11111,010001:SPECIAL3:32::PRECR_SRA_R.PH.W
    492       1.1  christos "precr_sra_r.ph.w r<RT>, r<RS>, <SA>"
    493       1.1  christos *dsp2:
    494       1.1  christos {
    495       1.1  christos   do_precr_sra (SD_, RT, RS, SA, 1);
    496       1.1  christos }
    497       1.1  christos 
    498       1.1  christos 011111,5.RS,5.RT,5.SA,00001,110001:SPECIAL3:32::PREPEND
    499       1.1  christos "prepend r<RT>, r<RS>, <SA>"
    500       1.1  christos *dsp2:
    501       1.1  christos {
    502   1.1.1.5  christos   do_prepend (SD_, RT, RS, SA);
    503       1.1  christos }
    504       1.1  christos 
    505       1.1  christos 011111,00,3.SHIFT3,5.RT,5.RD,00100,010011:SPECIAL3:32::SHRA.QB
    506       1.1  christos "shra.qb r<RD>, r<RT>, <SHIFT3>"
    507       1.1  christos *dsp2:
    508       1.1  christos {
    509       1.1  christos   do_qb_shra (SD_, RD, RT, SHIFT3, 0);
    510       1.1  christos }
    511       1.1  christos 
    512       1.1  christos 011111,00,3.SHIFT3,5.RT,5.RD,00101,010011:SPECIAL3:32::SHRA_R.QB
    513       1.1  christos "shra_r.qb r<RD>, r<RT>, <SHIFT3>"
    514       1.1  christos *dsp2:
    515       1.1  christos {
    516       1.1  christos   do_qb_shra (SD_, RD, RT, SHIFT3, 1);
    517       1.1  christos }
    518       1.1  christos 
    519       1.1  christos 011111,5.RS,5.RT,5.RD,00110,010011:SPECIAL3:32::SHRAV.QB
    520       1.1  christos "shrav.qb r<RD>, r<RT>, r<RS>"
    521       1.1  christos *dsp2:
    522       1.1  christos {
    523   1.1.1.5  christos   do_qb_shrav (SD_, RD, RT, RS, 0);
    524       1.1  christos }
    525       1.1  christos 
    526       1.1  christos 011111,5.RS,5.RT,5.RD,00111,010011:SPECIAL3:32::SHRAV_R.QB
    527       1.1  christos "shrav_r.qb r<RD>, r<RT>, r<RS>"
    528       1.1  christos *dsp2:
    529       1.1  christos {
    530   1.1.1.5  christos   do_qb_shrav (SD_, RD, RT, RS, 1);
    531       1.1  christos }
    532       1.1  christos 
    533       1.1  christos 011111,0,4.SHIFT4,5.RT,5.RD,11001,010011:SPECIAL3:32::SHRL.PH
    534       1.1  christos "shrl.ph r<RD>, r<RT>, <SHIFT4>"
    535       1.1  christos *dsp2:
    536       1.1  christos {
    537       1.1  christos   do_ph_shrl (SD_, RD, RT, SHIFT4);
    538       1.1  christos }
    539       1.1  christos 
    540       1.1  christos 011111,5.RS,5.RT,5.RD,11011,010011:SPECIAL3:32::SHRLV.PH
    541       1.1  christos "shrlv.ph r<RD>, r<RT>, r<RS>"
    542       1.1  christos *dsp2:
    543       1.1  christos {
    544   1.1.1.5  christos   do_ph_shrlv (SD_, RD, RT, RS);
    545       1.1  christos }
    546       1.1  christos 
    547       1.1  christos 011111,5.RS,5.RT,5.RD,01001,010000:SPECIAL3:32::SUBU.PH
    548       1.1  christos "subu.ph r<RD>, r<RS>, r<RT>"
    549       1.1  christos *dsp2:
    550       1.1  christos {
    551       1.1  christos   do_u_ph_op (SD_, RD, RS, RT, 1, 0);
    552       1.1  christos }
    553       1.1  christos 
    554       1.1  christos 011111,5.RS,5.RT,5.RD,01101,010000:SPECIAL3:32::SUBU_S.PH
    555       1.1  christos "subu_s.ph r<RD>, r<RS>, r<RT>"
    556       1.1  christos *dsp2:
    557       1.1  christos {
    558       1.1  christos   do_u_ph_op (SD_, RD, RS, RT, 1, 1);
    559       1.1  christos }
    560       1.1  christos 
    561       1.1  christos 011111,5.RS,5.RT,5.RD,00001,011000:SPECIAL3:32::SUBUH.QB
    562       1.1  christos "subuh.qb r<RD>, r<RS>, r<RT>"
    563       1.1  christos *dsp2:
    564       1.1  christos {
    565       1.1  christos   do_uh_qb_op (SD_, RD, RS, RT, 1, 0);
    566       1.1  christos }
    567       1.1  christos 
    568       1.1  christos 011111,5.RS,5.RT,5.RD,00011,011000:SPECIAL3:32::SUBUH_R.QB
    569       1.1  christos "subuh_r.qb r<RD>, r<RS>, r<RT>"
    570       1.1  christos *dsp2:
    571       1.1  christos {
    572       1.1  christos   do_uh_qb_op (SD_, RD, RS, RT, 1, 1);
    573       1.1  christos }
    574       1.1  christos 
    575       1.1  christos 011111,5.RS,5.RT,5.RD,01000,011000:SPECIAL3:32::ADDQH.PH
    576       1.1  christos "addqh.ph r<RD>, r<RS>, r<RT>"
    577       1.1  christos *dsp2:
    578       1.1  christos {
    579       1.1  christos   do_qh_ph_op (SD_, RD, RS, RT, 0, 0);
    580       1.1  christos }
    581       1.1  christos 
    582       1.1  christos 011111,5.RS,5.RT,5.RD,01010,011000:SPECIAL3:32::ADDQH_R.PH
    583       1.1  christos "addqh_r.ph r<RD>, r<RS>, r<RT>"
    584       1.1  christos *dsp2:
    585       1.1  christos {
    586       1.1  christos   do_qh_ph_op (SD_, RD, RS, RT, 0, 1);
    587       1.1  christos }
    588       1.1  christos 
    589       1.1  christos 011111,5.RS,5.RT,5.RD,10000,011000:SPECIAL3:32::ADDQH.W
    590       1.1  christos "addqh.w r<RD>, r<RS>, r<RT>"
    591       1.1  christos *dsp2:
    592       1.1  christos {
    593       1.1  christos   do_qh_w_op (SD_, RD, RS, RT, 0, 0);
    594       1.1  christos }
    595       1.1  christos 
    596       1.1  christos 011111,5.RS,5.RT,5.RD,10010,011000:SPECIAL3:32::ADDQH_R.W
    597       1.1  christos "addqh_r.w r<RD>, r<RS>, r<RT>"
    598       1.1  christos *dsp2:
    599       1.1  christos {
    600       1.1  christos   do_qh_w_op (SD_, RD, RS, RT, 0, 1);
    601       1.1  christos }
    602       1.1  christos 
    603       1.1  christos 011111,5.RS,5.RT,5.RD,01001,011000:SPECIAL3:32::SUBQH.PH
    604       1.1  christos "subqh.ph r<RD>, r<RS>, r<RT>"
    605       1.1  christos *dsp2:
    606       1.1  christos {
    607       1.1  christos   do_qh_ph_op (SD_, RD, RS, RT, 1, 0);
    608       1.1  christos }
    609       1.1  christos 
    610       1.1  christos 011111,5.RS,5.RT,5.RD,01011,011000:SPECIAL3:32::SUBQH_R.PH
    611       1.1  christos "subqh_r.ph r<RD>, r<RS>, r<RT>"
    612       1.1  christos *dsp2:
    613       1.1  christos {
    614       1.1  christos   do_qh_ph_op (SD_, RD, RS, RT, 1, 1);
    615       1.1  christos }
    616       1.1  christos 
    617       1.1  christos 011111,5.RS,5.RT,5.RD,10001,011000:SPECIAL3:32::SUBQH.W
    618       1.1  christos "subqh.w r<RD>, r<RS>, r<RT>"
    619       1.1  christos *dsp2:
    620       1.1  christos {
    621       1.1  christos   do_qh_w_op (SD_, RD, RS, RT, 1, 0);
    622       1.1  christos }
    623       1.1  christos 
    624       1.1  christos 011111,5.RS,5.RT,5.RD,10011,011000:SPECIAL3:32::SUBQH_R.W
    625       1.1  christos "subqh_r.w r<RD>, r<RS>, r<RT>"
    626       1.1  christos *dsp2:
    627       1.1  christos {
    628       1.1  christos   do_qh_w_op (SD_, RD, RS, RT, 1, 1);
    629       1.1  christos }
    630       1.1  christos 
    631       1.1  christos 011111,5.RS,5.RT,000,2.AC,01000,110000:SPECIAL3:32::DPAX.W.PH
    632       1.1  christos "dpax.w.ph ac<AC>, r<RS>, r<RT>"
    633       1.1  christos *dsp2:
    634       1.1  christos {
    635       1.1  christos   do_x_w_ph_dot_product (SD_, AC, RS, RT, 0);
    636       1.1  christos }
    637       1.1  christos 
    638       1.1  christos 011111,5.RS,5.RT,000,2.AC,01001,110000:SPECIAL3:32::DPSX.W.PH
    639       1.1  christos "dpsx.w.ph ac<AC>, r<RS>, r<RT>"
    640       1.1  christos *dsp2:
    641       1.1  christos {
    642       1.1  christos   do_x_w_ph_dot_product (SD_, AC, RS, RT, 1);
    643       1.1  christos }
    644       1.1  christos 
    645       1.1  christos 011111,5.RS,5.RT,000,2.AC,11000,110000:SPECIAL3:32::DPAQX_S.W.PH
    646       1.1  christos "dpaqx_s.w.ph ac<AC>, r<RS>, r<RT>"
    647       1.1  christos *dsp2:
    648       1.1  christos {
    649       1.1  christos   do_qx_w_ph_dot_product (SD_, AC, RS, RT, 0, 0);
    650       1.1  christos }
    651       1.1  christos 
    652       1.1  christos 011111,5.RS,5.RT,000,2.AC,11010,110000:SPECIAL3:32::DPAQX_SA.W.PH
    653       1.1  christos "dpaqx_sa.w.ph ac<AC>, r<RS>, r<RT>"
    654       1.1  christos *dsp2:
    655       1.1  christos {
    656       1.1  christos   do_qx_w_ph_dot_product (SD_, AC, RS, RT, 0, 1);
    657       1.1  christos }
    658       1.1  christos 
    659       1.1  christos 011111,5.RS,5.RT,000,2.AC,11001,110000:SPECIAL3:32::DPSQX_S.W.PH
    660       1.1  christos "dpsqx_s.w.ph ac<AC>, r<RS>, r<RT>"
    661       1.1  christos *dsp2:
    662       1.1  christos {
    663       1.1  christos   do_qx_w_ph_dot_product (SD_, AC, RS, RT, 1, 0);
    664       1.1  christos }
    665       1.1  christos 
    666       1.1  christos 011111,5.RS,5.RT,000,2.AC,11011,110000:SPECIAL3:32::DPSQX_SA.W.PH
    667       1.1  christos "dpsqx_sa.w.ph ac<AC>, r<RS>, r<RT>"
    668       1.1  christos *dsp2:
    669       1.1  christos {
    670       1.1  christos   do_qx_w_ph_dot_product (SD_, AC, RS, RT, 1, 1);
    671       1.1  christos }
    672