1 1.1 christos // -*- C -*- 2 1.1 christos // 3 1.1 christos // <insn> ::= 4 1.1 christos // <insn-word> { "+" <insn-word> } 5 1.1 christos // ":" <format-name> 6 1.1 christos // ":" <filter-flags> 7 1.1 christos // ":" <options> 8 1.1 christos // ":" <name> 9 1.1 christos // <nl> 10 1.1 christos // { <insn-model> } 11 1.1 christos // { <insn-mnemonic> } 12 1.1 christos // <code-block> 13 1.1 christos // 14 1.1 christos 15 1.1 christos 16 1.1 christos // IGEN config - mips16 17 1.1 christos // :option:16::insn-bit-size:16 18 1.1 christos // :option:16::hi-bit-nr:15 19 1.1 christos :option:16::insn-specifying-widths:true 20 1.1 christos :option:16::gen-delayed-branch:false 21 1.1 christos 22 1.1 christos // IGEN config - mips32/64.. 23 1.1 christos // :option:32::insn-bit-size:32 24 1.1 christos // :option:32::hi-bit-nr:31 25 1.1 christos :option:32::insn-specifying-widths:true 26 1.1 christos :option:32::gen-delayed-branch:false 27 1.1 christos 28 1.1 christos 29 1.1 christos // Generate separate simulators for each target 30 1.1 christos // :option:::multi-sim:true 31 1.1 christos 32 1.1 christos 33 1.1 christos // Models known by this simulator are defined below. 34 1.1 christos // 35 1.1 christos // When placing models in the instruction descriptions, please place 36 1.1 christos // them one per line, in the order given here. 37 1.1 christos 38 1.1 christos // MIPS ISAs: 39 1.1 christos // 40 1.1 christos // Instructions and related functions for these models are included in 41 1.1 christos // this file. 42 1.1 christos :model:::mipsI:mips3000: 43 1.1 christos :model:::mipsII:mips6000: 44 1.1 christos :model:::mipsIII:mips4000: 45 1.1 christos :model:::mipsIV:mips8000: 46 1.1 christos :model:::mipsV:mipsisaV: 47 1.1 christos :model:::mips32:mipsisa32: 48 1.1 christos :model:::mips32r2:mipsisa32r2: 49 1.1.1.4 christos :model:::mips32r6:mipsisa32r6: 50 1.1 christos :model:::mips64:mipsisa64: 51 1.1 christos :model:::mips64r2:mipsisa64r2: 52 1.1.1.4 christos :model:::mips64r6:mipsisa64r6: 53 1.1 christos 54 1.1 christos // Vendor ISAs: 55 1.1 christos // 56 1.1 christos // Standard MIPS ISA instructions used for these models are listed here, 57 1.1 christos // as are functions needed by those standard instructions. Instructions 58 1.1 christos // which are model-dependent and which are not in the standard MIPS ISAs 59 1.1 christos // (or which pre-date or use different encodings than the standard 60 1.1 christos // instructions) are (for the most part) in separate .igen files. 61 1.1 christos :model:::vr4100:mips4100: // vr.igen 62 1.1 christos :model:::vr4120:mips4120: 63 1.1 christos :model:::vr5000:mips5000: 64 1.1 christos :model:::vr5400:mips5400: 65 1.1 christos :model:::vr5500:mips5500: 66 1.1 christos :model:::r3900:mips3900: // tx.igen 67 1.1 christos 68 1.1 christos // MIPS Application Specific Extensions (ASEs) 69 1.1 christos // 70 1.1 christos // Instructions for the ASEs are in separate .igen files. 71 1.1 christos // ASEs add instructions on to a base ISA. 72 1.1 christos :model:::mips16:mips16: // m16.igen (and m16.dc) 73 1.1 christos :model:::mips16e:mips16e: // m16e.igen 74 1.1 christos :model:::mips3d:mips3d: // mips3d.igen 75 1.1 christos :model:::mdmx:mdmx: // mdmx.igen 76 1.1 christos :model:::dsp:dsp: // dsp.igen 77 1.1 christos :model:::dsp2:dsp2: // dsp2.igen 78 1.1 christos :model:::smartmips:smartmips: // smartmips.igen 79 1.1.1.2 christos :model:::micromips32:micromips64: // micromips.igen 80 1.1.1.2 christos :model:::micromips64:micromips64: // micromips.igen 81 1.1.1.2 christos :model:::micromipsdsp:micromipsdsp: // micromipsdsp.igen 82 1.1 christos 83 1.1 christos // Vendor Extensions 84 1.1 christos // 85 1.1 christos // Instructions specific to these extensions are in separate .igen files. 86 1.1 christos // Extensions add instructions on to a base ISA. 87 1.1 christos :model:::sb1:sb1: // sb1.igen 88 1.1 christos 89 1.1 christos 90 1.1 christos // Pseudo instructions known by IGEN 91 1.1 christos :internal::::illegal: 92 1.1 christos { 93 1.1 christos SignalException (ReservedInstruction, 0); 94 1.1 christos } 95 1.1 christos 96 1.1 christos 97 1.1 christos // Pseudo instructions known by interp.c 98 1.1 christos // For grep - RSVD_INSTRUCTION, RSVD_INSTRUCTION_MASK 99 1.1.1.2 christos 000000,5.*,5.*,5.*,5.OP,111001:SPECIAL:32::RSVD 100 1.1 christos "rsvd <OP>" 101 1.1 christos { 102 1.1 christos SignalException (ReservedInstruction, instruction_0); 103 1.1 christos } 104 1.1 christos 105 1.1 christos 106 1.1 christos 107 1.1.1.4 christos // Helpers: 108 1.1.1.4 christos // 109 1.1.1.4 christos // Check if given instruction is CTI, if so signal 110 1.1.1.4 christos // 111 1.1.1.4 christos :function:::void:signal_if_cti:instruction_word instr 112 1.1.1.4 christos { 113 1.1.1.4 christos uint32_t maj = (instr & 0xfc000000) >> 26; 114 1.1.1.4 christos uint32_t special = instr & 0x3f; 115 1.1.1.4 christos if ((maj & 0x3e) == 0x06 /* Branch/Jump */ 116 1.1.1.4 christos || ((maj & 0x38) == 0 && !((maj & 0x6) == 0)) 117 1.1.1.4 christos || maj == 0x18 118 1.1.1.4 christos || (maj & 0x37) == 0x32 119 1.1.1.4 christos || (maj & 0x37) == 0x36 120 1.1.1.4 christos || ((maj == 0) && (special == 0x9)) 121 1.1.1.4 christos /* DERET/ERET/WAIT */ 122 1.1.1.4 christos || ((maj == 0x10) && (instr & 0x02000000) 123 1.1.1.4 christos && (special == 0x1f || special == 0x18 || special == 0x20))) 124 1.1.1.4 christos { 125 1.1.1.4 christos SignalException (ReservedInstruction, instr); 126 1.1.1.4 christos } 127 1.1.1.4 christos } 128 1.1.1.4 christos 129 1.1 christos // 130 1.1 christos // Simulate a 32 bit delayslot instruction 131 1.1 christos // 132 1.1 christos 133 1.1 christos :function:::address_word:delayslot32:address_word target 134 1.1 christos { 135 1.1 christos instruction_word delay_insn; 136 1.1 christos sim_events_slip (SD, 1); 137 1.1 christos DSPC = CIA; 138 1.1 christos CIA = CIA + 4; /* NOTE not mips16 */ 139 1.1 christos STATE |= simDELAYSLOT; 140 1.1 christos delay_insn = IMEM32 (CIA); /* NOTE not mips16 */ 141 1.1.1.4 christos signal_if_cti (SD_, delay_insn); 142 1.1 christos ENGINE_ISSUE_PREFIX_HOOK(); 143 1.1 christos idecode_issue (CPU_, delay_insn, (CIA)); 144 1.1 christos STATE &= ~simDELAYSLOT; 145 1.1 christos return target; 146 1.1 christos } 147 1.1 christos 148 1.1.1.4 christos // 149 1.1.1.4 christos // Simulate a 32 bit forbidden slot instruction 150 1.1.1.4 christos // 151 1.1.1.4 christos 152 1.1.1.4 christos :function:::address_word:forbiddenslot32: 153 1.1.1.4 christos *mips32r6: 154 1.1.1.4 christos *mips64r6: 155 1.1.1.4 christos { 156 1.1.1.4 christos instruction_word delay_insn; 157 1.1.1.4 christos sim_events_slip (SD, 1); 158 1.1.1.4 christos DSPC = CIA; 159 1.1.1.4 christos CIA = CIA + 4; 160 1.1.1.4 christos STATE |= simFORBIDDENSLOT; 161 1.1.1.4 christos delay_insn = IMEM32 (CIA); 162 1.1.1.4 christos signal_if_cti (SD_, delay_insn); 163 1.1.1.4 christos ENGINE_ISSUE_PREFIX_HOOK (); 164 1.1.1.4 christos idecode_issue (CPU_, delay_insn, (CIA)); 165 1.1.1.4 christos STATE &= ~simFORBIDDENSLOT; 166 1.1.1.4 christos return CIA + 4; 167 1.1.1.4 christos } 168 1.1.1.4 christos 169 1.1 christos :function:::address_word:nullify_next_insn32: 170 1.1 christos { 171 1.1 christos sim_events_slip (SD, 1); 172 1.1 christos dotrace (SD, CPU, tracefh, 2, CIA + 4, 4, "load instruction"); 173 1.1 christos return CIA + 8; 174 1.1 christos } 175 1.1 christos 176 1.1 christos 177 1.1 christos // Helper: 178 1.1 christos // 179 1.1 christos // Calculate an effective address given a base and an offset. 180 1.1 christos // 181 1.1 christos 182 1.1 christos :function:::address_word:loadstore_ea:address_word base, address_word offset 183 1.1 christos *mipsI: 184 1.1 christos *mipsII: 185 1.1 christos *mipsIII: 186 1.1 christos *mipsIV: 187 1.1 christos *mipsV: 188 1.1 christos *mips32: 189 1.1 christos *mips32r2: 190 1.1.1.4 christos *mips32r6: 191 1.1 christos *vr4100: 192 1.1 christos *vr5000: 193 1.1 christos *r3900: 194 1.1.1.2 christos *micromips32: 195 1.1 christos { 196 1.1 christos return base + offset; 197 1.1 christos } 198 1.1 christos 199 1.1 christos :function:::address_word:loadstore_ea:address_word base, address_word offset 200 1.1 christos *mips64: 201 1.1 christos *mips64r2: 202 1.1.1.2 christos *micromips64: 203 1.1.1.4 christos *mips64r6: 204 1.1 christos { 205 1.1 christos #if 0 /* XXX FIXME: enable this only after some additional testing. */ 206 1.1 christos /* If in user mode and UX is not set, use 32-bit compatibility effective 207 1.1 christos address computations as defined in the MIPS64 Architecture for 208 1.1 christos Programmers Volume III, Revision 0.95, section 4.9. */ 209 1.1 christos if ((SR & (status_KSU_mask|status_EXL|status_ERL|status_UX)) 210 1.1 christos == (ksu_user << status_KSU_shift)) 211 1.1.1.4 christos return (address_word)((int32_t)base + (int32_t)offset); 212 1.1 christos #endif 213 1.1 christos return base + offset; 214 1.1 christos } 215 1.1 christos 216 1.1 christos 217 1.1 christos // Helper: 218 1.1 christos // 219 1.1 christos // Check that a 32-bit register value is properly sign-extended. 220 1.1 christos // (See NotWordValue in ISA spec.) 221 1.1 christos // 222 1.1 christos 223 1.1 christos :function:::int:not_word_value:unsigned_word value 224 1.1 christos *mipsI: 225 1.1 christos *mipsII: 226 1.1 christos *mipsIII: 227 1.1 christos *mipsIV: 228 1.1 christos *mipsV: 229 1.1 christos *vr4100: 230 1.1 christos *vr5000: 231 1.1 christos *r3900: 232 1.1 christos *mips32: 233 1.1 christos *mips32r2: 234 1.1.1.4 christos *mips32r6: 235 1.1 christos *mips64: 236 1.1 christos *mips64r2: 237 1.1.1.2 christos *micromips32: 238 1.1.1.2 christos *micromips64: 239 1.1.1.4 christos *mips64r6: 240 1.1 christos { 241 1.1 christos #if WITH_TARGET_WORD_BITSIZE == 64 242 1.1 christos return value != (((value & 0xffffffff) ^ 0x80000000) - 0x80000000); 243 1.1 christos #else 244 1.1 christos return 0; 245 1.1 christos #endif 246 1.1 christos } 247 1.1 christos 248 1.1 christos // Helper: 249 1.1 christos // 250 1.1 christos // Handle UNPREDICTABLE operation behaviour. The goal here is to prevent 251 1.1 christos // theoretically portable code which invokes non-portable behaviour from 252 1.1 christos // running with no indication of the portability issue. 253 1.1 christos // (See definition of UNPREDICTABLE in ISA spec.) 254 1.1 christos // 255 1.1 christos 256 1.1 christos :function:::void:unpredictable: 257 1.1 christos *mipsI: 258 1.1 christos *mipsII: 259 1.1 christos *mipsIII: 260 1.1 christos *mipsIV: 261 1.1 christos *mipsV: 262 1.1 christos *vr4100: 263 1.1 christos *vr5000: 264 1.1 christos *r3900: 265 1.1 christos { 266 1.1 christos } 267 1.1 christos 268 1.1 christos :function:::void:unpredictable: 269 1.1 christos *mips32: 270 1.1 christos *mips32r2: 271 1.1.1.4 christos *mips32r6: 272 1.1 christos *mips64: 273 1.1 christos *mips64r2: 274 1.1.1.2 christos *micromips32: 275 1.1.1.2 christos *micromips64: 276 1.1.1.4 christos *mips64r6: 277 1.1 christos { 278 1.1 christos unpredictable_action (CPU, CIA); 279 1.1 christos } 280 1.1 christos 281 1.1 christos 282 1.1 christos // Helpers: 283 1.1 christos // 284 1.1 christos // Check that an access to a HI/LO register meets timing requirements 285 1.1 christos // 286 1.1 christos // In all MIPS ISAs, 287 1.1 christos // 288 1.1 christos // OP {HI and LO} followed by MT{LO or HI} (and not MT{HI or LO}) 289 1.1 christos // makes subsequent MF{HI or LO} UNPREDICTABLE. (1) 290 1.1 christos // 291 1.1 christos // The following restrictions exist for MIPS I - MIPS III: 292 1.1 christos // 293 1.1 christos // MF{HI or LO} followed by MT{HI or LO} w/ less than 2 instructions 294 1.1 christos // in between makes MF UNPREDICTABLE. (2) 295 1.1 christos // 296 1.1 christos // MF{HI or LO} followed by OP {HI and LO} w/ less than 2 instructions 297 1.1 christos // in between makes MF UNPREDICTABLE. (3) 298 1.1 christos // 299 1.1 christos // On the r3900, restriction (2) is not present, and restriction (3) is not 300 1.1 christos // present for multiplication. 301 1.1 christos // 302 1.1 christos // Unfortunately, there seems to be some confusion about whether the last 303 1.1 christos // two restrictions should apply to "MIPS IV" as well. One edition of 304 1.1 christos // the MIPS IV ISA says they do, but references in later ISA documents 305 1.1 christos // suggest they don't. 306 1.1 christos // 307 1.1 christos // In reality, some MIPS IV parts, such as the VR5000 and VR5400, do have 308 1.1.1.6 christos // these restrictions, while others, like the VR5500, don't. To accommodate 309 1.1 christos // such differences, the MIPS IV and MIPS V version of these helper functions 310 1.1.1.6 christos // use auxiliary routines to determine whether the restriction applies. 311 1.1 christos 312 1.1 christos // check_mf_cycles: 313 1.1 christos // 314 1.1 christos // Helper used by check_mt_hilo, check_mult_hilo, and check_div_hilo 315 1.1 christos // to check for restrictions (2) and (3) above. 316 1.1 christos // 317 1.1.1.4 christos :function:::int:check_mf_cycles:hilo_history *history, int64_t time, const char *new 318 1.1 christos { 319 1.1 christos if (history->mf.timestamp + 3 > time) 320 1.1 christos { 321 1.1 christos sim_engine_abort (SD, CPU, CIA, "HILO: %s: %s at 0x%08lx too close to MF at 0x%08lx\n", 322 1.1 christos itable[MY_INDEX].name, 323 1.1 christos new, (long) CIA, 324 1.1 christos (long) history->mf.cia); 325 1.1 christos return 0; 326 1.1 christos } 327 1.1 christos return 1; 328 1.1 christos } 329 1.1 christos 330 1.1 christos 331 1.1 christos // check_mt_hilo: 332 1.1 christos // 333 1.1 christos // Check for restriction (2) above (for ISAs/processors that have it), 334 1.1 christos // and record timestamps for restriction (1) above. 335 1.1 christos // 336 1.1 christos :function:::int:check_mt_hilo:hilo_history *history 337 1.1 christos *mipsI: 338 1.1 christos *mipsII: 339 1.1 christos *mipsIII: 340 1.1 christos *vr4100: 341 1.1 christos *vr5000: 342 1.1 christos { 343 1.1.1.4 christos int64_t time = sim_events_time (SD); 344 1.1 christos int ok = check_mf_cycles (SD_, history, time, "MT"); 345 1.1 christos history->mt.timestamp = time; 346 1.1 christos history->mt.cia = CIA; 347 1.1 christos return ok; 348 1.1 christos } 349 1.1 christos 350 1.1 christos :function:::int:check_mt_hilo:hilo_history *history 351 1.1 christos *mipsIV: 352 1.1 christos *mipsV: 353 1.1 christos { 354 1.1.1.4 christos int64_t time = sim_events_time (SD); 355 1.1 christos int ok = (! MIPS_MACH_HAS_MT_HILO_HAZARD (SD) 356 1.1 christos || check_mf_cycles (SD_, history, time, "MT")); 357 1.1 christos history->mt.timestamp = time; 358 1.1 christos history->mt.cia = CIA; 359 1.1 christos return ok; 360 1.1 christos } 361 1.1 christos 362 1.1 christos :function:::int:check_mt_hilo:hilo_history *history 363 1.1 christos *mips32: 364 1.1 christos *mips32r2: 365 1.1.1.4 christos *mips32r6: 366 1.1 christos *mips64: 367 1.1 christos *mips64r2: 368 1.1.1.4 christos *mips64r6: 369 1.1 christos *r3900: 370 1.1.1.2 christos *micromips32: 371 1.1.1.2 christos *micromips64: 372 1.1 christos { 373 1.1.1.4 christos int64_t time = sim_events_time (SD); 374 1.1 christos history->mt.timestamp = time; 375 1.1 christos history->mt.cia = CIA; 376 1.1 christos return 1; 377 1.1 christos } 378 1.1 christos 379 1.1 christos 380 1.1 christos // check_mf_hilo: 381 1.1 christos // 382 1.1 christos // Check for restriction (1) above, and record timestamps for 383 1.1 christos // restriction (2) and (3) above. 384 1.1 christos // 385 1.1 christos :function:::int:check_mf_hilo:hilo_history *history, hilo_history *peer 386 1.1 christos *mipsI: 387 1.1 christos *mipsII: 388 1.1 christos *mipsIII: 389 1.1 christos *mipsIV: 390 1.1 christos *mipsV: 391 1.1 christos *mips32: 392 1.1 christos *mips32r2: 393 1.1.1.4 christos *mips32r6: 394 1.1 christos *mips64: 395 1.1 christos *mips64r2: 396 1.1.1.4 christos *mips64r6: 397 1.1 christos *vr4100: 398 1.1 christos *vr5000: 399 1.1 christos *r3900: 400 1.1.1.2 christos *micromips32: 401 1.1.1.2 christos *micromips64: 402 1.1 christos { 403 1.1.1.4 christos int64_t time = sim_events_time (SD); 404 1.1 christos int ok = 1; 405 1.1 christos if (peer != NULL 406 1.1 christos && peer->mt.timestamp > history->op.timestamp 407 1.1 christos && history->mt.timestamp < history->op.timestamp 408 1.1 christos && ! (history->mf.timestamp > history->op.timestamp 409 1.1 christos && history->mf.timestamp < peer->mt.timestamp) 410 1.1 christos && ! (peer->mf.timestamp > history->op.timestamp 411 1.1 christos && peer->mf.timestamp < peer->mt.timestamp)) 412 1.1 christos { 413 1.1 christos /* The peer has been written to since the last OP yet we have 414 1.1 christos not */ 415 1.1 christos sim_engine_abort (SD, CPU, CIA, "HILO: %s: MF at 0x%08lx following OP at 0x%08lx corrupted by MT at 0x%08lx\n", 416 1.1 christos itable[MY_INDEX].name, 417 1.1 christos (long) CIA, 418 1.1 christos (long) history->op.cia, 419 1.1 christos (long) peer->mt.cia); 420 1.1 christos ok = 0; 421 1.1 christos } 422 1.1 christos history->mf.timestamp = time; 423 1.1 christos history->mf.cia = CIA; 424 1.1 christos return ok; 425 1.1 christos } 426 1.1 christos 427 1.1 christos 428 1.1 christos 429 1.1 christos // check_mult_hilo: 430 1.1 christos // 431 1.1 christos // Check for restriction (3) above (for ISAs/processors that have it) 432 1.1 christos // for MULT ops, and record timestamps for restriction (1) above. 433 1.1 christos // 434 1.1 christos :function:::int:check_mult_hilo:hilo_history *hi, hilo_history *lo 435 1.1 christos *mipsI: 436 1.1 christos *mipsII: 437 1.1 christos *mipsIII: 438 1.1 christos *vr4100: 439 1.1 christos *vr5000: 440 1.1 christos { 441 1.1.1.4 christos int64_t time = sim_events_time (SD); 442 1.1 christos int ok = (check_mf_cycles (SD_, hi, time, "OP") 443 1.1 christos && check_mf_cycles (SD_, lo, time, "OP")); 444 1.1 christos hi->op.timestamp = time; 445 1.1 christos lo->op.timestamp = time; 446 1.1 christos hi->op.cia = CIA; 447 1.1 christos lo->op.cia = CIA; 448 1.1 christos return ok; 449 1.1 christos } 450 1.1 christos 451 1.1 christos :function:::int:check_mult_hilo:hilo_history *hi, hilo_history *lo 452 1.1 christos *mipsIV: 453 1.1 christos *mipsV: 454 1.1 christos { 455 1.1.1.4 christos int64_t time = sim_events_time (SD); 456 1.1 christos int ok = (! MIPS_MACH_HAS_MULT_HILO_HAZARD (SD) 457 1.1 christos || (check_mf_cycles (SD_, hi, time, "OP") 458 1.1 christos && check_mf_cycles (SD_, lo, time, "OP"))); 459 1.1 christos hi->op.timestamp = time; 460 1.1 christos lo->op.timestamp = time; 461 1.1 christos hi->op.cia = CIA; 462 1.1 christos lo->op.cia = CIA; 463 1.1 christos return ok; 464 1.1 christos } 465 1.1 christos 466 1.1 christos :function:::int:check_mult_hilo:hilo_history *hi, hilo_history *lo 467 1.1 christos *mips32: 468 1.1 christos *mips32r2: 469 1.1.1.4 christos *mips32r6: 470 1.1 christos *mips64: 471 1.1 christos *mips64r2: 472 1.1.1.4 christos *mips64r6: 473 1.1 christos *r3900: 474 1.1.1.2 christos *micromips32: 475 1.1.1.2 christos *micromips64: 476 1.1 christos { 477 1.1.1.6 christos /* FIXME: could record the fact that a stall occurred if we want */ 478 1.1.1.4 christos int64_t time = sim_events_time (SD); 479 1.1 christos hi->op.timestamp = time; 480 1.1 christos lo->op.timestamp = time; 481 1.1 christos hi->op.cia = CIA; 482 1.1 christos lo->op.cia = CIA; 483 1.1 christos return 1; 484 1.1 christos } 485 1.1 christos 486 1.1 christos 487 1.1 christos // check_div_hilo: 488 1.1 christos // 489 1.1 christos // Check for restriction (3) above (for ISAs/processors that have it) 490 1.1 christos // for DIV ops, and record timestamps for restriction (1) above. 491 1.1 christos // 492 1.1 christos :function:::int:check_div_hilo:hilo_history *hi, hilo_history *lo 493 1.1 christos *mipsI: 494 1.1 christos *mipsII: 495 1.1 christos *mipsIII: 496 1.1 christos *vr4100: 497 1.1 christos *vr5000: 498 1.1 christos *r3900: 499 1.1 christos { 500 1.1.1.4 christos int64_t time = sim_events_time (SD); 501 1.1 christos int ok = (check_mf_cycles (SD_, hi, time, "OP") 502 1.1 christos && check_mf_cycles (SD_, lo, time, "OP")); 503 1.1 christos hi->op.timestamp = time; 504 1.1 christos lo->op.timestamp = time; 505 1.1 christos hi->op.cia = CIA; 506 1.1 christos lo->op.cia = CIA; 507 1.1 christos return ok; 508 1.1 christos } 509 1.1 christos 510 1.1 christos :function:::int:check_div_hilo:hilo_history *hi, hilo_history *lo 511 1.1 christos *mipsIV: 512 1.1 christos *mipsV: 513 1.1 christos { 514 1.1.1.4 christos int64_t time = sim_events_time (SD); 515 1.1 christos int ok = (! MIPS_MACH_HAS_DIV_HILO_HAZARD (SD) 516 1.1 christos || (check_mf_cycles (SD_, hi, time, "OP") 517 1.1 christos && check_mf_cycles (SD_, lo, time, "OP"))); 518 1.1 christos hi->op.timestamp = time; 519 1.1 christos lo->op.timestamp = time; 520 1.1 christos hi->op.cia = CIA; 521 1.1 christos lo->op.cia = CIA; 522 1.1 christos return ok; 523 1.1 christos } 524 1.1 christos 525 1.1 christos :function:::int:check_div_hilo:hilo_history *hi, hilo_history *lo 526 1.1 christos *mips32: 527 1.1 christos *mips32r2: 528 1.1.1.4 christos *mips32r6: 529 1.1 christos *mips64: 530 1.1 christos *mips64r2: 531 1.1.1.2 christos *micromips32: 532 1.1.1.2 christos *micromips64: 533 1.1.1.4 christos *mips64r6: 534 1.1 christos { 535 1.1.1.4 christos int64_t time = sim_events_time (SD); 536 1.1 christos hi->op.timestamp = time; 537 1.1 christos lo->op.timestamp = time; 538 1.1 christos hi->op.cia = CIA; 539 1.1 christos lo->op.cia = CIA; 540 1.1 christos return 1; 541 1.1 christos } 542 1.1 christos 543 1.1 christos 544 1.1 christos // Helper: 545 1.1 christos // 546 1.1 christos // Check that the 64-bit instruction can currently be used, and signal 547 1.1 christos // a ReservedInstruction exception if not. 548 1.1 christos // 549 1.1 christos 550 1.1 christos :function:::void:check_u64:instruction_word insn 551 1.1 christos *mipsIII: 552 1.1 christos *mipsIV: 553 1.1 christos *mipsV: 554 1.1 christos *vr4100: 555 1.1 christos *vr5000: 556 1.1 christos *vr5400: 557 1.1 christos *vr5500: 558 1.1.1.3 christos *r3900: 559 1.1 christos { 560 1.1 christos // The check should be similar to mips64 for any with PX/UX bit equivalents. 561 1.1 christos } 562 1.1 christos 563 1.1 christos :function:::void:check_u64:instruction_word insn 564 1.1 christos *mips16e: 565 1.1 christos *mips64: 566 1.1 christos *mips64r2: 567 1.1.1.2 christos *mips32: 568 1.1.1.2 christos *mips32r2: 569 1.1.1.4 christos *mips32r6: 570 1.1.1.2 christos *micromips64: 571 1.1.1.2 christos *micromips32: 572 1.1.1.4 christos *mips64r6: 573 1.1.1.2 christos { 574 1.1.1.2 christos #if 0 /* XXX FIXME: enable this only after some additional testing. */ 575 1.1.1.2 christos if (UserMode && (SR & (status_UX|status_PX)) == 0) 576 1.1.1.2 christos SignalException (ReservedInstruction, insn); 577 1.1.1.2 christos #endif 578 1.1.1.2 christos } 579 1.1.1.2 christos 580 1.1.1.2 christos 581 1.1.1.2 christos 582 1.1.1.2 christos // 583 1.1.1.2 christos // MIPS Architecture: 584 1.1.1.2 christos // 585 1.1.1.2 christos // CPU Instruction Set (mipsI - mipsV, mips32/r2, mips64/r2) 586 1.1.1.2 christos // 587 1.1.1.2 christos 588 1.1.1.2 christos 589 1.1.1.2 christos :function:::void:do_add:int rs, int rt, int rd 590 1.1.1.2 christos { 591 1.1.1.2 christos if (NotWordValue (GPR[rs]) || NotWordValue (GPR[rt])) 592 1.1.1.2 christos Unpredictable (); 593 1.1.1.2 christos TRACE_ALU_INPUT2 (GPR[rs], GPR[rt]); 594 1.1.1.2 christos { 595 1.1.1.2 christos ALU32_BEGIN (GPR[rs]); 596 1.1.1.2 christos ALU32_ADD (GPR[rt]); 597 1.1.1.2 christos ALU32_END (GPR[rd]); /* This checks for overflow. */ 598 1.1.1.2 christos } 599 1.1.1.2 christos TRACE_ALU_RESULT (GPR[rd]); 600 1.1.1.2 christos } 601 1.1.1.2 christos 602 1.1.1.4 christos :function:::void:do_addi:int rs, int rt, uint16_t immediate 603 1.1.1.2 christos { 604 1.1.1.2 christos if (NotWordValue (GPR[rs])) 605 1.1.1.2 christos Unpredictable (); 606 1.1.1.2 christos TRACE_ALU_INPUT2 (GPR[rs], EXTEND16 (immediate)); 607 1.1.1.2 christos { 608 1.1.1.2 christos ALU32_BEGIN (GPR[rs]); 609 1.1.1.2 christos ALU32_ADD (EXTEND16 (immediate)); 610 1.1.1.2 christos ALU32_END (GPR[rt]); /* This checks for overflow. */ 611 1.1.1.2 christos } 612 1.1.1.2 christos TRACE_ALU_RESULT (GPR[rt]); 613 1.1.1.2 christos } 614 1.1.1.2 christos 615 1.1.1.2 christos :function:::void:do_andi:int rs, int rt, unsigned int immediate 616 1.1.1.2 christos { 617 1.1.1.2 christos TRACE_ALU_INPUT2 (GPR[rs], immediate); 618 1.1.1.2 christos GPR[rt] = GPR[rs] & immediate; 619 1.1.1.2 christos TRACE_ALU_RESULT (GPR[rt]); 620 1.1.1.2 christos } 621 1.1.1.2 christos 622 1.1.1.2 christos :function:::void:do_dadd:int rd, int rs, int rt 623 1.1.1.2 christos { 624 1.1.1.2 christos TRACE_ALU_INPUT2 (GPR[rs], GPR[rt]); 625 1.1.1.2 christos { 626 1.1.1.2 christos ALU64_BEGIN (GPR[rs]); 627 1.1.1.2 christos ALU64_ADD (GPR[rt]); 628 1.1.1.2 christos ALU64_END (GPR[rd]); /* This checks for overflow. */ 629 1.1.1.2 christos } 630 1.1.1.2 christos TRACE_ALU_RESULT (GPR[rd]); 631 1.1.1.2 christos } 632 1.1.1.2 christos 633 1.1.1.2 christos :function:::void:do_daddi:int rt, int rs, int immediate 634 1.1.1.2 christos { 635 1.1.1.2 christos TRACE_ALU_INPUT2 (GPR[rs], EXTEND16 (immediate)); 636 1.1.1.2 christos { 637 1.1.1.2 christos ALU64_BEGIN (GPR[rs]); 638 1.1.1.2 christos ALU64_ADD (EXTEND16 (immediate)); 639 1.1.1.2 christos ALU64_END (GPR[rt]); /* This checks for overflow. */ 640 1.1.1.2 christos } 641 1.1.1.2 christos TRACE_ALU_RESULT (GPR[rt]); 642 1.1.1.2 christos } 643 1.1.1.2 christos 644 1.1.1.2 christos :function:::void:do_dsll32:int rd, int rt, int shift 645 1.1.1.2 christos { 646 1.1.1.2 christos int s = 32 + shift; 647 1.1.1.2 christos TRACE_ALU_INPUT2 (GPR[rt], s); 648 1.1.1.2 christos GPR[rd] = GPR[rt] << s; 649 1.1.1.2 christos TRACE_ALU_RESULT (GPR[rd]); 650 1.1.1.2 christos } 651 1.1.1.2 christos 652 1.1.1.2 christos :function:::void:do_dsra32:int rd, int rt, int shift 653 1.1.1.2 christos { 654 1.1.1.2 christos int s = 32 + shift; 655 1.1.1.2 christos TRACE_ALU_INPUT2 (GPR[rt], s); 656 1.1.1.4 christos GPR[rd] = ((int64_t) GPR[rt]) >> s; 657 1.1.1.2 christos TRACE_ALU_RESULT (GPR[rd]); 658 1.1.1.2 christos } 659 1.1.1.2 christos 660 1.1.1.2 christos :function:::void:do_dsrl32:int rd, int rt, int shift 661 1.1.1.2 christos { 662 1.1.1.2 christos int s = 32 + shift; 663 1.1.1.2 christos TRACE_ALU_INPUT2 (GPR[rt], s); 664 1.1.1.4 christos GPR[rd] = (uint64_t) GPR[rt] >> s; 665 1.1.1.2 christos TRACE_ALU_RESULT (GPR[rd]); 666 1.1.1.2 christos } 667 1.1.1.2 christos 668 1.1.1.2 christos :function:::void:do_dsub:int rd, int rs, int rt 669 1.1.1.2 christos { 670 1.1.1.2 christos TRACE_ALU_INPUT2 (GPR[rs], GPR[rt]); 671 1.1.1.2 christos { 672 1.1.1.2 christos ALU64_BEGIN (GPR[rs]); 673 1.1.1.2 christos ALU64_SUB (GPR[rt]); 674 1.1.1.2 christos ALU64_END (GPR[rd]); /* This checks for overflow. */ 675 1.1.1.2 christos } 676 1.1.1.2 christos TRACE_ALU_RESULT (GPR[rd]); 677 1.1.1.2 christos } 678 1.1.1.2 christos 679 1.1.1.2 christos :function:::void:do_break:address_word instruction_0 680 1.1.1.2 christos { 681 1.1.1.2 christos /* Check for some break instruction which are reserved for use by the 682 1.1.1.2 christos simulator. */ 683 1.1.1.2 christos unsigned int break_code = instruction_0 & HALT_INSTRUCTION_MASK; 684 1.1.1.2 christos if (break_code == (HALT_INSTRUCTION & HALT_INSTRUCTION_MASK) || 685 1.1.1.2 christos break_code == (HALT_INSTRUCTION2 & HALT_INSTRUCTION_MASK)) 686 1.1.1.2 christos { 687 1.1.1.2 christos sim_engine_halt (SD, CPU, NULL, cia, 688 1.1.1.2 christos sim_exited, (unsigned int)(A0 & 0xFFFFFFFF)); 689 1.1.1.2 christos } 690 1.1.1.2 christos else if (break_code == (BREAKPOINT_INSTRUCTION & HALT_INSTRUCTION_MASK) || 691 1.1.1.2 christos break_code == (BREAKPOINT_INSTRUCTION2 & HALT_INSTRUCTION_MASK)) 692 1.1.1.2 christos { 693 1.1.1.2 christos if (STATE & simDELAYSLOT) 694 1.1.1.2 christos PC = cia - 4; /* reference the branch instruction */ 695 1.1.1.2 christos else 696 1.1.1.2 christos PC = cia; 697 1.1.1.2 christos SignalException (BreakPoint, instruction_0); 698 1.1.1.2 christos } 699 1.1.1.2 christos 700 1.1.1.2 christos else 701 1.1.1.2 christos { 702 1.1.1.2 christos /* If we get this far, we're not an instruction reserved by the sim. Raise 703 1.1.1.2 christos the exception. */ 704 1.1.1.2 christos SignalException (BreakPoint, instruction_0); 705 1.1.1.2 christos } 706 1.1.1.2 christos } 707 1.1.1.2 christos 708 1.1.1.2 christos :function:::void:do_break16:address_word instruction_0 709 1.1.1.2 christos { 710 1.1.1.2 christos if (STATE & simDELAYSLOT) 711 1.1.1.2 christos PC = cia - 2; /* reference the branch instruction */ 712 1.1.1.2 christos else 713 1.1.1.2 christos PC = cia; 714 1.1.1.2 christos SignalException (BreakPoint, instruction_0); 715 1.1.1.2 christos } 716 1.1.1.2 christos 717 1.1.1.2 christos :function:::void:do_clo:int rd, int rs 718 1.1.1.2 christos { 719 1.1.1.4 christos uint32_t temp = GPR[rs]; 720 1.1.1.4 christos uint32_t i, mask; 721 1.1.1.2 christos if (NotWordValue (GPR[rs])) 722 1.1.1.2 christos Unpredictable (); 723 1.1.1.2 christos TRACE_ALU_INPUT1 (GPR[rs]); 724 1.1.1.4 christos for (mask = ((uint32_t)1<<31), i = 0; i < 32; ++i) 725 1.1.1.2 christos { 726 1.1.1.2 christos if ((temp & mask) == 0) 727 1.1.1.2 christos break; 728 1.1.1.2 christos mask >>= 1; 729 1.1.1.2 christos } 730 1.1.1.2 christos GPR[rd] = EXTEND32 (i); 731 1.1.1.2 christos TRACE_ALU_RESULT (GPR[rd]); 732 1.1.1.2 christos } 733 1.1.1.2 christos 734 1.1.1.2 christos :function:::void:do_clz:int rd, int rs 735 1.1.1.2 christos { 736 1.1.1.4 christos uint32_t temp = GPR[rs]; 737 1.1.1.4 christos uint32_t i, mask; 738 1.1.1.2 christos if (NotWordValue (GPR[rs])) 739 1.1.1.2 christos Unpredictable (); 740 1.1.1.2 christos TRACE_ALU_INPUT1 (GPR[rs]); 741 1.1.1.4 christos for (mask = ((uint32_t)1<<31), i = 0; i < 32; ++i) 742 1.1.1.2 christos { 743 1.1.1.2 christos if ((temp & mask) != 0) 744 1.1.1.2 christos break; 745 1.1.1.2 christos mask >>= 1; 746 1.1.1.2 christos } 747 1.1.1.2 christos GPR[rd] = EXTEND32 (i); 748 1.1.1.2 christos TRACE_ALU_RESULT (GPR[rd]); 749 1.1.1.2 christos } 750 1.1.1.2 christos 751 1.1.1.2 christos :function:::void:do_dclo:int rd, int rs 752 1.1.1.2 christos { 753 1.1.1.4 christos uint64_t temp = GPR[rs]; 754 1.1.1.4 christos uint32_t i; 755 1.1.1.4 christos uint64_t mask; 756 1.1.1.2 christos TRACE_ALU_INPUT1 (GPR[rs]); 757 1.1.1.4 christos for (mask = ((uint64_t)1<<63), i = 0; i < 64; ++i) 758 1.1.1.2 christos { 759 1.1.1.2 christos if ((temp & mask) == 0) 760 1.1.1.2 christos break; 761 1.1.1.2 christos mask >>= 1; 762 1.1.1.2 christos } 763 1.1.1.2 christos GPR[rd] = EXTEND32 (i); 764 1.1.1.2 christos TRACE_ALU_RESULT (GPR[rd]); 765 1.1.1.2 christos } 766 1.1.1.2 christos 767 1.1.1.2 christos :function:::void:do_dclz:int rd, int rs 768 1.1.1.2 christos { 769 1.1.1.4 christos uint64_t temp = GPR[rs]; 770 1.1.1.4 christos uint32_t i; 771 1.1.1.4 christos uint64_t mask; 772 1.1.1.2 christos TRACE_ALU_INPUT1 (GPR[rs]); 773 1.1.1.4 christos for (mask = ((uint64_t)1<<63), i = 0; i < 64; ++i) 774 1.1.1.2 christos { 775 1.1.1.2 christos if ((temp & mask) != 0) 776 1.1.1.2 christos break; 777 1.1.1.2 christos mask >>= 1; 778 1.1.1.2 christos } 779 1.1.1.2 christos GPR[rd] = EXTEND32 (i); 780 1.1.1.2 christos TRACE_ALU_RESULT (GPR[rd]); 781 1.1.1.2 christos } 782 1.1.1.2 christos 783 1.1.1.2 christos :function:::void:do_lb:int rt, int offset, int base 784 1.1.1.2 christos { 785 1.1.1.2 christos GPR[rt] = EXTEND8 (do_load (SD_, AccessLength_BYTE, GPR[base], 786 1.1.1.2 christos EXTEND16 (offset))); 787 1.1.1.2 christos } 788 1.1.1.2 christos 789 1.1.1.2 christos :function:::void:do_lh:int rt, int offset, int base 790 1.1.1.2 christos { 791 1.1.1.2 christos GPR[rt] = EXTEND16 (do_load (SD_, AccessLength_HALFWORD, GPR[base], 792 1.1.1.2 christos EXTEND16 (offset))); 793 1.1.1.2 christos } 794 1.1.1.2 christos 795 1.1.1.2 christos :function:::void:do_lwr:int rt, int offset, int base 796 1.1.1.2 christos { 797 1.1.1.2 christos GPR[rt] = EXTEND32 (do_load_right (SD_, AccessLength_WORD, GPR[base], 798 1.1.1.2 christos EXTEND16 (offset), GPR[rt])); 799 1.1.1.2 christos } 800 1.1.1.2 christos 801 1.1.1.2 christos :function:::void:do_lwl:int rt, int offset, int base 802 1.1.1.2 christos { 803 1.1.1.2 christos GPR[rt] = EXTEND32 (do_load_left (SD_, AccessLength_WORD, GPR[base], 804 1.1.1.2 christos EXTEND16 (offset), GPR[rt])); 805 1.1.1.2 christos } 806 1.1.1.2 christos 807 1.1.1.2 christos :function:::void:do_lwc:int num, int rt, int offset, int base 808 1.1.1.2 christos { 809 1.1.1.2 christos COP_LW (num, rt, do_load (SD_, AccessLength_WORD, GPR[base], 810 1.1.1.2 christos EXTEND16 (offset))); 811 1.1.1.2 christos } 812 1.1.1.2 christos 813 1.1.1.2 christos :function:::void:do_lw:int rt, int offset, int base 814 1.1.1.2 christos { 815 1.1.1.2 christos GPR[rt] = EXTEND32 (do_load (SD_, AccessLength_WORD, GPR[base], 816 1.1.1.2 christos EXTEND16 (offset))); 817 1.1.1.2 christos } 818 1.1.1.2 christos 819 1.1.1.2 christos :function:::void:do_lwu:int rt, int offset, int base, address_word instruction_0 820 1.1.1.2 christos { 821 1.1.1.2 christos check_u64 (SD_, instruction_0); 822 1.1.1.2 christos GPR[rt] = do_load (SD_, AccessLength_WORD, GPR[base], EXTEND16 (offset)); 823 1.1.1.2 christos } 824 1.1.1.2 christos 825 1.1.1.2 christos :function:::void:do_lhu:int rt, int offset, int base 826 1.1.1.2 christos { 827 1.1.1.2 christos GPR[rt] = do_load (SD_, AccessLength_HALFWORD, GPR[base], EXTEND16 (offset)); 828 1.1.1.2 christos } 829 1.1.1.2 christos 830 1.1.1.2 christos :function:::void:do_ldc:int num, int rt, int offset, int base 831 1.1.1.2 christos { 832 1.1.1.2 christos COP_LD (num, rt, do_load (SD_, AccessLength_DOUBLEWORD, GPR[base], 833 1.1.1.2 christos EXTEND16 (offset))); 834 1.1.1.2 christos } 835 1.1.1.2 christos 836 1.1.1.2 christos :function:::void:do_lbu:int rt, int offset, int base 837 1.1.1.2 christos { 838 1.1.1.2 christos GPR[rt] = do_load (SD_, AccessLength_BYTE, GPR[base], EXTEND16 (offset)); 839 1.1.1.2 christos } 840 1.1.1.2 christos 841 1.1.1.2 christos :function:::void:do_ll:int rt, int insn_offset, int basereg 842 1.1.1.2 christos { 843 1.1.1.2 christos address_word base = GPR[basereg]; 844 1.1.1.2 christos address_word offset = EXTEND16 (insn_offset); 845 1.1.1.2 christos { 846 1.1.1.2 christos address_word vaddr = loadstore_ea (SD_, base, offset); 847 1.1.1.2 christos address_word paddr = vaddr; 848 1.1.1.2 christos if ((vaddr & 3) != 0) 849 1.1.1.2 christos { 850 1.1.1.2 christos SIM_CORE_SIGNAL (SD, CPU, cia, read_map, 4, vaddr, read_transfer, 851 1.1.1.2 christos sim_core_unaligned_signal); 852 1.1.1.2 christos } 853 1.1.1.2 christos else 854 1.1.1.2 christos { 855 1.1.1.4 christos uint64_t memval = 0; 856 1.1.1.4 christos uint64_t memval1 = 0; 857 1.1.1.4 christos uint64_t mask = (WITH_TARGET_WORD_BITSIZE == 64 ? 0x7 : 0x3); 858 1.1.1.2 christos unsigned int shift = 2; 859 1.1.1.2 christos unsigned int reverse = (ReverseEndian ? (mask >> shift) : 0); 860 1.1.1.2 christos unsigned int bigend = (BigEndianCPU ? (mask >> shift) : 0); 861 1.1.1.2 christos unsigned int byte; 862 1.1.1.2 christos paddr = ((paddr & ~mask) | ((paddr & mask) ^ (reverse << shift))); 863 1.1.1.2 christos LoadMemory (&memval, &memval1, AccessLength_WORD, paddr, vaddr, 864 1.1.1.2 christos isDATA, isREAL); 865 1.1.1.2 christos byte = ((vaddr & mask) ^ (bigend << shift)); 866 1.1.1.2 christos GPR[rt] = EXTEND32 (memval >> (8 * byte)); 867 1.1.1.2 christos LLBIT = 1; 868 1.1.1.2 christos } 869 1.1.1.2 christos } 870 1.1.1.2 christos } 871 1.1.1.2 christos 872 1.1.1.2 christos :function:::void:do_lld:int rt, int roffset, int rbase 873 1.1.1.2 christos { 874 1.1.1.2 christos address_word base = GPR[rbase]; 875 1.1.1.2 christos address_word offset = EXTEND16 (roffset); 876 1.1.1.2 christos { 877 1.1.1.2 christos address_word vaddr = loadstore_ea (SD_, base, offset); 878 1.1.1.2 christos address_word paddr = vaddr; 879 1.1.1.2 christos 880 1.1.1.2 christos if ((vaddr & 7) != 0) 881 1.1.1.2 christos { 882 1.1.1.2 christos SIM_CORE_SIGNAL (SD, CPU, cia, read_map, 8, vaddr, read_transfer, 883 1.1.1.2 christos sim_core_unaligned_signal); 884 1.1.1.2 christos } 885 1.1.1.2 christos else 886 1.1.1.2 christos { 887 1.1.1.4 christos uint64_t memval = 0; 888 1.1.1.4 christos uint64_t memval1 = 0; 889 1.1.1.2 christos LoadMemory (&memval, &memval1, AccessLength_DOUBLEWORD, paddr, vaddr, 890 1.1.1.2 christos isDATA, isREAL); 891 1.1.1.2 christos GPR[rt] = memval; 892 1.1.1.2 christos LLBIT = 1; 893 1.1.1.2 christos } 894 1.1.1.2 christos } 895 1.1.1.2 christos } 896 1.1.1.2 christos 897 1.1.1.2 christos :function:::void:do_lui:int rt, int immediate 898 1.1.1.2 christos { 899 1.1.1.2 christos TRACE_ALU_INPUT1 (immediate); 900 1.1.1.2 christos GPR[rt] = EXTEND32 (immediate << 16); 901 1.1.1.2 christos TRACE_ALU_RESULT (GPR[rt]); 902 1.1.1.2 christos } 903 1.1.1.2 christos 904 1.1.1.2 christos :function:::void:do_madd:int rs, int rt 905 1.1.1.2 christos { 906 1.1.1.4 christos int64_t temp; 907 1.1.1.2 christos check_mult_hilo (SD_, HIHISTORY, LOHISTORY); 908 1.1.1.2 christos if (NotWordValue (GPR[rs]) || NotWordValue (GPR[rt])) 909 1.1.1.2 christos Unpredictable (); 910 1.1.1.2 christos TRACE_ALU_INPUT2 (GPR[rs], GPR[rt]); 911 1.1.1.2 christos temp = (U8_4 (VL4_8 (HI), VL4_8 (LO)) 912 1.1.1.4 christos + ((int64_t) EXTEND32 (GPR[rt]) * (int64_t) EXTEND32 (GPR[rs]))); 913 1.1.1.2 christos LO = EXTEND32 (temp); 914 1.1.1.2 christos HI = EXTEND32 (VH4_8 (temp)); 915 1.1.1.2 christos TRACE_ALU_RESULT2 (HI, LO); 916 1.1.1.2 christos } 917 1.1.1.2 christos 918 1.1.1.2 christos :function:::void:do_dsp_madd:int ac, int rs, int rt 919 1.1.1.2 christos { 920 1.1.1.4 christos int64_t temp; 921 1.1.1.2 christos if (ac == 0) 922 1.1.1.2 christos check_mult_hilo (SD_, HIHISTORY, LOHISTORY); 923 1.1.1.2 christos if (NotWordValue (GPR[rs]) || NotWordValue (GPR[rt])) 924 1.1.1.2 christos Unpredictable (); 925 1.1.1.2 christos TRACE_ALU_INPUT2 (GPR[rs], GPR[rt]); 926 1.1.1.2 christos temp = (U8_4 (VL4_8 (DSPHI(ac)), VL4_8 (DSPLO(ac))) 927 1.1.1.4 christos + ((int64_t) EXTEND32 (GPR[rt]) * (int64_t) EXTEND32 (GPR[rs]))); 928 1.1.1.2 christos DSPLO(ac) = EXTEND32 (temp); 929 1.1.1.2 christos DSPHI(ac) = EXTEND32 (VH4_8 (temp)); 930 1.1.1.2 christos if (ac == 0) 931 1.1.1.2 christos TRACE_ALU_RESULT2 (HI, LO); 932 1.1.1.2 christos } 933 1.1.1.2 christos 934 1.1.1.2 christos :function:::void:do_maddu:int rs, int rt 935 1.1.1.2 christos { 936 1.1.1.4 christos uint64_t temp; 937 1.1.1.2 christos check_mult_hilo (SD_, HIHISTORY, LOHISTORY); 938 1.1.1.2 christos if (NotWordValue (GPR[rs]) || NotWordValue (GPR[rt])) 939 1.1.1.2 christos Unpredictable (); 940 1.1.1.2 christos TRACE_ALU_INPUT2 (GPR[rs], GPR[rt]); 941 1.1.1.2 christos temp = (U8_4 (VL4_8 (HI), VL4_8 (LO)) 942 1.1.1.4 christos + ((uint64_t) VL4_8 (GPR[rs]) * (uint64_t) VL4_8 (GPR[rt]))); 943 1.1.1.2 christos ACX += U8_4 (VL4_8 (HI), VL4_8 (LO)) < temp; /* SmartMIPS */ 944 1.1.1.2 christos LO = EXTEND32 (temp); 945 1.1.1.2 christos HI = EXTEND32 (VH4_8 (temp)); 946 1.1.1.2 christos TRACE_ALU_RESULT2 (HI, LO); 947 1.1.1.2 christos } 948 1.1.1.2 christos 949 1.1.1.2 christos :function:::void:do_dsp_maddu:int ac, int rs, int rt 950 1.1.1.2 christos { 951 1.1.1.4 christos uint64_t temp; 952 1.1.1.2 christos if (ac == 0) 953 1.1.1.2 christos check_mult_hilo (SD_, HIHISTORY, LOHISTORY); 954 1.1.1.2 christos if (NotWordValue (GPR[rs]) || NotWordValue (GPR[rt])) 955 1.1.1.2 christos Unpredictable (); 956 1.1.1.2 christos TRACE_ALU_INPUT2 (GPR[rs], GPR[rt]); 957 1.1.1.2 christos temp = (U8_4 (VL4_8 (DSPHI(ac)), VL4_8 (DSPLO(ac))) 958 1.1.1.4 christos + ((uint64_t) VL4_8 (GPR[rs]) * (uint64_t) VL4_8 (GPR[rt]))); 959 1.1.1.2 christos if (ac == 0) 960 1.1.1.2 christos ACX += U8_4 (VL4_8 (HI), VL4_8 (LO)) < temp; /* SmartMIPS */ 961 1.1.1.2 christos DSPLO(ac) = EXTEND32 (temp); 962 1.1.1.2 christos DSPHI(ac) = EXTEND32 (VH4_8 (temp)); 963 1.1.1.2 christos if (ac == 0) 964 1.1.1.2 christos TRACE_ALU_RESULT2 (HI, LO); 965 1.1.1.2 christos } 966 1.1.1.2 christos 967 1.1.1.2 christos :function:::void:do_dsp_mfhi:int ac, int rd 968 1.1.1.2 christos { 969 1.1.1.2 christos if (ac == 0) 970 1.1.1.2 christos do_mfhi (SD_, rd); 971 1.1.1.2 christos else 972 1.1.1.2 christos GPR[rd] = DSPHI(ac); 973 1.1.1.2 christos } 974 1.1.1.2 christos 975 1.1.1.2 christos :function:::void:do_dsp_mflo:int ac, int rd 976 1.1.1.2 christos { 977 1.1.1.2 christos if (ac == 0) 978 1.1.1.2 christos do_mflo (SD_, rd); 979 1.1.1.2 christos else 980 1.1.1.2 christos GPR[rd] = DSPLO(ac); 981 1.1.1.2 christos } 982 1.1.1.2 christos 983 1.1.1.2 christos :function:::void:do_movn:int rd, int rs, int rt 984 1.1.1.2 christos { 985 1.1.1.2 christos if (GPR[rt] != 0) 986 1.1.1.2 christos { 987 1.1.1.2 christos GPR[rd] = GPR[rs]; 988 1.1.1.2 christos TRACE_ALU_RESULT (GPR[rd]); 989 1.1.1.2 christos } 990 1.1.1.2 christos } 991 1.1.1.2 christos 992 1.1.1.2 christos :function:::void:do_movz:int rd, int rs, int rt 993 1.1.1.2 christos { 994 1.1.1.2 christos if (GPR[rt] == 0) 995 1.1.1.2 christos { 996 1.1.1.2 christos GPR[rd] = GPR[rs]; 997 1.1.1.2 christos TRACE_ALU_RESULT (GPR[rd]); 998 1.1.1.2 christos } 999 1.1.1.2 christos } 1000 1.1.1.2 christos 1001 1.1.1.2 christos :function:::void:do_msub:int rs, int rt 1002 1.1.1.2 christos { 1003 1.1.1.4 christos int64_t temp; 1004 1.1.1.2 christos check_mult_hilo (SD_, HIHISTORY, LOHISTORY); 1005 1.1.1.2 christos if (NotWordValue (GPR[rs]) || NotWordValue (GPR[rt])) 1006 1.1.1.2 christos Unpredictable (); 1007 1.1.1.2 christos TRACE_ALU_INPUT2 (GPR[rs], GPR[rt]); 1008 1.1.1.2 christos temp = (U8_4 (VL4_8 (HI), VL4_8 (LO)) 1009 1.1.1.4 christos - ((int64_t) EXTEND32 (GPR[rt]) * (int64_t) EXTEND32 (GPR[rs]))); 1010 1.1.1.2 christos LO = EXTEND32 (temp); 1011 1.1.1.2 christos HI = EXTEND32 (VH4_8 (temp)); 1012 1.1.1.2 christos TRACE_ALU_RESULT2 (HI, LO); 1013 1.1.1.2 christos } 1014 1.1.1.2 christos 1015 1.1.1.2 christos :function:::void:do_dsp_msub:int ac, int rs, int rt 1016 1.1.1.2 christos { 1017 1.1.1.4 christos int64_t temp; 1018 1.1.1.2 christos if (ac == 0) 1019 1.1.1.2 christos check_mult_hilo (SD_, HIHISTORY, LOHISTORY); 1020 1.1.1.2 christos if (NotWordValue (GPR[rs]) || NotWordValue (GPR[rt])) 1021 1.1.1.2 christos Unpredictable (); 1022 1.1.1.2 christos TRACE_ALU_INPUT2 (GPR[rs], GPR[rt]); 1023 1.1.1.2 christos temp = (U8_4 (VL4_8 (DSPHI(ac)), VL4_8 (DSPLO(ac))) 1024 1.1.1.4 christos - ((int64_t) EXTEND32 (GPR[rt]) * (int64_t) EXTEND32 (GPR[rs]))); 1025 1.1.1.2 christos DSPLO(ac) = EXTEND32 (temp); 1026 1.1.1.2 christos DSPHI(ac) = EXTEND32 (VH4_8 (temp)); 1027 1.1.1.2 christos if (ac == 0) 1028 1.1.1.2 christos TRACE_ALU_RESULT2 (HI, LO); 1029 1.1.1.2 christos } 1030 1.1.1.2 christos 1031 1.1.1.2 christos :function:::void:do_msubu:int rs, int rt 1032 1.1.1.2 christos { 1033 1.1.1.4 christos uint64_t temp; 1034 1.1.1.2 christos check_mult_hilo (SD_, HIHISTORY, LOHISTORY); 1035 1.1.1.2 christos if (NotWordValue (GPR[rs]) || NotWordValue (GPR[rt])) 1036 1.1.1.2 christos Unpredictable (); 1037 1.1.1.2 christos TRACE_ALU_INPUT2 (GPR[rs], GPR[rt]); 1038 1.1.1.2 christos temp = (U8_4 (VL4_8 (HI), VL4_8 (LO)) 1039 1.1.1.4 christos - ((uint64_t) VL4_8 (GPR[rs]) * (uint64_t) VL4_8 (GPR[rt]))); 1040 1.1.1.2 christos LO = EXTEND32 (temp); 1041 1.1.1.2 christos HI = EXTEND32 (VH4_8 (temp)); 1042 1.1.1.2 christos TRACE_ALU_RESULT2 (HI, LO); 1043 1.1.1.2 christos } 1044 1.1.1.2 christos 1045 1.1.1.2 christos :function:::void:do_dsp_msubu:int ac, int rs, int rt 1046 1.1.1.2 christos { 1047 1.1.1.4 christos uint64_t temp; 1048 1.1.1.2 christos if (ac == 0) 1049 1.1.1.2 christos check_mult_hilo (SD_, HIHISTORY, LOHISTORY); 1050 1.1.1.2 christos if (NotWordValue (GPR[rs]) || NotWordValue (GPR[rt])) 1051 1.1.1.2 christos Unpredictable (); 1052 1.1.1.2 christos TRACE_ALU_INPUT2 (GPR[rs], GPR[rt]); 1053 1.1.1.2 christos temp = (U8_4 (VL4_8 (DSPHI(ac)), VL4_8 (DSPLO(ac))) 1054 1.1.1.4 christos - ((uint64_t) VL4_8 (GPR[rs]) * (uint64_t) VL4_8 (GPR[rt]))); 1055 1.1.1.2 christos DSPLO(ac) = EXTEND32 (temp); 1056 1.1.1.2 christos DSPHI(ac) = EXTEND32 (VH4_8 (temp)); 1057 1.1.1.2 christos if (ac == 0) 1058 1.1.1.2 christos TRACE_ALU_RESULT2 (HI, LO); 1059 1.1.1.2 christos } 1060 1.1.1.2 christos 1061 1.1.1.2 christos :function:::void:do_mthi:int rs 1062 1.1.1.2 christos { 1063 1.1.1.2 christos check_mt_hilo (SD_, HIHISTORY); 1064 1.1.1.2 christos HI = GPR[rs]; 1065 1.1.1.2 christos } 1066 1.1.1.2 christos 1067 1.1.1.2 christos :function:::void:do_dsp_mthi:int ac, int rs 1068 1.1.1.2 christos { 1069 1.1.1.2 christos if (ac == 0) 1070 1.1.1.2 christos check_mt_hilo (SD_, HIHISTORY); 1071 1.1.1.2 christos DSPHI(ac) = GPR[rs]; 1072 1.1.1.2 christos } 1073 1.1.1.2 christos 1074 1.1.1.2 christos :function:::void:do_mtlo:int rs 1075 1.1.1.2 christos { 1076 1.1.1.2 christos check_mt_hilo (SD_, LOHISTORY); 1077 1.1.1.2 christos LO = GPR[rs]; 1078 1.1.1.2 christos } 1079 1.1.1.2 christos 1080 1.1.1.2 christos :function:::void:do_dsp_mtlo:int ac, int rs 1081 1.1.1.2 christos { 1082 1.1.1.2 christos if (ac == 0) 1083 1.1.1.2 christos check_mt_hilo (SD_, LOHISTORY); 1084 1.1.1.2 christos DSPLO(ac) = GPR[rs]; 1085 1.1.1.2 christos } 1086 1.1.1.2 christos 1087 1.1.1.2 christos :function:::void:do_mul:int rd, int rs, int rt 1088 1.1.1.2 christos { 1089 1.1.1.4 christos int64_t prod; 1090 1.1.1.2 christos if (NotWordValue (GPR[rs]) || NotWordValue (GPR[rt])) 1091 1.1.1.2 christos Unpredictable (); 1092 1.1.1.2 christos TRACE_ALU_INPUT2 (GPR[rs], GPR[rt]); 1093 1.1.1.4 christos prod = (((int64_t)(int32_t) GPR[rs]) 1094 1.1.1.4 christos * ((int64_t)(int32_t) GPR[rt])); 1095 1.1.1.2 christos GPR[rd] = EXTEND32 (VL4_8 (prod)); 1096 1.1.1.2 christos TRACE_ALU_RESULT (GPR[rd]); 1097 1.1.1.2 christos } 1098 1.1.1.2 christos 1099 1.1.1.2 christos :function:::void:do_dsp_mult:int ac, int rs, int rt 1100 1.1.1.2 christos { 1101 1.1.1.4 christos int64_t prod; 1102 1.1.1.2 christos if (ac == 0) 1103 1.1.1.2 christos check_mult_hilo (SD_, HIHISTORY, LOHISTORY); 1104 1.1.1.2 christos if (NotWordValue (GPR[rs]) || NotWordValue (GPR[rt])) 1105 1.1.1.2 christos Unpredictable (); 1106 1.1.1.2 christos TRACE_ALU_INPUT2 (GPR[rs], GPR[rt]); 1107 1.1.1.4 christos prod = ((int64_t)(int32_t) GPR[rs]) 1108 1.1.1.4 christos * ((int64_t)(int32_t) GPR[rt]); 1109 1.1.1.2 christos DSPLO(ac) = EXTEND32 (VL4_8 (prod)); 1110 1.1.1.2 christos DSPHI(ac) = EXTEND32 (VH4_8 (prod)); 1111 1.1.1.2 christos if (ac == 0) 1112 1.1.1.2 christos { 1113 1.1.1.2 christos ACX = 0; /* SmartMIPS */ 1114 1.1.1.2 christos TRACE_ALU_RESULT2 (HI, LO); 1115 1.1.1.2 christos } 1116 1.1.1.2 christos } 1117 1.1.1.2 christos 1118 1.1.1.2 christos :function:::void:do_dsp_multu:int ac, int rs, int rt 1119 1.1.1.2 christos { 1120 1.1.1.4 christos uint64_t prod; 1121 1.1.1.2 christos if (ac == 0) 1122 1.1.1.2 christos check_mult_hilo (SD_, HIHISTORY, LOHISTORY); 1123 1.1.1.2 christos if (NotWordValue (GPR[rs]) || NotWordValue (GPR[rt])) 1124 1.1.1.2 christos Unpredictable (); 1125 1.1.1.2 christos TRACE_ALU_INPUT2 (GPR[rs], GPR[rt]); 1126 1.1.1.4 christos prod = ((uint64_t)(uint32_t) GPR[rs]) 1127 1.1.1.4 christos * ((uint64_t)(uint32_t) GPR[rt]); 1128 1.1.1.2 christos DSPLO(ac) = EXTEND32 (VL4_8 (prod)); 1129 1.1.1.2 christos DSPHI(ac) = EXTEND32 (VH4_8 (prod)); 1130 1.1.1.2 christos if (ac == 0) 1131 1.1.1.2 christos TRACE_ALU_RESULT2 (HI, LO); 1132 1.1.1.2 christos } 1133 1.1.1.2 christos 1134 1.1.1.2 christos :function:::void:do_pref:int hint, int insn_offset, int insn_base 1135 1.1.1.2 christos { 1136 1.1.1.5 christos /* 1137 1.1.1.2 christos address_word base = GPR[insn_base]; 1138 1.1.1.2 christos address_word offset = EXTEND16 (insn_offset); 1139 1.1.1.5 christos address_word vaddr = loadstore_ea (SD_, base, offset); 1140 1.1.1.5 christos address_word paddr = vaddr; 1141 1.1.1.5 christos Prefetch (paddr, vaddr, isDATA, hint); 1142 1.1.1.5 christos */ 1143 1.1.1.2 christos } 1144 1.1.1.2 christos 1145 1.1.1.4 christos :function:::void:do_sc:int rt, int offsetarg, int basereg, address_word instruction_0, int store_ll_bit 1146 1.1.1.2 christos { 1147 1.1.1.2 christos address_word base = GPR[basereg]; 1148 1.1.1.2 christos address_word offset = EXTEND16 (offsetarg); 1149 1.1.1.2 christos { 1150 1.1.1.2 christos address_word vaddr = loadstore_ea (SD_, base, offset); 1151 1.1.1.2 christos address_word paddr = vaddr; 1152 1.1.1.2 christos 1153 1.1.1.2 christos if ((vaddr & 3) != 0) 1154 1.1.1.2 christos { 1155 1.1.1.2 christos SIM_CORE_SIGNAL (SD, CPU, cia, read_map, 4, vaddr, write_transfer, 1156 1.1.1.2 christos sim_core_unaligned_signal); 1157 1.1.1.2 christos } 1158 1.1.1.2 christos else 1159 1.1.1.2 christos { 1160 1.1.1.4 christos uint64_t memval = 0; 1161 1.1.1.4 christos uint64_t memval1 = 0; 1162 1.1.1.4 christos uint64_t mask = (WITH_TARGET_WORD_BITSIZE == 64 ? 0x7 : 0x3); 1163 1.1.1.2 christos address_word reverseendian = 1164 1.1.1.2 christos (ReverseEndian ? (mask ^ AccessLength_WORD) : 0); 1165 1.1.1.2 christos address_word bigendiancpu = 1166 1.1.1.2 christos (BigEndianCPU ? (mask ^ AccessLength_WORD) : 0); 1167 1.1.1.2 christos unsigned int byte; 1168 1.1.1.2 christos paddr = ((paddr & ~mask) | ((paddr & mask) ^ reverseendian)); 1169 1.1.1.2 christos byte = ((vaddr & mask) ^ bigendiancpu); 1170 1.1.1.4 christos memval = ((uint64_t) GPR[rt] << (8 * byte)); 1171 1.1.1.2 christos if (LLBIT) 1172 1.1.1.2 christos StoreMemory (AccessLength_WORD, memval, memval1, paddr, vaddr, 1173 1.1.1.2 christos isREAL); 1174 1.1.1.4 christos if (store_ll_bit) 1175 1.1.1.4 christos GPR[rt] = LLBIT; 1176 1.1.1.2 christos } 1177 1.1.1.2 christos } 1178 1.1.1.2 christos } 1179 1.1.1.2 christos 1180 1.1.1.4 christos :function:::void:do_scd:int rt, int roffset, int rbase, int store_ll_bit 1181 1.1.1.2 christos { 1182 1.1.1.2 christos address_word base = GPR[rbase]; 1183 1.1.1.2 christos address_word offset = EXTEND16 (roffset); 1184 1.1.1.2 christos { 1185 1.1.1.2 christos address_word vaddr = loadstore_ea (SD_, base, offset); 1186 1.1.1.2 christos address_word paddr = vaddr; 1187 1.1.1.2 christos 1188 1.1.1.2 christos if ((vaddr & 7) != 0) 1189 1.1.1.2 christos { 1190 1.1.1.2 christos SIM_CORE_SIGNAL (SD, CPU, cia, read_map, 8, vaddr, write_transfer, 1191 1.1.1.2 christos sim_core_unaligned_signal); 1192 1.1.1.2 christos } 1193 1.1.1.2 christos else 1194 1.1.1.2 christos { 1195 1.1.1.4 christos uint64_t memval = 0; 1196 1.1.1.4 christos uint64_t memval1 = 0; 1197 1.1.1.2 christos memval = GPR[rt]; 1198 1.1.1.2 christos if (LLBIT) 1199 1.1.1.2 christos StoreMemory (AccessLength_DOUBLEWORD, memval, memval1, paddr, vaddr, 1200 1.1.1.2 christos isREAL); 1201 1.1.1.4 christos if (store_ll_bit) 1202 1.1.1.4 christos GPR[rt] = LLBIT; 1203 1.1.1.2 christos } 1204 1.1.1.2 christos } 1205 1.1.1.2 christos } 1206 1.1.1.2 christos 1207 1.1.1.2 christos :function:::void:do_sub:int rs, int rt, int rd 1208 1.1.1.2 christos { 1209 1.1.1.2 christos if (NotWordValue (GPR[rs]) || NotWordValue (GPR[rt])) 1210 1.1.1.2 christos Unpredictable (); 1211 1.1.1.2 christos TRACE_ALU_INPUT2 (GPR[rs], GPR[rt]); 1212 1.1.1.2 christos { 1213 1.1.1.2 christos ALU32_BEGIN (GPR[rs]); 1214 1.1.1.2 christos ALU32_SUB (GPR[rt]); 1215 1.1.1.2 christos ALU32_END (GPR[rd]); /* This checks for overflow. */ 1216 1.1.1.2 christos } 1217 1.1.1.2 christos TRACE_ALU_RESULT (GPR[rd]); 1218 1.1.1.2 christos } 1219 1.1.1.2 christos 1220 1.1.1.2 christos :function:::void:do_sw:int rt, int offset, int base 1221 1.1.1.2 christos { 1222 1.1.1.2 christos do_store (SD_, AccessLength_WORD, GPR[base], EXTEND16 (offset), GPR[rt]); 1223 1.1.1.2 christos } 1224 1.1.1.2 christos 1225 1.1.1.2 christos :function:::void:do_teq:int rs, int rt, address_word instruction_0 1226 1.1.1.2 christos { 1227 1.1.1.2 christos if ((signed_word) GPR[rs] == (signed_word) GPR[rt]) 1228 1.1.1.2 christos SignalException (Trap, instruction_0); 1229 1.1.1.2 christos } 1230 1.1.1.2 christos 1231 1.1.1.2 christos :function:::void:do_teqi:int rs, int immediate, address_word instruction_0 1232 1.1.1.2 christos { 1233 1.1.1.2 christos if ((signed_word) GPR[rs] == (signed_word) EXTEND16 (immediate)) 1234 1.1.1.2 christos SignalException (Trap, instruction_0); 1235 1.1.1.2 christos } 1236 1.1.1.2 christos 1237 1.1.1.2 christos :function:::void:do_tge:int rs, int rt, address_word instruction_0 1238 1.1.1.2 christos { 1239 1.1.1.2 christos if ((signed_word) GPR[rs] >= (signed_word) GPR[rt]) 1240 1.1.1.2 christos SignalException (Trap, instruction_0); 1241 1.1.1.2 christos } 1242 1.1.1.2 christos 1243 1.1.1.2 christos :function:::void:do_tgei:int rs, int immediate, address_word instruction_0 1244 1.1.1.2 christos { 1245 1.1.1.2 christos if ((signed_word) GPR[rs] >= (signed_word) EXTEND16 (immediate)) 1246 1.1.1.2 christos SignalException (Trap, instruction_0); 1247 1.1.1.2 christos } 1248 1.1.1.2 christos 1249 1.1.1.2 christos :function:::void:do_tgeiu:int rs, int immediate, address_word instruction_0 1250 1.1.1.2 christos { 1251 1.1.1.2 christos if ((unsigned_word) GPR[rs] >= (unsigned_word) EXTEND16 (immediate)) 1252 1.1.1.2 christos SignalException (Trap, instruction_0); 1253 1.1.1.2 christos } 1254 1.1.1.2 christos 1255 1.1.1.2 christos :function:::void:do_tgeu:int rs ,int rt, address_word instruction_0 1256 1.1.1.2 christos { 1257 1.1.1.2 christos if ((unsigned_word) GPR[rs] >= (unsigned_word) GPR[rt]) 1258 1.1.1.2 christos SignalException (Trap, instruction_0); 1259 1.1.1.2 christos } 1260 1.1.1.2 christos 1261 1.1.1.2 christos :function:::void:do_tlt:int rs, int rt, address_word instruction_0 1262 1.1.1.2 christos { 1263 1.1.1.2 christos if ((signed_word) GPR[rs] < (signed_word) GPR[rt]) 1264 1.1.1.2 christos SignalException (Trap, instruction_0); 1265 1.1.1.2 christos } 1266 1.1.1.2 christos 1267 1.1.1.2 christos :function:::void:do_tlti:int rs, int immediate, address_word instruction_0 1268 1.1.1.2 christos { 1269 1.1.1.2 christos if ((signed_word) GPR[rs] < (signed_word) EXTEND16 (immediate)) 1270 1.1.1.2 christos SignalException (Trap, instruction_0); 1271 1.1.1.2 christos } 1272 1.1.1.2 christos 1273 1.1.1.2 christos :function:::void:do_tltiu:int rs, int immediate, address_word instruction_0 1274 1.1.1.2 christos { 1275 1.1.1.2 christos if ((unsigned_word) GPR[rs] < (unsigned_word) EXTEND16 (immediate)) 1276 1.1.1.2 christos SignalException (Trap, instruction_0); 1277 1.1.1.2 christos } 1278 1.1.1.2 christos 1279 1.1.1.2 christos :function:::void:do_tltu:int rs, int rt, address_word instruction_0 1280 1.1.1.2 christos { 1281 1.1.1.2 christos if ((unsigned_word) GPR[rs] < (unsigned_word) GPR[rt]) 1282 1.1.1.2 christos SignalException (Trap, instruction_0); 1283 1.1.1.2 christos } 1284 1.1.1.2 christos 1285 1.1.1.2 christos :function:::void:do_tne:int rs, int rt, address_word instruction_0 1286 1.1.1.2 christos { 1287 1.1.1.2 christos if ((signed_word) GPR[rs] != (signed_word) GPR[rt]) 1288 1.1.1.2 christos SignalException (Trap, instruction_0); 1289 1.1.1.2 christos } 1290 1.1.1.2 christos 1291 1.1.1.2 christos :function:::void:do_tnei:int rs, int immediate, address_word instruction_0 1292 1.1.1.2 christos { 1293 1.1.1.2 christos if ((signed_word) GPR[rs] != (signed_word) EXTEND16 (immediate)) 1294 1.1.1.2 christos SignalException (Trap, instruction_0); 1295 1.1.1.2 christos } 1296 1.1.1.2 christos 1297 1.1.1.2 christos :function:::void:do_abs_fmt:int fmt, int fd, int fs, address_word instruction_0 1298 1.1.1.2 christos { 1299 1.1.1.2 christos check_fpu (SD_); 1300 1.1.1.2 christos check_fmt_p (SD_, fmt, instruction_0); 1301 1.1.1.2 christos StoreFPR (fd, fmt, AbsoluteValue (ValueFPR (fs, fmt), fmt)); 1302 1.1.1.2 christos } 1303 1.1.1.2 christos 1304 1.1.1.2 christos :function:::void:do_add_fmt:int fmt, int fd, int fs, int ft, address_word instruction_0 1305 1.1.1.2 christos { 1306 1.1.1.2 christos check_fpu (SD_); 1307 1.1.1.2 christos check_fmt_p (SD_, fmt, instruction_0); 1308 1.1.1.2 christos StoreFPR (fd, fmt, Add (ValueFPR (fs, fmt), ValueFPR (ft, fmt), fmt)); 1309 1.1.1.2 christos } 1310 1.1.1.2 christos 1311 1.1.1.2 christos :function:::void:do_alnv_ps:int fd, int fs, int ft, int rs, address_word instruction_0 1312 1.1.1.2 christos { 1313 1.1.1.4 christos uint64_t fsx; 1314 1.1.1.4 christos uint64_t ftx; 1315 1.1.1.4 christos uint64_t fdx; 1316 1.1.1.2 christos check_fpu (SD_); 1317 1.1.1.2 christos check_u64 (SD_, instruction_0); 1318 1.1.1.2 christos fsx = ValueFPR (fs, fmt_ps); 1319 1.1.1.2 christos if ((GPR[rs] & 0x3) != 0) 1320 1.1.1.2 christos Unpredictable (); 1321 1.1.1.2 christos if ((GPR[rs] & 0x4) == 0) 1322 1.1.1.2 christos fdx = fsx; 1323 1.1.1.2 christos else 1324 1.1.1.2 christos { 1325 1.1.1.2 christos ftx = ValueFPR (ft, fmt_ps); 1326 1.1.1.2 christos if (BigEndianCPU) 1327 1.1.1.2 christos fdx = PackPS (PSLower (fsx), PSUpper (ftx)); 1328 1.1.1.2 christos else 1329 1.1.1.2 christos fdx = PackPS (PSLower (ftx), PSUpper (fsx)); 1330 1.1.1.2 christos } 1331 1.1.1.2 christos StoreFPR (fd, fmt_ps, fdx); 1332 1.1.1.2 christos } 1333 1.1.1.2 christos 1334 1.1.1.2 christos :function:::void:do_c_cond_fmt:int cond, int fmt, int cc, int fs, int ft, address_word instruction_0 1335 1.1.1.2 christos { 1336 1.1.1.2 christos check_fpu (SD_); 1337 1.1.1.2 christos check_fmt_p (SD_, fmt, instruction_0); 1338 1.1.1.2 christos Compare (ValueFPR (fs, fmt), ValueFPR (ft, fmt), fmt, cond, cc); 1339 1.1.1.2 christos TRACE_ALU_RESULT (ValueFCR (31)); 1340 1.1.1.2 christos } 1341 1.1.1.2 christos 1342 1.1.1.2 christos :function:::void:do_ceil_fmt:int type, int fmt, int fd, int fs, address_word instruction_0 1343 1.1.1.2 christos { 1344 1.1.1.2 christos check_fpu (SD_); 1345 1.1.1.2 christos check_fmt_p (SD_, fmt, instruction_0); 1346 1.1.1.2 christos StoreFPR (fd, type, Convert (FP_RM_TOPINF, ValueFPR (fs, fmt), fmt, 1347 1.1.1.2 christos type)); 1348 1.1.1.2 christos } 1349 1.1.1.2 christos 1350 1.1.1.2 christos :function:::void:do_cfc1:int rt, int fs 1351 1.1.1.2 christos { 1352 1.1.1.2 christos check_fpu (SD_); 1353 1.1.1.2 christos if (fs == 0 || fs == 25 || fs == 26 || fs == 28 || fs == 31) 1354 1.1.1.2 christos { 1355 1.1.1.2 christos unsigned_word fcr = ValueFCR (fs); 1356 1.1.1.2 christos TRACE_ALU_INPUT1 (fcr); 1357 1.1.1.2 christos GPR[rt] = fcr; 1358 1.1.1.2 christos } 1359 1.1.1.2 christos /* else NOP */ 1360 1.1.1.2 christos TRACE_ALU_RESULT (GPR[rt]); 1361 1.1.1.2 christos } 1362 1.1.1.2 christos 1363 1.1.1.2 christos :function:::void:do_ctc1:int rt, int fs 1364 1.1.1.2 christos { 1365 1.1.1.2 christos check_fpu (SD_); 1366 1.1.1.2 christos TRACE_ALU_INPUT1 (GPR[rt]); 1367 1.1.1.2 christos if (fs == 25 || fs == 26 || fs == 28 || fs == 31) 1368 1.1.1.2 christos StoreFCR (fs, GPR[rt]); 1369 1.1.1.2 christos /* else NOP */ 1370 1.1.1.2 christos } 1371 1.1.1.2 christos 1372 1.1.1.2 christos :function:::void:do_cvt_d_fmt:int fmt, int fd, int fs, address_word instruction_0 1373 1.1.1.2 christos { 1374 1.1.1.2 christos check_fpu (SD_); 1375 1.1.1.2 christos if ((fmt == fmt_double) | 0) 1376 1.1.1.2 christos SignalException (ReservedInstruction, instruction_0); 1377 1.1.1.2 christos StoreFPR (fd, fmt_double, Convert (GETRM (), ValueFPR (fs, fmt), fmt, 1378 1.1.1.2 christos fmt_double)); 1379 1.1.1.2 christos } 1380 1.1.1.2 christos 1381 1.1.1.2 christos :function:::void:do_cvt_l_fmt:int fmt, int fd, int fs, address_word instruction_0 1382 1.1.1.2 christos { 1383 1.1.1.2 christos check_fpu (SD_); 1384 1.1.1.2 christos if ((fmt == fmt_long) | ((fmt == fmt_long) || (fmt == fmt_word))) 1385 1.1.1.2 christos SignalException (ReservedInstruction, instruction_0); 1386 1.1.1.2 christos StoreFPR (fd, fmt_long, Convert (GETRM (), ValueFPR (fs, fmt), fmt, 1387 1.1.1.2 christos fmt_long)); 1388 1.1.1.2 christos } 1389 1.1.1.2 christos 1390 1.1.1.2 christos :function:::void:do_cvt_ps_s:int fd, int fs, int ft, address_word instruction_0 1391 1.1.1.2 christos { 1392 1.1.1.2 christos check_fpu (SD_); 1393 1.1.1.2 christos check_u64 (SD_, instruction_0); 1394 1.1.1.2 christos StoreFPR (fd, fmt_ps, PackPS (ValueFPR (fs, fmt_single), 1395 1.1.1.2 christos ValueFPR (ft, fmt_single))); 1396 1.1.1.2 christos } 1397 1.1.1.2 christos 1398 1.1.1.2 christos :function:::void:do_cvt_s_fmt:int fmt, int fd, int fs, address_word instruction_0 1399 1.1.1.2 christos { 1400 1.1.1.2 christos check_fpu (SD_); 1401 1.1.1.2 christos if ((fmt == fmt_single) | 0) 1402 1.1.1.2 christos SignalException (ReservedInstruction, instruction_0); 1403 1.1.1.2 christos StoreFPR (fd, fmt_single, Convert (GETRM (), ValueFPR (fs, fmt), fmt, 1404 1.1.1.2 christos fmt_single)); 1405 1.1.1.2 christos } 1406 1.1.1.2 christos 1407 1.1.1.2 christos :function:::void:do_cvt_s_pl:int fd, int fs, address_word instruction_0 1408 1.1.1.2 christos { 1409 1.1.1.2 christos check_fpu (SD_); 1410 1.1.1.2 christos check_u64 (SD_, instruction_0); 1411 1.1.1.2 christos StoreFPR (fd, fmt_single, PSLower (ValueFPR (fs, fmt_ps))); 1412 1.1.1.2 christos } 1413 1.1.1.2 christos 1414 1.1.1.2 christos :function:::void:do_cvt_s_pu:int fd, int fs, address_word instruction_0 1415 1.1.1.2 christos { 1416 1.1.1.2 christos check_fpu (SD_); 1417 1.1.1.2 christos check_u64 (SD_, instruction_0); 1418 1.1.1.2 christos StoreFPR (fd, fmt_single, PSUpper (ValueFPR (fs, fmt_ps))); 1419 1.1.1.2 christos } 1420 1.1.1.2 christos 1421 1.1.1.2 christos :function:::void:do_cvt_w_fmt:int fmt, int fd, int fs, address_word instruction_0 1422 1.1.1.2 christos { 1423 1.1.1.2 christos check_fpu (SD_); 1424 1.1.1.2 christos if ((fmt == fmt_word) | ((fmt == fmt_long) || (fmt == fmt_word))) 1425 1.1.1.2 christos SignalException (ReservedInstruction, instruction_0); 1426 1.1.1.2 christos StoreFPR (fd, fmt_word, Convert (GETRM (), ValueFPR (fs, fmt), fmt, 1427 1.1.1.2 christos fmt_word)); 1428 1.1.1.2 christos } 1429 1.1.1.2 christos 1430 1.1.1.2 christos :function:::void:do_div_fmt:int fmt, int fd, int fs, int ft, address_word instruction_0 1431 1.1.1.2 christos { 1432 1.1.1.2 christos check_fpu (SD_); 1433 1.1.1.2 christos StoreFPR (fd, fmt, Divide (ValueFPR (fs, fmt), ValueFPR (ft, fmt), fmt)); 1434 1.1.1.2 christos } 1435 1.1.1.2 christos 1436 1.1.1.2 christos :function:::void:do_dmfc1b:int rt, int fs 1437 1.1.1.2 christos *mipsIV: 1438 1.1.1.2 christos *mipsV: 1439 1.1.1.2 christos *mips64: 1440 1.1.1.2 christos *mips64r2: 1441 1.1.1.4 christos *mips64r6: 1442 1.1.1.2 christos *vr4100: 1443 1.1.1.2 christos *vr5000: 1444 1.1.1.2 christos *r3900: 1445 1.1.1.2 christos *micromips64: 1446 1.1.1.2 christos { 1447 1.1.1.2 christos if (SizeFGR () == 64) 1448 1.1.1.2 christos GPR[rt] = FGR[fs]; 1449 1.1.1.2 christos else if ((fs & 0x1) == 0) 1450 1.1.1.2 christos GPR[rt] = SET64HI (FGR[fs+1]) | FGR[fs]; 1451 1.1.1.2 christos else 1452 1.1.1.4 christos Unpredictable (); 1453 1.1.1.2 christos TRACE_ALU_RESULT (GPR[rt]); 1454 1.1.1.2 christos } 1455 1.1.1.2 christos 1456 1.1.1.2 christos :function:::void:do_dmtc1b:int rt, int fs 1457 1.1.1.2 christos { 1458 1.1.1.2 christos if (SizeFGR () == 64) 1459 1.1.1.2 christos StoreFPR (fs, fmt_uninterpreted_64, GPR[rt]); 1460 1.1.1.2 christos else if ((fs & 0x1) == 0) 1461 1.1.1.2 christos StoreFPR (fs, fmt_uninterpreted_64, GPR[rt]); 1462 1.1.1.2 christos else 1463 1.1.1.2 christos Unpredictable (); 1464 1.1.1.2 christos } 1465 1.1.1.2 christos 1466 1.1.1.2 christos :function:::void:do_floor_fmt:int type, int fmt, int fd, int fs 1467 1.1.1.2 christos { 1468 1.1.1.2 christos check_fpu (SD_); 1469 1.1.1.2 christos StoreFPR (fd, type, Convert (FP_RM_TOMINF, ValueFPR (fs, fmt), fmt, 1470 1.1.1.2 christos type)); 1471 1.1.1.2 christos } 1472 1.1.1.2 christos 1473 1.1.1.2 christos :function:::void:do_luxc1_32:int fd, int rindex, int rbase 1474 1.1.1.2 christos *mips32r2: 1475 1.1.1.2 christos *micromips32: 1476 1.1.1.2 christos { 1477 1.1.1.2 christos address_word base = GPR[rbase]; 1478 1.1.1.2 christos address_word index = GPR[rindex]; 1479 1.1.1.2 christos address_word vaddr = base + index; 1480 1.1.1.2 christos check_fpu (SD_); 1481 1.1.1.2 christos if (SizeFGR () != 64) 1482 1.1.1.2 christos Unpredictable (); 1483 1.1.1.2 christos /* Arrange for the bottom 3 bits of (base + index) to be 0. */ 1484 1.1.1.2 christos if ((vaddr & 0x7) != 0) 1485 1.1.1.2 christos index -= (vaddr & 0x7); 1486 1.1.1.2 christos COP_LD (1, fd, do_load_double (SD_, base, index)); 1487 1.1.1.2 christos } 1488 1.1.1.2 christos 1489 1.1.1.2 christos :function:::void:do_luxc1_64:int fd, int rindex, int rbase 1490 1.1.1.2 christos { 1491 1.1.1.2 christos address_word base = GPR[rbase]; 1492 1.1.1.2 christos address_word index = GPR[rindex]; 1493 1.1.1.2 christos address_word vaddr = base + index; 1494 1.1.1.2 christos if (SizeFGR () != 64) 1495 1.1.1.2 christos Unpredictable (); 1496 1.1.1.2 christos /* Arrange for the bottom 3 bits of (base + index) to be 0. */ 1497 1.1.1.2 christos if ((vaddr & 0x7) != 0) 1498 1.1.1.2 christos index -= (vaddr & 0x7); 1499 1.1.1.2 christos COP_LD (1, fd, do_load (SD_, AccessLength_DOUBLEWORD, base, index)); 1500 1.1.1.2 christos 1501 1.1.1.2 christos } 1502 1.1.1.2 christos 1503 1.1.1.2 christos :function:::void:do_lwc1:int ft, int offset, int base 1504 1.1.1.2 christos { 1505 1.1.1.2 christos check_fpu (SD_); 1506 1.1.1.2 christos COP_LW (1, ft, do_load (SD_, AccessLength_WORD, GPR[base], 1507 1.1.1.2 christos EXTEND16 (offset))); 1508 1.1.1.2 christos } 1509 1.1.1.2 christos 1510 1.1.1.2 christos :function:::void:do_lwxc1:int fd, int index, int base, address_word instruction_0 1511 1.1.1.2 christos { 1512 1.1.1.2 christos check_fpu (SD_); 1513 1.1.1.2 christos check_u64 (SD_, instruction_0); 1514 1.1.1.2 christos COP_LW (1, fd, do_load (SD_, AccessLength_WORD, GPR[base], GPR[index])); 1515 1.1.1.2 christos } 1516 1.1.1.2 christos 1517 1.1.1.2 christos :function:::void:do_madd_fmt:int fmt, int fd, int fr, int fs, int ft, address_word instruction_0 1518 1.1.1.2 christos { 1519 1.1.1.2 christos check_fpu (SD_); 1520 1.1.1.2 christos check_u64 (SD_, instruction_0); 1521 1.1.1.2 christos check_fmt_p (SD_, fmt, instruction_0); 1522 1.1.1.2 christos StoreFPR (fd, fmt, MultiplyAdd (ValueFPR (fs, fmt), ValueFPR (ft, fmt), 1523 1.1.1.2 christos ValueFPR (fr, fmt), fmt)); 1524 1.1.1.2 christos } 1525 1.1.1.2 christos 1526 1.1.1.2 christos :function:::void:do_mfc1b:int rt, int fs 1527 1.1.1.2 christos { 1528 1.1.1.2 christos check_fpu (SD_); 1529 1.1.1.2 christos GPR[rt] = EXTEND32 (FGR[fs]); 1530 1.1.1.2 christos TRACE_ALU_RESULT (GPR[rt]); 1531 1.1.1.2 christos } 1532 1.1.1.2 christos 1533 1.1.1.2 christos :function:::void:do_mov_fmt:int fmt, int fd, int fs, address_word instruction_0 1534 1.1.1.2 christos { 1535 1.1.1.2 christos check_fpu (SD_); 1536 1.1.1.2 christos check_fmt_p (SD_, fmt, instruction_0); 1537 1.1.1.2 christos StoreFPR (fd, fmt, ValueFPR (fs, fmt)); 1538 1.1.1.2 christos } 1539 1.1.1.2 christos 1540 1.1.1.2 christos :function:::void:do_movtf:int tf, int rd, int rs, int cc 1541 1.1.1.2 christos { 1542 1.1.1.2 christos check_fpu (SD_); 1543 1.1.1.2 christos if (GETFCC(cc) == tf) 1544 1.1.1.2 christos GPR[rd] = GPR[rs]; 1545 1.1.1.2 christos } 1546 1.1.1.2 christos 1547 1.1.1.2 christos :function:::void:do_movtf_fmt:int tf, int fmt, int fd, int fs, int cc 1548 1.1.1.2 christos { 1549 1.1.1.2 christos check_fpu (SD_); 1550 1.1.1.2 christos if (fmt != fmt_ps) 1551 1.1.1.2 christos { 1552 1.1.1.2 christos if (GETFCC(cc) == tf) 1553 1.1.1.2 christos StoreFPR (fd, fmt, ValueFPR (fs, fmt)); 1554 1.1.1.2 christos else 1555 1.1.1.2 christos StoreFPR (fd, fmt, ValueFPR (fd, fmt)); /* set fmt */ 1556 1.1.1.2 christos } 1557 1.1.1.2 christos else 1558 1.1.1.2 christos { 1559 1.1.1.4 christos uint64_t fdx; 1560 1.1.1.2 christos fdx = PackPS (PSUpper (ValueFPR ((GETFCC (cc+1) == tf) ? fs : fd, 1561 1.1.1.2 christos fmt_ps)), 1562 1.1.1.2 christos PSLower (ValueFPR ((GETFCC (cc+0) == tf) ? fs : fd, 1563 1.1.1.2 christos fmt_ps))); 1564 1.1.1.2 christos StoreFPR (fd, fmt_ps, fdx); 1565 1.1.1.2 christos } 1566 1.1.1.2 christos } 1567 1.1.1.2 christos 1568 1.1.1.2 christos :function:::void:do_movn_fmt:int fmt, int fd, int fs, int rt 1569 1.1.1.2 christos { 1570 1.1.1.2 christos check_fpu (SD_); 1571 1.1.1.2 christos if (GPR[rt] != 0) 1572 1.1.1.2 christos StoreFPR (fd, fmt, ValueFPR (fs, fmt)); 1573 1.1.1.2 christos else 1574 1.1.1.2 christos StoreFPR (fd, fmt, ValueFPR (fd, fmt)); 1575 1.1.1.2 christos } 1576 1.1.1.2 christos 1577 1.1.1.2 christos :function:::void:do_movz_fmt:int fmt, int fd, int fs, int rt 1578 1.1.1.2 christos { 1579 1.1.1.2 christos check_fpu (SD_); 1580 1.1.1.2 christos if (GPR[rt] == 0) 1581 1.1.1.2 christos StoreFPR (fd, fmt, ValueFPR (fs, fmt)); 1582 1.1.1.2 christos else 1583 1.1.1.2 christos StoreFPR (fd, fmt, ValueFPR (fd, fmt)); 1584 1.1.1.2 christos } 1585 1.1.1.2 christos 1586 1.1.1.2 christos :function:::void:do_msub_fmt:int fmt, int fd, int fr, int fs, int ft, address_word instruction_0 1587 1.1.1.2 christos { 1588 1.1.1.2 christos check_fpu (SD_); 1589 1.1.1.2 christos check_u64 (SD_, instruction_0); 1590 1.1.1.2 christos check_fmt_p (SD_, fmt, instruction_0); 1591 1.1.1.2 christos StoreFPR (fd, fmt, MultiplySub (ValueFPR (fs, fmt), ValueFPR (ft, fmt), 1592 1.1.1.2 christos ValueFPR (fr, fmt), fmt)); 1593 1.1.1.2 christos } 1594 1.1.1.2 christos 1595 1.1.1.2 christos :function:::void:do_mtc1b:int rt, int fs 1596 1.1.1.2 christos { 1597 1.1.1.2 christos check_fpu (SD_); 1598 1.1.1.2 christos StoreFPR (fs, fmt_uninterpreted_32, VL4_8 (GPR[rt])); 1599 1.1.1.2 christos } 1600 1.1.1.2 christos 1601 1.1.1.2 christos :function:::void:do_mul_fmt:int fmt, int fd, int fs, int ft, address_word instruction_0 1602 1.1.1.2 christos { 1603 1.1.1.2 christos check_fpu (SD_); 1604 1.1.1.2 christos check_fmt_p (SD_, fmt, instruction_0); 1605 1.1.1.2 christos StoreFPR (fd, fmt, Multiply (ValueFPR (fs, fmt), ValueFPR (ft, fmt), fmt)); 1606 1.1.1.2 christos } 1607 1.1.1.2 christos 1608 1.1.1.2 christos :function:::void:do_neg_fmt:int fmt, int fd, int fs, address_word instruction_0 1609 1.1.1.2 christos { 1610 1.1.1.2 christos check_fpu (SD_); 1611 1.1.1.2 christos check_fmt_p (SD_, fmt, instruction_0); 1612 1.1.1.2 christos StoreFPR (fd, fmt, Negate (ValueFPR (fs, fmt), fmt)); 1613 1.1.1.2 christos } 1614 1.1.1.2 christos 1615 1.1.1.2 christos :function:::void:do_nmadd_fmt:int fmt, int fd, int fr, int fs, int ft, address_word instruction_0 1616 1.1.1.2 christos { 1617 1.1.1.2 christos check_fpu (SD_); 1618 1.1.1.2 christos check_u64 (SD_, instruction_0); 1619 1.1.1.2 christos check_fmt_p (SD_, fmt, instruction_0); 1620 1.1.1.2 christos StoreFPR (fd, fmt, NegMultiplyAdd (ValueFPR (fs, fmt), ValueFPR (ft, fmt), 1621 1.1.1.2 christos ValueFPR (fr, fmt), fmt)); 1622 1.1.1.2 christos } 1623 1.1.1.2 christos 1624 1.1.1.2 christos :function:::void:do_nmsub_fmt:int fmt, int fd, int fr, int fs, int ft, address_word instruction_0 1625 1.1.1.2 christos { 1626 1.1.1.2 christos check_fpu (SD_); 1627 1.1.1.2 christos check_u64 (SD_, instruction_0); 1628 1.1.1.2 christos check_fmt_p (SD_, fmt, instruction_0); 1629 1.1.1.2 christos StoreFPR (fd, fmt, NegMultiplySub (ValueFPR (fs, fmt), ValueFPR (ft, fmt), 1630 1.1.1.2 christos ValueFPR (fr, fmt), fmt)); 1631 1.1.1.2 christos } 1632 1.1.1.2 christos 1633 1.1.1.2 christos :function:::void:do_pll_ps:int fd, int fs, int ft, address_word instruction_0 1634 1.1.1.2 christos { 1635 1.1.1.2 christos check_fpu (SD_); 1636 1.1.1.2 christos check_u64 (SD_, instruction_0); 1637 1.1.1.2 christos StoreFPR (fd, fmt_ps, PackPS (PSLower (ValueFPR (fs, fmt_ps)), 1638 1.1.1.2 christos PSLower (ValueFPR (ft, fmt_ps)))); 1639 1.1.1.2 christos } 1640 1.1.1.2 christos 1641 1.1.1.2 christos :function:::void:do_plu_ps:int fd, int fs, int ft, address_word instruction_0 1642 1.1.1.2 christos { 1643 1.1.1.2 christos check_fpu (SD_); 1644 1.1.1.2 christos check_u64 (SD_, instruction_0); 1645 1.1.1.2 christos StoreFPR (fd, fmt_ps, PackPS (PSLower (ValueFPR (fs, fmt_ps)), 1646 1.1.1.2 christos PSUpper (ValueFPR (ft, fmt_ps)))); 1647 1.1.1.2 christos } 1648 1.1.1.2 christos 1649 1.1.1.2 christos :function:::void:do_pul_ps:int fd, int fs, int ft, address_word instruction_0 1650 1.1.1.2 christos { 1651 1.1.1.2 christos check_fpu (SD_); 1652 1.1.1.2 christos check_u64 (SD_, instruction_0); 1653 1.1.1.2 christos StoreFPR (fd, fmt_ps, PackPS (PSUpper (ValueFPR (fs, fmt_ps)), 1654 1.1.1.2 christos PSLower (ValueFPR (ft, fmt_ps)))); 1655 1.1.1.2 christos } 1656 1.1.1.2 christos 1657 1.1.1.2 christos :function:::void:do_puu_ps:int fd, int fs, int ft, address_word instruction_0 1658 1.1 christos { 1659 1.1.1.2 christos check_fpu (SD_); 1660 1.1.1.2 christos check_u64 (SD_, instruction_0); 1661 1.1.1.2 christos StoreFPR (fd, fmt_ps, PackPS (PSUpper (ValueFPR (fs, fmt_ps)), 1662 1.1.1.2 christos PSUpper (ValueFPR (ft, fmt_ps)))); 1663 1.1.1.2 christos } 1664 1.1.1.2 christos 1665 1.1.1.2 christos :function:::void:do_recip_fmt:int fmt, int fd, int fs 1666 1.1.1.2 christos { 1667 1.1.1.2 christos check_fpu (SD_); 1668 1.1.1.2 christos StoreFPR (fd, fmt, Recip (ValueFPR (fs, fmt), fmt)); 1669 1.1.1.2 christos } 1670 1.1.1.2 christos 1671 1.1.1.2 christos :function:::void:do_round_fmt:int type, int fmt, int fd, int fs 1672 1.1.1.2 christos { 1673 1.1.1.2 christos check_fpu (SD_); 1674 1.1.1.2 christos StoreFPR (fd, type, Convert (FP_RM_NEAREST, ValueFPR (fs, fmt), fmt, 1675 1.1.1.2 christos type)); 1676 1.1 christos } 1677 1.1 christos 1678 1.1.1.2 christos :function:::void:do_rsqrt_fmt:int fmt, int fd, int fs 1679 1.1.1.2 christos { 1680 1.1.1.2 christos check_fpu (SD_); 1681 1.1.1.2 christos StoreFPR (fd, fmt, RSquareRoot (ValueFPR (fs, fmt), fmt)); 1682 1.1.1.2 christos } 1683 1.1 christos 1684 1.1.1.2 christos :function:::void:do_prefx:int hint, int rindex, int rbase 1685 1.1.1.2 christos { 1686 1.1.1.5 christos /* 1687 1.1.1.2 christos address_word base = GPR[rbase]; 1688 1.1.1.2 christos address_word index = GPR[rindex]; 1689 1.1.1.5 christos address_word vaddr = loadstore_ea (SD_, base, index); 1690 1.1.1.5 christos address_word paddr = vaddr; 1691 1.1.1.5 christos Prefetch (paddr, vaddr, isDATA, hint); 1692 1.1.1.5 christos */ 1693 1.1.1.2 christos } 1694 1.1 christos 1695 1.1.1.2 christos :function:::void:do_sdc1:int ft, int offset, int base 1696 1.1.1.2 christos *mipsII: 1697 1.1.1.2 christos *mips32: 1698 1.1.1.2 christos *mips32r2: 1699 1.1.1.4 christos *mips32r6: 1700 1.1.1.2 christos *micromips32: 1701 1.1.1.2 christos { 1702 1.1.1.2 christos check_fpu (SD_); 1703 1.1.1.2 christos do_store_double (SD_, GPR[base], EXTEND16 (offset), COP_SD (1, ft)); 1704 1.1.1.2 christos } 1705 1.1.1.2 christos 1706 1.1.1.2 christos :function:::void:do_suxc1_32:int fs, int rindex, int rbase 1707 1.1.1.2 christos *mips32r2: 1708 1.1.1.2 christos *micromips32: 1709 1.1.1.2 christos { 1710 1.1.1.2 christos address_word base = GPR[rbase]; 1711 1.1.1.2 christos address_word index = GPR[rindex]; 1712 1.1.1.2 christos address_word vaddr = base + index; 1713 1.1.1.2 christos check_fpu (SD_); 1714 1.1.1.2 christos if (SizeFGR () != 64) 1715 1.1.1.2 christos Unpredictable (); 1716 1.1.1.2 christos /* Arrange for the bottom 3 bits of (base + index) to be 0. */ 1717 1.1.1.2 christos if ((vaddr & 0x7) != 0) 1718 1.1.1.2 christos index -= (vaddr & 0x7); 1719 1.1.1.2 christos do_store_double (SD_, base, index, COP_SD (1, fs)); 1720 1.1.1.2 christos } 1721 1.1.1.2 christos 1722 1.1.1.2 christos :function:::void:do_suxc1_64:int fs, int rindex, int rbase 1723 1.1.1.2 christos { 1724 1.1.1.2 christos address_word base = GPR[rbase]; 1725 1.1.1.2 christos address_word index = GPR[rindex]; 1726 1.1.1.2 christos address_word vaddr = base + index; 1727 1.1.1.2 christos if (SizeFGR () != 64) 1728 1.1.1.2 christos Unpredictable (); 1729 1.1.1.2 christos /* Arrange for the bottom 3 bits of (base + index) to be 0. */ 1730 1.1.1.2 christos if ((vaddr & 0x7) != 0) 1731 1.1.1.2 christos index -= (vaddr & 0x7); 1732 1.1.1.2 christos do_store (SD_, AccessLength_DOUBLEWORD, base, index, COP_SD (1, fs)); 1733 1.1.1.2 christos } 1734 1.1.1.2 christos 1735 1.1.1.2 christos :function:::void:do_sqrt_fmt:int fmt, int fd, int fs 1736 1.1.1.2 christos { 1737 1.1.1.2 christos check_fpu (SD_); 1738 1.1.1.2 christos StoreFPR (fd, fmt, (SquareRoot (ValueFPR (fs, fmt), fmt))); 1739 1.1.1.2 christos } 1740 1.1.1.2 christos 1741 1.1.1.2 christos :function:::void:do_sub_fmt:int fmt, int fd, int fs, int ft, address_word instruction_0 1742 1.1.1.2 christos { 1743 1.1.1.2 christos check_fpu (SD_); 1744 1.1.1.2 christos check_fmt_p (SD_, fmt, instruction_0); 1745 1.1.1.2 christos StoreFPR (fd, fmt, Sub (ValueFPR (fs, fmt), ValueFPR (ft, fmt), fmt)); 1746 1.1.1.2 christos } 1747 1.1.1.2 christos 1748 1.1.1.2 christos :function:::void:do_swc1:int ft, int roffset, int rbase, address_word instruction_0 1749 1.1.1.2 christos { 1750 1.1.1.2 christos address_word base = GPR[rbase]; 1751 1.1.1.2 christos address_word offset = EXTEND16 (roffset); 1752 1.1.1.2 christos check_fpu (SD_); 1753 1.1.1.2 christos { 1754 1.1.1.2 christos address_word vaddr = loadstore_ea (SD_, base, offset); 1755 1.1.1.2 christos address_word paddr = vaddr; 1756 1.1.1.2 christos 1757 1.1.1.2 christos if ((vaddr & 3) != 0) 1758 1.1.1.2 christos { 1759 1.1.1.2 christos SIM_CORE_SIGNAL (SD, CPU, cia, read_map, AccessLength_WORD+1, vaddr, 1760 1.1.1.2 christos write_transfer, sim_core_unaligned_signal); 1761 1.1.1.2 christos } 1762 1.1.1.2 christos else 1763 1.1.1.2 christos { 1764 1.1.1.2 christos uword64 memval = 0; 1765 1.1.1.2 christos uword64 memval1 = 0; 1766 1.1.1.2 christos uword64 mask = (WITH_TARGET_WORD_BITSIZE == 64 ? 0x7 : 0x3); 1767 1.1.1.2 christos address_word reverseendian = 1768 1.1.1.2 christos (ReverseEndian ? (mask ^ AccessLength_WORD) : 0); 1769 1.1.1.2 christos address_word bigendiancpu = 1770 1.1.1.2 christos (BigEndianCPU ? (mask ^ AccessLength_WORD) : 0); 1771 1.1.1.2 christos unsigned int byte; 1772 1.1.1.2 christos paddr = ((paddr & ~mask) | ((paddr & mask) ^ reverseendian)); 1773 1.1.1.2 christos byte = ((vaddr & mask) ^ bigendiancpu); 1774 1.1.1.2 christos memval = (((uword64)COP_SW(1, ft)) << (8 * byte)); 1775 1.1.1.2 christos StoreMemory (AccessLength_WORD, memval, memval1, paddr, vaddr, isREAL); 1776 1.1.1.2 christos } 1777 1.1.1.2 christos } 1778 1.1.1.2 christos } 1779 1.1 christos 1780 1.1.1.2 christos :function:::void:do_swxc1:int fs, int rindex, int rbase, address_word instruction_0 1781 1.1.1.2 christos { 1782 1.1.1.2 christos address_word base = GPR[rbase]; 1783 1.1.1.2 christos address_word index = GPR[rindex]; 1784 1.1.1.2 christos check_fpu (SD_); 1785 1.1.1.2 christos check_u64 (SD_, instruction_0); 1786 1.1.1.2 christos { 1787 1.1.1.2 christos address_word vaddr = loadstore_ea (SD_, base, index); 1788 1.1.1.2 christos address_word paddr = vaddr; 1789 1.1.1.2 christos 1790 1.1.1.2 christos if ((vaddr & 3) != 0) 1791 1.1.1.2 christos { 1792 1.1.1.2 christos SIM_CORE_SIGNAL (SD, CPU, cia, read_map, 4, vaddr, write_transfer, 1793 1.1.1.2 christos sim_core_unaligned_signal); 1794 1.1.1.2 christos } 1795 1.1.1.2 christos else 1796 1.1.1.2 christos { 1797 1.1.1.4 christos uint64_t memval = 0; 1798 1.1.1.4 christos uint64_t memval1 = 0; 1799 1.1.1.4 christos uint64_t mask = (WITH_TARGET_WORD_BITSIZE == 64 ? 0x7 : 0x3); 1800 1.1.1.2 christos address_word reverseendian = 1801 1.1.1.2 christos (ReverseEndian ? (mask ^ AccessLength_WORD) : 0); 1802 1.1.1.2 christos address_word bigendiancpu = 1803 1.1.1.2 christos (BigEndianCPU ? (mask ^ AccessLength_WORD) : 0); 1804 1.1.1.2 christos unsigned int byte; 1805 1.1.1.2 christos paddr = ((paddr & ~mask) | ((paddr & mask) ^ reverseendian)); 1806 1.1.1.2 christos byte = ((vaddr & mask) ^ bigendiancpu); 1807 1.1.1.4 christos memval = (((uint64_t)COP_SW(1,fs)) << (8 * byte)); 1808 1.1.1.2 christos StoreMemory (AccessLength_WORD, memval, memval1, paddr, vaddr, 1809 1.1.1.2 christos isREAL); 1810 1.1.1.2 christos } 1811 1.1.1.2 christos } 1812 1.1.1.2 christos } 1813 1.1 christos 1814 1.1.1.2 christos :function:::void:do_trunc_fmt:int type, int fmt, int fd, int fs 1815 1.1.1.2 christos { 1816 1.1.1.2 christos check_fpu (SD_); 1817 1.1.1.2 christos StoreFPR (fd, type, Convert (FP_RM_TOZERO, ValueFPR (fs, fmt), fmt, 1818 1.1.1.2 christos type)); 1819 1.1.1.2 christos } 1820 1.1 christos 1821 1.1 christos 000000,5.RS,5.RT,5.RD,00000,100000:SPECIAL:32::ADD 1822 1.1 christos "add r<RD>, r<RS>, r<RT>" 1823 1.1 christos *mipsI: 1824 1.1 christos *mipsII: 1825 1.1 christos *mipsIII: 1826 1.1 christos *mipsIV: 1827 1.1 christos *mipsV: 1828 1.1 christos *mips32: 1829 1.1 christos *mips32r2: 1830 1.1.1.4 christos *mips32r6: 1831 1.1 christos *mips64: 1832 1.1 christos *mips64r2: 1833 1.1.1.4 christos *mips64r6: 1834 1.1 christos *vr4100: 1835 1.1 christos *vr5000: 1836 1.1 christos *r3900: 1837 1.1 christos { 1838 1.1.1.2 christos do_add (SD_, RS, RT, RD); 1839 1.1 christos } 1840 1.1 christos 1841 1.1 christos 1842 1.1 christos 1843 1.1 christos 001000,5.RS,5.RT,16.IMMEDIATE:NORMAL:32::ADDI 1844 1.1 christos "addi r<RT>, r<RS>, <IMMEDIATE>" 1845 1.1 christos *mipsI: 1846 1.1 christos *mipsII: 1847 1.1 christos *mipsIII: 1848 1.1 christos *mipsIV: 1849 1.1 christos *mipsV: 1850 1.1 christos *mips32: 1851 1.1 christos *mips32r2: 1852 1.1 christos *mips64: 1853 1.1 christos *mips64r2: 1854 1.1 christos *vr4100: 1855 1.1 christos *vr5000: 1856 1.1 christos *r3900: 1857 1.1 christos { 1858 1.1.1.2 christos do_addi (SD_, RS, RT, IMMEDIATE); 1859 1.1 christos } 1860 1.1 christos 1861 1.1 christos 1862 1.1 christos 1863 1.1.1.4 christos :function:::void:do_addiu:int rs, int rt, uint16_t immediate 1864 1.1 christos { 1865 1.1 christos if (NotWordValue (GPR[rs])) 1866 1.1 christos Unpredictable (); 1867 1.1 christos TRACE_ALU_INPUT2 (GPR[rs], EXTEND16 (immediate)); 1868 1.1 christos GPR[rt] = EXTEND32 (GPR[rs] + EXTEND16 (immediate)); 1869 1.1 christos TRACE_ALU_RESULT (GPR[rt]); 1870 1.1 christos } 1871 1.1 christos 1872 1.1 christos 001001,5.RS,5.RT,16.IMMEDIATE:NORMAL:32::ADDIU 1873 1.1 christos "addiu r<RT>, r<RS>, <IMMEDIATE>" 1874 1.1 christos *mipsI: 1875 1.1 christos *mipsII: 1876 1.1 christos *mipsIII: 1877 1.1 christos *mipsIV: 1878 1.1 christos *mipsV: 1879 1.1 christos *mips32: 1880 1.1 christos *mips32r2: 1881 1.1.1.4 christos *mips32r6: 1882 1.1 christos *mips64: 1883 1.1 christos *mips64r2: 1884 1.1.1.4 christos *mips64r6: 1885 1.1 christos *vr4100: 1886 1.1 christos *vr5000: 1887 1.1 christos *r3900: 1888 1.1 christos { 1889 1.1 christos do_addiu (SD_, RS, RT, IMMEDIATE); 1890 1.1 christos } 1891 1.1 christos 1892 1.1 christos 1893 1.1 christos 1894 1.1 christos :function:::void:do_addu:int rs, int rt, int rd 1895 1.1 christos { 1896 1.1 christos if (NotWordValue (GPR[rs]) || NotWordValue (GPR[rt])) 1897 1.1 christos Unpredictable (); 1898 1.1 christos TRACE_ALU_INPUT2 (GPR[rs], GPR[rt]); 1899 1.1 christos GPR[rd] = EXTEND32 (GPR[rs] + GPR[rt]); 1900 1.1 christos TRACE_ALU_RESULT (GPR[rd]); 1901 1.1 christos } 1902 1.1 christos 1903 1.1 christos 000000,5.RS,5.RT,5.RD,00000,100001:SPECIAL:32::ADDU 1904 1.1 christos "addu r<RD>, r<RS>, r<RT>" 1905 1.1 christos *mipsI: 1906 1.1 christos *mipsII: 1907 1.1 christos *mipsIII: 1908 1.1 christos *mipsIV: 1909 1.1 christos *mipsV: 1910 1.1 christos *mips32: 1911 1.1 christos *mips32r2: 1912 1.1.1.4 christos *mips32r6: 1913 1.1 christos *mips64: 1914 1.1 christos *mips64r2: 1915 1.1.1.4 christos *mips64r6: 1916 1.1 christos *vr4100: 1917 1.1 christos *vr5000: 1918 1.1 christos *r3900: 1919 1.1 christos { 1920 1.1 christos do_addu (SD_, RS, RT, RD); 1921 1.1 christos } 1922 1.1 christos 1923 1.1 christos 1924 1.1 christos 1925 1.1 christos :function:::void:do_and:int rs, int rt, int rd 1926 1.1 christos { 1927 1.1 christos TRACE_ALU_INPUT2 (GPR[rs], GPR[rt]); 1928 1.1 christos GPR[rd] = GPR[rs] & GPR[rt]; 1929 1.1 christos TRACE_ALU_RESULT (GPR[rd]); 1930 1.1 christos } 1931 1.1 christos 1932 1.1 christos 000000,5.RS,5.RT,5.RD,00000,100100:SPECIAL:32::AND 1933 1.1 christos "and r<RD>, r<RS>, r<RT>" 1934 1.1 christos *mipsI: 1935 1.1 christos *mipsII: 1936 1.1 christos *mipsIII: 1937 1.1 christos *mipsIV: 1938 1.1 christos *mipsV: 1939 1.1 christos *mips32: 1940 1.1 christos *mips32r2: 1941 1.1.1.4 christos *mips32r6: 1942 1.1 christos *mips64: 1943 1.1 christos *mips64r2: 1944 1.1.1.4 christos *mips64r6: 1945 1.1 christos *vr4100: 1946 1.1 christos *vr5000: 1947 1.1 christos *r3900: 1948 1.1 christos { 1949 1.1 christos do_and (SD_, RS, RT, RD); 1950 1.1 christos } 1951 1.1 christos 1952 1.1 christos 1953 1.1 christos 1954 1.1 christos 001100,5.RS,5.RT,16.IMMEDIATE:NORMAL:32::ANDI 1955 1.1 christos "andi r<RT>, r<RS>, %#lx<IMMEDIATE>" 1956 1.1 christos *mipsI: 1957 1.1 christos *mipsII: 1958 1.1 christos *mipsIII: 1959 1.1 christos *mipsIV: 1960 1.1 christos *mipsV: 1961 1.1 christos *mips32: 1962 1.1 christos *mips32r2: 1963 1.1.1.4 christos *mips32r6: 1964 1.1 christos *mips64: 1965 1.1 christos *mips64r2: 1966 1.1.1.4 christos *mips64r6: 1967 1.1 christos *vr4100: 1968 1.1 christos *vr5000: 1969 1.1 christos *r3900: 1970 1.1 christos { 1971 1.1.1.2 christos do_andi (SD_,RS, RT, IMMEDIATE); 1972 1.1 christos } 1973 1.1 christos 1974 1.1 christos 1975 1.1 christos 1976 1.1 christos 000100,5.RS,5.RT,16.OFFSET:NORMAL:32::BEQ 1977 1.1 christos "beq r<RS>, r<RT>, <OFFSET>" 1978 1.1 christos *mipsI: 1979 1.1 christos *mipsII: 1980 1.1 christos *mipsIII: 1981 1.1 christos *mipsIV: 1982 1.1 christos *mipsV: 1983 1.1 christos *mips32: 1984 1.1 christos *mips32r2: 1985 1.1 christos *mips64: 1986 1.1 christos *mips64r2: 1987 1.1 christos *vr4100: 1988 1.1 christos *vr5000: 1989 1.1 christos *r3900: 1990 1.1 christos { 1991 1.1 christos address_word offset = EXTEND16 (OFFSET) << 2; 1992 1.1 christos if ((signed_word) GPR[RS] == (signed_word) GPR[RT]) 1993 1.1 christos { 1994 1.1 christos DELAY_SLOT (NIA + offset); 1995 1.1 christos } 1996 1.1 christos } 1997 1.1 christos 1998 1.1 christos 1999 1.1.1.4 christos 000100,5.RS,5.RT,16.OFFSET:R6:32::BEQ 2000 1.1.1.4 christos "beq r<RS>, r<RT>, <OFFSET>" 2001 1.1.1.4 christos *mips32r6: 2002 1.1.1.4 christos *mips64r6: 2003 1.1.1.4 christos { 2004 1.1.1.4 christos address_word offset = EXTEND16 (OFFSET) << 2; 2005 1.1.1.4 christos if (GPR[RS] == GPR[RT]) 2006 1.1.1.4 christos DELAY_SLOT (NIA + offset); 2007 1.1.1.4 christos else 2008 1.1.1.4 christos FORBIDDEN_SLOT (); 2009 1.1.1.4 christos } 2010 1.1 christos 2011 1.1 christos 010100,5.RS,5.RT,16.OFFSET:NORMAL:32::BEQL 2012 1.1 christos "beql r<RS>, r<RT>, <OFFSET>" 2013 1.1 christos *mipsII: 2014 1.1 christos *mipsIII: 2015 1.1 christos *mipsIV: 2016 1.1 christos *mipsV: 2017 1.1 christos *mips32: 2018 1.1 christos *mips32r2: 2019 1.1 christos *mips64: 2020 1.1 christos *mips64r2: 2021 1.1 christos *vr4100: 2022 1.1 christos *vr5000: 2023 1.1 christos *r3900: 2024 1.1 christos { 2025 1.1 christos address_word offset = EXTEND16 (OFFSET) << 2; 2026 1.1 christos if ((signed_word) GPR[RS] == (signed_word) GPR[RT]) 2027 1.1 christos { 2028 1.1 christos DELAY_SLOT (NIA + offset); 2029 1.1 christos } 2030 1.1 christos else 2031 1.1 christos NULLIFY_NEXT_INSTRUCTION (); 2032 1.1 christos } 2033 1.1 christos 2034 1.1 christos 2035 1.1 christos 2036 1.1 christos 000001,5.RS,00001,16.OFFSET:REGIMM:32::BGEZ 2037 1.1 christos "bgez r<RS>, <OFFSET>" 2038 1.1 christos *mipsI: 2039 1.1 christos *mipsII: 2040 1.1 christos *mipsIII: 2041 1.1 christos *mipsIV: 2042 1.1 christos *mipsV: 2043 1.1 christos *mips32: 2044 1.1 christos *mips32r2: 2045 1.1.1.4 christos *mips32r6: 2046 1.1 christos *mips64: 2047 1.1 christos *mips64r2: 2048 1.1.1.4 christos *mips64r6: 2049 1.1 christos *vr4100: 2050 1.1 christos *vr5000: 2051 1.1 christos *r3900: 2052 1.1 christos { 2053 1.1 christos address_word offset = EXTEND16 (OFFSET) << 2; 2054 1.1 christos if ((signed_word) GPR[RS] >= 0) 2055 1.1 christos { 2056 1.1 christos DELAY_SLOT (NIA + offset); 2057 1.1 christos } 2058 1.1 christos } 2059 1.1 christos 2060 1.1 christos 2061 1.1 christos 2062 1.1 christos 000001,5.RS!31,10001,16.OFFSET:REGIMM:32::BGEZAL 2063 1.1 christos "bgezal r<RS>, <OFFSET>" 2064 1.1 christos *mipsI: 2065 1.1 christos *mipsII: 2066 1.1 christos *mipsIII: 2067 1.1 christos *mipsIV: 2068 1.1 christos *mipsV: 2069 1.1 christos *mips32: 2070 1.1 christos *mips32r2: 2071 1.1 christos *mips64: 2072 1.1 christos *mips64r2: 2073 1.1 christos *vr4100: 2074 1.1 christos *vr5000: 2075 1.1 christos *r3900: 2076 1.1 christos { 2077 1.1 christos address_word offset = EXTEND16 (OFFSET) << 2; 2078 1.1 christos if (RS == 31) 2079 1.1 christos Unpredictable (); 2080 1.1 christos RA = (CIA + 8); 2081 1.1 christos if ((signed_word) GPR[RS] >= 0) 2082 1.1 christos { 2083 1.1 christos DELAY_SLOT (NIA + offset); 2084 1.1 christos } 2085 1.1 christos } 2086 1.1 christos 2087 1.1.1.4 christos 000001,00000,10001,16.OFFSET:REGIMM:32::BAL 2088 1.1.1.4 christos "bal <OFFSET>" 2089 1.1.1.4 christos *mips32r6: 2090 1.1.1.4 christos *mips64r6: 2091 1.1.1.4 christos { 2092 1.1.1.4 christos address_word offset = EXTEND16 (OFFSET) << 2; 2093 1.1.1.4 christos RA = (CIA + 8); 2094 1.1.1.4 christos DELAY_SLOT (NIA + offset); 2095 1.1.1.4 christos } 2096 1.1 christos 2097 1.1 christos 000001,5.RS!31,10011,16.OFFSET:REGIMM:32::BGEZALL 2098 1.1 christos "bgezall r<RS>, <OFFSET>" 2099 1.1 christos *mipsII: 2100 1.1 christos *mipsIII: 2101 1.1 christos *mipsIV: 2102 1.1 christos *mipsV: 2103 1.1 christos *mips32: 2104 1.1 christos *mips32r2: 2105 1.1 christos *mips64: 2106 1.1 christos *mips64r2: 2107 1.1 christos *vr4100: 2108 1.1 christos *vr5000: 2109 1.1 christos *r3900: 2110 1.1 christos { 2111 1.1 christos address_word offset = EXTEND16 (OFFSET) << 2; 2112 1.1 christos if (RS == 31) 2113 1.1 christos Unpredictable (); 2114 1.1 christos RA = (CIA + 8); 2115 1.1 christos /* NOTE: The branch occurs AFTER the next instruction has been 2116 1.1 christos executed */ 2117 1.1 christos if ((signed_word) GPR[RS] >= 0) 2118 1.1 christos { 2119 1.1 christos DELAY_SLOT (NIA + offset); 2120 1.1 christos } 2121 1.1 christos else 2122 1.1 christos NULLIFY_NEXT_INSTRUCTION (); 2123 1.1 christos } 2124 1.1 christos 2125 1.1 christos 2126 1.1 christos 2127 1.1 christos 000001,5.RS,00011,16.OFFSET:REGIMM:32::BGEZL 2128 1.1 christos "bgezl r<RS>, <OFFSET>" 2129 1.1 christos *mipsII: 2130 1.1 christos *mipsIII: 2131 1.1 christos *mipsIV: 2132 1.1 christos *mipsV: 2133 1.1 christos *mips32: 2134 1.1 christos *mips32r2: 2135 1.1 christos *mips64: 2136 1.1 christos *mips64r2: 2137 1.1 christos *vr4100: 2138 1.1 christos *vr5000: 2139 1.1 christos *r3900: 2140 1.1 christos { 2141 1.1 christos address_word offset = EXTEND16 (OFFSET) << 2; 2142 1.1 christos if ((signed_word) GPR[RS] >= 0) 2143 1.1 christos { 2144 1.1 christos DELAY_SLOT (NIA + offset); 2145 1.1 christos } 2146 1.1 christos else 2147 1.1 christos NULLIFY_NEXT_INSTRUCTION (); 2148 1.1 christos } 2149 1.1 christos 2150 1.1 christos 2151 1.1 christos 2152 1.1 christos 000111,5.RS,00000,16.OFFSET:NORMAL:32::BGTZ 2153 1.1 christos "bgtz r<RS>, <OFFSET>" 2154 1.1 christos *mipsI: 2155 1.1 christos *mipsII: 2156 1.1 christos *mipsIII: 2157 1.1 christos *mipsIV: 2158 1.1 christos *mipsV: 2159 1.1 christos *mips32: 2160 1.1 christos *mips32r2: 2161 1.1.1.4 christos *mips32r6: 2162 1.1 christos *mips64: 2163 1.1 christos *mips64r2: 2164 1.1.1.4 christos *mips64r6: 2165 1.1 christos *vr4100: 2166 1.1 christos *vr5000: 2167 1.1 christos *r3900: 2168 1.1 christos { 2169 1.1 christos address_word offset = EXTEND16 (OFFSET) << 2; 2170 1.1 christos if ((signed_word) GPR[RS] > 0) 2171 1.1 christos { 2172 1.1 christos DELAY_SLOT (NIA + offset); 2173 1.1 christos } 2174 1.1 christos } 2175 1.1 christos 2176 1.1 christos 2177 1.1 christos 2178 1.1 christos 010111,5.RS,00000,16.OFFSET:NORMAL:32::BGTZL 2179 1.1 christos "bgtzl r<RS>, <OFFSET>" 2180 1.1 christos *mipsII: 2181 1.1 christos *mipsIII: 2182 1.1 christos *mipsIV: 2183 1.1 christos *mipsV: 2184 1.1 christos *mips32: 2185 1.1 christos *mips32r2: 2186 1.1 christos *mips64: 2187 1.1 christos *mips64r2: 2188 1.1 christos *vr4100: 2189 1.1 christos *vr5000: 2190 1.1 christos *r3900: 2191 1.1 christos { 2192 1.1 christos address_word offset = EXTEND16 (OFFSET) << 2; 2193 1.1 christos /* NOTE: The branch occurs AFTER the next instruction has been 2194 1.1 christos executed */ 2195 1.1 christos if ((signed_word) GPR[RS] > 0) 2196 1.1 christos { 2197 1.1 christos DELAY_SLOT (NIA + offset); 2198 1.1 christos } 2199 1.1 christos else 2200 1.1 christos NULLIFY_NEXT_INSTRUCTION (); 2201 1.1 christos } 2202 1.1 christos 2203 1.1 christos 2204 1.1 christos 2205 1.1 christos 000110,5.RS,00000,16.OFFSET:NORMAL:32::BLEZ 2206 1.1 christos "blez r<RS>, <OFFSET>" 2207 1.1 christos *mipsI: 2208 1.1 christos *mipsII: 2209 1.1 christos *mipsIII: 2210 1.1 christos *mipsIV: 2211 1.1 christos *mipsV: 2212 1.1 christos *mips32: 2213 1.1 christos *mips32r2: 2214 1.1.1.4 christos *mips32r6: 2215 1.1 christos *mips64: 2216 1.1 christos *mips64r2: 2217 1.1.1.4 christos *mips64r6: 2218 1.1 christos *vr4100: 2219 1.1 christos *vr5000: 2220 1.1 christos *r3900: 2221 1.1 christos { 2222 1.1 christos address_word offset = EXTEND16 (OFFSET) << 2; 2223 1.1 christos /* NOTE: The branch occurs AFTER the next instruction has been 2224 1.1 christos executed */ 2225 1.1 christos if ((signed_word) GPR[RS] <= 0) 2226 1.1 christos { 2227 1.1 christos DELAY_SLOT (NIA + offset); 2228 1.1 christos } 2229 1.1 christos } 2230 1.1 christos 2231 1.1 christos 2232 1.1 christos 2233 1.1 christos 010110,5.RS,00000,16.OFFSET:NORMAL:32::BLEZL 2234 1.1 christos "bgezl r<RS>, <OFFSET>" 2235 1.1 christos *mipsII: 2236 1.1 christos *mipsIII: 2237 1.1 christos *mipsIV: 2238 1.1 christos *mipsV: 2239 1.1 christos *mips32: 2240 1.1 christos *mips32r2: 2241 1.1 christos *mips64: 2242 1.1 christos *mips64r2: 2243 1.1 christos *vr4100: 2244 1.1 christos *vr5000: 2245 1.1 christos *r3900: 2246 1.1 christos { 2247 1.1 christos address_word offset = EXTEND16 (OFFSET) << 2; 2248 1.1 christos if ((signed_word) GPR[RS] <= 0) 2249 1.1 christos { 2250 1.1 christos DELAY_SLOT (NIA + offset); 2251 1.1 christos } 2252 1.1 christos else 2253 1.1 christos NULLIFY_NEXT_INSTRUCTION (); 2254 1.1 christos } 2255 1.1 christos 2256 1.1 christos 2257 1.1 christos 2258 1.1 christos 000001,5.RS,00000,16.OFFSET:REGIMM:32::BLTZ 2259 1.1 christos "bltz r<RS>, <OFFSET>" 2260 1.1 christos *mipsI: 2261 1.1 christos *mipsII: 2262 1.1 christos *mipsIII: 2263 1.1 christos *mipsIV: 2264 1.1 christos *mipsV: 2265 1.1 christos *mips32: 2266 1.1 christos *mips32r2: 2267 1.1.1.4 christos *mips32r6: 2268 1.1 christos *mips64: 2269 1.1 christos *mips64r2: 2270 1.1.1.4 christos *mips64r6: 2271 1.1 christos *vr4100: 2272 1.1 christos *vr5000: 2273 1.1 christos *r3900: 2274 1.1 christos { 2275 1.1 christos address_word offset = EXTEND16 (OFFSET) << 2; 2276 1.1 christos if ((signed_word) GPR[RS] < 0) 2277 1.1 christos { 2278 1.1 christos DELAY_SLOT (NIA + offset); 2279 1.1 christos } 2280 1.1 christos } 2281 1.1 christos 2282 1.1 christos 2283 1.1 christos 2284 1.1 christos 000001,5.RS!31,10000,16.OFFSET:REGIMM:32::BLTZAL 2285 1.1 christos "bltzal r<RS>, <OFFSET>" 2286 1.1 christos *mipsI: 2287 1.1 christos *mipsII: 2288 1.1 christos *mipsIII: 2289 1.1 christos *mipsIV: 2290 1.1 christos *mipsV: 2291 1.1 christos *mips32: 2292 1.1 christos *mips32r2: 2293 1.1 christos *mips64: 2294 1.1 christos *mips64r2: 2295 1.1 christos *vr4100: 2296 1.1 christos *vr5000: 2297 1.1 christos *r3900: 2298 1.1 christos { 2299 1.1 christos address_word offset = EXTEND16 (OFFSET) << 2; 2300 1.1 christos if (RS == 31) 2301 1.1 christos Unpredictable (); 2302 1.1 christos RA = (CIA + 8); 2303 1.1 christos /* NOTE: The branch occurs AFTER the next instruction has been 2304 1.1 christos executed */ 2305 1.1 christos if ((signed_word) GPR[RS] < 0) 2306 1.1 christos { 2307 1.1 christos DELAY_SLOT (NIA + offset); 2308 1.1 christos } 2309 1.1 christos } 2310 1.1 christos 2311 1.1 christos 2312 1.1 christos 2313 1.1.1.4 christos 000001,00000,10000,16.OFFSET:REGIMM:32::NAL 2314 1.1.1.4 christos "nal <OFFSET>" 2315 1.1.1.4 christos *mips32r6: 2316 1.1.1.4 christos *mips64r6: 2317 1.1.1.4 christos { 2318 1.1.1.4 christos address_word offset = EXTEND16 (OFFSET) << 2; 2319 1.1.1.4 christos RA = (CIA + 8); 2320 1.1.1.4 christos FORBIDDEN_SLOT (); 2321 1.1.1.4 christos } 2322 1.1.1.4 christos 2323 1.1.1.4 christos 2324 1.1.1.4 christos 2325 1.1 christos 000001,5.RS!31,10010,16.OFFSET:REGIMM:32::BLTZALL 2326 1.1 christos "bltzall r<RS>, <OFFSET>" 2327 1.1 christos *mipsII: 2328 1.1 christos *mipsIII: 2329 1.1 christos *mipsIV: 2330 1.1 christos *mipsV: 2331 1.1 christos *mips32: 2332 1.1 christos *mips32r2: 2333 1.1 christos *mips64: 2334 1.1 christos *mips64r2: 2335 1.1 christos *vr4100: 2336 1.1 christos *vr5000: 2337 1.1 christos *r3900: 2338 1.1 christos { 2339 1.1 christos address_word offset = EXTEND16 (OFFSET) << 2; 2340 1.1 christos if (RS == 31) 2341 1.1 christos Unpredictable (); 2342 1.1 christos RA = (CIA + 8); 2343 1.1 christos if ((signed_word) GPR[RS] < 0) 2344 1.1 christos { 2345 1.1 christos DELAY_SLOT (NIA + offset); 2346 1.1 christos } 2347 1.1 christos else 2348 1.1 christos NULLIFY_NEXT_INSTRUCTION (); 2349 1.1 christos } 2350 1.1 christos 2351 1.1 christos 2352 1.1 christos 2353 1.1 christos 000001,5.RS,00010,16.OFFSET:REGIMM:32::BLTZL 2354 1.1 christos "bltzl r<RS>, <OFFSET>" 2355 1.1 christos *mipsII: 2356 1.1 christos *mipsIII: 2357 1.1 christos *mipsIV: 2358 1.1 christos *mipsV: 2359 1.1 christos *mips32: 2360 1.1 christos *mips32r2: 2361 1.1 christos *mips64: 2362 1.1 christos *mips64r2: 2363 1.1 christos *vr4100: 2364 1.1 christos *vr5000: 2365 1.1 christos *r3900: 2366 1.1 christos { 2367 1.1 christos address_word offset = EXTEND16 (OFFSET) << 2; 2368 1.1 christos /* NOTE: The branch occurs AFTER the next instruction has been 2369 1.1 christos executed */ 2370 1.1 christos if ((signed_word) GPR[RS] < 0) 2371 1.1 christos { 2372 1.1 christos DELAY_SLOT (NIA + offset); 2373 1.1 christos } 2374 1.1 christos else 2375 1.1 christos NULLIFY_NEXT_INSTRUCTION (); 2376 1.1 christos } 2377 1.1 christos 2378 1.1 christos 2379 1.1 christos 2380 1.1 christos 000101,5.RS,5.RT,16.OFFSET:NORMAL:32::BNE 2381 1.1 christos "bne r<RS>, r<RT>, <OFFSET>" 2382 1.1 christos *mipsI: 2383 1.1 christos *mipsII: 2384 1.1 christos *mipsIII: 2385 1.1 christos *mipsIV: 2386 1.1 christos *mipsV: 2387 1.1 christos *mips32: 2388 1.1 christos *mips32r2: 2389 1.1.1.4 christos *mips32r6: 2390 1.1 christos *mips64: 2391 1.1 christos *mips64r2: 2392 1.1.1.4 christos *mips64r6: 2393 1.1 christos *vr4100: 2394 1.1 christos *vr5000: 2395 1.1 christos *r3900: 2396 1.1 christos { 2397 1.1 christos address_word offset = EXTEND16 (OFFSET) << 2; 2398 1.1 christos if ((signed_word) GPR[RS] != (signed_word) GPR[RT]) 2399 1.1 christos { 2400 1.1 christos DELAY_SLOT (NIA + offset); 2401 1.1 christos } 2402 1.1 christos } 2403 1.1 christos 2404 1.1 christos 2405 1.1 christos 2406 1.1 christos 010101,5.RS,5.RT,16.OFFSET:NORMAL:32::BNEL 2407 1.1 christos "bnel r<RS>, r<RT>, <OFFSET>" 2408 1.1 christos *mipsII: 2409 1.1 christos *mipsIII: 2410 1.1 christos *mipsIV: 2411 1.1 christos *mipsV: 2412 1.1 christos *mips32: 2413 1.1 christos *mips32r2: 2414 1.1 christos *mips64: 2415 1.1 christos *mips64r2: 2416 1.1 christos *vr4100: 2417 1.1 christos *vr5000: 2418 1.1 christos *r3900: 2419 1.1 christos { 2420 1.1 christos address_word offset = EXTEND16 (OFFSET) << 2; 2421 1.1 christos if ((signed_word) GPR[RS] != (signed_word) GPR[RT]) 2422 1.1 christos { 2423 1.1 christos DELAY_SLOT (NIA + offset); 2424 1.1 christos } 2425 1.1 christos else 2426 1.1 christos NULLIFY_NEXT_INSTRUCTION (); 2427 1.1 christos } 2428 1.1 christos 2429 1.1 christos 2430 1.1 christos 2431 1.1 christos 000000,20.CODE,001101:SPECIAL:32::BREAK 2432 1.1 christos "break %#lx<CODE>" 2433 1.1 christos *mipsI: 2434 1.1 christos *mipsII: 2435 1.1 christos *mipsIII: 2436 1.1 christos *mipsIV: 2437 1.1 christos *mipsV: 2438 1.1 christos *mips32: 2439 1.1 christos *mips32r2: 2440 1.1.1.4 christos *mips32r6: 2441 1.1 christos *mips64: 2442 1.1 christos *mips64r2: 2443 1.1.1.4 christos *mips64r6: 2444 1.1 christos *vr4100: 2445 1.1 christos *vr5000: 2446 1.1 christos *r3900: 2447 1.1 christos { 2448 1.1.1.2 christos do_break (SD_, instruction_0); 2449 1.1 christos } 2450 1.1 christos 2451 1.1 christos 2452 1.1 christos 2453 1.1 christos 011100,5.RS,5.RT,5.RD,00000,100001:SPECIAL2:32::CLO 2454 1.1 christos "clo r<RD>, r<RS>" 2455 1.1 christos *mips32: 2456 1.1 christos *mips32r2: 2457 1.1 christos *mips64: 2458 1.1 christos *mips64r2: 2459 1.1 christos *vr5500: 2460 1.1 christos { 2461 1.1 christos if (RT != RD) 2462 1.1 christos Unpredictable (); 2463 1.1.1.2 christos do_clo (SD_, RD, RS); 2464 1.1 christos } 2465 1.1 christos 2466 1.1 christos 2467 1.1 christos 2468 1.1 christos 011100,5.RS,5.RT,5.RD,00000,100000:SPECIAL2:32::CLZ 2469 1.1 christos "clz r<RD>, r<RS>" 2470 1.1 christos *mips32: 2471 1.1 christos *mips32r2: 2472 1.1 christos *mips64: 2473 1.1 christos *mips64r2: 2474 1.1 christos *vr5500: 2475 1.1 christos { 2476 1.1 christos if (RT != RD) 2477 1.1 christos Unpredictable (); 2478 1.1.1.2 christos do_clz (SD_, RD, RS); 2479 1.1 christos } 2480 1.1 christos 2481 1.1 christos 2482 1.1 christos 2483 1.1 christos 000000,5.RS,5.RT,5.RD,00000,101100:SPECIAL:64::DADD 2484 1.1 christos "dadd r<RD>, r<RS>, r<RT>" 2485 1.1 christos *mipsIII: 2486 1.1 christos *mipsIV: 2487 1.1 christos *mipsV: 2488 1.1 christos *mips64: 2489 1.1 christos *mips64r2: 2490 1.1.1.4 christos *mips64r6: 2491 1.1 christos *vr4100: 2492 1.1 christos *vr5000: 2493 1.1 christos { 2494 1.1 christos check_u64 (SD_, instruction_0); 2495 1.1.1.2 christos do_dadd (SD_, RD, RS, RT); 2496 1.1 christos } 2497 1.1 christos 2498 1.1 christos 2499 1.1 christos 2500 1.1 christos 011000,5.RS,5.RT,16.IMMEDIATE:NORMAL:64::DADDI 2501 1.1 christos "daddi r<RT>, r<RS>, <IMMEDIATE>" 2502 1.1 christos *mipsIII: 2503 1.1 christos *mipsIV: 2504 1.1 christos *mipsV: 2505 1.1 christos *mips64: 2506 1.1 christos *mips64r2: 2507 1.1 christos *vr4100: 2508 1.1 christos *vr5000: 2509 1.1 christos { 2510 1.1 christos check_u64 (SD_, instruction_0); 2511 1.1.1.2 christos do_daddi (SD_, RT, RS, IMMEDIATE); 2512 1.1 christos } 2513 1.1 christos 2514 1.1 christos 2515 1.1 christos 2516 1.1.1.4 christos :function:::void:do_daddiu:int rs, int rt, uint16_t immediate 2517 1.1 christos { 2518 1.1 christos TRACE_ALU_INPUT2 (GPR[rs], EXTEND16 (immediate)); 2519 1.1 christos GPR[rt] = GPR[rs] + EXTEND16 (immediate); 2520 1.1 christos TRACE_ALU_RESULT (GPR[rt]); 2521 1.1 christos } 2522 1.1 christos 2523 1.1 christos 011001,5.RS,5.RT,16.IMMEDIATE:NORMAL:64::DADDIU 2524 1.1 christos "daddiu r<RT>, r<RS>, <IMMEDIATE>" 2525 1.1 christos *mipsIII: 2526 1.1 christos *mipsIV: 2527 1.1 christos *mipsV: 2528 1.1 christos *mips64: 2529 1.1 christos *mips64r2: 2530 1.1.1.4 christos *mips64r6: 2531 1.1 christos *vr4100: 2532 1.1 christos *vr5000: 2533 1.1 christos { 2534 1.1 christos check_u64 (SD_, instruction_0); 2535 1.1 christos do_daddiu (SD_, RS, RT, IMMEDIATE); 2536 1.1 christos } 2537 1.1 christos 2538 1.1 christos 2539 1.1 christos 2540 1.1 christos :function:::void:do_daddu:int rs, int rt, int rd 2541 1.1 christos { 2542 1.1 christos TRACE_ALU_INPUT2 (GPR[rs], GPR[rt]); 2543 1.1 christos GPR[rd] = GPR[rs] + GPR[rt]; 2544 1.1 christos TRACE_ALU_RESULT (GPR[rd]); 2545 1.1 christos } 2546 1.1 christos 2547 1.1 christos 000000,5.RS,5.RT,5.RD,00000,101101:SPECIAL:64::DADDU 2548 1.1 christos "daddu r<RD>, r<RS>, r<RT>" 2549 1.1 christos *mipsIII: 2550 1.1 christos *mipsIV: 2551 1.1 christos *mipsV: 2552 1.1 christos *mips64: 2553 1.1 christos *mips64r2: 2554 1.1.1.4 christos *mips64r6: 2555 1.1 christos *vr4100: 2556 1.1 christos *vr5000: 2557 1.1 christos { 2558 1.1 christos check_u64 (SD_, instruction_0); 2559 1.1 christos do_daddu (SD_, RS, RT, RD); 2560 1.1 christos } 2561 1.1 christos 2562 1.1 christos 2563 1.1 christos 2564 1.1 christos 011100,5.RS,5.RT,5.RD,00000,100101:SPECIAL2:64::DCLO 2565 1.1 christos "dclo r<RD>, r<RS>" 2566 1.1 christos *mips64: 2567 1.1 christos *mips64r2: 2568 1.1 christos *vr5500: 2569 1.1 christos { 2570 1.1 christos if (RT != RD) 2571 1.1 christos Unpredictable (); 2572 1.1.1.2 christos check_u64 (SD_, instruction_0); 2573 1.1.1.4 christos if (RT != RD) 2574 1.1.1.4 christos Unpredictable (); 2575 1.1.1.2 christos do_dclo (SD_, RD, RS); 2576 1.1 christos } 2577 1.1 christos 2578 1.1 christos 2579 1.1 christos 2580 1.1 christos 011100,5.RS,5.RT,5.RD,00000,100100:SPECIAL2:64::DCLZ 2581 1.1 christos "dclz r<RD>, r<RS>" 2582 1.1 christos *mips64: 2583 1.1 christos *mips64r2: 2584 1.1 christos *vr5500: 2585 1.1 christos { 2586 1.1 christos if (RT != RD) 2587 1.1 christos Unpredictable (); 2588 1.1.1.2 christos check_u64 (SD_, instruction_0); 2589 1.1.1.4 christos if (RT != RD) 2590 1.1.1.4 christos Unpredictable (); 2591 1.1.1.2 christos do_dclz (SD_, RD, RS); 2592 1.1 christos } 2593 1.1 christos 2594 1.1 christos 2595 1.1 christos 2596 1.1 christos :function:::void:do_ddiv:int rs, int rt 2597 1.1 christos { 2598 1.1 christos check_div_hilo (SD_, HIHISTORY, LOHISTORY); 2599 1.1 christos TRACE_ALU_INPUT2 (GPR[rs], GPR[rt]); 2600 1.1 christos { 2601 1.1.1.4 christos int64_t n = GPR[rs]; 2602 1.1.1.4 christos int64_t d = GPR[rt]; 2603 1.1.1.4 christos int64_t hi; 2604 1.1.1.4 christos int64_t lo; 2605 1.1 christos if (d == 0) 2606 1.1 christos { 2607 1.1 christos lo = SIGNED64 (0x8000000000000000); 2608 1.1 christos hi = 0; 2609 1.1 christos } 2610 1.1 christos else if (d == -1 && n == SIGNED64 (0x8000000000000000)) 2611 1.1 christos { 2612 1.1 christos lo = SIGNED64 (0x8000000000000000); 2613 1.1 christos hi = 0; 2614 1.1 christos } 2615 1.1 christos else 2616 1.1 christos { 2617 1.1 christos lo = (n / d); 2618 1.1 christos hi = (n % d); 2619 1.1 christos } 2620 1.1 christos HI = hi; 2621 1.1 christos LO = lo; 2622 1.1 christos } 2623 1.1 christos TRACE_ALU_RESULT2 (HI, LO); 2624 1.1 christos } 2625 1.1 christos 2626 1.1 christos 000000,5.RS,5.RT,0000000000,011110:SPECIAL:64::DDIV 2627 1.1 christos "ddiv r<RS>, r<RT>" 2628 1.1 christos *mipsIII: 2629 1.1 christos *mipsIV: 2630 1.1 christos *mipsV: 2631 1.1 christos *mips64: 2632 1.1 christos *mips64r2: 2633 1.1 christos *vr4100: 2634 1.1 christos *vr5000: 2635 1.1 christos { 2636 1.1 christos check_u64 (SD_, instruction_0); 2637 1.1 christos do_ddiv (SD_, RS, RT); 2638 1.1 christos } 2639 1.1 christos 2640 1.1 christos 2641 1.1 christos 2642 1.1 christos :function:::void:do_ddivu:int rs, int rt 2643 1.1 christos { 2644 1.1 christos check_div_hilo (SD_, HIHISTORY, LOHISTORY); 2645 1.1 christos TRACE_ALU_INPUT2 (GPR[rs], GPR[rt]); 2646 1.1 christos { 2647 1.1.1.4 christos uint64_t n = GPR[rs]; 2648 1.1.1.4 christos uint64_t d = GPR[rt]; 2649 1.1.1.4 christos uint64_t hi; 2650 1.1.1.4 christos uint64_t lo; 2651 1.1 christos if (d == 0) 2652 1.1 christos { 2653 1.1 christos lo = SIGNED64 (0x8000000000000000); 2654 1.1 christos hi = 0; 2655 1.1 christos } 2656 1.1 christos else 2657 1.1 christos { 2658 1.1 christos lo = (n / d); 2659 1.1 christos hi = (n % d); 2660 1.1 christos } 2661 1.1 christos HI = hi; 2662 1.1 christos LO = lo; 2663 1.1 christos } 2664 1.1 christos TRACE_ALU_RESULT2 (HI, LO); 2665 1.1 christos } 2666 1.1 christos 2667 1.1 christos 000000,5.RS,5.RT,0000000000,011111:SPECIAL:64::DDIVU 2668 1.1 christos "ddivu r<RS>, r<RT>" 2669 1.1 christos *mipsIII: 2670 1.1 christos *mipsIV: 2671 1.1 christos *mipsV: 2672 1.1 christos *mips64: 2673 1.1 christos *mips64r2: 2674 1.1 christos *vr4100: 2675 1.1 christos *vr5000: 2676 1.1 christos { 2677 1.1 christos check_u64 (SD_, instruction_0); 2678 1.1 christos do_ddivu (SD_, RS, RT); 2679 1.1 christos } 2680 1.1 christos 2681 1.1 christos :function:::void:do_div:int rs, int rt 2682 1.1 christos { 2683 1.1 christos check_div_hilo (SD_, HIHISTORY, LOHISTORY); 2684 1.1 christos TRACE_ALU_INPUT2 (GPR[rs], GPR[rt]); 2685 1.1 christos { 2686 1.1.1.4 christos int32_t n = GPR[rs]; 2687 1.1.1.4 christos int32_t d = GPR[rt]; 2688 1.1 christos if (d == 0) 2689 1.1 christos { 2690 1.1 christos LO = EXTEND32 (0x80000000); 2691 1.1 christos HI = EXTEND32 (0); 2692 1.1 christos } 2693 1.1 christos else if (n == SIGNED32 (0x80000000) && d == -1) 2694 1.1 christos { 2695 1.1 christos LO = EXTEND32 (0x80000000); 2696 1.1 christos HI = EXTEND32 (0); 2697 1.1 christos } 2698 1.1 christos else 2699 1.1 christos { 2700 1.1 christos LO = EXTEND32 (n / d); 2701 1.1 christos HI = EXTEND32 (n % d); 2702 1.1 christos } 2703 1.1 christos } 2704 1.1 christos TRACE_ALU_RESULT2 (HI, LO); 2705 1.1 christos } 2706 1.1 christos 2707 1.1 christos 000000,5.RS,5.RT,0000000000,011010:SPECIAL:32::DIV 2708 1.1 christos "div r<RS>, r<RT>" 2709 1.1 christos *mipsI: 2710 1.1 christos *mipsII: 2711 1.1 christos *mipsIII: 2712 1.1 christos *mipsIV: 2713 1.1 christos *mipsV: 2714 1.1 christos *mips32: 2715 1.1 christos *mips32r2: 2716 1.1 christos *mips64: 2717 1.1 christos *mips64r2: 2718 1.1 christos *vr4100: 2719 1.1 christos *vr5000: 2720 1.1 christos *r3900: 2721 1.1 christos { 2722 1.1 christos do_div (SD_, RS, RT); 2723 1.1 christos } 2724 1.1 christos 2725 1.1 christos 2726 1.1 christos 2727 1.1 christos :function:::void:do_divu:int rs, int rt 2728 1.1 christos { 2729 1.1 christos check_div_hilo (SD_, HIHISTORY, LOHISTORY); 2730 1.1 christos TRACE_ALU_INPUT2 (GPR[rs], GPR[rt]); 2731 1.1 christos { 2732 1.1.1.4 christos uint32_t n = GPR[rs]; 2733 1.1.1.4 christos uint32_t d = GPR[rt]; 2734 1.1 christos if (d == 0) 2735 1.1 christos { 2736 1.1 christos LO = EXTEND32 (0x80000000); 2737 1.1 christos HI = EXTEND32 (0); 2738 1.1 christos } 2739 1.1 christos else 2740 1.1 christos { 2741 1.1 christos LO = EXTEND32 (n / d); 2742 1.1 christos HI = EXTEND32 (n % d); 2743 1.1 christos } 2744 1.1 christos } 2745 1.1 christos TRACE_ALU_RESULT2 (HI, LO); 2746 1.1 christos } 2747 1.1 christos 2748 1.1 christos 000000,5.RS,5.RT,0000000000,011011:SPECIAL:32::DIVU 2749 1.1 christos "divu r<RS>, r<RT>" 2750 1.1 christos *mipsI: 2751 1.1 christos *mipsII: 2752 1.1 christos *mipsIII: 2753 1.1 christos *mipsIV: 2754 1.1 christos *mipsV: 2755 1.1 christos *mips32: 2756 1.1 christos *mips32r2: 2757 1.1 christos *mips64: 2758 1.1 christos *mips64r2: 2759 1.1 christos *vr4100: 2760 1.1 christos *vr5000: 2761 1.1 christos *r3900: 2762 1.1 christos { 2763 1.1 christos do_divu (SD_, RS, RT); 2764 1.1 christos } 2765 1.1 christos 2766 1.1 christos 2767 1.1 christos :function:::void:do_dmultx:int rs, int rt, int rd, int signed_p 2768 1.1 christos { 2769 1.1.1.4 christos uint64_t lo; 2770 1.1.1.4 christos uint64_t hi; 2771 1.1.1.4 christos uint64_t m00; 2772 1.1.1.4 christos uint64_t m01; 2773 1.1.1.4 christos uint64_t m10; 2774 1.1.1.4 christos uint64_t m11; 2775 1.1.1.4 christos uint64_t mid; 2776 1.1 christos int sign; 2777 1.1.1.4 christos uint64_t op1 = GPR[rs]; 2778 1.1.1.4 christos uint64_t op2 = GPR[rt]; 2779 1.1 christos check_mult_hilo (SD_, HIHISTORY, LOHISTORY); 2780 1.1 christos TRACE_ALU_INPUT2 (GPR[rs], GPR[rt]); 2781 1.1 christos /* make signed multiply unsigned */ 2782 1.1 christos sign = 0; 2783 1.1 christos if (signed_p) 2784 1.1 christos { 2785 1.1.1.4 christos if ((int64_t) op1 < 0) 2786 1.1 christos { 2787 1.1 christos op1 = - op1; 2788 1.1 christos ++sign; 2789 1.1 christos } 2790 1.1.1.4 christos if ((int64_t) op2 < 0) 2791 1.1 christos { 2792 1.1 christos op2 = - op2; 2793 1.1 christos ++sign; 2794 1.1 christos } 2795 1.1 christos } 2796 1.1 christos /* multiply out the 4 sub products */ 2797 1.1.1.4 christos m00 = ((uint64_t) VL4_8 (op1) * (uint64_t) VL4_8 (op2)); 2798 1.1.1.4 christos m10 = ((uint64_t) VH4_8 (op1) * (uint64_t) VL4_8 (op2)); 2799 1.1.1.4 christos m01 = ((uint64_t) VL4_8 (op1) * (uint64_t) VH4_8 (op2)); 2800 1.1.1.4 christos m11 = ((uint64_t) VH4_8 (op1) * (uint64_t) VH4_8 (op2)); 2801 1.1 christos /* add the products */ 2802 1.1.1.4 christos mid = ((uint64_t) VH4_8 (m00) 2803 1.1.1.4 christos + (uint64_t) VL4_8 (m10) 2804 1.1.1.4 christos + (uint64_t) VL4_8 (m01)); 2805 1.1 christos lo = U8_4 (mid, m00); 2806 1.1 christos hi = (m11 2807 1.1.1.4 christos + (uint64_t) VH4_8 (mid) 2808 1.1.1.4 christos + (uint64_t) VH4_8 (m01) 2809 1.1.1.4 christos + (uint64_t) VH4_8 (m10)); 2810 1.1 christos /* fix the sign */ 2811 1.1 christos if (sign & 1) 2812 1.1 christos { 2813 1.1 christos lo = -lo; 2814 1.1 christos if (lo == 0) 2815 1.1 christos hi = -hi; 2816 1.1 christos else 2817 1.1 christos hi = -hi - 1; 2818 1.1 christos } 2819 1.1 christos /* save the result HI/LO (and a gpr) */ 2820 1.1 christos LO = lo; 2821 1.1 christos HI = hi; 2822 1.1 christos if (rd != 0) 2823 1.1 christos GPR[rd] = lo; 2824 1.1 christos TRACE_ALU_RESULT2 (HI, LO); 2825 1.1 christos } 2826 1.1 christos 2827 1.1 christos :function:::void:do_dmult:int rs, int rt, int rd 2828 1.1 christos { 2829 1.1 christos do_dmultx (SD_, rs, rt, rd, 1); 2830 1.1 christos } 2831 1.1 christos 2832 1.1 christos 000000,5.RS,5.RT,0000000000,011100:SPECIAL:64::DMULT 2833 1.1 christos "dmult r<RS>, r<RT>" 2834 1.1 christos *mipsIII: 2835 1.1 christos *mipsIV: 2836 1.1 christos *mipsV: 2837 1.1 christos *mips64: 2838 1.1 christos *mips64r2: 2839 1.1 christos *vr4100: 2840 1.1 christos { 2841 1.1 christos check_u64 (SD_, instruction_0); 2842 1.1 christos do_dmult (SD_, RS, RT, 0); 2843 1.1 christos } 2844 1.1 christos 2845 1.1 christos 000000,5.RS,5.RT,5.RD,00000,011100:SPECIAL:64::DMULT 2846 1.1 christos "dmult r<RS>, r<RT>":RD == 0 2847 1.1 christos "dmult r<RD>, r<RS>, r<RT>" 2848 1.1 christos *vr5000: 2849 1.1 christos { 2850 1.1 christos check_u64 (SD_, instruction_0); 2851 1.1 christos do_dmult (SD_, RS, RT, RD); 2852 1.1 christos } 2853 1.1 christos 2854 1.1 christos 2855 1.1 christos 2856 1.1 christos :function:::void:do_dmultu:int rs, int rt, int rd 2857 1.1 christos { 2858 1.1 christos do_dmultx (SD_, rs, rt, rd, 0); 2859 1.1 christos } 2860 1.1 christos 2861 1.1 christos 000000,5.RS,5.RT,0000000000,011101:SPECIAL:64::DMULTU 2862 1.1 christos "dmultu r<RS>, r<RT>" 2863 1.1 christos *mipsIII: 2864 1.1 christos *mipsIV: 2865 1.1 christos *mipsV: 2866 1.1 christos *mips64: 2867 1.1 christos *mips64r2: 2868 1.1 christos *vr4100: 2869 1.1 christos { 2870 1.1 christos check_u64 (SD_, instruction_0); 2871 1.1 christos do_dmultu (SD_, RS, RT, 0); 2872 1.1 christos } 2873 1.1 christos 2874 1.1 christos 000000,5.RS,5.RT,5.RD,00000,011101:SPECIAL:64::DMULTU 2875 1.1 christos "dmultu r<RD>, r<RS>, r<RT>":RD == 0 2876 1.1 christos "dmultu r<RS>, r<RT>" 2877 1.1 christos *vr5000: 2878 1.1 christos { 2879 1.1 christos check_u64 (SD_, instruction_0); 2880 1.1 christos do_dmultu (SD_, RS, RT, RD); 2881 1.1 christos } 2882 1.1 christos 2883 1.1 christos 2884 1.1.1.4 christos :function:::uint64_t:do_dror:uint64_t x,uint64_t y 2885 1.1 christos { 2886 1.1.1.4 christos uint64_t result; 2887 1.1 christos 2888 1.1 christos y &= 63; 2889 1.1 christos TRACE_ALU_INPUT2 (x, y); 2890 1.1 christos result = ROTR64 (x, y); 2891 1.1 christos TRACE_ALU_RESULT (result); 2892 1.1 christos return result; 2893 1.1 christos } 2894 1.1 christos 2895 1.1 christos 000000,00001,5.RT,5.RD,5.SHIFT,111010::64::DROR 2896 1.1 christos "dror r<RD>, r<RT>, <SHIFT>" 2897 1.1 christos *mips64r2: 2898 1.1.1.4 christos *mips64r6: 2899 1.1 christos *vr5400: 2900 1.1 christos *vr5500: 2901 1.1 christos { 2902 1.1 christos check_u64 (SD_, instruction_0); 2903 1.1 christos GPR[RD] = do_dror (SD_, GPR[RT], SHIFT); 2904 1.1 christos } 2905 1.1 christos 2906 1.1 christos 000000,00001,5.RT,5.RD,5.SHIFT,111110::64::DROR32 2907 1.1 christos "dror32 r<RD>, r<RT>, <SHIFT>" 2908 1.1 christos *mips64r2: 2909 1.1.1.4 christos *mips64r6: 2910 1.1 christos *vr5400: 2911 1.1 christos *vr5500: 2912 1.1 christos { 2913 1.1 christos check_u64 (SD_, instruction_0); 2914 1.1 christos GPR[RD] = do_dror (SD_, GPR[RT], SHIFT + 32); 2915 1.1 christos } 2916 1.1 christos 2917 1.1 christos 000000,5.RS,5.RT,5.RD,00001,010110::64::DRORV 2918 1.1 christos "drorv r<RD>, r<RT>, r<RS>" 2919 1.1 christos *mips64r2: 2920 1.1.1.4 christos *mips64r6: 2921 1.1 christos *vr5400: 2922 1.1 christos *vr5500: 2923 1.1 christos { 2924 1.1 christos check_u64 (SD_, instruction_0); 2925 1.1 christos GPR[RD] = do_dror (SD_, GPR[RT], GPR[RS]); 2926 1.1 christos } 2927 1.1 christos 2928 1.1 christos 2929 1.1 christos :function:::void:do_dsll:int rt, int rd, int shift 2930 1.1 christos { 2931 1.1 christos TRACE_ALU_INPUT2 (GPR[rt], shift); 2932 1.1 christos GPR[rd] = GPR[rt] << shift; 2933 1.1 christos TRACE_ALU_RESULT (GPR[rd]); 2934 1.1 christos } 2935 1.1 christos 2936 1.1 christos 000000,00000,5.RT,5.RD,5.SHIFT,111000:SPECIAL:64::DSLL 2937 1.1 christos "dsll r<RD>, r<RT>, <SHIFT>" 2938 1.1 christos *mipsIII: 2939 1.1 christos *mipsIV: 2940 1.1 christos *mipsV: 2941 1.1 christos *mips64: 2942 1.1 christos *mips64r2: 2943 1.1.1.4 christos *mips64r6: 2944 1.1 christos *vr4100: 2945 1.1 christos *vr5000: 2946 1.1 christos { 2947 1.1 christos check_u64 (SD_, instruction_0); 2948 1.1 christos do_dsll (SD_, RT, RD, SHIFT); 2949 1.1 christos } 2950 1.1 christos 2951 1.1 christos 2952 1.1 christos 000000,00000,5.RT,5.RD,5.SHIFT,111100:SPECIAL:64::DSLL32 2953 1.1 christos "dsll32 r<RD>, r<RT>, <SHIFT>" 2954 1.1 christos *mipsIII: 2955 1.1 christos *mipsIV: 2956 1.1 christos *mipsV: 2957 1.1 christos *mips64: 2958 1.1 christos *mips64r2: 2959 1.1.1.4 christos *mips64r6: 2960 1.1 christos *vr4100: 2961 1.1 christos *vr5000: 2962 1.1 christos { 2963 1.1 christos check_u64 (SD_, instruction_0); 2964 1.1.1.2 christos do_dsll32 (SD_, RD, RT, SHIFT); 2965 1.1 christos } 2966 1.1 christos 2967 1.1 christos :function:::void:do_dsllv:int rs, int rt, int rd 2968 1.1 christos { 2969 1.1 christos int s = MASKED64 (GPR[rs], 5, 0); 2970 1.1 christos TRACE_ALU_INPUT2 (GPR[rt], s); 2971 1.1 christos GPR[rd] = GPR[rt] << s; 2972 1.1 christos TRACE_ALU_RESULT (GPR[rd]); 2973 1.1 christos } 2974 1.1 christos 2975 1.1 christos 000000,5.RS,5.RT,5.RD,00000,010100:SPECIAL:64::DSLLV 2976 1.1 christos "dsllv r<RD>, r<RT>, r<RS>" 2977 1.1 christos *mipsIII: 2978 1.1 christos *mipsIV: 2979 1.1 christos *mipsV: 2980 1.1 christos *mips64: 2981 1.1 christos *mips64r2: 2982 1.1.1.4 christos *mips64r6: 2983 1.1 christos *vr4100: 2984 1.1 christos *vr5000: 2985 1.1 christos { 2986 1.1 christos check_u64 (SD_, instruction_0); 2987 1.1 christos do_dsllv (SD_, RS, RT, RD); 2988 1.1 christos } 2989 1.1 christos 2990 1.1 christos :function:::void:do_dsra:int rt, int rd, int shift 2991 1.1 christos { 2992 1.1 christos TRACE_ALU_INPUT2 (GPR[rt], shift); 2993 1.1.1.4 christos GPR[rd] = ((int64_t) GPR[rt]) >> shift; 2994 1.1 christos TRACE_ALU_RESULT (GPR[rd]); 2995 1.1 christos } 2996 1.1 christos 2997 1.1 christos 2998 1.1 christos 000000,00000,5.RT,5.RD,5.SHIFT,111011:SPECIAL:64::DSRA 2999 1.1 christos "dsra r<RD>, r<RT>, <SHIFT>" 3000 1.1 christos *mipsIII: 3001 1.1 christos *mipsIV: 3002 1.1 christos *mipsV: 3003 1.1 christos *mips64: 3004 1.1 christos *mips64r2: 3005 1.1.1.4 christos *mips64r6: 3006 1.1 christos *vr4100: 3007 1.1 christos *vr5000: 3008 1.1 christos { 3009 1.1 christos check_u64 (SD_, instruction_0); 3010 1.1 christos do_dsra (SD_, RT, RD, SHIFT); 3011 1.1 christos } 3012 1.1 christos 3013 1.1 christos 3014 1.1 christos 000000,00000,5.RT,5.RD,5.SHIFT,111111:SPECIAL:64::DSRA32 3015 1.1 christos "dsra32 r<RD>, r<RT>, <SHIFT>" 3016 1.1 christos *mipsIII: 3017 1.1 christos *mipsIV: 3018 1.1 christos *mipsV: 3019 1.1 christos *mips64: 3020 1.1 christos *mips64r2: 3021 1.1.1.4 christos *mips64r6: 3022 1.1 christos *vr4100: 3023 1.1 christos *vr5000: 3024 1.1 christos { 3025 1.1 christos check_u64 (SD_, instruction_0); 3026 1.1.1.2 christos do_dsra32 (SD_, RD, RT, SHIFT); 3027 1.1 christos } 3028 1.1 christos 3029 1.1 christos 3030 1.1 christos :function:::void:do_dsrav:int rs, int rt, int rd 3031 1.1 christos { 3032 1.1 christos int s = MASKED64 (GPR[rs], 5, 0); 3033 1.1 christos TRACE_ALU_INPUT2 (GPR[rt], s); 3034 1.1.1.4 christos GPR[rd] = ((int64_t) GPR[rt]) >> s; 3035 1.1 christos TRACE_ALU_RESULT (GPR[rd]); 3036 1.1 christos } 3037 1.1 christos 3038 1.1 christos 000000,5.RS,5.RT,5.RD,00000,010111:SPECIAL:64::DSRAV 3039 1.1 christos "dsrav r<RD>, r<RT>, r<RS>" 3040 1.1 christos *mipsIII: 3041 1.1 christos *mipsIV: 3042 1.1 christos *mipsV: 3043 1.1 christos *mips64: 3044 1.1 christos *mips64r2: 3045 1.1.1.4 christos *mips64r6: 3046 1.1 christos *vr4100: 3047 1.1 christos *vr5000: 3048 1.1 christos { 3049 1.1 christos check_u64 (SD_, instruction_0); 3050 1.1 christos do_dsrav (SD_, RS, RT, RD); 3051 1.1 christos } 3052 1.1 christos 3053 1.1 christos :function:::void:do_dsrl:int rt, int rd, int shift 3054 1.1 christos { 3055 1.1 christos TRACE_ALU_INPUT2 (GPR[rt], shift); 3056 1.1.1.4 christos GPR[rd] = (uint64_t) GPR[rt] >> shift; 3057 1.1 christos TRACE_ALU_RESULT (GPR[rd]); 3058 1.1 christos } 3059 1.1 christos 3060 1.1 christos 3061 1.1 christos 000000,00000,5.RT,5.RD,5.SHIFT,111010:SPECIAL:64::DSRL 3062 1.1 christos "dsrl r<RD>, r<RT>, <SHIFT>" 3063 1.1 christos *mipsIII: 3064 1.1 christos *mipsIV: 3065 1.1 christos *mipsV: 3066 1.1 christos *mips64: 3067 1.1 christos *mips64r2: 3068 1.1.1.4 christos *mips64r6: 3069 1.1 christos *vr4100: 3070 1.1 christos *vr5000: 3071 1.1 christos { 3072 1.1 christos check_u64 (SD_, instruction_0); 3073 1.1 christos do_dsrl (SD_, RT, RD, SHIFT); 3074 1.1 christos } 3075 1.1 christos 3076 1.1 christos 3077 1.1 christos 000000,00000,5.RT,5.RD,5.SHIFT,111110:SPECIAL:64::DSRL32 3078 1.1 christos "dsrl32 r<RD>, r<RT>, <SHIFT>" 3079 1.1 christos *mipsIII: 3080 1.1 christos *mipsIV: 3081 1.1 christos *mipsV: 3082 1.1 christos *mips64: 3083 1.1 christos *mips64r2: 3084 1.1.1.4 christos *mips64r6: 3085 1.1 christos *vr4100: 3086 1.1 christos *vr5000: 3087 1.1 christos { 3088 1.1 christos check_u64 (SD_, instruction_0); 3089 1.1.1.2 christos do_dsrl32 (SD_, RD, RT, SHIFT); 3090 1.1 christos } 3091 1.1 christos 3092 1.1 christos 3093 1.1 christos :function:::void:do_dsrlv:int rs, int rt, int rd 3094 1.1 christos { 3095 1.1 christos int s = MASKED64 (GPR[rs], 5, 0); 3096 1.1 christos TRACE_ALU_INPUT2 (GPR[rt], s); 3097 1.1.1.4 christos GPR[rd] = (uint64_t) GPR[rt] >> s; 3098 1.1 christos TRACE_ALU_RESULT (GPR[rd]); 3099 1.1 christos } 3100 1.1 christos 3101 1.1 christos 3102 1.1 christos 3103 1.1 christos 000000,5.RS,5.RT,5.RD,00000,010110:SPECIAL:64::DSRLV 3104 1.1 christos "dsrlv r<RD>, r<RT>, r<RS>" 3105 1.1 christos *mipsIII: 3106 1.1 christos *mipsIV: 3107 1.1 christos *mipsV: 3108 1.1 christos *mips64: 3109 1.1 christos *mips64r2: 3110 1.1.1.4 christos *mips64r6: 3111 1.1 christos *vr4100: 3112 1.1 christos *vr5000: 3113 1.1 christos { 3114 1.1 christos check_u64 (SD_, instruction_0); 3115 1.1 christos do_dsrlv (SD_, RS, RT, RD); 3116 1.1 christos } 3117 1.1 christos 3118 1.1 christos 3119 1.1 christos 000000,5.RS,5.RT,5.RD,00000,101110:SPECIAL:64::DSUB 3120 1.1 christos "dsub r<RD>, r<RS>, r<RT>" 3121 1.1 christos *mipsIII: 3122 1.1 christos *mipsIV: 3123 1.1 christos *mipsV: 3124 1.1 christos *mips64: 3125 1.1 christos *mips64r2: 3126 1.1.1.4 christos *mips64r6: 3127 1.1 christos *vr4100: 3128 1.1 christos *vr5000: 3129 1.1 christos { 3130 1.1 christos check_u64 (SD_, instruction_0); 3131 1.1.1.2 christos do_dsub (SD_, RD, RS, RT); 3132 1.1 christos } 3133 1.1 christos 3134 1.1 christos 3135 1.1 christos :function:::void:do_dsubu:int rs, int rt, int rd 3136 1.1 christos { 3137 1.1 christos TRACE_ALU_INPUT2 (GPR[rs], GPR[rt]); 3138 1.1 christos GPR[rd] = GPR[rs] - GPR[rt]; 3139 1.1 christos TRACE_ALU_RESULT (GPR[rd]); 3140 1.1 christos } 3141 1.1 christos 3142 1.1 christos 000000,5.RS,5.RT,5.RD,00000,101111:SPECIAL:64::DSUBU 3143 1.1 christos "dsubu r<RD>, r<RS>, r<RT>" 3144 1.1 christos *mipsIII: 3145 1.1 christos *mipsIV: 3146 1.1 christos *mipsV: 3147 1.1 christos *mips64: 3148 1.1 christos *mips64r2: 3149 1.1.1.4 christos *mips64r6: 3150 1.1 christos *vr4100: 3151 1.1 christos *vr5000: 3152 1.1 christos { 3153 1.1 christos check_u64 (SD_, instruction_0); 3154 1.1 christos do_dsubu (SD_, RS, RT, RD); 3155 1.1 christos } 3156 1.1 christos 3157 1.1 christos 3158 1.1 christos 000010,26.INSTR_INDEX:NORMAL:32::J 3159 1.1 christos "j <INSTR_INDEX>" 3160 1.1 christos *mipsI: 3161 1.1 christos *mipsII: 3162 1.1 christos *mipsIII: 3163 1.1 christos *mipsIV: 3164 1.1 christos *mipsV: 3165 1.1 christos *mips32: 3166 1.1 christos *mips32r2: 3167 1.1.1.4 christos *mips32r6: 3168 1.1 christos *mips64: 3169 1.1 christos *mips64r2: 3170 1.1.1.4 christos *mips64r6: 3171 1.1 christos *vr4100: 3172 1.1 christos *vr5000: 3173 1.1 christos *r3900: 3174 1.1 christos { 3175 1.1 christos /* NOTE: The region used is that of the delay slot NIA and NOT the 3176 1.1 christos current instruction */ 3177 1.1 christos address_word region = (NIA & MASK (63, 28)); 3178 1.1 christos DELAY_SLOT (region | (INSTR_INDEX << 2)); 3179 1.1 christos } 3180 1.1 christos 3181 1.1 christos 3182 1.1 christos 000011,26.INSTR_INDEX:NORMAL:32::JAL 3183 1.1 christos "jal <INSTR_INDEX>" 3184 1.1 christos *mipsI: 3185 1.1 christos *mipsII: 3186 1.1 christos *mipsIII: 3187 1.1 christos *mipsIV: 3188 1.1 christos *mipsV: 3189 1.1 christos *mips32: 3190 1.1 christos *mips32r2: 3191 1.1.1.4 christos *mips32r6: 3192 1.1 christos *mips64: 3193 1.1 christos *mips64r2: 3194 1.1.1.4 christos *mips64r6: 3195 1.1 christos *vr4100: 3196 1.1 christos *vr5000: 3197 1.1 christos *r3900: 3198 1.1 christos { 3199 1.1 christos /* NOTE: The region used is that of the delay slot and NOT the 3200 1.1 christos current instruction */ 3201 1.1 christos address_word region = (NIA & MASK (63, 28)); 3202 1.1 christos GPR[31] = CIA + 8; 3203 1.1 christos DELAY_SLOT (region | (INSTR_INDEX << 2)); 3204 1.1 christos } 3205 1.1 christos 3206 1.1 christos 000000,5.RS,00000,5.RD,00000,001001:SPECIAL:32::JALR 3207 1.1 christos "jalr r<RS>":RD == 31 3208 1.1 christos "jalr r<RD>, r<RS>" 3209 1.1 christos *mipsI: 3210 1.1 christos *mipsII: 3211 1.1 christos *mipsIII: 3212 1.1 christos *mipsIV: 3213 1.1 christos *mipsV: 3214 1.1 christos *mips32: 3215 1.1 christos *mips32r2: 3216 1.1.1.4 christos *mips32r6: 3217 1.1 christos *mips64: 3218 1.1 christos *mips64r2: 3219 1.1.1.4 christos *mips64r6: 3220 1.1 christos *vr4100: 3221 1.1 christos *vr5000: 3222 1.1 christos *r3900: 3223 1.1 christos { 3224 1.1 christos address_word temp = GPR[RS]; 3225 1.1 christos GPR[RD] = CIA + 8; 3226 1.1 christos DELAY_SLOT (temp); 3227 1.1 christos } 3228 1.1 christos 3229 1.1 christos 000000,5.RS,00000,5.RD,10000,001001:SPECIAL:32::JALR_HB 3230 1.1 christos "jalr.hb r<RS>":RD == 31 3231 1.1 christos "jalr.hb r<RD>, r<RS>" 3232 1.1 christos *mips32r2: 3233 1.1.1.4 christos *mips32r6: 3234 1.1 christos *mips64r2: 3235 1.1.1.4 christos *mips64r6: 3236 1.1 christos { 3237 1.1 christos address_word temp = GPR[RS]; 3238 1.1 christos GPR[RD] = CIA + 8; 3239 1.1 christos DELAY_SLOT (temp); 3240 1.1 christos } 3241 1.1 christos 3242 1.1 christos 000000,5.RS,0000000000,00000,001000:SPECIAL:32::JR 3243 1.1 christos "jr r<RS>" 3244 1.1 christos *mipsI: 3245 1.1 christos *mipsII: 3246 1.1 christos *mipsIII: 3247 1.1 christos *mipsIV: 3248 1.1 christos *mipsV: 3249 1.1 christos *mips32: 3250 1.1 christos *mips32r2: 3251 1.1.1.4 christos *mips32r6: 3252 1.1 christos *mips64: 3253 1.1 christos *mips64r2: 3254 1.1.1.4 christos *mips64r6: 3255 1.1 christos *vr4100: 3256 1.1 christos *vr5000: 3257 1.1 christos *r3900: 3258 1.1 christos { 3259 1.1 christos DELAY_SLOT (GPR[RS]); 3260 1.1 christos } 3261 1.1 christos 3262 1.1 christos 000000,5.RS,0000000000,10000,001000:SPECIAL:32::JR_HB 3263 1.1 christos "jr.hb r<RS>" 3264 1.1 christos *mips32r2: 3265 1.1.1.4 christos *mips32r6: 3266 1.1 christos *mips64r2: 3267 1.1.1.4 christos *mips64r6: 3268 1.1 christos { 3269 1.1 christos DELAY_SLOT (GPR[RS]); 3270 1.1 christos } 3271 1.1 christos 3272 1.1 christos :function:::unsigned_word:do_load:unsigned access, address_word base, address_word offset 3273 1.1 christos { 3274 1.1 christos address_word mask = (WITH_TARGET_WORD_BITSIZE == 64 ? 0x7 : 0x3); 3275 1.1 christos address_word reverseendian = (ReverseEndian ? (mask ^ access) : 0); 3276 1.1 christos address_word bigendiancpu = (BigEndianCPU ? (mask ^ access) : 0); 3277 1.1 christos unsigned int byte; 3278 1.1 christos address_word paddr; 3279 1.1.1.4 christos uint64_t memval; 3280 1.1 christos address_word vaddr; 3281 1.1 christos 3282 1.1.1.2 christos paddr = vaddr = loadstore_ea (SD_, base, offset); 3283 1.1 christos if ((vaddr & access) != 0) 3284 1.1 christos { 3285 1.1 christos SIM_CORE_SIGNAL (SD, STATE_CPU (SD, 0), cia, read_map, access+1, vaddr, read_transfer, sim_core_unaligned_signal); 3286 1.1 christos } 3287 1.1 christos paddr = ((paddr & ~mask) | ((paddr & mask) ^ reverseendian)); 3288 1.1.1.2 christos LoadMemory (&memval, NULL, access, paddr, vaddr, isDATA, isREAL); 3289 1.1 christos byte = ((vaddr & mask) ^ bigendiancpu); 3290 1.1 christos return (memval >> (8 * byte)); 3291 1.1 christos } 3292 1.1 christos 3293 1.1 christos :function:::unsigned_word:do_load_left:unsigned access, address_word base, address_word offset, unsigned_word rt 3294 1.1 christos { 3295 1.1 christos address_word mask = (WITH_TARGET_WORD_BITSIZE == 64 ? 0x7 : 0x3); 3296 1.1 christos address_word reverseendian = (ReverseEndian ? -1 : 0); 3297 1.1 christos address_word bigendiancpu = (BigEndianCPU ? -1 : 0); 3298 1.1 christos unsigned int byte; 3299 1.1 christos unsigned int word; 3300 1.1 christos address_word paddr; 3301 1.1.1.4 christos uint64_t memval; 3302 1.1 christos address_word vaddr; 3303 1.1 christos int nr_lhs_bits; 3304 1.1 christos int nr_rhs_bits; 3305 1.1 christos unsigned_word lhs_mask; 3306 1.1 christos unsigned_word temp; 3307 1.1 christos 3308 1.1.1.2 christos paddr = vaddr = loadstore_ea (SD_, base, offset); 3309 1.1 christos paddr = (paddr ^ (reverseendian & mask)); 3310 1.1 christos if (BigEndianMem == 0) 3311 1.1 christos paddr = paddr & ~access; 3312 1.1 christos 3313 1.1 christos /* compute where within the word/mem we are */ 3314 1.1 christos byte = ((vaddr ^ bigendiancpu) & access); /* 0..access */ 3315 1.1 christos word = ((vaddr ^ bigendiancpu) & (mask & ~access)) / (access + 1); /* 0..1 */ 3316 1.1 christos nr_lhs_bits = 8 * byte + 8; 3317 1.1 christos nr_rhs_bits = 8 * access - 8 * byte; 3318 1.1 christos /* nr_lhs_bits + nr_rhs_bits == 8 * (accesss + 1) */ 3319 1.1 christos 3320 1.1 christos /* fprintf (stderr, "l[wd]l: 0x%08lx%08lx 0x%08lx%08lx %d:%d %d+%d\n", 3321 1.1.1.4 christos (long) ((uint64_t) vaddr >> 32), (long) vaddr, 3322 1.1.1.4 christos (long) ((uint64_t) paddr >> 32), (long) paddr, 3323 1.1 christos word, byte, nr_lhs_bits, nr_rhs_bits); */ 3324 1.1 christos 3325 1.1.1.2 christos LoadMemory (&memval, NULL, byte, paddr, vaddr, isDATA, isREAL); 3326 1.1 christos if (word == 0) 3327 1.1 christos { 3328 1.1 christos /* GPR{31..32-NR_LHS_BITS} = memval{NR_LHS_BITS-1..0} */ 3329 1.1 christos temp = (memval << nr_rhs_bits); 3330 1.1 christos } 3331 1.1 christos else 3332 1.1 christos { 3333 1.1 christos /* GPR{31..32-NR_LHS_BITS = memval{32+NR_LHS_BITS..32} */ 3334 1.1 christos temp = (memval >> nr_lhs_bits); 3335 1.1 christos } 3336 1.1 christos lhs_mask = LSMASK (nr_lhs_bits + nr_rhs_bits - 1, nr_rhs_bits); 3337 1.1 christos rt = (rt & ~lhs_mask) | (temp & lhs_mask); 3338 1.1 christos 3339 1.1 christos /* fprintf (stderr, "l[wd]l: 0x%08lx%08lx -> 0x%08lx%08lx & 0x%08lx%08lx -> 0x%08lx%08lx\n", 3340 1.1.1.4 christos (long) ((uint64_t) memval >> 32), (long) memval, 3341 1.1.1.4 christos (long) ((uint64_t) temp >> 32), (long) temp, 3342 1.1.1.4 christos (long) ((uint64_t) lhs_mask >> 32), (long) lhs_mask, 3343 1.1 christos (long) (rt >> 32), (long) rt); */ 3344 1.1 christos return rt; 3345 1.1 christos } 3346 1.1 christos 3347 1.1 christos :function:::unsigned_word:do_load_right:unsigned access, address_word base, address_word offset, unsigned_word rt 3348 1.1 christos { 3349 1.1 christos address_word mask = (WITH_TARGET_WORD_BITSIZE == 64 ? 0x7 : 0x3); 3350 1.1 christos address_word reverseendian = (ReverseEndian ? -1 : 0); 3351 1.1 christos address_word bigendiancpu = (BigEndianCPU ? -1 : 0); 3352 1.1 christos unsigned int byte; 3353 1.1 christos address_word paddr; 3354 1.1.1.4 christos uint64_t memval; 3355 1.1 christos address_word vaddr; 3356 1.1 christos 3357 1.1.1.2 christos paddr = vaddr = loadstore_ea (SD_, base, offset); 3358 1.1 christos /* NOTE: SPEC is wrong, has `BigEndianMem == 0' not `BigEndianMem != 0' */ 3359 1.1 christos paddr = (paddr ^ (reverseendian & mask)); 3360 1.1 christos if (BigEndianMem != 0) 3361 1.1 christos paddr = paddr & ~access; 3362 1.1 christos byte = ((vaddr & mask) ^ (bigendiancpu & mask)); 3363 1.1 christos /* NOTE: SPEC is wrong, had `byte' not `access - byte'. See SW. */ 3364 1.1.1.2 christos LoadMemory (&memval, NULL, access - (access & byte), paddr, vaddr, isDATA, isREAL); 3365 1.1 christos /* printf ("lr: 0x%08lx %d@0x%08lx 0x%08lx\n", 3366 1.1 christos (long) paddr, byte, (long) paddr, (long) memval); */ 3367 1.1 christos { 3368 1.1 christos unsigned_word screen = LSMASK (8 * (access - (byte & access) + 1) - 1, 0); 3369 1.1 christos rt &= ~screen; 3370 1.1 christos rt |= (memval >> (8 * byte)) & screen; 3371 1.1 christos } 3372 1.1 christos return rt; 3373 1.1 christos } 3374 1.1 christos 3375 1.1 christos 3376 1.1 christos 100000,5.BASE,5.RT,16.OFFSET:NORMAL:32::LB 3377 1.1 christos "lb r<RT>, <OFFSET>(r<BASE>)" 3378 1.1 christos *mipsI: 3379 1.1 christos *mipsII: 3380 1.1 christos *mipsIII: 3381 1.1 christos *mipsIV: 3382 1.1 christos *mipsV: 3383 1.1 christos *mips32: 3384 1.1 christos *mips32r2: 3385 1.1.1.4 christos *mips32r6: 3386 1.1 christos *mips64: 3387 1.1 christos *mips64r2: 3388 1.1.1.4 christos *mips64r6: 3389 1.1 christos *vr4100: 3390 1.1 christos *vr5000: 3391 1.1 christos *r3900: 3392 1.1 christos { 3393 1.1.1.2 christos do_lb (SD_,RT,OFFSET,BASE); 3394 1.1 christos } 3395 1.1 christos 3396 1.1 christos 3397 1.1 christos 100100,5.BASE,5.RT,16.OFFSET:NORMAL:32::LBU 3398 1.1 christos "lbu r<RT>, <OFFSET>(r<BASE>)" 3399 1.1 christos *mipsI: 3400 1.1 christos *mipsII: 3401 1.1 christos *mipsIII: 3402 1.1 christos *mipsIV: 3403 1.1 christos *mipsV: 3404 1.1 christos *mips32: 3405 1.1 christos *mips32r2: 3406 1.1.1.4 christos *mips32r6: 3407 1.1 christos *mips64: 3408 1.1 christos *mips64r2: 3409 1.1.1.4 christos *mips64r6: 3410 1.1 christos *vr4100: 3411 1.1 christos *vr5000: 3412 1.1 christos *r3900: 3413 1.1 christos { 3414 1.1.1.2 christos do_lbu (SD_, RT,OFFSET,BASE); 3415 1.1 christos } 3416 1.1 christos 3417 1.1 christos 3418 1.1 christos 110111,5.BASE,5.RT,16.OFFSET:NORMAL:64::LD 3419 1.1 christos "ld r<RT>, <OFFSET>(r<BASE>)" 3420 1.1 christos *mipsIII: 3421 1.1 christos *mipsIV: 3422 1.1 christos *mipsV: 3423 1.1 christos *mips64: 3424 1.1 christos *mips64r2: 3425 1.1.1.4 christos *mips64r6: 3426 1.1 christos *vr4100: 3427 1.1 christos *vr5000: 3428 1.1 christos { 3429 1.1 christos check_u64 (SD_, instruction_0); 3430 1.1 christos GPR[RT] = EXTEND64 (do_load (SD_, AccessLength_DOUBLEWORD, GPR[BASE], EXTEND16 (OFFSET))); 3431 1.1 christos } 3432 1.1 christos 3433 1.1 christos 3434 1.1 christos 1101,ZZ!0!1!3,5.BASE,5.RT,16.OFFSET:NORMAL:64::LDCz 3435 1.1 christos "ldc<ZZ> r<RT>, <OFFSET>(r<BASE>)" 3436 1.1 christos *mipsII: 3437 1.1 christos *mipsIII: 3438 1.1 christos *mipsIV: 3439 1.1 christos *mipsV: 3440 1.1 christos *mips32: 3441 1.1 christos *mips32r2: 3442 1.1 christos *mips64: 3443 1.1 christos *mips64r2: 3444 1.1 christos *vr4100: 3445 1.1 christos *vr5000: 3446 1.1 christos *r3900: 3447 1.1 christos { 3448 1.1.1.2 christos do_ldc (SD_, ZZ, RT, OFFSET, BASE); 3449 1.1 christos } 3450 1.1 christos 3451 1.1 christos 3452 1.1 christos 3453 1.1 christos 3454 1.1 christos 011010,5.BASE,5.RT,16.OFFSET:NORMAL:64::LDL 3455 1.1 christos "ldl r<RT>, <OFFSET>(r<BASE>)" 3456 1.1 christos *mipsIII: 3457 1.1 christos *mipsIV: 3458 1.1 christos *mipsV: 3459 1.1 christos *mips64: 3460 1.1 christos *mips64r2: 3461 1.1 christos *vr4100: 3462 1.1 christos *vr5000: 3463 1.1 christos { 3464 1.1 christos check_u64 (SD_, instruction_0); 3465 1.1 christos GPR[RT] = do_load_left (SD_, AccessLength_DOUBLEWORD, GPR[BASE], EXTEND16 (OFFSET), GPR[RT]); 3466 1.1 christos } 3467 1.1 christos 3468 1.1 christos 3469 1.1 christos 011011,5.BASE,5.RT,16.OFFSET:NORMAL:64::LDR 3470 1.1 christos "ldr r<RT>, <OFFSET>(r<BASE>)" 3471 1.1 christos *mipsIII: 3472 1.1 christos *mipsIV: 3473 1.1 christos *mipsV: 3474 1.1 christos *mips64: 3475 1.1 christos *mips64r2: 3476 1.1 christos *vr4100: 3477 1.1 christos *vr5000: 3478 1.1 christos { 3479 1.1 christos check_u64 (SD_, instruction_0); 3480 1.1 christos GPR[RT] = do_load_right (SD_, AccessLength_DOUBLEWORD, GPR[BASE], EXTEND16 (OFFSET), GPR[RT]); 3481 1.1 christos } 3482 1.1 christos 3483 1.1 christos 3484 1.1 christos 100001,5.BASE,5.RT,16.OFFSET:NORMAL:32::LH 3485 1.1 christos "lh r<RT>, <OFFSET>(r<BASE>)" 3486 1.1 christos *mipsI: 3487 1.1 christos *mipsII: 3488 1.1 christos *mipsIII: 3489 1.1 christos *mipsIV: 3490 1.1 christos *mipsV: 3491 1.1 christos *mips32: 3492 1.1 christos *mips32r2: 3493 1.1.1.4 christos *mips32r6: 3494 1.1 christos *mips64: 3495 1.1 christos *mips64r2: 3496 1.1.1.4 christos *mips64r6: 3497 1.1 christos *vr4100: 3498 1.1 christos *vr5000: 3499 1.1 christos *r3900: 3500 1.1 christos { 3501 1.1.1.2 christos do_lh (SD_,RT,OFFSET,BASE); 3502 1.1 christos } 3503 1.1 christos 3504 1.1 christos 3505 1.1 christos 100101,5.BASE,5.RT,16.OFFSET:NORMAL:32::LHU 3506 1.1 christos "lhu r<RT>, <OFFSET>(r<BASE>)" 3507 1.1 christos *mipsI: 3508 1.1 christos *mipsII: 3509 1.1 christos *mipsIII: 3510 1.1 christos *mipsIV: 3511 1.1 christos *mipsV: 3512 1.1 christos *mips32: 3513 1.1 christos *mips32r2: 3514 1.1.1.4 christos *mips32r6: 3515 1.1 christos *mips64: 3516 1.1 christos *mips64r2: 3517 1.1.1.4 christos *mips64r6: 3518 1.1 christos *vr4100: 3519 1.1 christos *vr5000: 3520 1.1 christos *r3900: 3521 1.1 christos { 3522 1.1.1.2 christos do_lhu (SD_,RT,OFFSET,BASE); 3523 1.1 christos } 3524 1.1 christos 3525 1.1 christos 3526 1.1 christos 110000,5.BASE,5.RT,16.OFFSET:NORMAL:32::LL 3527 1.1 christos "ll r<RT>, <OFFSET>(r<BASE>)" 3528 1.1 christos *mipsII: 3529 1.1 christos *mipsIII: 3530 1.1 christos *mipsIV: 3531 1.1 christos *mipsV: 3532 1.1 christos *mips32: 3533 1.1 christos *mips32r2: 3534 1.1 christos *mips64: 3535 1.1 christos *mips64r2: 3536 1.1 christos *vr4100: 3537 1.1 christos *vr5000: 3538 1.1 christos { 3539 1.1.1.2 christos do_ll (SD_, RT, OFFSET, BASE); 3540 1.1 christos } 3541 1.1 christos 3542 1.1 christos 3543 1.1 christos 110100,5.BASE,5.RT,16.OFFSET:NORMAL:64::LLD 3544 1.1 christos "lld r<RT>, <OFFSET>(r<BASE>)" 3545 1.1 christos *mipsIII: 3546 1.1 christos *mipsIV: 3547 1.1 christos *mipsV: 3548 1.1 christos *mips64: 3549 1.1 christos *mips64r2: 3550 1.1 christos *vr4100: 3551 1.1 christos *vr5000: 3552 1.1 christos { 3553 1.1 christos check_u64 (SD_, instruction_0); 3554 1.1.1.2 christos do_lld (SD_, RT, OFFSET, BASE); 3555 1.1 christos } 3556 1.1 christos 3557 1.1 christos 3558 1.1 christos 001111,00000,5.RT,16.IMMEDIATE:NORMAL:32::LUI 3559 1.1 christos "lui r<RT>, %#lx<IMMEDIATE>" 3560 1.1 christos *mipsI: 3561 1.1 christos *mipsII: 3562 1.1 christos *mipsIII: 3563 1.1 christos *mipsIV: 3564 1.1 christos *mipsV: 3565 1.1 christos *mips32: 3566 1.1 christos *mips32r2: 3567 1.1.1.4 christos *mips32r6: 3568 1.1 christos *mips64: 3569 1.1 christos *mips64r2: 3570 1.1.1.4 christos *mips64r6: 3571 1.1 christos *vr4100: 3572 1.1 christos *vr5000: 3573 1.1 christos *r3900: 3574 1.1 christos { 3575 1.1.1.2 christos do_lui (SD_, RT, IMMEDIATE); 3576 1.1 christos } 3577 1.1 christos 3578 1.1 christos 3579 1.1 christos 100011,5.BASE,5.RT,16.OFFSET:NORMAL:32::LW 3580 1.1 christos "lw r<RT>, <OFFSET>(r<BASE>)" 3581 1.1 christos *mipsI: 3582 1.1 christos *mipsII: 3583 1.1 christos *mipsIII: 3584 1.1 christos *mipsIV: 3585 1.1 christos *mipsV: 3586 1.1 christos *mips32: 3587 1.1 christos *mips32r2: 3588 1.1.1.4 christos *mips32r6: 3589 1.1 christos *mips64: 3590 1.1 christos *mips64r2: 3591 1.1.1.4 christos *mips64r6: 3592 1.1 christos *vr4100: 3593 1.1 christos *vr5000: 3594 1.1 christos *r3900: 3595 1.1 christos { 3596 1.1.1.2 christos do_lw (SD_,RT,OFFSET,BASE); 3597 1.1 christos } 3598 1.1 christos 3599 1.1 christos 3600 1.1 christos 1100,ZZ!0!1!3,5.BASE,5.RT,16.OFFSET:NORMAL:32::LWCz 3601 1.1 christos "lwc<ZZ> r<RT>, <OFFSET>(r<BASE>)" 3602 1.1 christos *mipsI: 3603 1.1 christos *mipsII: 3604 1.1 christos *mipsIII: 3605 1.1 christos *mipsIV: 3606 1.1 christos *mipsV: 3607 1.1 christos *mips32: 3608 1.1 christos *mips32r2: 3609 1.1 christos *mips64: 3610 1.1 christos *mips64r2: 3611 1.1 christos *vr4100: 3612 1.1 christos *vr5000: 3613 1.1 christos *r3900: 3614 1.1 christos { 3615 1.1.1.2 christos do_lwc (SD_, ZZ, RT, OFFSET, BASE); 3616 1.1 christos } 3617 1.1 christos 3618 1.1 christos 3619 1.1 christos 100010,5.BASE,5.RT,16.OFFSET:NORMAL:32::LWL 3620 1.1 christos "lwl r<RT>, <OFFSET>(r<BASE>)" 3621 1.1 christos *mipsI: 3622 1.1 christos *mipsII: 3623 1.1 christos *mipsIII: 3624 1.1 christos *mipsIV: 3625 1.1 christos *mipsV: 3626 1.1 christos *mips32: 3627 1.1 christos *mips32r2: 3628 1.1 christos *mips64: 3629 1.1 christos *mips64r2: 3630 1.1 christos *vr4100: 3631 1.1 christos *vr5000: 3632 1.1 christos *r3900: 3633 1.1 christos { 3634 1.1.1.2 christos do_lwl (SD_, RT, OFFSET, BASE); 3635 1.1 christos } 3636 1.1 christos 3637 1.1 christos 3638 1.1 christos 100110,5.BASE,5.RT,16.OFFSET:NORMAL:32::LWR 3639 1.1 christos "lwr r<RT>, <OFFSET>(r<BASE>)" 3640 1.1 christos *mipsI: 3641 1.1 christos *mipsII: 3642 1.1 christos *mipsIII: 3643 1.1 christos *mipsIV: 3644 1.1 christos *mipsV: 3645 1.1 christos *mips32: 3646 1.1 christos *mips32r2: 3647 1.1 christos *mips64: 3648 1.1 christos *mips64r2: 3649 1.1 christos *vr4100: 3650 1.1 christos *vr5000: 3651 1.1 christos *r3900: 3652 1.1 christos { 3653 1.1.1.2 christos do_lwr (SD_, RT, OFFSET, BASE); 3654 1.1 christos } 3655 1.1 christos 3656 1.1 christos 3657 1.1 christos 100111,5.BASE,5.RT,16.OFFSET:NORMAL:64::LWU 3658 1.1 christos "lwu r<RT>, <OFFSET>(r<BASE>)" 3659 1.1 christos *mipsIII: 3660 1.1 christos *mipsIV: 3661 1.1 christos *mipsV: 3662 1.1 christos *mips64: 3663 1.1 christos *mips64r2: 3664 1.1.1.4 christos *mips64r6: 3665 1.1 christos *vr4100: 3666 1.1 christos *vr5000: 3667 1.1 christos { 3668 1.1.1.2 christos do_lwu (SD_, RT, OFFSET, BASE, instruction_0); 3669 1.1 christos } 3670 1.1 christos 3671 1.1 christos 3672 1.1 christos 3673 1.1 christos 011100,5.RS,5.RT,00000,00000,000000:SPECIAL2:32::MADD 3674 1.1 christos "madd r<RS>, r<RT>" 3675 1.1 christos *mips32: 3676 1.1 christos *mips64: 3677 1.1 christos *vr5500: 3678 1.1 christos { 3679 1.1.1.2 christos do_madd (SD_, RS, RT); 3680 1.1 christos } 3681 1.1 christos 3682 1.1 christos 3683 1.1 christos 011100,5.RS,5.RT,000,2.AC,00000,000000:SPECIAL2:32::MADD 3684 1.1 christos "madd r<RS>, r<RT>":AC == 0 3685 1.1 christos "madd ac<AC>, r<RS>, r<RT>" 3686 1.1 christos *mips32r2: 3687 1.1 christos *mips64r2: 3688 1.1 christos *dsp2: 3689 1.1 christos { 3690 1.1.1.2 christos do_dsp_madd (SD_, AC, RS, RT); 3691 1.1 christos } 3692 1.1 christos 3693 1.1 christos 3694 1.1 christos 011100,5.RS,5.RT,00000,00000,000001:SPECIAL2:32::MADDU 3695 1.1 christos "maddu r<RS>, r<RT>" 3696 1.1 christos *mips32: 3697 1.1 christos *mips64: 3698 1.1 christos *vr5500: 3699 1.1 christos { 3700 1.1.1.2 christos do_maddu (SD_, RS, RT); 3701 1.1 christos } 3702 1.1 christos 3703 1.1 christos 3704 1.1 christos 011100,5.RS,5.RT,000,2.AC,00000,000001:SPECIAL2:32::MADDU 3705 1.1 christos "maddu r<RS>, r<RT>":AC == 0 3706 1.1 christos "maddu ac<AC>, r<RS>, r<RT>" 3707 1.1 christos *mips32r2: 3708 1.1 christos *mips64r2: 3709 1.1 christos *dsp2: 3710 1.1 christos { 3711 1.1.1.2 christos do_dsp_maddu (SD_, AC, RS, RT); 3712 1.1 christos } 3713 1.1 christos 3714 1.1 christos 3715 1.1 christos :function:::void:do_mfhi:int rd 3716 1.1 christos { 3717 1.1 christos check_mf_hilo (SD_, HIHISTORY, LOHISTORY); 3718 1.1 christos TRACE_ALU_INPUT1 (HI); 3719 1.1 christos GPR[rd] = HI; 3720 1.1 christos TRACE_ALU_RESULT (GPR[rd]); 3721 1.1 christos } 3722 1.1 christos 3723 1.1 christos 000000,0000000000,5.RD,00000,010000:SPECIAL:32::MFHI 3724 1.1 christos "mfhi r<RD>" 3725 1.1 christos *mipsI: 3726 1.1 christos *mipsII: 3727 1.1 christos *mipsIII: 3728 1.1 christos *mipsIV: 3729 1.1 christos *mipsV: 3730 1.1 christos *vr4100: 3731 1.1 christos *vr5000: 3732 1.1 christos *r3900: 3733 1.1 christos *mips32: 3734 1.1 christos *mips64: 3735 1.1 christos { 3736 1.1 christos do_mfhi (SD_, RD); 3737 1.1 christos } 3738 1.1 christos 3739 1.1 christos 3740 1.1 christos 000000,000,2.AC,00000,5.RD,00000,010000:SPECIAL:32::MFHI 3741 1.1 christos "mfhi r<RD>":AC == 0 3742 1.1 christos "mfhi r<RD>, ac<AC>" 3743 1.1 christos *mips32r2: 3744 1.1 christos *mips64r2: 3745 1.1 christos *dsp: 3746 1.1 christos { 3747 1.1.1.2 christos do_dsp_mfhi (SD_, AC, RD); 3748 1.1 christos } 3749 1.1 christos 3750 1.1 christos 3751 1.1 christos :function:::void:do_mflo:int rd 3752 1.1 christos { 3753 1.1 christos check_mf_hilo (SD_, LOHISTORY, HIHISTORY); 3754 1.1 christos TRACE_ALU_INPUT1 (LO); 3755 1.1 christos GPR[rd] = LO; 3756 1.1 christos TRACE_ALU_RESULT (GPR[rd]); 3757 1.1 christos } 3758 1.1 christos 3759 1.1 christos 000000,0000000000,5.RD,00000,010010:SPECIAL:32::MFLO 3760 1.1 christos "mflo r<RD>" 3761 1.1 christos *mipsI: 3762 1.1 christos *mipsII: 3763 1.1 christos *mipsIII: 3764 1.1 christos *mipsIV: 3765 1.1 christos *mipsV: 3766 1.1 christos *vr4100: 3767 1.1 christos *vr5000: 3768 1.1 christos *r3900: 3769 1.1 christos *mips32: 3770 1.1 christos *mips64: 3771 1.1 christos { 3772 1.1 christos do_mflo (SD_, RD); 3773 1.1 christos } 3774 1.1 christos 3775 1.1 christos 3776 1.1 christos 000000,000,2.AC,00000,5.RD,00000,010010:SPECIAL:32::MFLO 3777 1.1 christos "mflo r<RD>":AC == 0 3778 1.1 christos "mflo r<RD>, ac<AC>" 3779 1.1 christos *mips32r2: 3780 1.1 christos *mips64r2: 3781 1.1 christos *dsp: 3782 1.1 christos { 3783 1.1.1.2 christos do_dsp_mflo (SD_, AC, RD); 3784 1.1 christos } 3785 1.1 christos 3786 1.1 christos 3787 1.1 christos 000000,5.RS,5.RT,5.RD,00000,001011:SPECIAL:32::MOVN 3788 1.1 christos "movn r<RD>, r<RS>, r<RT>" 3789 1.1 christos *mipsIV: 3790 1.1 christos *mipsV: 3791 1.1 christos *mips32: 3792 1.1 christos *mips32r2: 3793 1.1 christos *mips64: 3794 1.1 christos *mips64r2: 3795 1.1 christos *vr5000: 3796 1.1 christos { 3797 1.1.1.2 christos do_movn (SD_, RD, RS, RT); 3798 1.1 christos } 3799 1.1 christos 3800 1.1 christos 3801 1.1 christos 3802 1.1 christos 000000,5.RS,5.RT,5.RD,00000,001010:SPECIAL:32::MOVZ 3803 1.1 christos "movz r<RD>, r<RS>, r<RT>" 3804 1.1 christos *mipsIV: 3805 1.1 christos *mipsV: 3806 1.1 christos *mips32: 3807 1.1 christos *mips32r2: 3808 1.1 christos *mips64: 3809 1.1 christos *mips64r2: 3810 1.1 christos *vr5000: 3811 1.1 christos { 3812 1.1.1.2 christos do_movz (SD_, RD, RS, RT); 3813 1.1 christos } 3814 1.1 christos 3815 1.1 christos 3816 1.1 christos 3817 1.1 christos 011100,5.RS,5.RT,00000,00000,000100:SPECIAL2:32::MSUB 3818 1.1 christos "msub r<RS>, r<RT>" 3819 1.1 christos *mips32: 3820 1.1 christos *mips64: 3821 1.1 christos *vr5500: 3822 1.1 christos { 3823 1.1.1.2 christos do_msub (SD_, RS, RT); 3824 1.1 christos } 3825 1.1 christos 3826 1.1 christos 3827 1.1 christos 011100,5.RS,5.RT,000,2.AC,00000,000100:SPECIAL2:32::MSUB 3828 1.1 christos "msub r<RS>, r<RT>":AC == 0 3829 1.1 christos "msub ac<AC>, r<RS>, r<RT>" 3830 1.1 christos *mips32r2: 3831 1.1 christos *mips64r2: 3832 1.1 christos *dsp2: 3833 1.1 christos { 3834 1.1.1.2 christos do_dsp_msub (SD_, AC, RS, RT); 3835 1.1 christos } 3836 1.1 christos 3837 1.1 christos 3838 1.1 christos 011100,5.RS,5.RT,00000,00000,000101:SPECIAL2:32::MSUBU 3839 1.1 christos "msubu r<RS>, r<RT>" 3840 1.1 christos *mips32: 3841 1.1 christos *mips64: 3842 1.1 christos *vr5500: 3843 1.1 christos { 3844 1.1.1.2 christos do_msubu (SD_, RS, RT); 3845 1.1 christos } 3846 1.1 christos 3847 1.1 christos 3848 1.1 christos 011100,5.RS,5.RT,000,2.AC,00000,000101:SPECIAL2:32::MSUBU 3849 1.1 christos "msubu r<RS>, r<RT>":AC == 0 3850 1.1 christos "msubu ac<AC>, r<RS>, r<RT>" 3851 1.1 christos *mips32r2: 3852 1.1 christos *mips64r2: 3853 1.1 christos *dsp2: 3854 1.1 christos { 3855 1.1.1.2 christos do_dsp_msubu (SD_, AC, RS, RT); 3856 1.1 christos } 3857 1.1 christos 3858 1.1 christos 3859 1.1 christos 000000,5.RS,000000000000000,010001:SPECIAL:32::MTHI 3860 1.1 christos "mthi r<RS>" 3861 1.1 christos *mipsI: 3862 1.1 christos *mipsII: 3863 1.1 christos *mipsIII: 3864 1.1 christos *mipsIV: 3865 1.1 christos *mipsV: 3866 1.1 christos *vr4100: 3867 1.1 christos *vr5000: 3868 1.1 christos *r3900: 3869 1.1 christos *mips32: 3870 1.1 christos *mips64: 3871 1.1 christos { 3872 1.1.1.2 christos do_mthi (SD_, RS); 3873 1.1 christos } 3874 1.1 christos 3875 1.1 christos 3876 1.1 christos 000000,5.RS,00000,000,2.AC,00000,010001:SPECIAL:32::MTHI 3877 1.1 christos "mthi r<RS>":AC == 0 3878 1.1 christos "mthi r<RS>, ac<AC>" 3879 1.1 christos *mips32r2: 3880 1.1 christos *mips64r2: 3881 1.1 christos *dsp: 3882 1.1 christos { 3883 1.1.1.2 christos do_dsp_mthi (SD_, AC, RS); 3884 1.1 christos } 3885 1.1 christos 3886 1.1 christos 3887 1.1 christos 000000,5.RS,000000000000000,010011:SPECIAL:32::MTLO 3888 1.1 christos "mtlo r<RS>" 3889 1.1 christos *mipsI: 3890 1.1 christos *mipsII: 3891 1.1 christos *mipsIII: 3892 1.1 christos *mipsIV: 3893 1.1 christos *mipsV: 3894 1.1 christos *vr4100: 3895 1.1 christos *vr5000: 3896 1.1 christos *r3900: 3897 1.1 christos *mips32: 3898 1.1 christos *mips64: 3899 1.1 christos { 3900 1.1.1.2 christos do_mtlo (SD_, RS); 3901 1.1 christos } 3902 1.1 christos 3903 1.1 christos 3904 1.1 christos 000000,5.RS,00000,000,2.AC,00000,010011:SPECIAL:32::MTLO 3905 1.1 christos "mtlo r<RS>":AC == 0 3906 1.1 christos "mtlo r<RS>, ac<AC>" 3907 1.1 christos *mips32r2: 3908 1.1 christos *mips64r2: 3909 1.1 christos *dsp: 3910 1.1 christos { 3911 1.1.1.2 christos do_dsp_mtlo (SD_, AC, RS); 3912 1.1 christos } 3913 1.1 christos 3914 1.1 christos 3915 1.1 christos 011100,5.RS,5.RT,5.RD,00000,000010:SPECIAL2:32::MUL 3916 1.1 christos "mul r<RD>, r<RS>, r<RT>" 3917 1.1 christos *mips32: 3918 1.1 christos *mips32r2: 3919 1.1 christos *mips64: 3920 1.1 christos *mips64r2: 3921 1.1 christos *vr5500: 3922 1.1 christos { 3923 1.1.1.2 christos do_mul (SD_, RD, RS, RT); 3924 1.1 christos } 3925 1.1 christos 3926 1.1 christos 3927 1.1 christos 3928 1.1 christos :function:::void:do_mult:int rs, int rt, int rd 3929 1.1 christos { 3930 1.1.1.4 christos int64_t prod; 3931 1.1 christos check_mult_hilo (SD_, HIHISTORY, LOHISTORY); 3932 1.1 christos if (NotWordValue (GPR[rs]) || NotWordValue (GPR[rt])) 3933 1.1 christos Unpredictable (); 3934 1.1 christos TRACE_ALU_INPUT2 (GPR[rs], GPR[rt]); 3935 1.1.1.4 christos prod = (((int64_t)(int32_t) GPR[rs]) 3936 1.1.1.4 christos * ((int64_t)(int32_t) GPR[rt])); 3937 1.1 christos LO = EXTEND32 (VL4_8 (prod)); 3938 1.1 christos HI = EXTEND32 (VH4_8 (prod)); 3939 1.1 christos ACX = 0; /* SmartMIPS */ 3940 1.1 christos if (rd != 0) 3941 1.1 christos GPR[rd] = LO; 3942 1.1 christos TRACE_ALU_RESULT2 (HI, LO); 3943 1.1 christos } 3944 1.1 christos 3945 1.1 christos 000000,5.RS,5.RT,0000000000,011000:SPECIAL:32::MULT 3946 1.1 christos "mult r<RS>, r<RT>" 3947 1.1 christos *mipsI: 3948 1.1 christos *mipsII: 3949 1.1 christos *mipsIII: 3950 1.1 christos *mipsIV: 3951 1.1 christos *mipsV: 3952 1.1 christos *mips32: 3953 1.1 christos *mips64: 3954 1.1 christos *vr4100: 3955 1.1 christos { 3956 1.1 christos do_mult (SD_, RS, RT, 0); 3957 1.1 christos } 3958 1.1 christos 3959 1.1 christos 3960 1.1 christos 000000,5.RS,5.RT,000,2.AC,00000,011000:SPECIAL:32::MULT 3961 1.1 christos "mult r<RS>, r<RT>":AC == 0 3962 1.1 christos "mult ac<AC>, r<RS>, r<RT>" 3963 1.1 christos *mips32r2: 3964 1.1 christos *mips64r2: 3965 1.1 christos *dsp2: 3966 1.1 christos { 3967 1.1.1.2 christos do_dsp_mult (SD_, AC, RS, RT); 3968 1.1 christos } 3969 1.1 christos 3970 1.1 christos 3971 1.1 christos 000000,5.RS,5.RT,5.RD,00000,011000:SPECIAL:32::MULT 3972 1.1 christos "mult r<RS>, r<RT>":RD == 0 3973 1.1 christos "mult r<RD>, r<RS>, r<RT>" 3974 1.1 christos *vr5000: 3975 1.1 christos *r3900: 3976 1.1 christos { 3977 1.1 christos do_mult (SD_, RS, RT, RD); 3978 1.1 christos } 3979 1.1 christos 3980 1.1 christos 3981 1.1 christos :function:::void:do_multu:int rs, int rt, int rd 3982 1.1 christos { 3983 1.1.1.4 christos uint64_t prod; 3984 1.1 christos check_mult_hilo (SD_, HIHISTORY, LOHISTORY); 3985 1.1 christos if (NotWordValue (GPR[rs]) || NotWordValue (GPR[rt])) 3986 1.1 christos Unpredictable (); 3987 1.1 christos TRACE_ALU_INPUT2 (GPR[rs], GPR[rt]); 3988 1.1.1.4 christos prod = (((uint64_t)(uint32_t) GPR[rs]) 3989 1.1.1.4 christos * ((uint64_t)(uint32_t) GPR[rt])); 3990 1.1 christos LO = EXTEND32 (VL4_8 (prod)); 3991 1.1 christos HI = EXTEND32 (VH4_8 (prod)); 3992 1.1 christos if (rd != 0) 3993 1.1 christos GPR[rd] = LO; 3994 1.1 christos TRACE_ALU_RESULT2 (HI, LO); 3995 1.1 christos } 3996 1.1 christos 3997 1.1 christos 000000,5.RS,5.RT,0000000000,011001:SPECIAL:32::MULTU 3998 1.1 christos "multu r<RS>, r<RT>" 3999 1.1 christos *mipsI: 4000 1.1 christos *mipsII: 4001 1.1 christos *mipsIII: 4002 1.1 christos *mipsIV: 4003 1.1 christos *mipsV: 4004 1.1 christos *mips32: 4005 1.1 christos *mips64: 4006 1.1 christos *vr4100: 4007 1.1 christos { 4008 1.1 christos do_multu (SD_, RS, RT, 0); 4009 1.1 christos } 4010 1.1 christos 4011 1.1 christos 4012 1.1 christos 000000,5.RS,5.RT,000,2.AC,00000,011001:SPECIAL:32::MULTU 4013 1.1 christos "multu r<RS>, r<RT>":AC == 0 4014 1.1 christos "multu r<RS>, r<RT>" 4015 1.1 christos *mips32r2: 4016 1.1 christos *mips64r2: 4017 1.1 christos *dsp2: 4018 1.1.1.2 christos { 4019 1.1.1.2 christos do_dsp_multu (SD_, AC, RS, RT); 4020 1.1 christos } 4021 1.1 christos 4022 1.1 christos 4023 1.1 christos 000000,5.RS,5.RT,5.RD,00000,011001:SPECIAL:32::MULTU 4024 1.1 christos "multu r<RS>, r<RT>":RD == 0 4025 1.1 christos "multu r<RD>, r<RS>, r<RT>" 4026 1.1 christos *vr5000: 4027 1.1 christos *r3900: 4028 1.1 christos { 4029 1.1 christos do_multu (SD_, RS, RT, RD); 4030 1.1 christos } 4031 1.1 christos 4032 1.1 christos 4033 1.1 christos :function:::void:do_nor:int rs, int rt, int rd 4034 1.1 christos { 4035 1.1 christos TRACE_ALU_INPUT2 (GPR[rs], GPR[rt]); 4036 1.1 christos GPR[rd] = ~ (GPR[rs] | GPR[rt]); 4037 1.1 christos TRACE_ALU_RESULT (GPR[rd]); 4038 1.1 christos } 4039 1.1 christos 4040 1.1 christos 000000,5.RS,5.RT,5.RD,00000,100111:SPECIAL:32::NOR 4041 1.1 christos "nor r<RD>, r<RS>, r<RT>" 4042 1.1 christos *mipsI: 4043 1.1 christos *mipsII: 4044 1.1 christos *mipsIII: 4045 1.1 christos *mipsIV: 4046 1.1 christos *mipsV: 4047 1.1 christos *mips32: 4048 1.1 christos *mips32r2: 4049 1.1.1.4 christos *mips32r6: 4050 1.1 christos *mips64: 4051 1.1 christos *mips64r2: 4052 1.1.1.4 christos *mips64r6: 4053 1.1 christos *vr4100: 4054 1.1 christos *vr5000: 4055 1.1 christos *r3900: 4056 1.1 christos { 4057 1.1 christos do_nor (SD_, RS, RT, RD); 4058 1.1 christos } 4059 1.1 christos 4060 1.1 christos 4061 1.1 christos :function:::void:do_or:int rs, int rt, int rd 4062 1.1 christos { 4063 1.1 christos TRACE_ALU_INPUT2 (GPR[rs], GPR[rt]); 4064 1.1 christos GPR[rd] = (GPR[rs] | GPR[rt]); 4065 1.1 christos TRACE_ALU_RESULT (GPR[rd]); 4066 1.1 christos } 4067 1.1 christos 4068 1.1 christos 000000,5.RS,5.RT,5.RD,00000,100101:SPECIAL:32::OR 4069 1.1 christos "or r<RD>, r<RS>, r<RT>" 4070 1.1 christos *mipsI: 4071 1.1 christos *mipsII: 4072 1.1 christos *mipsIII: 4073 1.1 christos *mipsIV: 4074 1.1 christos *mipsV: 4075 1.1 christos *mips32: 4076 1.1 christos *mips32r2: 4077 1.1.1.4 christos *mips32r6: 4078 1.1 christos *mips64: 4079 1.1 christos *mips64r2: 4080 1.1.1.4 christos *mips64r6: 4081 1.1 christos *vr4100: 4082 1.1 christos *vr5000: 4083 1.1 christos *r3900: 4084 1.1 christos { 4085 1.1 christos do_or (SD_, RS, RT, RD); 4086 1.1 christos } 4087 1.1 christos 4088 1.1 christos 4089 1.1 christos 4090 1.1 christos :function:::void:do_ori:int rs, int rt, unsigned immediate 4091 1.1 christos { 4092 1.1 christos TRACE_ALU_INPUT2 (GPR[rs], immediate); 4093 1.1 christos GPR[rt] = (GPR[rs] | immediate); 4094 1.1 christos TRACE_ALU_RESULT (GPR[rt]); 4095 1.1 christos } 4096 1.1 christos 4097 1.1 christos 001101,5.RS,5.RT,16.IMMEDIATE:NORMAL:32::ORI 4098 1.1 christos "ori r<RT>, r<RS>, %#lx<IMMEDIATE>" 4099 1.1 christos *mipsI: 4100 1.1 christos *mipsII: 4101 1.1 christos *mipsIII: 4102 1.1 christos *mipsIV: 4103 1.1 christos *mipsV: 4104 1.1 christos *mips32: 4105 1.1 christos *mips32r2: 4106 1.1.1.4 christos *mips32r6: 4107 1.1 christos *mips64: 4108 1.1 christos *mips64r2: 4109 1.1.1.4 christos *mips64r6: 4110 1.1 christos *vr4100: 4111 1.1 christos *vr5000: 4112 1.1 christos *r3900: 4113 1.1 christos { 4114 1.1 christos do_ori (SD_, RS, RT, IMMEDIATE); 4115 1.1 christos } 4116 1.1 christos 4117 1.1 christos 4118 1.1 christos 110011,5.BASE,5.HINT,16.OFFSET:NORMAL:32::PREF 4119 1.1 christos "pref <HINT>, <OFFSET>(r<BASE>)" 4120 1.1 christos *mipsIV: 4121 1.1 christos *mipsV: 4122 1.1 christos *mips32: 4123 1.1 christos *mips32r2: 4124 1.1 christos *mips64: 4125 1.1 christos *mips64r2: 4126 1.1 christos *vr5000: 4127 1.1 christos { 4128 1.1.1.2 christos do_pref (SD_, HINT, OFFSET, BASE); 4129 1.1 christos } 4130 1.1 christos 4131 1.1 christos 4132 1.1.1.4 christos :function:::uint64_t:do_ror:uint32_t x,uint32_t y 4133 1.1 christos { 4134 1.1.1.4 christos uint64_t result; 4135 1.1 christos 4136 1.1 christos y &= 31; 4137 1.1 christos TRACE_ALU_INPUT2 (x, y); 4138 1.1 christos result = EXTEND32 (ROTR32 (x, y)); 4139 1.1 christos TRACE_ALU_RESULT (result); 4140 1.1 christos return result; 4141 1.1 christos } 4142 1.1 christos 4143 1.1 christos 000000,00001,5.RT,5.RD,5.SHIFT,000010::32::ROR 4144 1.1 christos "ror r<RD>, r<RT>, <SHIFT>" 4145 1.1 christos *mips32r2: 4146 1.1.1.4 christos *mips32r6: 4147 1.1 christos *mips64r2: 4148 1.1.1.4 christos *mips64r6: 4149 1.1 christos *smartmips: 4150 1.1 christos *vr5400: 4151 1.1 christos *vr5500: 4152 1.1 christos { 4153 1.1 christos GPR[RD] = do_ror (SD_, GPR[RT], SHIFT); 4154 1.1 christos } 4155 1.1 christos 4156 1.1 christos 000000,5.RS,5.RT,5.RD,00001,000110::32::RORV 4157 1.1 christos "rorv r<RD>, r<RT>, r<RS>" 4158 1.1 christos *mips32r2: 4159 1.1.1.4 christos *mips32r6: 4160 1.1 christos *mips64r2: 4161 1.1.1.4 christos *mips64r6: 4162 1.1 christos *smartmips: 4163 1.1 christos *vr5400: 4164 1.1 christos *vr5500: 4165 1.1 christos { 4166 1.1 christos GPR[RD] = do_ror (SD_, GPR[RT], GPR[RS]); 4167 1.1 christos } 4168 1.1 christos 4169 1.1 christos 4170 1.1 christos :function:::void:do_store:unsigned access, address_word base, address_word offset, unsigned_word word 4171 1.1 christos { 4172 1.1 christos address_word mask = (WITH_TARGET_WORD_BITSIZE == 64 ? 0x7 : 0x3); 4173 1.1 christos address_word reverseendian = (ReverseEndian ? (mask ^ access) : 0); 4174 1.1 christos address_word bigendiancpu = (BigEndianCPU ? (mask ^ access) : 0); 4175 1.1 christos unsigned int byte; 4176 1.1 christos address_word paddr; 4177 1.1.1.4 christos uint64_t memval; 4178 1.1 christos address_word vaddr; 4179 1.1 christos 4180 1.1.1.2 christos paddr = vaddr = loadstore_ea (SD_, base, offset); 4181 1.1 christos if ((vaddr & access) != 0) 4182 1.1 christos { 4183 1.1 christos SIM_CORE_SIGNAL (SD, STATE_CPU(SD, 0), cia, read_map, access+1, vaddr, write_transfer, sim_core_unaligned_signal); 4184 1.1 christos } 4185 1.1 christos paddr = ((paddr & ~mask) | ((paddr & mask) ^ reverseendian)); 4186 1.1 christos byte = ((vaddr & mask) ^ bigendiancpu); 4187 1.1 christos memval = (word << (8 * byte)); 4188 1.1.1.2 christos StoreMemory (access, memval, 0, paddr, vaddr, isREAL); 4189 1.1 christos } 4190 1.1 christos 4191 1.1 christos :function:::void:do_store_left:unsigned access, address_word base, address_word offset, unsigned_word rt 4192 1.1 christos { 4193 1.1 christos address_word mask = (WITH_TARGET_WORD_BITSIZE == 64 ? 0x7 : 0x3); 4194 1.1 christos address_word reverseendian = (ReverseEndian ? -1 : 0); 4195 1.1 christos address_word bigendiancpu = (BigEndianCPU ? -1 : 0); 4196 1.1 christos unsigned int byte; 4197 1.1 christos unsigned int word; 4198 1.1 christos address_word paddr; 4199 1.1.1.4 christos uint64_t memval; 4200 1.1 christos address_word vaddr; 4201 1.1 christos int nr_lhs_bits; 4202 1.1 christos int nr_rhs_bits; 4203 1.1 christos 4204 1.1.1.2 christos paddr = vaddr = loadstore_ea (SD_, base, offset); 4205 1.1 christos paddr = (paddr ^ (reverseendian & mask)); 4206 1.1 christos if (BigEndianMem == 0) 4207 1.1 christos paddr = paddr & ~access; 4208 1.1 christos 4209 1.1 christos /* compute where within the word/mem we are */ 4210 1.1 christos byte = ((vaddr ^ bigendiancpu) & access); /* 0..access */ 4211 1.1 christos word = ((vaddr ^ bigendiancpu) & (mask & ~access)) / (access + 1); /* 0..1 */ 4212 1.1 christos nr_lhs_bits = 8 * byte + 8; 4213 1.1 christos nr_rhs_bits = 8 * access - 8 * byte; 4214 1.1 christos /* nr_lhs_bits + nr_rhs_bits == 8 * (accesss + 1) */ 4215 1.1 christos /* fprintf (stderr, "s[wd]l: 0x%08lx%08lx 0x%08lx%08lx %d:%d %d+%d\n", 4216 1.1.1.4 christos (long) ((uint64_t) vaddr >> 32), (long) vaddr, 4217 1.1.1.4 christos (long) ((uint64_t) paddr >> 32), (long) paddr, 4218 1.1 christos word, byte, nr_lhs_bits, nr_rhs_bits); */ 4219 1.1 christos 4220 1.1 christos if (word == 0) 4221 1.1 christos { 4222 1.1 christos memval = (rt >> nr_rhs_bits); 4223 1.1 christos } 4224 1.1 christos else 4225 1.1 christos { 4226 1.1 christos memval = (rt << nr_lhs_bits); 4227 1.1 christos } 4228 1.1 christos /* fprintf (stderr, "s[wd]l: 0x%08lx%08lx -> 0x%08lx%08lx\n", 4229 1.1.1.4 christos (long) ((uint64_t) rt >> 32), (long) rt, 4230 1.1.1.4 christos (long) ((uint64_t) memval >> 32), (long) memval); */ 4231 1.1.1.2 christos StoreMemory (byte, memval, 0, paddr, vaddr, isREAL); 4232 1.1 christos } 4233 1.1 christos 4234 1.1 christos :function:::void:do_store_right:unsigned access, address_word base, address_word offset, unsigned_word rt 4235 1.1 christos { 4236 1.1 christos address_word mask = (WITH_TARGET_WORD_BITSIZE == 64 ? 0x7 : 0x3); 4237 1.1 christos address_word reverseendian = (ReverseEndian ? -1 : 0); 4238 1.1 christos address_word bigendiancpu = (BigEndianCPU ? -1 : 0); 4239 1.1 christos unsigned int byte; 4240 1.1 christos address_word paddr; 4241 1.1.1.4 christos uint64_t memval; 4242 1.1 christos address_word vaddr; 4243 1.1 christos 4244 1.1.1.2 christos paddr = vaddr = loadstore_ea (SD_, base, offset); 4245 1.1 christos paddr = (paddr ^ (reverseendian & mask)); 4246 1.1 christos if (BigEndianMem != 0) 4247 1.1 christos paddr &= ~access; 4248 1.1 christos byte = ((vaddr & mask) ^ (bigendiancpu & mask)); 4249 1.1 christos memval = (rt << (byte * 8)); 4250 1.1.1.2 christos StoreMemory (access - (access & byte), memval, 0, paddr, vaddr, isREAL); 4251 1.1 christos } 4252 1.1 christos 4253 1.1 christos 4254 1.1 christos 101000,5.BASE,5.RT,16.OFFSET:NORMAL:32::SB 4255 1.1 christos "sb r<RT>, <OFFSET>(r<BASE>)" 4256 1.1 christos *mipsI: 4257 1.1 christos *mipsII: 4258 1.1 christos *mipsIII: 4259 1.1 christos *mipsIV: 4260 1.1 christos *mipsV: 4261 1.1 christos *mips32: 4262 1.1 christos *mips32r2: 4263 1.1.1.4 christos *mips32r6: 4264 1.1 christos *mips64: 4265 1.1 christos *mips64r2: 4266 1.1.1.4 christos *mips64r6: 4267 1.1 christos *vr4100: 4268 1.1 christos *vr5000: 4269 1.1 christos *r3900: 4270 1.1 christos { 4271 1.1 christos do_store (SD_, AccessLength_BYTE, GPR[BASE], EXTEND16 (OFFSET), GPR[RT]); 4272 1.1 christos } 4273 1.1 christos 4274 1.1 christos 4275 1.1 christos 111000,5.BASE,5.RT,16.OFFSET:NORMAL:32::SC 4276 1.1 christos "sc r<RT>, <OFFSET>(r<BASE>)" 4277 1.1 christos *mipsII: 4278 1.1 christos *mipsIII: 4279 1.1 christos *mipsIV: 4280 1.1 christos *mipsV: 4281 1.1 christos *mips32: 4282 1.1 christos *mips32r2: 4283 1.1 christos *mips64: 4284 1.1 christos *mips64r2: 4285 1.1 christos *vr4100: 4286 1.1 christos *vr5000: 4287 1.1 christos { 4288 1.1.1.4 christos do_sc (SD_, RT, OFFSET, BASE, instruction_0, 1); 4289 1.1 christos } 4290 1.1 christos 4291 1.1 christos 4292 1.1 christos 111100,5.BASE,5.RT,16.OFFSET:NORMAL:64::SCD 4293 1.1 christos "scd r<RT>, <OFFSET>(r<BASE>)" 4294 1.1 christos *mipsIII: 4295 1.1 christos *mipsIV: 4296 1.1 christos *mipsV: 4297 1.1 christos *mips64: 4298 1.1 christos *mips64r2: 4299 1.1 christos *vr4100: 4300 1.1 christos *vr5000: 4301 1.1 christos { 4302 1.1 christos check_u64 (SD_, instruction_0); 4303 1.1.1.4 christos do_scd (SD_, RT, OFFSET, BASE, 1); 4304 1.1 christos } 4305 1.1 christos 4306 1.1 christos 4307 1.1 christos 111111,5.BASE,5.RT,16.OFFSET:NORMAL:64::SD 4308 1.1 christos "sd r<RT>, <OFFSET>(r<BASE>)" 4309 1.1 christos *mipsIII: 4310 1.1 christos *mipsIV: 4311 1.1 christos *mipsV: 4312 1.1 christos *mips64: 4313 1.1 christos *mips64r2: 4314 1.1.1.4 christos *mips64r6: 4315 1.1 christos *vr4100: 4316 1.1 christos *vr5000: 4317 1.1 christos { 4318 1.1 christos check_u64 (SD_, instruction_0); 4319 1.1 christos do_store (SD_, AccessLength_DOUBLEWORD, GPR[BASE], EXTEND16 (OFFSET), GPR[RT]); 4320 1.1 christos } 4321 1.1 christos 4322 1.1 christos 4323 1.1 christos 1111,ZZ!0!1!3,5.BASE,5.RT,16.OFFSET:NORMAL:64::SDCz 4324 1.1 christos "sdc<ZZ> r<RT>, <OFFSET>(r<BASE>)" 4325 1.1 christos *mipsII: 4326 1.1 christos *mipsIII: 4327 1.1 christos *mipsIV: 4328 1.1 christos *mipsV: 4329 1.1 christos *mips32: 4330 1.1 christos *mips32r2: 4331 1.1 christos *mips64: 4332 1.1 christos *mips64r2: 4333 1.1 christos *vr4100: 4334 1.1 christos *vr5000: 4335 1.1 christos { 4336 1.1 christos do_store (SD_, AccessLength_DOUBLEWORD, GPR[BASE], EXTEND16 (OFFSET), COP_SD (ZZ, RT)); 4337 1.1 christos } 4338 1.1 christos 4339 1.1 christos 4340 1.1 christos 101100,5.BASE,5.RT,16.OFFSET:NORMAL:64::SDL 4341 1.1 christos "sdl r<RT>, <OFFSET>(r<BASE>)" 4342 1.1 christos *mipsIII: 4343 1.1 christos *mipsIV: 4344 1.1 christos *mipsV: 4345 1.1 christos *mips64: 4346 1.1 christos *mips64r2: 4347 1.1 christos *vr4100: 4348 1.1 christos *vr5000: 4349 1.1 christos { 4350 1.1 christos check_u64 (SD_, instruction_0); 4351 1.1 christos do_store_left (SD_, AccessLength_DOUBLEWORD, GPR[BASE], EXTEND16 (OFFSET), GPR[RT]); 4352 1.1 christos } 4353 1.1 christos 4354 1.1 christos 4355 1.1 christos 101101,5.BASE,5.RT,16.OFFSET:NORMAL:64::SDR 4356 1.1 christos "sdr r<RT>, <OFFSET>(r<BASE>)" 4357 1.1 christos *mipsIII: 4358 1.1 christos *mipsIV: 4359 1.1 christos *mipsV: 4360 1.1 christos *mips64: 4361 1.1 christos *mips64r2: 4362 1.1 christos *vr4100: 4363 1.1 christos *vr5000: 4364 1.1 christos { 4365 1.1 christos check_u64 (SD_, instruction_0); 4366 1.1 christos do_store_right (SD_, AccessLength_DOUBLEWORD, GPR[BASE], EXTEND16 (OFFSET), GPR[RT]); 4367 1.1 christos } 4368 1.1 christos 4369 1.1 christos 4370 1.1 christos 4371 1.1 christos 101001,5.BASE,5.RT,16.OFFSET:NORMAL:32::SH 4372 1.1 christos "sh r<RT>, <OFFSET>(r<BASE>)" 4373 1.1 christos *mipsI: 4374 1.1 christos *mipsII: 4375 1.1 christos *mipsIII: 4376 1.1 christos *mipsIV: 4377 1.1 christos *mipsV: 4378 1.1 christos *mips32: 4379 1.1 christos *mips32r2: 4380 1.1.1.4 christos *mips32r6: 4381 1.1 christos *mips64: 4382 1.1 christos *mips64r2: 4383 1.1.1.4 christos *mips64r6: 4384 1.1 christos *vr4100: 4385 1.1 christos *vr5000: 4386 1.1 christos *r3900: 4387 1.1 christos { 4388 1.1 christos do_store (SD_, AccessLength_HALFWORD, GPR[BASE], EXTEND16 (OFFSET), GPR[RT]); 4389 1.1 christos } 4390 1.1 christos 4391 1.1 christos 4392 1.1 christos :function:::void:do_sll:int rt, int rd, int shift 4393 1.1 christos { 4394 1.1.1.4 christos uint32_t temp = (GPR[rt] << shift); 4395 1.1 christos TRACE_ALU_INPUT2 (GPR[rt], shift); 4396 1.1 christos GPR[rd] = EXTEND32 (temp); 4397 1.1 christos TRACE_ALU_RESULT (GPR[rd]); 4398 1.1 christos } 4399 1.1 christos 4400 1.1 christos 000000,00000,5.RT,5.RD,5.SHIFT,000000:SPECIAL:32::SLLa 4401 1.1 christos "nop":RD == 0 && RT == 0 && SHIFT == 0 4402 1.1 christos "sll r<RD>, r<RT>, <SHIFT>" 4403 1.1 christos *mipsI: 4404 1.1 christos *mipsII: 4405 1.1 christos *mipsIII: 4406 1.1 christos *mipsIV: 4407 1.1 christos *mipsV: 4408 1.1 christos *vr4100: 4409 1.1 christos *vr5000: 4410 1.1 christos *r3900: 4411 1.1 christos { 4412 1.1 christos /* Skip shift for NOP, so that there won't be lots of extraneous 4413 1.1 christos trace output. */ 4414 1.1 christos if (RD != 0 || RT != 0 || SHIFT != 0) 4415 1.1 christos do_sll (SD_, RT, RD, SHIFT); 4416 1.1 christos } 4417 1.1 christos 4418 1.1 christos 000000,00000,5.RT,5.RD,5.SHIFT,000000:SPECIAL:32::SLLb 4419 1.1 christos "nop":RD == 0 && RT == 0 && SHIFT == 0 4420 1.1 christos "ssnop":RD == 0 && RT == 0 && SHIFT == 1 4421 1.1.1.4 christos "ehb":RD == 0 && RT == 0 && SHIFT == 3 4422 1.1 christos "sll r<RD>, r<RT>, <SHIFT>" 4423 1.1 christos *mips32: 4424 1.1 christos *mips32r2: 4425 1.1.1.4 christos *mips32r6: 4426 1.1 christos *mips64: 4427 1.1 christos *mips64r2: 4428 1.1.1.4 christos *mips64r6: 4429 1.1 christos { 4430 1.1.1.4 christos do_sll (SD_, RT, RD, SHIFT); 4431 1.1 christos } 4432 1.1 christos 4433 1.1 christos 4434 1.1 christos :function:::void:do_sllv:int rs, int rt, int rd 4435 1.1 christos { 4436 1.1 christos int s = MASKED (GPR[rs], 4, 0); 4437 1.1.1.4 christos uint32_t temp = (GPR[rt] << s); 4438 1.1 christos TRACE_ALU_INPUT2 (GPR[rt], s); 4439 1.1 christos GPR[rd] = EXTEND32 (temp); 4440 1.1 christos TRACE_ALU_RESULT (GPR[rd]); 4441 1.1 christos } 4442 1.1 christos 4443 1.1 christos 000000,5.RS,5.RT,5.RD,00000,000100:SPECIAL:32::SLLV 4444 1.1 christos "sllv r<RD>, r<RT>, r<RS>" 4445 1.1 christos *mipsI: 4446 1.1 christos *mipsII: 4447 1.1 christos *mipsIII: 4448 1.1 christos *mipsIV: 4449 1.1 christos *mipsV: 4450 1.1 christos *mips32: 4451 1.1 christos *mips32r2: 4452 1.1.1.4 christos *mips32r6: 4453 1.1 christos *mips64: 4454 1.1 christos *mips64r2: 4455 1.1.1.4 christos *mips64r6: 4456 1.1 christos *vr4100: 4457 1.1 christos *vr5000: 4458 1.1 christos *r3900: 4459 1.1 christos { 4460 1.1 christos do_sllv (SD_, RS, RT, RD); 4461 1.1 christos } 4462 1.1 christos 4463 1.1 christos 4464 1.1 christos :function:::void:do_slt:int rs, int rt, int rd 4465 1.1 christos { 4466 1.1 christos TRACE_ALU_INPUT2 (GPR[rs], GPR[rt]); 4467 1.1 christos GPR[rd] = ((signed_word) GPR[rs] < (signed_word) GPR[rt]); 4468 1.1 christos TRACE_ALU_RESULT (GPR[rd]); 4469 1.1 christos } 4470 1.1 christos 4471 1.1 christos 000000,5.RS,5.RT,5.RD,00000,101010:SPECIAL:32::SLT 4472 1.1 christos "slt r<RD>, r<RS>, r<RT>" 4473 1.1 christos *mipsI: 4474 1.1 christos *mipsII: 4475 1.1 christos *mipsIII: 4476 1.1 christos *mipsIV: 4477 1.1 christos *mipsV: 4478 1.1 christos *mips32: 4479 1.1 christos *mips32r2: 4480 1.1.1.4 christos *mips32r6: 4481 1.1 christos *mips64: 4482 1.1 christos *mips64r2: 4483 1.1.1.4 christos *mips64r6: 4484 1.1 christos *vr4100: 4485 1.1 christos *vr5000: 4486 1.1 christos *r3900: 4487 1.1 christos { 4488 1.1 christos do_slt (SD_, RS, RT, RD); 4489 1.1 christos } 4490 1.1 christos 4491 1.1 christos 4492 1.1.1.4 christos :function:::void:do_slti:int rs, int rt, uint16_t immediate 4493 1.1 christos { 4494 1.1 christos TRACE_ALU_INPUT2 (GPR[rs], EXTEND16 (immediate)); 4495 1.1 christos GPR[rt] = ((signed_word) GPR[rs] < (signed_word) EXTEND16 (immediate)); 4496 1.1 christos TRACE_ALU_RESULT (GPR[rt]); 4497 1.1 christos } 4498 1.1 christos 4499 1.1 christos 001010,5.RS,5.RT,16.IMMEDIATE:NORMAL:32::SLTI 4500 1.1 christos "slti r<RT>, r<RS>, <IMMEDIATE>" 4501 1.1 christos *mipsI: 4502 1.1 christos *mipsII: 4503 1.1 christos *mipsIII: 4504 1.1 christos *mipsIV: 4505 1.1 christos *mipsV: 4506 1.1 christos *mips32: 4507 1.1 christos *mips32r2: 4508 1.1.1.4 christos *mips32r6: 4509 1.1 christos *mips64: 4510 1.1 christos *mips64r2: 4511 1.1.1.4 christos *mips64r6: 4512 1.1 christos *vr4100: 4513 1.1 christos *vr5000: 4514 1.1 christos *r3900: 4515 1.1 christos { 4516 1.1 christos do_slti (SD_, RS, RT, IMMEDIATE); 4517 1.1 christos } 4518 1.1 christos 4519 1.1 christos 4520 1.1.1.4 christos :function:::void:do_sltiu:int rs, int rt, uint16_t immediate 4521 1.1 christos { 4522 1.1 christos TRACE_ALU_INPUT2 (GPR[rs], EXTEND16 (immediate)); 4523 1.1 christos GPR[rt] = ((unsigned_word) GPR[rs] < (unsigned_word) EXTEND16 (immediate)); 4524 1.1 christos TRACE_ALU_RESULT (GPR[rt]); 4525 1.1 christos } 4526 1.1 christos 4527 1.1 christos 001011,5.RS,5.RT,16.IMMEDIATE:NORMAL:32::SLTIU 4528 1.1 christos "sltiu r<RT>, r<RS>, <IMMEDIATE>" 4529 1.1 christos *mipsI: 4530 1.1 christos *mipsII: 4531 1.1 christos *mipsIII: 4532 1.1 christos *mipsIV: 4533 1.1 christos *mipsV: 4534 1.1 christos *mips32: 4535 1.1 christos *mips32r2: 4536 1.1.1.4 christos *mips32r6: 4537 1.1 christos *mips64: 4538 1.1 christos *mips64r2: 4539 1.1.1.4 christos *mips64r6: 4540 1.1 christos *vr4100: 4541 1.1 christos *vr5000: 4542 1.1 christos *r3900: 4543 1.1 christos { 4544 1.1 christos do_sltiu (SD_, RS, RT, IMMEDIATE); 4545 1.1 christos } 4546 1.1 christos 4547 1.1 christos 4548 1.1 christos 4549 1.1 christos :function:::void:do_sltu:int rs, int rt, int rd 4550 1.1 christos { 4551 1.1 christos TRACE_ALU_INPUT2 (GPR[rs], GPR[rt]); 4552 1.1 christos GPR[rd] = ((unsigned_word) GPR[rs] < (unsigned_word) GPR[rt]); 4553 1.1 christos TRACE_ALU_RESULT (GPR[rd]); 4554 1.1 christos } 4555 1.1 christos 4556 1.1 christos 000000,5.RS,5.RT,5.RD,00000,101011:SPECIAL:32::SLTU 4557 1.1 christos "sltu r<RD>, r<RS>, r<RT>" 4558 1.1 christos *mipsI: 4559 1.1 christos *mipsII: 4560 1.1 christos *mipsIII: 4561 1.1 christos *mipsIV: 4562 1.1 christos *mipsV: 4563 1.1 christos *mips32: 4564 1.1 christos *mips32r2: 4565 1.1.1.4 christos *mips32r6: 4566 1.1 christos *mips64: 4567 1.1 christos *mips64r2: 4568 1.1.1.4 christos *mips64r6: 4569 1.1 christos *vr4100: 4570 1.1 christos *vr5000: 4571 1.1 christos *r3900: 4572 1.1 christos { 4573 1.1 christos do_sltu (SD_, RS, RT, RD); 4574 1.1 christos } 4575 1.1 christos 4576 1.1 christos 4577 1.1 christos :function:::void:do_sra:int rt, int rd, int shift 4578 1.1 christos { 4579 1.1.1.4 christos int32_t temp = (int32_t) GPR[rt] >> shift; 4580 1.1 christos if (NotWordValue (GPR[rt])) 4581 1.1 christos Unpredictable (); 4582 1.1 christos TRACE_ALU_INPUT2 (GPR[rt], shift); 4583 1.1 christos GPR[rd] = EXTEND32 (temp); 4584 1.1 christos TRACE_ALU_RESULT (GPR[rd]); 4585 1.1 christos } 4586 1.1 christos 4587 1.1 christos 000000,00000,5.RT,5.RD,5.SHIFT,000011:SPECIAL:32::SRA 4588 1.1 christos "sra r<RD>, r<RT>, <SHIFT>" 4589 1.1 christos *mipsI: 4590 1.1 christos *mipsII: 4591 1.1 christos *mipsIII: 4592 1.1 christos *mipsIV: 4593 1.1 christos *mipsV: 4594 1.1 christos *mips32: 4595 1.1 christos *mips32r2: 4596 1.1.1.4 christos *mips32r6: 4597 1.1 christos *mips64: 4598 1.1 christos *mips64r2: 4599 1.1.1.4 christos *mips64r6: 4600 1.1 christos *vr4100: 4601 1.1 christos *vr5000: 4602 1.1 christos *r3900: 4603 1.1 christos { 4604 1.1 christos do_sra (SD_, RT, RD, SHIFT); 4605 1.1 christos } 4606 1.1 christos 4607 1.1 christos 4608 1.1 christos 4609 1.1 christos :function:::void:do_srav:int rs, int rt, int rd 4610 1.1 christos { 4611 1.1 christos int s = MASKED (GPR[rs], 4, 0); 4612 1.1.1.4 christos int32_t temp = (int32_t) GPR[rt] >> s; 4613 1.1 christos if (NotWordValue (GPR[rt])) 4614 1.1 christos Unpredictable (); 4615 1.1 christos TRACE_ALU_INPUT2 (GPR[rt], s); 4616 1.1 christos GPR[rd] = EXTEND32 (temp); 4617 1.1 christos TRACE_ALU_RESULT (GPR[rd]); 4618 1.1 christos } 4619 1.1 christos 4620 1.1 christos 000000,5.RS,5.RT,5.RD,00000,000111:SPECIAL:32::SRAV 4621 1.1 christos "srav r<RD>, r<RT>, r<RS>" 4622 1.1 christos *mipsI: 4623 1.1 christos *mipsII: 4624 1.1 christos *mipsIII: 4625 1.1 christos *mipsIV: 4626 1.1 christos *mipsV: 4627 1.1 christos *mips32: 4628 1.1 christos *mips32r2: 4629 1.1.1.4 christos *mips32r6: 4630 1.1 christos *mips64: 4631 1.1 christos *mips64r2: 4632 1.1.1.4 christos *mips64r6: 4633 1.1 christos *vr4100: 4634 1.1 christos *vr5000: 4635 1.1 christos *r3900: 4636 1.1 christos { 4637 1.1 christos do_srav (SD_, RS, RT, RD); 4638 1.1 christos } 4639 1.1 christos 4640 1.1 christos 4641 1.1 christos 4642 1.1 christos :function:::void:do_srl:int rt, int rd, int shift 4643 1.1 christos { 4644 1.1.1.4 christos uint32_t temp = (uint32_t) GPR[rt] >> shift; 4645 1.1 christos if (NotWordValue (GPR[rt])) 4646 1.1 christos Unpredictable (); 4647 1.1 christos TRACE_ALU_INPUT2 (GPR[rt], shift); 4648 1.1 christos GPR[rd] = EXTEND32 (temp); 4649 1.1 christos TRACE_ALU_RESULT (GPR[rd]); 4650 1.1 christos } 4651 1.1 christos 4652 1.1 christos 000000,00000,5.RT,5.RD,5.SHIFT,000010:SPECIAL:32::SRL 4653 1.1 christos "srl r<RD>, r<RT>, <SHIFT>" 4654 1.1 christos *mipsI: 4655 1.1 christos *mipsII: 4656 1.1 christos *mipsIII: 4657 1.1 christos *mipsIV: 4658 1.1 christos *mipsV: 4659 1.1 christos *mips32: 4660 1.1 christos *mips32r2: 4661 1.1.1.4 christos *mips32r6: 4662 1.1 christos *mips64: 4663 1.1 christos *mips64r2: 4664 1.1.1.4 christos *mips64r6: 4665 1.1 christos *vr4100: 4666 1.1 christos *vr5000: 4667 1.1 christos *r3900: 4668 1.1 christos { 4669 1.1 christos do_srl (SD_, RT, RD, SHIFT); 4670 1.1 christos } 4671 1.1 christos 4672 1.1 christos 4673 1.1 christos :function:::void:do_srlv:int rs, int rt, int rd 4674 1.1 christos { 4675 1.1 christos int s = MASKED (GPR[rs], 4, 0); 4676 1.1.1.4 christos uint32_t temp = (uint32_t) GPR[rt] >> s; 4677 1.1 christos if (NotWordValue (GPR[rt])) 4678 1.1 christos Unpredictable (); 4679 1.1 christos TRACE_ALU_INPUT2 (GPR[rt], s); 4680 1.1 christos GPR[rd] = EXTEND32 (temp); 4681 1.1 christos TRACE_ALU_RESULT (GPR[rd]); 4682 1.1 christos } 4683 1.1 christos 4684 1.1 christos 000000,5.RS,5.RT,5.RD,00000,000110:SPECIAL:32::SRLV 4685 1.1 christos "srlv r<RD>, r<RT>, r<RS>" 4686 1.1 christos *mipsI: 4687 1.1 christos *mipsII: 4688 1.1 christos *mipsIII: 4689 1.1 christos *mipsIV: 4690 1.1 christos *mipsV: 4691 1.1 christos *mips32: 4692 1.1 christos *mips32r2: 4693 1.1.1.4 christos *mips32r6: 4694 1.1 christos *mips64: 4695 1.1 christos *mips64r2: 4696 1.1.1.4 christos *mips64r6: 4697 1.1 christos *vr4100: 4698 1.1 christos *vr5000: 4699 1.1 christos *r3900: 4700 1.1 christos { 4701 1.1 christos do_srlv (SD_, RS, RT, RD); 4702 1.1 christos } 4703 1.1 christos 4704 1.1 christos 4705 1.1 christos 000000,5.RS,5.RT,5.RD,00000,100010:SPECIAL:32::SUB 4706 1.1 christos "sub r<RD>, r<RS>, r<RT>" 4707 1.1 christos *mipsI: 4708 1.1 christos *mipsII: 4709 1.1 christos *mipsIII: 4710 1.1 christos *mipsIV: 4711 1.1 christos *mipsV: 4712 1.1 christos *mips32: 4713 1.1 christos *mips32r2: 4714 1.1.1.4 christos *mips32r6: 4715 1.1 christos *mips64: 4716 1.1 christos *mips64r2: 4717 1.1.1.4 christos *mips64r6: 4718 1.1 christos *vr4100: 4719 1.1 christos *vr5000: 4720 1.1 christos *r3900: 4721 1.1 christos { 4722 1.1.1.2 christos do_sub (SD_, RD, RS, RT); 4723 1.1 christos } 4724 1.1 christos 4725 1.1 christos 4726 1.1 christos :function:::void:do_subu:int rs, int rt, int rd 4727 1.1 christos { 4728 1.1 christos if (NotWordValue (GPR[rs]) || NotWordValue (GPR[rt])) 4729 1.1 christos Unpredictable (); 4730 1.1 christos TRACE_ALU_INPUT2 (GPR[rs], GPR[rt]); 4731 1.1 christos GPR[rd] = EXTEND32 (GPR[rs] - GPR[rt]); 4732 1.1 christos TRACE_ALU_RESULT (GPR[rd]); 4733 1.1 christos } 4734 1.1 christos 4735 1.1 christos 000000,5.RS,5.RT,5.RD,00000,100011:SPECIAL:32::SUBU 4736 1.1 christos "subu r<RD>, r<RS>, r<RT>" 4737 1.1 christos *mipsI: 4738 1.1 christos *mipsII: 4739 1.1 christos *mipsIII: 4740 1.1 christos *mipsIV: 4741 1.1 christos *mipsV: 4742 1.1 christos *mips32: 4743 1.1 christos *mips32r2: 4744 1.1.1.4 christos *mips32r6: 4745 1.1 christos *mips64: 4746 1.1 christos *mips64r2: 4747 1.1.1.4 christos *mips64r6: 4748 1.1 christos *vr4100: 4749 1.1 christos *vr5000: 4750 1.1 christos *r3900: 4751 1.1 christos { 4752 1.1 christos do_subu (SD_, RS, RT, RD); 4753 1.1 christos } 4754 1.1 christos 4755 1.1 christos 4756 1.1 christos 101011,5.BASE,5.RT,16.OFFSET:NORMAL:32::SW 4757 1.1 christos "sw r<RT>, <OFFSET>(r<BASE>)" 4758 1.1 christos *mipsI: 4759 1.1 christos *mipsII: 4760 1.1 christos *mipsIII: 4761 1.1 christos *mipsIV: 4762 1.1 christos *mipsV: 4763 1.1 christos *mips32: 4764 1.1 christos *mips32r2: 4765 1.1.1.4 christos *mips32r6: 4766 1.1 christos *mips64: 4767 1.1 christos *mips64r2: 4768 1.1.1.4 christos *mips64r6: 4769 1.1 christos *vr4100: 4770 1.1 christos *r3900: 4771 1.1 christos *vr5000: 4772 1.1 christos { 4773 1.1.1.2 christos do_sw (SD_, RT, OFFSET, BASE); 4774 1.1 christos } 4775 1.1 christos 4776 1.1 christos 4777 1.1 christos 1110,ZZ!0!1!3,5.BASE,5.RT,16.OFFSET:NORMAL:32::SWCz 4778 1.1 christos "swc<ZZ> r<RT>, <OFFSET>(r<BASE>)" 4779 1.1 christos *mipsI: 4780 1.1 christos *mipsII: 4781 1.1 christos *mipsIII: 4782 1.1 christos *mipsIV: 4783 1.1 christos *mipsV: 4784 1.1 christos *mips32: 4785 1.1 christos *mips32r2: 4786 1.1 christos *mips64: 4787 1.1 christos *mips64r2: 4788 1.1 christos *vr4100: 4789 1.1 christos *vr5000: 4790 1.1 christos *r3900: 4791 1.1 christos { 4792 1.1 christos do_store (SD_, AccessLength_WORD, GPR[BASE], EXTEND16 (OFFSET), COP_SW (ZZ, RT)); 4793 1.1 christos } 4794 1.1 christos 4795 1.1 christos 4796 1.1 christos 101010,5.BASE,5.RT,16.OFFSET:NORMAL:32::SWL 4797 1.1 christos "swl r<RT>, <OFFSET>(r<BASE>)" 4798 1.1 christos *mipsI: 4799 1.1 christos *mipsII: 4800 1.1 christos *mipsIII: 4801 1.1 christos *mipsIV: 4802 1.1 christos *mipsV: 4803 1.1 christos *mips32: 4804 1.1 christos *mips32r2: 4805 1.1 christos *mips64: 4806 1.1 christos *mips64r2: 4807 1.1 christos *vr4100: 4808 1.1 christos *vr5000: 4809 1.1 christos *r3900: 4810 1.1 christos { 4811 1.1 christos do_store_left (SD_, AccessLength_WORD, GPR[BASE], EXTEND16 (OFFSET), GPR[RT]); 4812 1.1 christos } 4813 1.1 christos 4814 1.1 christos 4815 1.1 christos 101110,5.BASE,5.RT,16.OFFSET:NORMAL:32::SWR 4816 1.1 christos "swr r<RT>, <OFFSET>(r<BASE>)" 4817 1.1 christos *mipsI: 4818 1.1 christos *mipsII: 4819 1.1 christos *mipsIII: 4820 1.1 christos *mipsIV: 4821 1.1 christos *mipsV: 4822 1.1 christos *mips32: 4823 1.1 christos *mips32r2: 4824 1.1 christos *mips64: 4825 1.1 christos *mips64r2: 4826 1.1 christos *vr4100: 4827 1.1 christos *vr5000: 4828 1.1 christos *r3900: 4829 1.1 christos { 4830 1.1 christos do_store_right (SD_, AccessLength_WORD, GPR[BASE], EXTEND16 (OFFSET), GPR[RT]); 4831 1.1 christos } 4832 1.1 christos 4833 1.1 christos 4834 1.1 christos 000000,000000000000000,5.STYPE,001111:SPECIAL:32::SYNC 4835 1.1 christos "sync":STYPE == 0 4836 1.1 christos "sync <STYPE>" 4837 1.1 christos *mipsII: 4838 1.1 christos *mipsIII: 4839 1.1 christos *mipsIV: 4840 1.1 christos *mipsV: 4841 1.1 christos *mips32: 4842 1.1 christos *mips32r2: 4843 1.1.1.4 christos *mips32r6: 4844 1.1 christos *mips64: 4845 1.1 christos *mips64r2: 4846 1.1.1.4 christos *mips64r6: 4847 1.1 christos *vr4100: 4848 1.1 christos *vr5000: 4849 1.1 christos *r3900: 4850 1.1 christos { 4851 1.1 christos SyncOperation (STYPE); 4852 1.1 christos } 4853 1.1 christos 4854 1.1 christos 4855 1.1 christos 000000,20.CODE,001100:SPECIAL:32::SYSCALL 4856 1.1 christos "syscall %#lx<CODE>" 4857 1.1 christos *mipsI: 4858 1.1 christos *mipsII: 4859 1.1 christos *mipsIII: 4860 1.1 christos *mipsIV: 4861 1.1 christos *mipsV: 4862 1.1 christos *mips32: 4863 1.1 christos *mips32r2: 4864 1.1.1.4 christos *mips32r6: 4865 1.1 christos *mips64: 4866 1.1 christos *mips64r2: 4867 1.1.1.4 christos *mips64r6: 4868 1.1 christos *vr4100: 4869 1.1 christos *vr5000: 4870 1.1 christos *r3900: 4871 1.1 christos { 4872 1.1 christos SignalException (SystemCall, instruction_0); 4873 1.1 christos } 4874 1.1 christos 4875 1.1 christos 4876 1.1 christos 000000,5.RS,5.RT,10.CODE,110100:SPECIAL:32::TEQ 4877 1.1 christos "teq r<RS>, r<RT>" 4878 1.1 christos *mipsII: 4879 1.1 christos *mipsIII: 4880 1.1 christos *mipsIV: 4881 1.1 christos *mipsV: 4882 1.1 christos *mips32: 4883 1.1 christos *mips32r2: 4884 1.1.1.4 christos *mips32r6: 4885 1.1 christos *mips64: 4886 1.1 christos *mips64r2: 4887 1.1.1.4 christos *mips64r6: 4888 1.1 christos *vr4100: 4889 1.1 christos *vr5000: 4890 1.1 christos { 4891 1.1.1.2 christos do_teq (SD_, RS, RT, instruction_0); 4892 1.1 christos } 4893 1.1 christos 4894 1.1 christos 4895 1.1 christos 000001,5.RS,01100,16.IMMEDIATE:REGIMM:32::TEQI 4896 1.1 christos "teqi r<RS>, <IMMEDIATE>" 4897 1.1 christos *mipsII: 4898 1.1 christos *mipsIII: 4899 1.1 christos *mipsIV: 4900 1.1 christos *mipsV: 4901 1.1 christos *mips32: 4902 1.1 christos *mips32r2: 4903 1.1 christos *mips64: 4904 1.1 christos *mips64r2: 4905 1.1 christos *vr4100: 4906 1.1 christos *vr5000: 4907 1.1 christos { 4908 1.1.1.2 christos do_teqi (SD_, RS, IMMEDIATE, instruction_0); 4909 1.1 christos } 4910 1.1 christos 4911 1.1 christos 4912 1.1 christos 000000,5.RS,5.RT,10.CODE,110000:SPECIAL:32::TGE 4913 1.1 christos "tge r<RS>, r<RT>" 4914 1.1 christos *mipsII: 4915 1.1 christos *mipsIII: 4916 1.1 christos *mipsIV: 4917 1.1 christos *mipsV: 4918 1.1 christos *mips32: 4919 1.1 christos *mips32r2: 4920 1.1.1.4 christos *mips32r6: 4921 1.1 christos *mips64: 4922 1.1 christos *mips64r2: 4923 1.1.1.4 christos *mips64r6: 4924 1.1 christos *vr4100: 4925 1.1 christos *vr5000: 4926 1.1 christos { 4927 1.1.1.2 christos do_tge (SD_, RS, RT, instruction_0); 4928 1.1 christos } 4929 1.1 christos 4930 1.1 christos 4931 1.1 christos 000001,5.RS,01000,16.IMMEDIATE:REGIMM:32::TGEI 4932 1.1 christos "tgei r<RS>, <IMMEDIATE>" 4933 1.1 christos *mipsII: 4934 1.1 christos *mipsIII: 4935 1.1 christos *mipsIV: 4936 1.1 christos *mipsV: 4937 1.1 christos *mips32: 4938 1.1 christos *mips32r2: 4939 1.1 christos *mips64: 4940 1.1 christos *mips64r2: 4941 1.1 christos *vr4100: 4942 1.1 christos *vr5000: 4943 1.1 christos { 4944 1.1.1.2 christos do_tgei (SD_, RS, IMMEDIATE, instruction_0); 4945 1.1 christos } 4946 1.1 christos 4947 1.1 christos 4948 1.1 christos 000001,5.RS,01001,16.IMMEDIATE:REGIMM:32::TGEIU 4949 1.1 christos "tgeiu r<RS>, <IMMEDIATE>" 4950 1.1 christos *mipsII: 4951 1.1 christos *mipsIII: 4952 1.1 christos *mipsIV: 4953 1.1 christos *mipsV: 4954 1.1 christos *mips32: 4955 1.1 christos *mips32r2: 4956 1.1 christos *mips64: 4957 1.1 christos *mips64r2: 4958 1.1 christos *vr4100: 4959 1.1 christos *vr5000: 4960 1.1 christos { 4961 1.1.1.2 christos do_tgeiu (SD_, RS, IMMEDIATE, instruction_0); 4962 1.1 christos } 4963 1.1 christos 4964 1.1 christos 4965 1.1 christos 000000,5.RS,5.RT,10.CODE,110001:SPECIAL:32::TGEU 4966 1.1 christos "tgeu r<RS>, r<RT>" 4967 1.1 christos *mipsII: 4968 1.1 christos *mipsIII: 4969 1.1 christos *mipsIV: 4970 1.1 christos *mipsV: 4971 1.1 christos *mips32: 4972 1.1 christos *mips32r2: 4973 1.1.1.4 christos *mips32r6: 4974 1.1 christos *mips64: 4975 1.1 christos *mips64r2: 4976 1.1.1.4 christos *mips64r6: 4977 1.1 christos *vr4100: 4978 1.1 christos *vr5000: 4979 1.1 christos { 4980 1.1.1.2 christos do_tgeu (SD_, RS, RT, instruction_0); 4981 1.1 christos } 4982 1.1 christos 4983 1.1 christos 4984 1.1 christos 000000,5.RS,5.RT,10.CODE,110010:SPECIAL:32::TLT 4985 1.1 christos "tlt r<RS>, r<RT>" 4986 1.1 christos *mipsII: 4987 1.1 christos *mipsIII: 4988 1.1 christos *mipsIV: 4989 1.1 christos *mipsV: 4990 1.1 christos *mips32: 4991 1.1 christos *mips32r2: 4992 1.1.1.4 christos *mips32r6: 4993 1.1 christos *mips64: 4994 1.1 christos *mips64r2: 4995 1.1.1.4 christos *mips64r6: 4996 1.1 christos *vr4100: 4997 1.1 christos *vr5000: 4998 1.1 christos { 4999 1.1.1.2 christos do_tlt (SD_, RS, RT, instruction_0); 5000 1.1 christos } 5001 1.1 christos 5002 1.1 christos 5003 1.1 christos 000001,5.RS,01010,16.IMMEDIATE:REGIMM:32::TLTI 5004 1.1 christos "tlti r<RS>, <IMMEDIATE>" 5005 1.1 christos *mipsII: 5006 1.1 christos *mipsIII: 5007 1.1 christos *mipsIV: 5008 1.1 christos *mipsV: 5009 1.1 christos *mips32: 5010 1.1 christos *mips32r2: 5011 1.1 christos *mips64: 5012 1.1 christos *mips64r2: 5013 1.1 christos *vr4100: 5014 1.1 christos *vr5000: 5015 1.1 christos { 5016 1.1.1.2 christos do_tlti (SD_, RS, IMMEDIATE, instruction_0); 5017 1.1 christos } 5018 1.1 christos 5019 1.1 christos 5020 1.1 christos 000001,5.RS,01011,16.IMMEDIATE:REGIMM:32::TLTIU 5021 1.1 christos "tltiu r<RS>, <IMMEDIATE>" 5022 1.1 christos *mipsII: 5023 1.1 christos *mipsIII: 5024 1.1 christos *mipsIV: 5025 1.1 christos *mipsV: 5026 1.1 christos *mips32: 5027 1.1 christos *mips32r2: 5028 1.1 christos *mips64: 5029 1.1 christos *mips64r2: 5030 1.1 christos *vr4100: 5031 1.1 christos *vr5000: 5032 1.1 christos { 5033 1.1.1.2 christos do_tltiu (SD_, RS, IMMEDIATE, instruction_0); 5034 1.1 christos } 5035 1.1 christos 5036 1.1 christos 5037 1.1 christos 000000,5.RS,5.RT,10.CODE,110011:SPECIAL:32::TLTU 5038 1.1 christos "tltu r<RS>, r<RT>" 5039 1.1 christos *mipsII: 5040 1.1 christos *mipsIII: 5041 1.1 christos *mipsIV: 5042 1.1 christos *mipsV: 5043 1.1 christos *mips32: 5044 1.1 christos *mips32r2: 5045 1.1.1.4 christos *mips32r6: 5046 1.1 christos *mips64: 5047 1.1 christos *mips64r2: 5048 1.1.1.4 christos *mips64r6: 5049 1.1 christos *vr4100: 5050 1.1 christos *vr5000: 5051 1.1 christos { 5052 1.1.1.2 christos do_tltu (SD_, RS, RT, instruction_0); 5053 1.1 christos } 5054 1.1 christos 5055 1.1 christos 5056 1.1 christos 000000,5.RS,5.RT,10.CODE,110110:SPECIAL:32::TNE 5057 1.1 christos "tne r<RS>, r<RT>" 5058 1.1 christos *mipsII: 5059 1.1 christos *mipsIII: 5060 1.1 christos *mipsIV: 5061 1.1 christos *mipsV: 5062 1.1 christos *mips32: 5063 1.1 christos *mips32r2: 5064 1.1.1.4 christos *mips32r6: 5065 1.1 christos *mips64: 5066 1.1 christos *mips64r2: 5067 1.1.1.4 christos *mips64r6: 5068 1.1 christos *vr4100: 5069 1.1 christos *vr5000: 5070 1.1 christos { 5071 1.1.1.2 christos do_tne (SD_, RS, RT, instruction_0); 5072 1.1 christos } 5073 1.1 christos 5074 1.1 christos 5075 1.1 christos 000001,5.RS,01110,16.IMMEDIATE:REGIMM:32::TNEI 5076 1.1 christos "tnei r<RS>, <IMMEDIATE>" 5077 1.1 christos *mipsII: 5078 1.1 christos *mipsIII: 5079 1.1 christos *mipsIV: 5080 1.1 christos *mipsV: 5081 1.1 christos *mips32: 5082 1.1 christos *mips32r2: 5083 1.1 christos *mips64: 5084 1.1 christos *mips64r2: 5085 1.1 christos *vr4100: 5086 1.1 christos *vr5000: 5087 1.1 christos { 5088 1.1.1.2 christos do_tnei (SD_, RS, IMMEDIATE, instruction_0); 5089 1.1 christos } 5090 1.1 christos 5091 1.1 christos 5092 1.1 christos :function:::void:do_xor:int rs, int rt, int rd 5093 1.1 christos { 5094 1.1 christos TRACE_ALU_INPUT2 (GPR[rs], GPR[rt]); 5095 1.1 christos GPR[rd] = GPR[rs] ^ GPR[rt]; 5096 1.1 christos TRACE_ALU_RESULT (GPR[rd]); 5097 1.1 christos } 5098 1.1 christos 5099 1.1 christos 000000,5.RS,5.RT,5.RD,00000,100110:SPECIAL:32::XOR 5100 1.1 christos "xor r<RD>, r<RS>, r<RT>" 5101 1.1 christos *mipsI: 5102 1.1 christos *mipsII: 5103 1.1 christos *mipsIII: 5104 1.1 christos *mipsIV: 5105 1.1 christos *mipsV: 5106 1.1 christos *mips32: 5107 1.1 christos *mips32r2: 5108 1.1.1.4 christos *mips32r6: 5109 1.1 christos *mips64: 5110 1.1 christos *mips64r2: 5111 1.1.1.4 christos *mips64r6: 5112 1.1 christos *vr4100: 5113 1.1 christos *vr5000: 5114 1.1 christos *r3900: 5115 1.1 christos { 5116 1.1 christos do_xor (SD_, RS, RT, RD); 5117 1.1 christos } 5118 1.1 christos 5119 1.1 christos 5120 1.1.1.4 christos :function:::void:do_xori:int rs, int rt, uint16_t immediate 5121 1.1 christos { 5122 1.1 christos TRACE_ALU_INPUT2 (GPR[rs], immediate); 5123 1.1 christos GPR[rt] = GPR[rs] ^ immediate; 5124 1.1 christos TRACE_ALU_RESULT (GPR[rt]); 5125 1.1 christos } 5126 1.1 christos 5127 1.1 christos 001110,5.RS,5.RT,16.IMMEDIATE:NORMAL:32::XORI 5128 1.1 christos "xori r<RT>, r<RS>, %#lx<IMMEDIATE>" 5129 1.1 christos *mipsI: 5130 1.1 christos *mipsII: 5131 1.1 christos *mipsIII: 5132 1.1 christos *mipsIV: 5133 1.1 christos *mipsV: 5134 1.1 christos *mips32: 5135 1.1 christos *mips32r2: 5136 1.1.1.4 christos *mips32r6: 5137 1.1 christos *mips64: 5138 1.1 christos *mips64r2: 5139 1.1.1.4 christos *mips64r6: 5140 1.1 christos *vr4100: 5141 1.1 christos *vr5000: 5142 1.1 christos *r3900: 5143 1.1 christos { 5144 1.1 christos do_xori (SD_, RS, RT, IMMEDIATE); 5145 1.1 christos } 5146 1.1 christos 5147 1.1.1.4 christos 5148 1.1 christos // 5149 1.1 christos // MIPS Architecture: 5150 1.1 christos // 5151 1.1 christos // FPU Instruction Set (COP1 & COP1X) 5152 1.1 christos // 5153 1.1 christos 5154 1.1 christos 5155 1.1 christos :%s::::FMT:int fmt 5156 1.1 christos { 5157 1.1 christos switch (fmt) 5158 1.1 christos { 5159 1.1 christos case fmt_single: return "s"; 5160 1.1 christos case fmt_double: return "d"; 5161 1.1 christos case fmt_word: return "w"; 5162 1.1 christos case fmt_long: return "l"; 5163 1.1 christos case fmt_ps: return "ps"; 5164 1.1 christos default: return "?"; 5165 1.1 christos } 5166 1.1 christos } 5167 1.1 christos 5168 1.1 christos :%s::::TF:int tf 5169 1.1 christos { 5170 1.1 christos if (tf) 5171 1.1 christos return "t"; 5172 1.1 christos else 5173 1.1 christos return "f"; 5174 1.1 christos } 5175 1.1 christos 5176 1.1 christos :%s::::ND:int nd 5177 1.1 christos { 5178 1.1 christos if (nd) 5179 1.1 christos return "l"; 5180 1.1 christos else 5181 1.1 christos return ""; 5182 1.1 christos } 5183 1.1 christos 5184 1.1 christos :%s::::COND:int cond 5185 1.1 christos { 5186 1.1 christos switch (cond) 5187 1.1 christos { 5188 1.1 christos case 00: return "f"; 5189 1.1 christos case 01: return "un"; 5190 1.1 christos case 02: return "eq"; 5191 1.1 christos case 03: return "ueq"; 5192 1.1 christos case 04: return "olt"; 5193 1.1 christos case 05: return "ult"; 5194 1.1 christos case 06: return "ole"; 5195 1.1 christos case 07: return "ule"; 5196 1.1 christos case 010: return "sf"; 5197 1.1 christos case 011: return "ngle"; 5198 1.1 christos case 012: return "seq"; 5199 1.1 christos case 013: return "ngl"; 5200 1.1 christos case 014: return "lt"; 5201 1.1 christos case 015: return "nge"; 5202 1.1 christos case 016: return "le"; 5203 1.1 christos case 017: return "ngt"; 5204 1.1 christos default: return "?"; 5205 1.1 christos } 5206 1.1 christos } 5207 1.1 christos 5208 1.1 christos 5209 1.1 christos // Helpers: 5210 1.1 christos // 5211 1.1 christos // Check that the given FPU format is usable, and signal a 5212 1.1 christos // ReservedInstruction exception if not. 5213 1.1 christos // 5214 1.1 christos 5215 1.1 christos // check_fmt_p checks that the format is single, double, or paired single. 5216 1.1 christos :function:::void:check_fmt_p:int fmt, instruction_word insn 5217 1.1 christos *mipsI: 5218 1.1 christos *mipsII: 5219 1.1 christos *mipsIII: 5220 1.1 christos *mipsIV: 5221 1.1 christos *mips32: 5222 1.1.1.4 christos *mips32r6: 5223 1.1.1.4 christos *mips64r6: 5224 1.1 christos *vr4100: 5225 1.1 christos *vr5000: 5226 1.1 christos *r3900: 5227 1.1 christos { 5228 1.1 christos /* None of these ISAs support Paired Single, so just fall back to 5229 1.1 christos the single/double check. */ 5230 1.1 christos if ((fmt != fmt_single) && (fmt != fmt_double)) 5231 1.1 christos SignalException (ReservedInstruction, insn); 5232 1.1 christos } 5233 1.1 christos 5234 1.1 christos :function:::void:check_fmt_p:int fmt, instruction_word insn 5235 1.1 christos *mips32r2: 5236 1.1.1.2 christos *micromips32: 5237 1.1 christos { 5238 1.1 christos if ((fmt != fmt_single) && (fmt != fmt_double) && (fmt != fmt_ps)) 5239 1.1 christos SignalException (ReservedInstruction, insn); 5240 1.1 christos } 5241 1.1 christos 5242 1.1 christos :function:::void:check_fmt_p:int fmt, instruction_word insn 5243 1.1 christos *mipsV: 5244 1.1 christos *mips64: 5245 1.1 christos *mips64r2: 5246 1.1.1.2 christos *micromips64: 5247 1.1 christos { 5248 1.1 christos if ((fmt != fmt_single) && (fmt != fmt_double) 5249 1.1 christos && (fmt != fmt_ps || (UserMode && (SR & (status_UX|status_PX)) == 0))) 5250 1.1 christos SignalException (ReservedInstruction, insn); 5251 1.1 christos } 5252 1.1 christos 5253 1.1 christos 5254 1.1 christos // Helper: 5255 1.1 christos // 5256 1.1 christos // Check that the FPU is currently usable, and signal a CoProcessorUnusable 5257 1.1 christos // exception if not. 5258 1.1 christos // 5259 1.1 christos 5260 1.1 christos :function:::void:check_fpu: 5261 1.1 christos *mipsI: 5262 1.1 christos *mipsII: 5263 1.1 christos *mipsIII: 5264 1.1 christos *mipsIV: 5265 1.1 christos *mipsV: 5266 1.1 christos *mips32: 5267 1.1 christos *mips32r2: 5268 1.1 christos *mips64: 5269 1.1 christos *mips64r2: 5270 1.1 christos *vr4100: 5271 1.1 christos *vr5000: 5272 1.1 christos *r3900: 5273 1.1.1.2 christos *micromips32: 5274 1.1.1.2 christos *micromips64: 5275 1.1 christos { 5276 1.1 christos if (! COP_Usable (1)) 5277 1.1 christos SignalExceptionCoProcessorUnusable (1); 5278 1.1.1.4 christos 5279 1.1.1.4 christos FCSR &= ~(fcsr_NAN2008_mask | fcsr_ABS2008_mask); 5280 1.1.1.4 christos sim_fpu_quiet_nan_inverted = true; 5281 1.1 christos } 5282 1.1 christos 5283 1.1.1.4 christos // Helper: 5284 1.1.1.4 christos // 5285 1.1.1.4 christos // Check that the FPU is currently usable, and signal a CoProcessorUnusable 5286 1.1.1.4 christos // exception if not. 5287 1.1.1.4 christos // 5288 1.1.1.4 christos 5289 1.1.1.4 christos :function:::void:check_fpu: 5290 1.1.1.4 christos *mips32r6: 5291 1.1.1.4 christos *mips64r6: 5292 1.1.1.4 christos { 5293 1.1.1.4 christos if (! COP_Usable (1)) 5294 1.1.1.4 christos SignalExceptionCoProcessorUnusable (1); 5295 1.1.1.4 christos 5296 1.1.1.4 christos FCSR |= (fcsr_NAN2008_mask | fcsr_ABS2008_mask); 5297 1.1.1.4 christos sim_fpu_quiet_nan_inverted = 0; 5298 1.1.1.4 christos sim_fpu_set_mode (sim_fpu_ieee754_2008); 5299 1.1.1.4 christos } 5300 1.1 christos 5301 1.1 christos // Helper: 5302 1.1 christos // 5303 1.1 christos // Load a double word FP value using 2 32-bit memory cycles a la MIPS II 5304 1.1 christos // or MIPS32. do_load cannot be used instead because it returns an 5305 1.1 christos // unsigned_word, which is limited to the size of the machine's registers. 5306 1.1 christos // 5307 1.1 christos 5308 1.1.1.4 christos :function:::uint64_t:do_load_double:address_word base, address_word offset 5309 1.1 christos *mipsII: 5310 1.1 christos *mips32: 5311 1.1 christos *mips32r2: 5312 1.1.1.4 christos *mips32r6: 5313 1.1.1.2 christos *micromips32: 5314 1.1 christos { 5315 1.1 christos int bigendian = (BigEndianCPU ? ! ReverseEndian : ReverseEndian); 5316 1.1 christos address_word vaddr; 5317 1.1 christos address_word paddr; 5318 1.1.1.4 christos uint64_t memval; 5319 1.1.1.4 christos uint64_t v; 5320 1.1 christos 5321 1.1.1.2 christos paddr = vaddr = loadstore_ea (SD_, base, offset); 5322 1.1 christos if ((vaddr & AccessLength_DOUBLEWORD) != 0) 5323 1.1 christos { 5324 1.1 christos SIM_CORE_SIGNAL (SD, STATE_CPU (SD, 0), cia, read_map, 5325 1.1 christos AccessLength_DOUBLEWORD + 1, vaddr, read_transfer, 5326 1.1 christos sim_core_unaligned_signal); 5327 1.1 christos } 5328 1.1.1.2 christos LoadMemory (&memval, NULL, AccessLength_WORD, paddr, vaddr, isDATA, isREAL); 5329 1.1.1.4 christos v = (uint64_t)memval; 5330 1.1.1.2 christos LoadMemory (&memval, NULL, AccessLength_WORD, paddr + 4, vaddr + 4, isDATA, 5331 1.1.1.2 christos isREAL); 5332 1.1 christos return (bigendian ? ((v << 32) | memval) : (v | (memval << 32))); 5333 1.1 christos } 5334 1.1 christos 5335 1.1 christos 5336 1.1 christos // Helper: 5337 1.1 christos // 5338 1.1 christos // Store a double word FP value using 2 32-bit memory cycles a la MIPS II 5339 1.1 christos // or MIPS32. do_load cannot be used instead because it returns an 5340 1.1 christos // unsigned_word, which is limited to the size of the machine's registers. 5341 1.1 christos // 5342 1.1 christos 5343 1.1.1.4 christos :function:::void:do_store_double:address_word base, address_word offset, uint64_t v 5344 1.1 christos *mipsII: 5345 1.1 christos *mips32: 5346 1.1 christos *mips32r2: 5347 1.1.1.2 christos *micromips32: 5348 1.1.1.4 christos *mips32r6: 5349 1.1 christos { 5350 1.1 christos int bigendian = (BigEndianCPU ? ! ReverseEndian : ReverseEndian); 5351 1.1 christos address_word vaddr; 5352 1.1 christos address_word paddr; 5353 1.1.1.4 christos uint64_t memval; 5354 1.1 christos 5355 1.1.1.2 christos paddr = vaddr = loadstore_ea (SD_, base, offset); 5356 1.1 christos if ((vaddr & AccessLength_DOUBLEWORD) != 0) 5357 1.1 christos { 5358 1.1 christos SIM_CORE_SIGNAL (SD, STATE_CPU(SD, 0), cia, read_map, 5359 1.1 christos AccessLength_DOUBLEWORD + 1, vaddr, write_transfer, 5360 1.1 christos sim_core_unaligned_signal); 5361 1.1 christos } 5362 1.1 christos memval = (bigendian ? (v >> 32) : (v & 0xFFFFFFFF)); 5363 1.1.1.2 christos StoreMemory (AccessLength_WORD, memval, 0, paddr, vaddr, isREAL); 5364 1.1 christos memval = (bigendian ? (v & 0xFFFFFFFF) : (v >> 32)); 5365 1.1.1.2 christos StoreMemory (AccessLength_WORD, memval, 0, paddr + 4, vaddr + 4, isREAL); 5366 1.1 christos } 5367 1.1 christos 5368 1.1 christos 5369 1.1 christos 010001,10,3.FMT!2!3!4!5!7,00000,5.FS,5.FD,000101:COP1:32,f::ABS.fmt 5370 1.1 christos "abs.%s<FMT> f<FD>, f<FS>" 5371 1.1 christos *mipsI: 5372 1.1 christos *mipsII: 5373 1.1 christos *mipsIII: 5374 1.1 christos *mipsIV: 5375 1.1 christos *mipsV: 5376 1.1 christos *mips32: 5377 1.1 christos *mips32r2: 5378 1.1.1.4 christos *mips32r6: 5379 1.1 christos *mips64: 5380 1.1 christos *mips64r2: 5381 1.1.1.4 christos *mips64r6: 5382 1.1 christos *vr4100: 5383 1.1 christos *vr5000: 5384 1.1 christos *r3900: 5385 1.1 christos { 5386 1.1.1.2 christos do_abs_fmt (SD_, FMT, FD, FS, instruction_0); 5387 1.1 christos } 5388 1.1 christos 5389 1.1 christos 5390 1.1 christos 5391 1.1 christos 010001,10,3.FMT!2!3!4!5!7,5.FT,5.FS,5.FD,000000:COP1:32,f::ADD.fmt 5392 1.1 christos "add.%s<FMT> f<FD>, f<FS>, f<FT>" 5393 1.1 christos *mipsI: 5394 1.1 christos *mipsII: 5395 1.1 christos *mipsIII: 5396 1.1 christos *mipsIV: 5397 1.1 christos *mipsV: 5398 1.1 christos *mips32: 5399 1.1 christos *mips32r2: 5400 1.1.1.4 christos *mips32r6: 5401 1.1 christos *mips64: 5402 1.1 christos *mips64r2: 5403 1.1.1.4 christos *mips64r6: 5404 1.1 christos *vr4100: 5405 1.1 christos *vr5000: 5406 1.1 christos *r3900: 5407 1.1 christos { 5408 1.1.1.2 christos do_add_fmt (SD_, FMT, FD, FS, FT, instruction_0); 5409 1.1 christos } 5410 1.1 christos 5411 1.1 christos 5412 1.1 christos 010011,5.RS,5.FT,5.FS,5.FD,011,110:COP1X:32,f::ALNV.PS 5413 1.1 christos "alnv.ps f<FD>, f<FS>, f<FT>, r<RS>" 5414 1.1 christos *mipsV: 5415 1.1 christos *mips32r2: 5416 1.1 christos *mips64: 5417 1.1 christos *mips64r2: 5418 1.1 christos { 5419 1.1.1.2 christos do_alnv_ps (SD_, FD, FS, FT, RS, instruction_0); 5420 1.1 christos } 5421 1.1 christos 5422 1.1 christos 5423 1.1 christos // BC1F 5424 1.1 christos // BC1FL 5425 1.1 christos // BC1T 5426 1.1 christos // BC1TL 5427 1.1 christos 5428 1.1 christos 010001,01000,3.0,1.ND,1.TF,16.OFFSET:COP1S:32,f::BC1a 5429 1.1 christos "bc1%s<TF>%s<ND> <OFFSET>" 5430 1.1 christos *mipsI: 5431 1.1 christos *mipsII: 5432 1.1 christos *mipsIII: 5433 1.1 christos { 5434 1.1 christos check_fpu (SD_); 5435 1.1 christos TRACE_BRANCH_INPUT (PREVCOC1()); 5436 1.1 christos if (PREVCOC1() == TF) 5437 1.1 christos { 5438 1.1 christos address_word dest = NIA + (EXTEND16 (OFFSET) << 2); 5439 1.1 christos TRACE_BRANCH_RESULT (dest); 5440 1.1 christos DELAY_SLOT (dest); 5441 1.1 christos } 5442 1.1 christos else if (ND) 5443 1.1 christos { 5444 1.1 christos TRACE_BRANCH_RESULT (0); 5445 1.1 christos NULLIFY_NEXT_INSTRUCTION (); 5446 1.1 christos } 5447 1.1 christos else 5448 1.1 christos { 5449 1.1 christos TRACE_BRANCH_RESULT (NIA); 5450 1.1 christos } 5451 1.1 christos } 5452 1.1 christos 5453 1.1 christos 010001,01000,3.CC,1.ND,1.TF,16.OFFSET:COP1S:32,f::BC1b 5454 1.1 christos "bc1%s<TF>%s<ND> <OFFSET>":CC == 0 5455 1.1 christos "bc1%s<TF>%s<ND> <CC>, <OFFSET>" 5456 1.1 christos *mipsIV: 5457 1.1 christos *mipsV: 5458 1.1 christos *mips32: 5459 1.1 christos *mips32r2: 5460 1.1 christos *mips64: 5461 1.1 christos *mips64r2: 5462 1.1 christos #*vr4100: 5463 1.1 christos *vr5000: 5464 1.1 christos *r3900: 5465 1.1 christos { 5466 1.1 christos check_fpu (SD_); 5467 1.1 christos if (GETFCC(CC) == TF) 5468 1.1 christos { 5469 1.1 christos address_word dest = NIA + (EXTEND16 (OFFSET) << 2); 5470 1.1 christos DELAY_SLOT (dest); 5471 1.1 christos } 5472 1.1 christos else if (ND) 5473 1.1 christos { 5474 1.1 christos NULLIFY_NEXT_INSTRUCTION (); 5475 1.1 christos } 5476 1.1 christos } 5477 1.1 christos 5478 1.1 christos 5479 1.1 christos 010001,10,3.FMT!2!3!4!5!6!7,5.FT,5.FS,3.0,00,11,4.COND:COP1:32,f::C.cond.fmta 5480 1.1 christos "c.%s<COND>.%s<FMT> f<FS>, f<FT>" 5481 1.1 christos *mipsI: 5482 1.1 christos *mipsII: 5483 1.1 christos *mipsIII: 5484 1.1 christos { 5485 1.1 christos int fmt = FMT; 5486 1.1 christos check_fpu (SD_); 5487 1.1 christos Compare (ValueFPR (FS, fmt), ValueFPR (FT, fmt), fmt, COND, 0); 5488 1.1 christos TRACE_ALU_RESULT (ValueFCR (31)); 5489 1.1 christos } 5490 1.1 christos 5491 1.1 christos 010001,10,3.FMT!2!3!4!5!7,5.FT,5.FS,3.CC,00,11,4.COND:COP1:32,f::C.cond.fmtb 5492 1.1 christos "c.%s<COND>.%s<FMT> f<FS>, f<FT>":CC == 0 5493 1.1 christos "c.%s<COND>.%s<FMT> <CC>, f<FS>, f<FT>" 5494 1.1 christos *mipsIV: 5495 1.1 christos *mipsV: 5496 1.1 christos *mips32: 5497 1.1 christos *mips32r2: 5498 1.1 christos *mips64: 5499 1.1 christos *mips64r2: 5500 1.1 christos *vr4100: 5501 1.1 christos *vr5000: 5502 1.1 christos *r3900: 5503 1.1 christos { 5504 1.1.1.2 christos do_c_cond_fmt (SD_, COND, FMT, CC, FS, FT, instruction_0); 5505 1.1 christos } 5506 1.1 christos 5507 1.1 christos 5508 1.1 christos 010001,10,3.FMT!2!3!4!5!6!7,00000,5.FS,5.FD,001010:COP1:32,f::CEIL.L.fmt 5509 1.1 christos "ceil.l.%s<FMT> f<FD>, f<FS>" 5510 1.1 christos *mipsIII: 5511 1.1 christos *mipsIV: 5512 1.1 christos *mipsV: 5513 1.1 christos *mips32r2: 5514 1.1.1.4 christos *mips32r6: 5515 1.1 christos *mips64: 5516 1.1 christos *mips64r2: 5517 1.1.1.4 christos *mips64r6: 5518 1.1 christos *vr4100: 5519 1.1 christos *vr5000: 5520 1.1 christos *r3900: 5521 1.1 christos { 5522 1.1.1.2 christos do_ceil_fmt (SD_, fmt_long, FMT, FD, FS, instruction_0); 5523 1.1 christos } 5524 1.1 christos 5525 1.1 christos 5526 1.1 christos 010001,10,3.FMT!2!3!4!5!6!7,00000,5.FS,5.FD,001110:COP1:32,f::CEIL.W 5527 1.1 christos "ceil.w.%s<FMT> f<FD>, f<FS>" 5528 1.1 christos *mipsII: 5529 1.1 christos *mipsIII: 5530 1.1 christos *mipsIV: 5531 1.1 christos *mipsV: 5532 1.1 christos *mips32: 5533 1.1 christos *mips32r2: 5534 1.1.1.4 christos *mips32r6: 5535 1.1 christos *mips64: 5536 1.1 christos *mips64r2: 5537 1.1.1.4 christos *mips64r6: 5538 1.1 christos *vr4100: 5539 1.1 christos *vr5000: 5540 1.1 christos *r3900: 5541 1.1 christos { 5542 1.1.1.2 christos do_ceil_fmt (SD_, fmt_word, FMT, FD, FS, instruction_0); 5543 1.1 christos } 5544 1.1 christos 5545 1.1 christos 5546 1.1 christos 010001,00010,5.RT,5.FS,00000000000:COP1:32,f::CFC1a 5547 1.1 christos "cfc1 r<RT>, f<FS>" 5548 1.1 christos *mipsI: 5549 1.1 christos *mipsII: 5550 1.1 christos *mipsIII: 5551 1.1 christos { 5552 1.1 christos check_fpu (SD_); 5553 1.1 christos if (FS == 0) 5554 1.1 christos PENDING_FILL (RT, EXTEND32 (FCR0)); 5555 1.1 christos else if (FS == 31) 5556 1.1 christos PENDING_FILL (RT, EXTEND32 (FCR31)); 5557 1.1 christos /* else NOP */ 5558 1.1 christos } 5559 1.1 christos 5560 1.1 christos 010001,00010,5.RT,5.FS,00000000000:COP1:32,f::CFC1b 5561 1.1 christos "cfc1 r<RT>, f<FS>" 5562 1.1 christos *mipsIV: 5563 1.1 christos *vr4100: 5564 1.1 christos *vr5000: 5565 1.1 christos *r3900: 5566 1.1 christos { 5567 1.1 christos check_fpu (SD_); 5568 1.1 christos if (FS == 0 || FS == 31) 5569 1.1 christos { 5570 1.1 christos unsigned_word fcr = ValueFCR (FS); 5571 1.1 christos TRACE_ALU_INPUT1 (fcr); 5572 1.1 christos GPR[RT] = fcr; 5573 1.1 christos } 5574 1.1 christos /* else NOP */ 5575 1.1 christos TRACE_ALU_RESULT (GPR[RT]); 5576 1.1 christos } 5577 1.1 christos 5578 1.1 christos 010001,00010,5.RT,5.FS,00000000000:COP1:32,f::CFC1c 5579 1.1 christos "cfc1 r<RT>, f<FS>" 5580 1.1 christos *mipsV: 5581 1.1 christos *mips32: 5582 1.1 christos *mips32r2: 5583 1.1.1.4 christos *mips32r6: 5584 1.1 christos *mips64: 5585 1.1 christos *mips64r2: 5586 1.1.1.4 christos *mips64r6: 5587 1.1 christos { 5588 1.1.1.2 christos do_cfc1 (SD_, RT, FS); 5589 1.1 christos } 5590 1.1 christos 5591 1.1 christos 010001,00110,5.RT,5.FS,00000000000:COP1:32,f::CTC1a 5592 1.1 christos "ctc1 r<RT>, f<FS>" 5593 1.1 christos *mipsI: 5594 1.1 christos *mipsII: 5595 1.1 christos *mipsIII: 5596 1.1 christos { 5597 1.1 christos check_fpu (SD_); 5598 1.1 christos if (FS == 31) 5599 1.1 christos PENDING_FILL (FCRCS_REGNUM, VL4_8 (GPR[RT])); 5600 1.1 christos /* else NOP */ 5601 1.1 christos } 5602 1.1 christos 5603 1.1 christos 010001,00110,5.RT,5.FS,00000000000:COP1:32,f::CTC1b 5604 1.1 christos "ctc1 r<RT>, f<FS>" 5605 1.1 christos *mipsIV: 5606 1.1 christos *vr4100: 5607 1.1 christos *vr5000: 5608 1.1 christos *r3900: 5609 1.1 christos { 5610 1.1 christos check_fpu (SD_); 5611 1.1 christos TRACE_ALU_INPUT1 (GPR[RT]); 5612 1.1 christos if (FS == 31) 5613 1.1 christos StoreFCR (FS, GPR[RT]); 5614 1.1 christos /* else NOP */ 5615 1.1 christos } 5616 1.1 christos 5617 1.1 christos 010001,00110,5.RT,5.FS,00000000000:COP1:32,f::CTC1c 5618 1.1 christos "ctc1 r<RT>, f<FS>" 5619 1.1 christos *mipsV: 5620 1.1 christos *mips32: 5621 1.1 christos *mips32r2: 5622 1.1.1.4 christos *mips32r6: 5623 1.1 christos *mips64: 5624 1.1 christos *mips64r2: 5625 1.1.1.4 christos *mips64r6: 5626 1.1 christos { 5627 1.1.1.2 christos do_ctc1 (SD_, RT, FS); 5628 1.1 christos } 5629 1.1 christos 5630 1.1 christos 5631 1.1 christos // 5632 1.1 christos // FIXME: Does not correctly differentiate between mips* 5633 1.1 christos // 5634 1.1 christos 010001,10,3.FMT!1!2!3!6!7,00000,5.FS,5.FD,100001:COP1:32,f::CVT.D.fmt 5635 1.1 christos "cvt.d.%s<FMT> f<FD>, f<FS>" 5636 1.1 christos *mipsI: 5637 1.1 christos *mipsII: 5638 1.1 christos *mipsIII: 5639 1.1 christos *mipsIV: 5640 1.1 christos *mipsV: 5641 1.1 christos *mips32: 5642 1.1 christos *mips32r2: 5643 1.1.1.4 christos *mips32r6: 5644 1.1 christos *mips64: 5645 1.1 christos *mips64r2: 5646 1.1.1.4 christos *mips64r6: 5647 1.1 christos *vr4100: 5648 1.1 christos *vr5000: 5649 1.1 christos *r3900: 5650 1.1 christos { 5651 1.1.1.2 christos do_cvt_d_fmt (SD_, FMT, FD, FS, instruction_0); 5652 1.1 christos } 5653 1.1 christos 5654 1.1 christos 5655 1.1 christos 010001,10,3.FMT!2!3!4!5!6!7,00000,5.FS,5.FD,100101:COP1:32,f::CVT.L.fmt 5656 1.1 christos "cvt.l.%s<FMT> f<FD>, f<FS>" 5657 1.1 christos *mipsIII: 5658 1.1 christos *mipsIV: 5659 1.1 christos *mipsV: 5660 1.1 christos *mips32r2: 5661 1.1.1.4 christos *mips32r6: 5662 1.1 christos *mips64: 5663 1.1 christos *mips64r2: 5664 1.1.1.4 christos *mips64r6: 5665 1.1 christos *vr4100: 5666 1.1 christos *vr5000: 5667 1.1 christos *r3900: 5668 1.1 christos { 5669 1.1.1.2 christos do_cvt_l_fmt (SD_, FMT, FD, FS, instruction_0); 5670 1.1 christos } 5671 1.1 christos 5672 1.1 christos 5673 1.1 christos 010001,10,000,5.FT,5.FS,5.FD,100110:COP1:32,f::CVT.PS.S 5674 1.1 christos "cvt.ps.s f<FD>, f<FS>, f<FT>" 5675 1.1 christos *mipsV: 5676 1.1 christos *mips32r2: 5677 1.1 christos *mips64: 5678 1.1 christos *mips64r2: 5679 1.1 christos { 5680 1.1.1.2 christos do_cvt_ps_s (SD_, FD, FS, FT, instruction_0); 5681 1.1 christos } 5682 1.1 christos 5683 1.1 christos 5684 1.1 christos // 5685 1.1 christos // FIXME: Does not correctly differentiate between mips* 5686 1.1 christos // 5687 1.1 christos 010001,10,3.FMT!0!2!3!6!7,00000,5.FS,5.FD,100000:COP1:32,f::CVT.S.fmt 5688 1.1 christos "cvt.s.%s<FMT> f<FD>, f<FS>" 5689 1.1 christos *mipsI: 5690 1.1 christos *mipsII: 5691 1.1 christos *mipsIII: 5692 1.1 christos *mipsIV: 5693 1.1 christos *mipsV: 5694 1.1 christos *mips32: 5695 1.1 christos *mips32r2: 5696 1.1.1.4 christos *mips32r6: 5697 1.1 christos *mips64: 5698 1.1 christos *mips64r2: 5699 1.1.1.4 christos *mips64r6: 5700 1.1 christos *vr4100: 5701 1.1 christos *vr5000: 5702 1.1 christos *r3900: 5703 1.1 christos { 5704 1.1.1.2 christos do_cvt_s_fmt (SD_, FMT, FD, FS, instruction_0); 5705 1.1 christos } 5706 1.1 christos 5707 1.1 christos 5708 1.1 christos 010001,10,110,00000,5.FS,5.FD,101000:COP1:32,f::CVT.S.PL 5709 1.1 christos "cvt.s.pl f<FD>, f<FS>" 5710 1.1 christos *mipsV: 5711 1.1 christos *mips32r2: 5712 1.1 christos *mips64: 5713 1.1 christos *mips64r2: 5714 1.1 christos { 5715 1.1.1.2 christos do_cvt_s_pl (SD_, FD, FS, instruction_0); 5716 1.1 christos } 5717 1.1 christos 5718 1.1 christos 5719 1.1 christos 010001,10,110,00000,5.FS,5.FD,100000:COP1:32,f::CVT.S.PU 5720 1.1 christos "cvt.s.pu f<FD>, f<FS>" 5721 1.1 christos *mipsV: 5722 1.1 christos *mips32r2: 5723 1.1 christos *mips64: 5724 1.1 christos *mips64r2: 5725 1.1 christos { 5726 1.1.1.2 christos do_cvt_s_pu (SD_, FD, FS, instruction_0); 5727 1.1 christos } 5728 1.1 christos 5729 1.1 christos 5730 1.1 christos 010001,10,3.FMT!2!3!4!5!6!7,00000,5.FS,5.FD,100100:COP1:32,f::CVT.W.fmt 5731 1.1 christos "cvt.w.%s<FMT> f<FD>, f<FS>" 5732 1.1 christos *mipsI: 5733 1.1 christos *mipsII: 5734 1.1 christos *mipsIII: 5735 1.1 christos *mipsIV: 5736 1.1 christos *mipsV: 5737 1.1 christos *mips32: 5738 1.1 christos *mips32r2: 5739 1.1.1.4 christos *mips32r6: 5740 1.1 christos *mips64: 5741 1.1 christos *mips64r2: 5742 1.1.1.4 christos *mips64r6: 5743 1.1 christos *vr4100: 5744 1.1 christos *vr5000: 5745 1.1 christos *r3900: 5746 1.1 christos { 5747 1.1.1.2 christos do_cvt_w_fmt (SD_, FMT, FD, FS, instruction_0); 5748 1.1 christos } 5749 1.1 christos 5750 1.1 christos 5751 1.1 christos 010001,10,3.FMT!2!3!4!5!6!7,5.FT,5.FS,5.FD,000011:COP1:32,f::DIV.fmt 5752 1.1 christos "div.%s<FMT> f<FD>, f<FS>, f<FT>" 5753 1.1 christos *mipsI: 5754 1.1 christos *mipsII: 5755 1.1 christos *mipsIII: 5756 1.1 christos *mipsIV: 5757 1.1 christos *mipsV: 5758 1.1 christos *mips32: 5759 1.1 christos *mips32r2: 5760 1.1.1.4 christos *mips32r6: 5761 1.1 christos *mips64: 5762 1.1 christos *mips64r2: 5763 1.1.1.4 christos *mips64r6: 5764 1.1 christos *vr4100: 5765 1.1 christos *vr5000: 5766 1.1 christos *r3900: 5767 1.1 christos { 5768 1.1.1.2 christos do_div_fmt (SD_, FMT, FD, FS, FT, instruction_0); 5769 1.1 christos } 5770 1.1 christos 5771 1.1 christos 5772 1.1 christos 010001,00001,5.RT,5.FS,00000000000:COP1:64,f::DMFC1a 5773 1.1 christos "dmfc1 r<RT>, f<FS>" 5774 1.1 christos *mipsIII: 5775 1.1 christos { 5776 1.1.1.4 christos uint64_t v; 5777 1.1 christos check_fpu (SD_); 5778 1.1 christos check_u64 (SD_, instruction_0); 5779 1.1 christos if (SizeFGR () == 64) 5780 1.1 christos v = FGR[FS]; 5781 1.1 christos else if ((FS & 0x1) == 0) 5782 1.1 christos v = SET64HI (FGR[FS+1]) | FGR[FS]; 5783 1.1 christos else 5784 1.1.1.4 christos Unpredictable (); 5785 1.1 christos PENDING_FILL (RT, v); 5786 1.1 christos TRACE_ALU_RESULT (v); 5787 1.1 christos } 5788 1.1 christos 5789 1.1 christos 010001,00001,5.RT,5.FS,00000000000:COP1:64,f::DMFC1b 5790 1.1 christos "dmfc1 r<RT>, f<FS>" 5791 1.1 christos *mipsIV: 5792 1.1 christos *mipsV: 5793 1.1 christos *mips64: 5794 1.1 christos *mips64r2: 5795 1.1.1.4 christos *mips64r6: 5796 1.1 christos *vr4100: 5797 1.1 christos *vr5000: 5798 1.1 christos *r3900: 5799 1.1 christos { 5800 1.1 christos check_fpu (SD_); 5801 1.1 christos check_u64 (SD_, instruction_0); 5802 1.1.1.2 christos do_dmfc1b (SD_, RT, FS); 5803 1.1 christos } 5804 1.1 christos 5805 1.1 christos 5806 1.1 christos 010001,00101,5.RT,5.FS,00000000000:COP1:64,f::DMTC1a 5807 1.1 christos "dmtc1 r<RT>, f<FS>" 5808 1.1 christos *mipsIII: 5809 1.1 christos { 5810 1.1.1.4 christos uint64_t v; 5811 1.1 christos check_fpu (SD_); 5812 1.1 christos check_u64 (SD_, instruction_0); 5813 1.1 christos if (SizeFGR () == 64) 5814 1.1 christos PENDING_FILL ((FS + FGR_BASE), GPR[RT]); 5815 1.1 christos else if ((FS & 0x1) == 0) 5816 1.1 christos { 5817 1.1 christos PENDING_FILL (((FS + 1) + FGR_BASE), VH4_8 (GPR[RT])); 5818 1.1 christos PENDING_FILL ((FS + FGR_BASE), VL4_8 (GPR[RT])); 5819 1.1 christos } 5820 1.1 christos else 5821 1.1 christos Unpredictable (); 5822 1.1 christos TRACE_FP_RESULT (GPR[RT]); 5823 1.1 christos } 5824 1.1 christos 5825 1.1 christos 010001,00101,5.RT,5.FS,00000000000:COP1:64,f::DMTC1b 5826 1.1 christos "dmtc1 r<RT>, f<FS>" 5827 1.1 christos *mipsIV: 5828 1.1 christos *mipsV: 5829 1.1 christos *mips64: 5830 1.1 christos *mips64r2: 5831 1.1.1.4 christos *mips64r6: 5832 1.1 christos *vr4100: 5833 1.1 christos *vr5000: 5834 1.1 christos *r3900: 5835 1.1 christos { 5836 1.1 christos check_fpu (SD_); 5837 1.1 christos check_u64 (SD_, instruction_0); 5838 1.1.1.2 christos do_dmtc1b (SD_, RT, FS); 5839 1.1 christos } 5840 1.1 christos 5841 1.1 christos 5842 1.1 christos 010001,10,3.FMT!2!3!4!5!6!7,00000,5.FS,5.FD,001011:COP1:32,f::FLOOR.L.fmt 5843 1.1 christos "floor.l.%s<FMT> f<FD>, f<FS>" 5844 1.1 christos *mipsIII: 5845 1.1 christos *mipsIV: 5846 1.1 christos *mipsV: 5847 1.1 christos *mips32r2: 5848 1.1.1.4 christos *mips32r6: 5849 1.1 christos *mips64: 5850 1.1 christos *mips64r2: 5851 1.1.1.4 christos *mips64r6: 5852 1.1 christos *vr4100: 5853 1.1 christos *vr5000: 5854 1.1 christos *r3900: 5855 1.1 christos { 5856 1.1.1.2 christos do_floor_fmt (SD_, fmt_long, FMT, FD, FS); 5857 1.1 christos } 5858 1.1 christos 5859 1.1 christos 5860 1.1 christos 010001,10,3.FMT!2!3!4!5!6!7,00000,5.FS,5.FD,001111:COP1:32,f::FLOOR.W.fmt 5861 1.1 christos "floor.w.%s<FMT> f<FD>, f<FS>" 5862 1.1 christos *mipsII: 5863 1.1 christos *mipsIII: 5864 1.1 christos *mipsIV: 5865 1.1 christos *mipsV: 5866 1.1 christos *mips32: 5867 1.1 christos *mips32r2: 5868 1.1.1.4 christos *mips32r6: 5869 1.1 christos *mips64: 5870 1.1 christos *mips64r2: 5871 1.1.1.4 christos *mips64r6: 5872 1.1 christos *vr4100: 5873 1.1 christos *vr5000: 5874 1.1 christos *r3900: 5875 1.1 christos { 5876 1.1.1.2 christos do_floor_fmt (SD_, fmt_word, FMT, FD, FS); 5877 1.1 christos } 5878 1.1 christos 5879 1.1 christos 5880 1.1 christos 110101,5.BASE,5.FT,16.OFFSET:COP1:32,f::LDC1a 5881 1.1 christos "ldc1 f<FT>, <OFFSET>(r<BASE>)" 5882 1.1 christos *mipsII: 5883 1.1 christos *mips32: 5884 1.1 christos *mips32r2: 5885 1.1.1.4 christos *mips32r6: 5886 1.1 christos { 5887 1.1 christos check_fpu (SD_); 5888 1.1 christos COP_LD (1, FT, do_load_double (SD_, GPR[BASE], EXTEND16 (OFFSET))); 5889 1.1 christos } 5890 1.1 christos 5891 1.1 christos 5892 1.1 christos 110101,5.BASE,5.FT,16.OFFSET:COP1:32,f::LDC1b 5893 1.1 christos "ldc1 f<FT>, <OFFSET>(r<BASE>)" 5894 1.1 christos *mipsIII: 5895 1.1 christos *mipsIV: 5896 1.1 christos *mipsV: 5897 1.1 christos *mips64: 5898 1.1 christos *mips64r2: 5899 1.1.1.4 christos *mips64r6: 5900 1.1 christos *vr4100: 5901 1.1 christos *vr5000: 5902 1.1 christos *r3900: 5903 1.1 christos { 5904 1.1 christos check_fpu (SD_); 5905 1.1 christos COP_LD (1, FT, do_load (SD_, AccessLength_DOUBLEWORD, GPR[BASE], EXTEND16 (OFFSET))); 5906 1.1 christos } 5907 1.1 christos 5908 1.1 christos 5909 1.1 christos 010011,5.BASE,5.INDEX,5.0,5.FD,000001:COP1X:32,f::LDXC1 5910 1.1 christos "ldxc1 f<FD>, r<INDEX>(r<BASE>)" 5911 1.1 christos *mips32r2: 5912 1.1 christos { 5913 1.1 christos check_fpu (SD_); 5914 1.1 christos COP_LD (1, FD, do_load_double (SD_, GPR[BASE], GPR[INDEX])); 5915 1.1 christos } 5916 1.1 christos 5917 1.1 christos 5918 1.1 christos 010011,5.BASE,5.INDEX,5.0,5.FD,000001:COP1X:64,f::LDXC1 5919 1.1 christos "ldxc1 f<FD>, r<INDEX>(r<BASE>)" 5920 1.1 christos *mipsIV: 5921 1.1 christos *mipsV: 5922 1.1 christos *mips64: 5923 1.1 christos *mips64r2: 5924 1.1 christos *vr5000: 5925 1.1 christos { 5926 1.1 christos check_fpu (SD_); 5927 1.1 christos check_u64 (SD_, instruction_0); 5928 1.1 christos COP_LD (1, FD, do_load (SD_, AccessLength_DOUBLEWORD, GPR[BASE], GPR[INDEX])); 5929 1.1 christos } 5930 1.1 christos 5931 1.1 christos 5932 1.1 christos 010011,5.BASE,5.INDEX,5.0,5.FD,000101:COP1X:32,f::LUXC1 5933 1.1 christos "luxc1 f<FD>, r<INDEX>(r<BASE>)" 5934 1.1 christos *mips32r2: 5935 1.1 christos { 5936 1.1.1.2 christos do_luxc1_32 (SD_, FD, INDEX, BASE); 5937 1.1 christos } 5938 1.1 christos 5939 1.1 christos 5940 1.1 christos 010011,5.BASE,5.INDEX,5.0,5.FD,000101:COP1X:64,f::LUXC1 5941 1.1 christos "luxc1 f<FD>, r<INDEX>(r<BASE>)" 5942 1.1 christos *mipsV: 5943 1.1 christos *mips64: 5944 1.1 christos *mips64r2: 5945 1.1 christos { 5946 1.1 christos check_fpu (SD_); 5947 1.1 christos check_u64 (SD_, instruction_0); 5948 1.1.1.2 christos do_luxc1_64 (SD_, FD, INDEX, BASE); 5949 1.1 christos } 5950 1.1 christos 5951 1.1 christos 5952 1.1 christos 110001,5.BASE,5.FT,16.OFFSET:COP1:32,f::LWC1 5953 1.1 christos "lwc1 f<FT>, <OFFSET>(r<BASE>)" 5954 1.1 christos *mipsI: 5955 1.1 christos *mipsII: 5956 1.1 christos *mipsIII: 5957 1.1 christos *mipsIV: 5958 1.1 christos *mipsV: 5959 1.1 christos *mips32: 5960 1.1 christos *mips32r2: 5961 1.1.1.4 christos *mips32r6: 5962 1.1 christos *mips64: 5963 1.1 christos *mips64r2: 5964 1.1.1.4 christos *mips64r6: 5965 1.1 christos *vr4100: 5966 1.1 christos *vr5000: 5967 1.1 christos *r3900: 5968 1.1 christos { 5969 1.1.1.2 christos do_lwc1 (SD_, FT, OFFSET, BASE); 5970 1.1 christos } 5971 1.1 christos 5972 1.1 christos 5973 1.1 christos 010011,5.BASE,5.INDEX,5.0,5.FD,000000:COP1X:32,f::LWXC1 5974 1.1 christos "lwxc1 f<FD>, r<INDEX>(r<BASE>)" 5975 1.1 christos *mipsIV: 5976 1.1 christos *mipsV: 5977 1.1 christos *mips32r2: 5978 1.1 christos *mips64: 5979 1.1 christos *mips64r2: 5980 1.1 christos *vr5000: 5981 1.1 christos { 5982 1.1.1.2 christos do_lwxc1 (SD_, FD, INDEX, BASE, instruction_0); 5983 1.1 christos } 5984 1.1 christos 5985 1.1 christos 5986 1.1 christos 5987 1.1 christos 010011,5.FR,5.FT,5.FS,5.FD,100,3.FMT!2!3!4!5!7:COP1X:32,f::MADD.fmt 5988 1.1 christos "madd.%s<FMT> f<FD>, f<FR>, f<FS>, f<FT>" 5989 1.1 christos *mipsIV: 5990 1.1 christos *mipsV: 5991 1.1 christos *mips32r2: 5992 1.1 christos *mips64: 5993 1.1 christos *mips64r2: 5994 1.1 christos *vr5000: 5995 1.1 christos { 5996 1.1.1.2 christos do_madd_fmt (SD_, FMT, FD, FR, FS, FT, instruction_0); 5997 1.1 christos } 5998 1.1 christos 5999 1.1 christos 6000 1.1 christos 010001,00000,5.RT,5.FS,00000000000:COP1:32,f::MFC1a 6001 1.1 christos "mfc1 r<RT>, f<FS>" 6002 1.1 christos *mipsI: 6003 1.1 christos *mipsII: 6004 1.1 christos *mipsIII: 6005 1.1 christos { 6006 1.1.1.4 christos uint64_t v; 6007 1.1 christos check_fpu (SD_); 6008 1.1 christos v = EXTEND32 (FGR[FS]); 6009 1.1 christos PENDING_FILL (RT, v); 6010 1.1 christos TRACE_ALU_RESULT (v); 6011 1.1 christos } 6012 1.1.1.4 christos 6013 1.1 christos 010001,00000,5.RT,5.FS,00000000000:COP1:32,f::MFC1b 6014 1.1 christos "mfc1 r<RT>, f<FS>" 6015 1.1 christos *mipsIV: 6016 1.1 christos *mipsV: 6017 1.1 christos *mips32: 6018 1.1 christos *mips32r2: 6019 1.1.1.4 christos *mips32r6: 6020 1.1 christos *mips64: 6021 1.1 christos *mips64r2: 6022 1.1.1.4 christos *mips64r6: 6023 1.1 christos *vr4100: 6024 1.1 christos *vr5000: 6025 1.1 christos *r3900: 6026 1.1.1.4 christos { 6027 1.1.1.2 christos do_mfc1b (SD_, RT, FS); 6028 1.1 christos } 6029 1.1 christos 6030 1.1 christos 6031 1.1 christos 010001,10,3.FMT!2!3!4!5!7,00000,5.FS,5.FD,000110:COP1:32,f::MOV.fmt 6032 1.1 christos "mov.%s<FMT> f<FD>, f<FS>" 6033 1.1 christos *mipsI: 6034 1.1 christos *mipsII: 6035 1.1 christos *mipsIII: 6036 1.1 christos *mipsIV: 6037 1.1 christos *mipsV: 6038 1.1 christos *mips32: 6039 1.1 christos *mips32r2: 6040 1.1.1.4 christos *mips32r6: 6041 1.1 christos *mips64: 6042 1.1 christos *mips64r2: 6043 1.1.1.4 christos *mips64r6: 6044 1.1 christos *vr4100: 6045 1.1 christos *vr5000: 6046 1.1 christos *r3900: 6047 1.1 christos { 6048 1.1.1.2 christos do_mov_fmt (SD_, FMT, FD, FS, instruction_0); 6049 1.1 christos } 6050 1.1 christos 6051 1.1 christos 6052 1.1 christos // MOVF 6053 1.1 christos // MOVT 6054 1.1 christos 000000,5.RS,3.CC,0,1.TF,5.RD,00000,000001:SPECIAL:32,f::MOVtf 6055 1.1 christos "mov%s<TF> r<RD>, r<RS>, <CC>" 6056 1.1 christos *mipsIV: 6057 1.1 christos *mipsV: 6058 1.1 christos *mips32: 6059 1.1 christos *mips32r2: 6060 1.1 christos *mips64: 6061 1.1 christos *mips64r2: 6062 1.1 christos *vr5000: 6063 1.1 christos { 6064 1.1.1.2 christos do_movtf (SD_, TF, RD, RS, CC); 6065 1.1 christos } 6066 1.1 christos 6067 1.1 christos 6068 1.1 christos // MOVF.fmt 6069 1.1 christos // MOVT.fmt 6070 1.1 christos 010001,10,3.FMT!2!3!4!5!7,3.CC,0,1.TF,5.FS,5.FD,010001:COP1:32,f::MOVtf.fmt 6071 1.1 christos "mov%s<TF>.%s<FMT> f<FD>, f<FS>, <CC>" 6072 1.1 christos *mipsIV: 6073 1.1 christos *mipsV: 6074 1.1 christos *mips32: 6075 1.1 christos *mips32r2: 6076 1.1 christos *mips64: 6077 1.1 christos *mips64r2: 6078 1.1 christos *vr5000: 6079 1.1 christos { 6080 1.1.1.2 christos do_movtf_fmt (SD_, TF, FMT, FD, FS, CC); 6081 1.1 christos } 6082 1.1 christos 6083 1.1 christos 6084 1.1 christos 010001,10,3.FMT!2!3!4!5!7,5.RT,5.FS,5.FD,010011:COP1:32,f::MOVN.fmt 6085 1.1 christos "movn.%s<FMT> f<FD>, f<FS>, r<RT>" 6086 1.1 christos *mipsIV: 6087 1.1 christos *mipsV: 6088 1.1 christos *mips32: 6089 1.1 christos *mips32r2: 6090 1.1 christos *mips64: 6091 1.1 christos *mips64r2: 6092 1.1 christos *vr5000: 6093 1.1 christos { 6094 1.1.1.2 christos do_movn_fmt (SD_, FMT, FD, FS, RT); 6095 1.1 christos } 6096 1.1 christos 6097 1.1 christos 6098 1.1 christos // MOVT see MOVtf 6099 1.1 christos 6100 1.1 christos 6101 1.1 christos // MOVT.fmt see MOVtf.fmt 6102 1.1 christos 6103 1.1 christos 6104 1.1 christos 6105 1.1 christos 010001,10,3.FMT!2!3!4!5!7,5.RT,5.FS,5.FD,010010:COP1:32,f::MOVZ.fmt 6106 1.1 christos "movz.%s<FMT> f<FD>, f<FS>, r<RT>" 6107 1.1 christos *mipsIV: 6108 1.1 christos *mipsV: 6109 1.1 christos *mips32: 6110 1.1 christos *mips32r2: 6111 1.1 christos *mips64: 6112 1.1 christos *mips64r2: 6113 1.1 christos *vr5000: 6114 1.1 christos { 6115 1.1.1.2 christos do_movz_fmt (SD_, FMT, FD, FS, RT); 6116 1.1 christos } 6117 1.1 christos 6118 1.1 christos 6119 1.1 christos 010011,5.FR,5.FT,5.FS,5.FD,101,3.FMT!2!3!4!5!7:COP1X:32,f::MSUB.fmt 6120 1.1 christos "msub.%s<FMT> f<FD>, f<FR>, f<FS>, f<FT>" 6121 1.1 christos *mipsIV: 6122 1.1 christos *mipsV: 6123 1.1 christos *mips32r2: 6124 1.1 christos *mips64: 6125 1.1 christos *mips64r2: 6126 1.1 christos *vr5000: 6127 1.1 christos { 6128 1.1.1.2 christos do_msub_fmt (SD_, FMT, FD, FR, FS, FT, instruction_0); 6129 1.1 christos } 6130 1.1 christos 6131 1.1 christos 6132 1.1 christos 010001,00100,5.RT,5.FS,00000000000:COP1:32,f::MTC1a 6133 1.1 christos "mtc1 r<RT>, f<FS>" 6134 1.1 christos *mipsI: 6135 1.1 christos *mipsII: 6136 1.1 christos *mipsIII: 6137 1.1.1.4 christos { 6138 1.1 christos check_fpu (SD_); 6139 1.1 christos if (SizeFGR () == 64) 6140 1.1 christos PENDING_FILL ((FS + FGR_BASE), (SET64HI (0xDEADC0DE) | VL4_8 (GPR[RT]))); 6141 1.1 christos else 6142 1.1 christos PENDING_FILL ((FS + FGR_BASE), VL4_8 (GPR[RT])); 6143 1.1 christos TRACE_FP_RESULT (GPR[RT]); 6144 1.1.1.4 christos } 6145 1.1 christos 6146 1.1 christos 010001,00100,5.RT,5.FS,00000000000:COP1:32,f::MTC1b 6147 1.1 christos "mtc1 r<RT>, f<FS>" 6148 1.1 christos *mipsIV: 6149 1.1 christos *mipsV: 6150 1.1 christos *mips32: 6151 1.1 christos *mips32r2: 6152 1.1.1.4 christos *mips32r6: 6153 1.1 christos *mips64: 6154 1.1 christos *mips64r2: 6155 1.1.1.4 christos *mips64r6: 6156 1.1 christos *vr4100: 6157 1.1 christos *vr5000: 6158 1.1 christos *r3900: 6159 1.1 christos { 6160 1.1.1.2 christos do_mtc1b (SD_, RT, FS); 6161 1.1 christos } 6162 1.1 christos 6163 1.1 christos 6164 1.1 christos 010001,10,3.FMT!2!3!4!5!7,5.FT,5.FS,5.FD,000010:COP1:32,f::MUL.fmt 6165 1.1 christos "mul.%s<FMT> f<FD>, f<FS>, f<FT>" 6166 1.1 christos *mipsI: 6167 1.1 christos *mipsII: 6168 1.1 christos *mipsIII: 6169 1.1 christos *mipsIV: 6170 1.1 christos *mipsV: 6171 1.1 christos *mips32: 6172 1.1 christos *mips32r2: 6173 1.1.1.4 christos *mips32r6: 6174 1.1 christos *mips64: 6175 1.1 christos *mips64r2: 6176 1.1.1.4 christos *mips64r6: 6177 1.1 christos *vr4100: 6178 1.1 christos *vr5000: 6179 1.1 christos *r3900: 6180 1.1 christos { 6181 1.1.1.2 christos do_mul_fmt (SD_, FMT, FD, FS, FT, instruction_0); 6182 1.1 christos } 6183 1.1 christos 6184 1.1 christos 6185 1.1 christos 010001,10,3.FMT!2!3!4!5!7,00000,5.FS,5.FD,000111:COP1:32,f::NEG.fmt 6186 1.1 christos "neg.%s<FMT> f<FD>, f<FS>" 6187 1.1 christos *mipsI: 6188 1.1 christos *mipsII: 6189 1.1 christos *mipsIII: 6190 1.1 christos *mipsIV: 6191 1.1 christos *mipsV: 6192 1.1 christos *mips32: 6193 1.1 christos *mips32r2: 6194 1.1.1.4 christos *mips32r6: 6195 1.1 christos *mips64: 6196 1.1 christos *mips64r2: 6197 1.1.1.4 christos *mips64r6: 6198 1.1 christos *vr4100: 6199 1.1 christos *vr5000: 6200 1.1 christos *r3900: 6201 1.1 christos { 6202 1.1.1.2 christos do_neg_fmt (SD_, FMT, FD, FS, instruction_0); 6203 1.1 christos } 6204 1.1 christos 6205 1.1 christos 6206 1.1 christos 010011,5.FR,5.FT,5.FS,5.FD,110,3.FMT!2!3!4!5!7:COP1X:32,f::NMADD.fmt 6207 1.1 christos "nmadd.%s<FMT> f<FD>, f<FR>, f<FS>, f<FT>" 6208 1.1 christos *mipsIV: 6209 1.1 christos *mipsV: 6210 1.1 christos *mips32r2: 6211 1.1 christos *mips64: 6212 1.1 christos *mips64r2: 6213 1.1 christos *vr5000: 6214 1.1 christos { 6215 1.1.1.2 christos do_nmadd_fmt (SD_, FMT, FD, FR, FS, FT, instruction_0); 6216 1.1 christos } 6217 1.1 christos 6218 1.1 christos 6219 1.1 christos 010011,5.FR,5.FT,5.FS,5.FD,111,3.FMT!2!3!4!5!7:COP1X:32,f::NMSUB.fmt 6220 1.1 christos "nmsub.%s<FMT> f<FD>, f<FR>, f<FS>, f<FT>" 6221 1.1 christos *mipsIV: 6222 1.1 christos *mipsV: 6223 1.1 christos *mips32r2: 6224 1.1 christos *mips64: 6225 1.1 christos *mips64r2: 6226 1.1 christos *vr5000: 6227 1.1 christos { 6228 1.1.1.2 christos do_nmsub_fmt (SD_, FMT, FD, FR, FS, FT, instruction_0); 6229 1.1 christos } 6230 1.1 christos 6231 1.1 christos 6232 1.1 christos 010001,10,110,5.FT,5.FS,5.FD,101100:COP1:32,f::PLL.PS 6233 1.1 christos "pll.ps f<FD>, f<FS>, f<FT>" 6234 1.1 christos *mipsV: 6235 1.1 christos *mips32r2: 6236 1.1 christos *mips64: 6237 1.1 christos *mips64r2: 6238 1.1 christos { 6239 1.1.1.2 christos do_pll_ps (SD_, FD, FS, FT, instruction_0); 6240 1.1 christos } 6241 1.1 christos 6242 1.1 christos 6243 1.1 christos 010001,10,110,5.FT,5.FS,5.FD,101101:COP1:32,f::PLU.PS 6244 1.1 christos "plu.ps f<FD>, f<FS>, f<FT>" 6245 1.1 christos *mipsV: 6246 1.1 christos *mips32r2: 6247 1.1 christos *mips64: 6248 1.1 christos *mips64r2: 6249 1.1 christos { 6250 1.1.1.2 christos do_plu_ps (SD_, FD, FS, FT, instruction_0); 6251 1.1 christos } 6252 1.1 christos 6253 1.1 christos 6254 1.1 christos 010011,5.BASE,5.INDEX,5.HINT,00000,001111:COP1X:32::PREFX 6255 1.1 christos "prefx <HINT>, r<INDEX>(r<BASE>)" 6256 1.1 christos *mipsIV: 6257 1.1 christos *mipsV: 6258 1.1 christos *mips32r2: 6259 1.1 christos *mips64: 6260 1.1 christos *mips64r2: 6261 1.1 christos *vr5000: 6262 1.1 christos { 6263 1.1.1.2 christos do_prefx (SD_, HINT, INDEX, BASE); 6264 1.1 christos } 6265 1.1 christos 6266 1.1 christos 6267 1.1 christos 010001,10,110,5.FT,5.FS,5.FD,101110:COP1:32,f::PUL.PS 6268 1.1 christos "pul.ps f<FD>, f<FS>, f<FT>" 6269 1.1 christos *mipsV: 6270 1.1 christos *mips32r2: 6271 1.1 christos *mips64: 6272 1.1 christos *mips64r2: 6273 1.1 christos { 6274 1.1.1.2 christos do_pul_ps (SD_, FD, FS, FT, instruction_0); 6275 1.1 christos } 6276 1.1 christos 6277 1.1 christos 6278 1.1 christos 010001,10,110,5.FT,5.FS,5.FD,101111:COP1:32,f::PUU.PS 6279 1.1 christos "puu.ps f<FD>, f<FS>, f<FT>" 6280 1.1 christos *mipsV: 6281 1.1 christos *mips32r2: 6282 1.1 christos *mips64: 6283 1.1 christos *mips64r2: 6284 1.1 christos { 6285 1.1.1.2 christos do_puu_ps (SD_, FD, FS, FT, instruction_0); 6286 1.1 christos } 6287 1.1 christos 6288 1.1 christos 6289 1.1 christos 010001,10,3.FMT!2!3!4!5!6!7,00000,5.FS,5.FD,010101:COP1:32,f::RECIP.fmt 6290 1.1 christos "recip.%s<FMT> f<FD>, f<FS>" 6291 1.1 christos *mipsIV: 6292 1.1 christos *mipsV: 6293 1.1 christos *mips32r2: 6294 1.1.1.4 christos *mips32r6: 6295 1.1 christos *mips64: 6296 1.1 christos *mips64r2: 6297 1.1.1.4 christos *mips64r6: 6298 1.1 christos *vr5000: 6299 1.1 christos { 6300 1.1.1.2 christos do_recip_fmt (SD_, FMT, FD, FS); 6301 1.1 christos } 6302 1.1 christos 6303 1.1 christos 6304 1.1 christos 010001,10,3.FMT!2!3!4!5!6!7,00000,5.FS,5.FD,001000:COP1:32,f::ROUND.L.fmt 6305 1.1 christos "round.l.%s<FMT> f<FD>, f<FS>" 6306 1.1 christos *mipsIII: 6307 1.1 christos *mipsIV: 6308 1.1 christos *mipsV: 6309 1.1 christos *mips32r2: 6310 1.1.1.4 christos *mips32r6: 6311 1.1 christos *mips64: 6312 1.1 christos *mips64r2: 6313 1.1.1.4 christos *mips64r6: 6314 1.1 christos *vr4100: 6315 1.1 christos *vr5000: 6316 1.1 christos *r3900: 6317 1.1 christos { 6318 1.1.1.2 christos do_round_fmt (SD_, fmt_long, FMT, FD, FS); 6319 1.1 christos } 6320 1.1 christos 6321 1.1 christos 6322 1.1 christos 010001,10,3.FMT!2!3!4!5!6!7,00000,5.FS,5.FD,001100:COP1:32,f::ROUND.W.fmt 6323 1.1 christos "round.w.%s<FMT> f<FD>, f<FS>" 6324 1.1 christos *mipsII: 6325 1.1 christos *mipsIII: 6326 1.1 christos *mipsIV: 6327 1.1 christos *mipsV: 6328 1.1 christos *mips32: 6329 1.1 christos *mips32r2: 6330 1.1.1.4 christos *mips32r6: 6331 1.1 christos *mips64: 6332 1.1 christos *mips64r2: 6333 1.1.1.4 christos *mips64r6: 6334 1.1 christos *vr4100: 6335 1.1 christos *vr5000: 6336 1.1 christos *r3900: 6337 1.1 christos { 6338 1.1.1.2 christos do_round_fmt (SD_, fmt_word, FMT, FD, FS); 6339 1.1 christos } 6340 1.1 christos 6341 1.1 christos 6342 1.1 christos 010001,10,3.FMT!2!3!4!5!6!7,00000,5.FS,5.FD,010110:COP1:32,f::RSQRT.fmt 6343 1.1 christos "rsqrt.%s<FMT> f<FD>, f<FS>" 6344 1.1 christos *mipsIV: 6345 1.1 christos *mipsV: 6346 1.1 christos *mips32r2: 6347 1.1.1.4 christos *mips32r6: 6348 1.1 christos *mips64: 6349 1.1 christos *mips64r2: 6350 1.1.1.4 christos *mips64r6: 6351 1.1 christos *vr5000: 6352 1.1 christos { 6353 1.1.1.2 christos do_rsqrt_fmt (SD_, FMT, FD, FS); 6354 1.1 christos } 6355 1.1 christos 6356 1.1 christos 6357 1.1 christos 111101,5.BASE,5.FT,16.OFFSET:COP1:32,f::SDC1a 6358 1.1 christos "sdc1 f<FT>, <OFFSET>(r<BASE>)" 6359 1.1 christos *mipsII: 6360 1.1 christos *mips32: 6361 1.1 christos *mips32r2: 6362 1.1.1.4 christos *mips32r6: 6363 1.1 christos { 6364 1.1.1.2 christos do_sdc1 (SD_, FT, OFFSET, BASE); 6365 1.1 christos } 6366 1.1 christos 6367 1.1 christos 6368 1.1 christos 111101,5.BASE,5.FT,16.OFFSET:COP1:32,f::SDC1b 6369 1.1 christos "sdc1 f<FT>, <OFFSET>(r<BASE>)" 6370 1.1 christos *mipsIII: 6371 1.1 christos *mipsIV: 6372 1.1 christos *mipsV: 6373 1.1 christos *mips64: 6374 1.1 christos *mips64r2: 6375 1.1.1.4 christos *mips64r6: 6376 1.1 christos *vr4100: 6377 1.1 christos *vr5000: 6378 1.1 christos *r3900: 6379 1.1 christos { 6380 1.1 christos check_fpu (SD_); 6381 1.1 christos do_store (SD_, AccessLength_DOUBLEWORD, GPR[BASE], EXTEND16 (OFFSET), COP_SD (1, FT)); 6382 1.1 christos } 6383 1.1 christos 6384 1.1 christos 6385 1.1 christos 010011,5.BASE,5.INDEX,5.FS,00000001001:COP1X:32,f::SDXC1 6386 1.1 christos "sdxc1 f<FS>, r<INDEX>(r<BASE>)" 6387 1.1.1.4 christos *mips32r2: 6388 1.1 christos { 6389 1.1 christos check_fpu (SD_); 6390 1.1 christos do_store_double (SD_, GPR[BASE], GPR[INDEX], COP_SD (1, FS)); 6391 1.1 christos } 6392 1.1 christos 6393 1.1 christos 6394 1.1 christos 010011,5.BASE,5.INDEX,5.FS,00000001001:COP1X:64,f::SDXC1 6395 1.1 christos "sdxc1 f<FS>, r<INDEX>(r<BASE>)" 6396 1.1 christos *mipsIV: 6397 1.1 christos *mipsV: 6398 1.1 christos *mips64: 6399 1.1 christos *mips64r2: 6400 1.1 christos *vr5000: 6401 1.1 christos { 6402 1.1 christos check_fpu (SD_); 6403 1.1 christos check_u64 (SD_, instruction_0); 6404 1.1 christos do_store (SD_, AccessLength_DOUBLEWORD, GPR[BASE], GPR[INDEX], COP_SD (1, FS)); 6405 1.1 christos } 6406 1.1 christos 6407 1.1 christos 6408 1.1 christos 010011,5.BASE,5.INDEX,5.FS,00000,001101:COP1X:32,f::SUXC1 6409 1.1 christos "suxc1 f<FS>, r<INDEX>(r<BASE>)" 6410 1.1 christos *mips32r2: 6411 1.1 christos { 6412 1.1.1.2 christos do_suxc1_32 (SD_, FS, INDEX, BASE); 6413 1.1 christos } 6414 1.1 christos 6415 1.1 christos 6416 1.1 christos 010011,5.BASE,5.INDEX,5.FS,00000,001101:COP1X:64,f::SUXC1 6417 1.1 christos "suxc1 f<FS>, r<INDEX>(r<BASE>)" 6418 1.1 christos *mipsV: 6419 1.1 christos *mips64: 6420 1.1 christos *mips64r2: 6421 1.1 christos { 6422 1.1 christos check_fpu (SD_); 6423 1.1 christos check_u64 (SD_, instruction_0); 6424 1.1.1.2 christos do_suxc1_64 (SD_, FS, INDEX, BASE); 6425 1.1 christos } 6426 1.1 christos 6427 1.1 christos 6428 1.1 christos 010001,10,3.FMT!2!3!4!5!6!7,00000,5.FS,5.FD,000100:COP1:32,f::SQRT.fmt 6429 1.1 christos "sqrt.%s<FMT> f<FD>, f<FS>" 6430 1.1 christos *mipsII: 6431 1.1 christos *mipsIII: 6432 1.1 christos *mipsIV: 6433 1.1 christos *mipsV: 6434 1.1 christos *mips32: 6435 1.1 christos *mips32r2: 6436 1.1.1.4 christos *mips32r6: 6437 1.1 christos *mips64: 6438 1.1 christos *mips64r2: 6439 1.1.1.4 christos *mips64r6: 6440 1.1 christos *vr4100: 6441 1.1 christos *vr5000: 6442 1.1 christos *r3900: 6443 1.1 christos { 6444 1.1.1.2 christos do_sqrt_fmt (SD_, FMT, FD, FS); 6445 1.1 christos } 6446 1.1 christos 6447 1.1 christos 6448 1.1 christos 010001,10,3.FMT!2!3!4!5!7,5.FT,5.FS,5.FD,000001:COP1:32,f::SUB.fmt 6449 1.1 christos "sub.%s<FMT> f<FD>, f<FS>, f<FT>" 6450 1.1 christos *mipsI: 6451 1.1 christos *mipsII: 6452 1.1 christos *mipsIII: 6453 1.1 christos *mipsIV: 6454 1.1 christos *mipsV: 6455 1.1 christos *mips32: 6456 1.1 christos *mips32r2: 6457 1.1.1.4 christos *mips32r6: 6458 1.1 christos *mips64: 6459 1.1 christos *mips64r2: 6460 1.1.1.4 christos *mips64r6: 6461 1.1 christos *vr4100: 6462 1.1 christos *vr5000: 6463 1.1 christos *r3900: 6464 1.1 christos { 6465 1.1.1.2 christos do_sub_fmt (SD_, FMT, FD, FS, FT, instruction_0); 6466 1.1 christos } 6467 1.1 christos 6468 1.1 christos 6469 1.1 christos 6470 1.1 christos 111001,5.BASE,5.FT,16.OFFSET:COP1:32,f::SWC1 6471 1.1 christos "swc1 f<FT>, <OFFSET>(r<BASE>)" 6472 1.1 christos *mipsI: 6473 1.1 christos *mipsII: 6474 1.1 christos *mipsIII: 6475 1.1 christos *mipsIV: 6476 1.1 christos *mipsV: 6477 1.1 christos *mips32: 6478 1.1 christos *mips32r2: 6479 1.1.1.4 christos *mips32r6: 6480 1.1 christos *mips64: 6481 1.1 christos *mips64r2: 6482 1.1.1.4 christos *mips64r6: 6483 1.1 christos *vr4100: 6484 1.1 christos *vr5000: 6485 1.1 christos *r3900: 6486 1.1 christos { 6487 1.1.1.2 christos do_swc1 (SD_, FT, OFFSET, BASE, instruction_0); 6488 1.1 christos } 6489 1.1 christos 6490 1.1 christos 6491 1.1 christos 010011,5.BASE,5.INDEX,5.FS,00000,001000:COP1X:32,f::SWXC1 6492 1.1 christos "swxc1 f<FS>, r<INDEX>(r<BASE>)" 6493 1.1 christos *mipsIV: 6494 1.1 christos *mipsV: 6495 1.1 christos *mips32r2: 6496 1.1 christos *mips64: 6497 1.1 christos *mips64r2: 6498 1.1 christos *vr5000: 6499 1.1 christos { 6500 1.1.1.2 christos do_swxc1 (SD_, FS, INDEX, BASE, instruction_0); 6501 1.1 christos } 6502 1.1 christos 6503 1.1 christos 6504 1.1 christos 010001,10,3.FMT!2!3!4!5!6!7,00000,5.FS,5.FD,001001:COP1:32,f::TRUNC.L.fmt 6505 1.1 christos "trunc.l.%s<FMT> f<FD>, f<FS>" 6506 1.1 christos *mipsIII: 6507 1.1 christos *mipsIV: 6508 1.1 christos *mipsV: 6509 1.1 christos *mips32r2: 6510 1.1.1.4 christos *mips32r6: 6511 1.1 christos *mips64: 6512 1.1 christos *mips64r2: 6513 1.1.1.4 christos *mips64r6: 6514 1.1 christos *vr4100: 6515 1.1 christos *vr5000: 6516 1.1 christos *r3900: 6517 1.1 christos { 6518 1.1.1.2 christos do_trunc_fmt (SD_, fmt_long, FMT, FD, FS); 6519 1.1 christos } 6520 1.1 christos 6521 1.1 christos 6522 1.1 christos 010001,10,3.FMT!2!3!4!5!6!7,00000,5.FS,5.FD,001101:COP1:32,f::TRUNC.W 6523 1.1 christos "trunc.w.%s<FMT> f<FD>, f<FS>" 6524 1.1 christos *mipsII: 6525 1.1 christos *mipsIII: 6526 1.1 christos *mipsIV: 6527 1.1 christos *mipsV: 6528 1.1 christos *mips32: 6529 1.1 christos *mips32r2: 6530 1.1.1.4 christos *mips32r6: 6531 1.1 christos *mips64: 6532 1.1 christos *mips64r2: 6533 1.1.1.4 christos *mips64r6: 6534 1.1 christos *vr4100: 6535 1.1 christos *vr5000: 6536 1.1 christos *r3900: 6537 1.1 christos { 6538 1.1.1.2 christos do_trunc_fmt (SD_, fmt_word, FMT, FD, FS); 6539 1.1 christos } 6540 1.1 christos 6541 1.1.1.4 christos 6542 1.1 christos // 6543 1.1 christos // MIPS Architecture: 6544 1.1 christos // 6545 1.1 christos // System Control Instruction Set (COP0) 6546 1.1 christos // 6547 1.1 christos 6548 1.1 christos 6549 1.1 christos 010000,01000,00000,16.OFFSET:COP0:32::BC0F 6550 1.1 christos "bc0f <OFFSET>" 6551 1.1 christos *mipsI: 6552 1.1 christos *mipsII: 6553 1.1 christos *mipsIII: 6554 1.1 christos *mipsIV: 6555 1.1 christos *mipsV: 6556 1.1 christos *mips32: 6557 1.1 christos *mips32r2: 6558 1.1.1.4 christos *mips32r6: 6559 1.1 christos *mips64: 6560 1.1 christos *mips64r2: 6561 1.1.1.4 christos *mips64r6: 6562 1.1 christos *vr4100: 6563 1.1 christos *vr5000: 6564 1.1 christos 6565 1.1 christos 010000,01000,00000,16.OFFSET:COP0:32::BC0F 6566 1.1 christos "bc0f <OFFSET>" 6567 1.1 christos // stub needed for eCos as tx39 hardware bug workaround 6568 1.1 christos *r3900: 6569 1.1 christos { 6570 1.1 christos /* do nothing */ 6571 1.1 christos } 6572 1.1 christos 6573 1.1 christos 6574 1.1 christos 010000,01000,00010,16.OFFSET:COP0:32::BC0FL 6575 1.1 christos "bc0fl <OFFSET>" 6576 1.1 christos *mipsI: 6577 1.1 christos *mipsII: 6578 1.1 christos *mipsIII: 6579 1.1 christos *mipsIV: 6580 1.1 christos *mipsV: 6581 1.1 christos *mips32: 6582 1.1 christos *mips32r2: 6583 1.1.1.4 christos *mips32r6: 6584 1.1 christos *mips64: 6585 1.1 christos *mips64r2: 6586 1.1.1.4 christos *mips64r6: 6587 1.1 christos *vr4100: 6588 1.1 christos *vr5000: 6589 1.1 christos 6590 1.1 christos 6591 1.1 christos 010000,01000,00001,16.OFFSET:COP0:32::BC0T 6592 1.1 christos "bc0t <OFFSET>" 6593 1.1 christos *mipsI: 6594 1.1 christos *mipsII: 6595 1.1 christos *mipsIII: 6596 1.1 christos *mipsIV: 6597 1.1 christos *mipsV: 6598 1.1 christos *mips32: 6599 1.1 christos *mips32r2: 6600 1.1.1.4 christos *mips32r6: 6601 1.1 christos *mips64: 6602 1.1 christos *mips64r2: 6603 1.1.1.4 christos *mips64r6: 6604 1.1 christos *vr4100: 6605 1.1 christos 6606 1.1 christos 6607 1.1 christos 010000,01000,00011,16.OFFSET:COP0:32::BC0TL 6608 1.1 christos "bc0tl <OFFSET>" 6609 1.1 christos *mipsI: 6610 1.1 christos *mipsII: 6611 1.1 christos *mipsIII: 6612 1.1 christos *mipsIV: 6613 1.1 christos *mipsV: 6614 1.1 christos *mips32: 6615 1.1 christos *mips32r2: 6616 1.1.1.4 christos *mips32r6: 6617 1.1 christos *mips64: 6618 1.1 christos *mips64r2: 6619 1.1.1.4 christos *mips64r6: 6620 1.1 christos *vr4100: 6621 1.1 christos *vr5000: 6622 1.1 christos 6623 1.1.1.4 christos :function:::void:do_cache:int op, int rbase, int roffset, address_word instruction_0 6624 1.1.1.4 christos { 6625 1.1.1.4 christos address_word base = GPR[rbase]; 6626 1.1.1.4 christos address_word offset = EXTEND16 (roffset); 6627 1.1.1.4 christos { 6628 1.1.1.4 christos address_word vaddr = loadstore_ea (SD_, base, offset); 6629 1.1.1.4 christos address_word paddr = vaddr; 6630 1.1.1.4 christos CacheOp(op, vaddr, paddr, instruction_0); 6631 1.1.1.4 christos } 6632 1.1.1.4 christos } 6633 1.1 christos 6634 1.1 christos 101111,5.BASE,5.OP,16.OFFSET:NORMAL:32::CACHE 6635 1.1 christos "cache <OP>, <OFFSET>(r<BASE>)" 6636 1.1 christos *mipsIII: 6637 1.1 christos *mipsIV: 6638 1.1 christos *mipsV: 6639 1.1 christos *mips32: 6640 1.1 christos *mips32r2: 6641 1.1 christos *mips64: 6642 1.1 christos *mips64r2: 6643 1.1 christos *vr4100: 6644 1.1 christos *vr5000: 6645 1.1 christos *r3900: 6646 1.1 christos { 6647 1.1.1.4 christos do_cache (SD_, OP, BASE, OFFSET, instruction_0); 6648 1.1 christos } 6649 1.1 christos 6650 1.1 christos 6651 1.1.1.2 christos 010000,00001,5.RT,5.RD,00000000,3.SEL:COP0:64::DMFC0 6652 1.1 christos "dmfc0 r<RT>, r<RD>" 6653 1.1 christos *mipsIII: 6654 1.1 christos *mipsIV: 6655 1.1 christos *mipsV: 6656 1.1 christos *mips64: 6657 1.1 christos *mips64r2: 6658 1.1.1.4 christos *mips64r6: 6659 1.1 christos { 6660 1.1 christos check_u64 (SD_, instruction_0); 6661 1.1.1.2 christos DecodeCoproc (instruction_0, 0, cp0_dmfc0, RT, RD, SEL); 6662 1.1 christos } 6663 1.1 christos 6664 1.1 christos 6665 1.1.1.2 christos 010000,00101,5.RT,5.RD,00000000,3.SEL:COP0:64::DMTC0 6666 1.1 christos "dmtc0 r<RT>, r<RD>" 6667 1.1 christos *mipsIII: 6668 1.1 christos *mipsIV: 6669 1.1 christos *mipsV: 6670 1.1 christos *mips64: 6671 1.1 christos *mips64r2: 6672 1.1.1.4 christos *mips64r6: 6673 1.1 christos { 6674 1.1 christos check_u64 (SD_, instruction_0); 6675 1.1.1.2 christos DecodeCoproc (instruction_0, 0, cp0_dmtc0, RT, RD, SEL); 6676 1.1 christos } 6677 1.1 christos 6678 1.1 christos 6679 1.1 christos 010000,1,0000000000000000000,011000:COP0:32::ERET 6680 1.1 christos "eret" 6681 1.1 christos *mipsIII: 6682 1.1 christos *mipsIV: 6683 1.1 christos *mipsV: 6684 1.1 christos *mips32: 6685 1.1 christos *mips32r2: 6686 1.1.1.4 christos *mips32r6: 6687 1.1 christos *mips64: 6688 1.1 christos *mips64r2: 6689 1.1.1.4 christos *mips64r6: 6690 1.1 christos *vr4100: 6691 1.1 christos *vr5000: 6692 1.1 christos { 6693 1.1 christos if (SR & status_ERL) 6694 1.1 christos { 6695 1.1 christos /* Oops, not yet available */ 6696 1.1 christos sim_io_printf (SD, "Warning: ERET when SR[ERL] set not supported"); 6697 1.1 christos NIA = EPC; 6698 1.1 christos SR &= ~status_ERL; 6699 1.1 christos } 6700 1.1 christos else 6701 1.1 christos { 6702 1.1 christos NIA = EPC; 6703 1.1 christos SR &= ~status_EXL; 6704 1.1 christos } 6705 1.1 christos } 6706 1.1 christos 6707 1.1 christos 6708 1.1.1.2 christos 010000,00000,5.RT,5.RD,00000000,3.SEL:COP0:32::MFC0 6709 1.1.1.2 christos "mfc0 r<RT>, r<RD> # <SEL>" 6710 1.1 christos *mipsI: 6711 1.1 christos *mipsII: 6712 1.1 christos *mipsIII: 6713 1.1 christos *mipsIV: 6714 1.1 christos *mipsV: 6715 1.1 christos *mips32: 6716 1.1 christos *mips32r2: 6717 1.1.1.4 christos *mips32r6: 6718 1.1 christos *mips64: 6719 1.1 christos *mips64r2: 6720 1.1.1.4 christos *mips64r6: 6721 1.1 christos *vr4100: 6722 1.1 christos *vr5000: 6723 1.1 christos *r3900: 6724 1.1 christos { 6725 1.1 christos TRACE_ALU_INPUT0 (); 6726 1.1.1.2 christos DecodeCoproc (instruction_0, 0, cp0_mfc0, RT, RD, SEL); 6727 1.1 christos TRACE_ALU_RESULT (GPR[RT]); 6728 1.1 christos } 6729 1.1 christos 6730 1.1.1.2 christos 010000,00100,5.RT,5.RD,00000000,3.SEL:COP0:32::MTC0 6731 1.1.1.2 christos "mtc0 r<RT>, r<RD> # <SEL>" 6732 1.1 christos *mipsI: 6733 1.1 christos *mipsII: 6734 1.1 christos *mipsIII: 6735 1.1 christos *mipsIV: 6736 1.1 christos *mipsV: 6737 1.1 christos *mips32: 6738 1.1 christos *mips32r2: 6739 1.1.1.4 christos *mips32r6: 6740 1.1 christos *mips64: 6741 1.1 christos *mips64r2: 6742 1.1.1.4 christos *mips64r6: 6743 1.1 christos *vr4100: 6744 1.1 christos *vr5000: 6745 1.1 christos *r3900: 6746 1.1 christos { 6747 1.1.1.2 christos DecodeCoproc (instruction_0, 0, cp0_mtc0, RT, RD, SEL); 6748 1.1 christos } 6749 1.1 christos 6750 1.1 christos 6751 1.1 christos 010000,1,0000000000000000000,010000:COP0:32::RFE 6752 1.1 christos "rfe" 6753 1.1 christos *mipsI: 6754 1.1 christos *mipsII: 6755 1.1 christos *mipsIII: 6756 1.1 christos *mipsIV: 6757 1.1 christos *mipsV: 6758 1.1 christos *vr4100: 6759 1.1 christos *vr5000: 6760 1.1 christos *r3900: 6761 1.1 christos { 6762 1.1.1.2 christos DecodeCoproc (instruction_0, 0, cp0_rfe, 0, 0, 0x10); 6763 1.1 christos } 6764 1.1 christos 6765 1.1 christos 6766 1.1 christos 0100,ZZ!0!1!3,5.COP_FUN0!8,5.COP_FUN1,16.COP_FUN2:NORMAL:32::COPz 6767 1.1 christos "cop<ZZ> <COP_FUN0><COP_FUN1><COP_FUN2>" 6768 1.1 christos *mipsI: 6769 1.1 christos *mipsII: 6770 1.1 christos *mipsIII: 6771 1.1 christos *mipsIV: 6772 1.1 christos *mipsV: 6773 1.1 christos *mips32: 6774 1.1 christos *mips32r2: 6775 1.1.1.4 christos *mips32r6: 6776 1.1 christos *mips64: 6777 1.1 christos *mips64r2: 6778 1.1.1.4 christos *mips64r6: 6779 1.1 christos *vr4100: 6780 1.1 christos *r3900: 6781 1.1 christos { 6782 1.1.1.2 christos DecodeCoproc (instruction_0, 2, 0, 0, 0, 0); 6783 1.1 christos } 6784 1.1 christos 6785 1.1 christos 6786 1.1 christos 6787 1.1 christos 010000,1,0000000000000000000,001000:COP0:32::TLBP 6788 1.1 christos "tlbp" 6789 1.1 christos *mipsI: 6790 1.1 christos *mipsII: 6791 1.1 christos *mipsIII: 6792 1.1 christos *mipsIV: 6793 1.1 christos *mipsV: 6794 1.1 christos *mips32: 6795 1.1 christos *mips32r2: 6796 1.1.1.4 christos *mips32r6: 6797 1.1 christos *mips64: 6798 1.1 christos *mips64r2: 6799 1.1.1.4 christos *mips64r6: 6800 1.1 christos *vr4100: 6801 1.1 christos *vr5000: 6802 1.1 christos 6803 1.1 christos 6804 1.1 christos 010000,1,0000000000000000000,000001:COP0:32::TLBR 6805 1.1 christos "tlbr" 6806 1.1 christos *mipsI: 6807 1.1 christos *mipsII: 6808 1.1 christos *mipsIII: 6809 1.1 christos *mipsIV: 6810 1.1 christos *mipsV: 6811 1.1 christos *mips32: 6812 1.1 christos *mips32r2: 6813 1.1.1.4 christos *mips32r6: 6814 1.1 christos *mips64: 6815 1.1 christos *mips64r2: 6816 1.1.1.4 christos *mips64r6: 6817 1.1 christos *vr4100: 6818 1.1 christos *vr5000: 6819 1.1 christos 6820 1.1 christos 6821 1.1 christos 010000,1,0000000000000000000,000010:COP0:32::TLBWI 6822 1.1 christos "tlbwi" 6823 1.1 christos *mipsI: 6824 1.1 christos *mipsII: 6825 1.1 christos *mipsIII: 6826 1.1 christos *mipsIV: 6827 1.1 christos *mipsV: 6828 1.1 christos *mips32: 6829 1.1 christos *mips32r2: 6830 1.1.1.4 christos *mips32r6: 6831 1.1 christos *mips64: 6832 1.1 christos *mips64r2: 6833 1.1.1.4 christos *mips64r6: 6834 1.1 christos *vr4100: 6835 1.1 christos *vr5000: 6836 1.1 christos 6837 1.1 christos 6838 1.1 christos 010000,1,0000000000000000000,000110:COP0:32::TLBWR 6839 1.1 christos "tlbwr" 6840 1.1 christos *mipsI: 6841 1.1 christos *mipsII: 6842 1.1 christos *mipsIII: 6843 1.1 christos *mipsIV: 6844 1.1 christos *mipsV: 6845 1.1 christos *mips32: 6846 1.1 christos *mips32r2: 6847 1.1.1.4 christos *mips32r6: 6848 1.1 christos *mips64: 6849 1.1 christos *mips64r2: 6850 1.1.1.4 christos *mips64r6: 6851 1.1 christos *vr4100: 6852 1.1 christos *vr5000: 6853 1.1 christos 6854 1.1 christos 6855 1.1 christos :include:::mips3264r2.igen 6856 1.1.1.4 christos :include:::mips3264r6.igen 6857 1.1 christos :include:::m16.igen 6858 1.1 christos :include:::m16e.igen 6859 1.1 christos :include:::mdmx.igen 6860 1.1 christos :include:::mips3d.igen 6861 1.1 christos :include:::sb1.igen 6862 1.1 christos :include:::tx.igen 6863 1.1 christos :include:::vr.igen 6864 1.1 christos :include:::dsp.igen 6865 1.1 christos :include:::dsp2.igen 6866 1.1 christos :include:::smartmips.igen 6867 1.1.1.2 christos :include:::micromips.igen 6868 1.1.1.2 christos :include:::micromipsdsp.igen 6869 1.1 christos 6870