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