OLD | NEW |
1 // Copyright 2012 the V8 project authors. All rights reserved. | 1 // Copyright 2012 the V8 project authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #ifndef V8_MIPS_CONSTANTS_H_ | 5 #ifndef V8_MIPS_CONSTANTS_H_ |
6 #define V8_MIPS_CONSTANTS_H_ | 6 #define V8_MIPS_CONSTANTS_H_ |
7 | 7 |
8 #include "src/base/logging.h" | 8 #include "src/base/logging.h" |
9 #include "src/base/macros.h" | 9 #include "src/base/macros.h" |
10 #include "src/globals.h" | 10 #include "src/globals.h" |
(...skipping 286 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
297 // Misc masks. | 297 // Misc masks. |
298 const int kHiMask = 0xffff << 16; | 298 const int kHiMask = 0xffff << 16; |
299 const int kLoMask = 0xffff; | 299 const int kLoMask = 0xffff; |
300 const int kSignMask = 0x80000000; | 300 const int kSignMask = 0x80000000; |
301 const int kJumpAddrMask = (1 << (kImm26Bits + kImmFieldShift)) - 1; | 301 const int kJumpAddrMask = (1 << (kImm26Bits + kImmFieldShift)) - 1; |
302 const int64_t kHi16MaskOf64 = (int64_t)0xffff << 48; | 302 const int64_t kHi16MaskOf64 = (int64_t)0xffff << 48; |
303 const int64_t kSe16MaskOf64 = (int64_t)0xffff << 32; | 303 const int64_t kSe16MaskOf64 = (int64_t)0xffff << 32; |
304 const int64_t kTh16MaskOf64 = (int64_t)0xffff << 16; | 304 const int64_t kTh16MaskOf64 = (int64_t)0xffff << 16; |
305 const int32_t kJalRawMark = 0x00000000; | 305 const int32_t kJalRawMark = 0x00000000; |
306 const int32_t kJRawMark = 0xf0000000; | 306 const int32_t kJRawMark = 0xf0000000; |
| 307 const int32_t kJumpRawMask = 0xf0000000; |
307 | 308 |
308 // ----- MIPS Opcodes and Function Fields. | 309 // ----- MIPS Opcodes and Function Fields. |
309 // We use this presentation to stay close to the table representation in | 310 // We use this presentation to stay close to the table representation in |
310 // MIPS32 Architecture For Programmers, Volume II: The MIPS32 Instruction Set. | 311 // MIPS32 Architecture For Programmers, Volume II: The MIPS32 Instruction Set. |
311 enum Opcode { | 312 enum Opcode : uint32_t { |
312 SPECIAL = 0 << kOpcodeShift, | 313 SPECIAL = 0U << kOpcodeShift, |
313 REGIMM = 1 << kOpcodeShift, | 314 REGIMM = 1U << kOpcodeShift, |
314 | 315 |
315 J = ((0 << 3) + 2) << kOpcodeShift, | 316 J = ((0U << 3) + 2) << kOpcodeShift, |
316 JAL = ((0 << 3) + 3) << kOpcodeShift, | 317 JAL = ((0U << 3) + 3) << kOpcodeShift, |
317 BEQ = ((0 << 3) + 4) << kOpcodeShift, | 318 BEQ = ((0U << 3) + 4) << kOpcodeShift, |
318 BNE = ((0 << 3) + 5) << kOpcodeShift, | 319 BNE = ((0U << 3) + 5) << kOpcodeShift, |
319 BLEZ = ((0 << 3) + 6) << kOpcodeShift, | 320 BLEZ = ((0U << 3) + 6) << kOpcodeShift, |
320 BGTZ = ((0 << 3) + 7) << kOpcodeShift, | 321 BGTZ = ((0U << 3) + 7) << kOpcodeShift, |
321 | 322 |
322 ADDI = ((1 << 3) + 0) << kOpcodeShift, | 323 ADDI = ((1U << 3) + 0) << kOpcodeShift, |
323 ADDIU = ((1 << 3) + 1) << kOpcodeShift, | 324 ADDIU = ((1U << 3) + 1) << kOpcodeShift, |
324 SLTI = ((1 << 3) + 2) << kOpcodeShift, | 325 SLTI = ((1U << 3) + 2) << kOpcodeShift, |
325 SLTIU = ((1 << 3) + 3) << kOpcodeShift, | 326 SLTIU = ((1U << 3) + 3) << kOpcodeShift, |
326 ANDI = ((1 << 3) + 4) << kOpcodeShift, | 327 ANDI = ((1U << 3) + 4) << kOpcodeShift, |
327 ORI = ((1 << 3) + 5) << kOpcodeShift, | 328 ORI = ((1U << 3) + 5) << kOpcodeShift, |
328 XORI = ((1 << 3) + 6) << kOpcodeShift, | 329 XORI = ((1U << 3) + 6) << kOpcodeShift, |
329 LUI = ((1 << 3) + 7) << kOpcodeShift, // LUI/AUI family. | 330 LUI = ((1U << 3) + 7) << kOpcodeShift, // LUI/AUI family. |
330 DAUI = ((3 << 3) + 5) << kOpcodeShift, | 331 DAUI = ((3U << 3) + 5) << kOpcodeShift, |
331 | 332 |
332 BEQC = ((2 << 3) + 0) << kOpcodeShift, | 333 BEQC = ((2U << 3) + 0) << kOpcodeShift, |
333 COP1 = ((2 << 3) + 1) << kOpcodeShift, // Coprocessor 1 class. | 334 COP1 = ((2U << 3) + 1) << kOpcodeShift, // Coprocessor 1 class. |
334 BEQL = ((2 << 3) + 4) << kOpcodeShift, | 335 BEQL = ((2U << 3) + 4) << kOpcodeShift, |
335 BNEL = ((2 << 3) + 5) << kOpcodeShift, | 336 BNEL = ((2U << 3) + 5) << kOpcodeShift, |
336 BLEZL = ((2 << 3) + 6) << kOpcodeShift, | 337 BLEZL = ((2U << 3) + 6) << kOpcodeShift, |
337 BGTZL = ((2 << 3) + 7) << kOpcodeShift, | 338 BGTZL = ((2U << 3) + 7) << kOpcodeShift, |
338 | 339 |
339 DADDI = ((3 << 3) + 0) << kOpcodeShift, // This is also BNEC. | 340 DADDI = ((3U << 3) + 0) << kOpcodeShift, // This is also BNEC. |
340 DADDIU = ((3 << 3) + 1) << kOpcodeShift, | 341 DADDIU = ((3U << 3) + 1) << kOpcodeShift, |
341 LDL = ((3 << 3) + 2) << kOpcodeShift, | 342 LDL = ((3U << 3) + 2) << kOpcodeShift, |
342 LDR = ((3 << 3) + 3) << kOpcodeShift, | 343 LDR = ((3U << 3) + 3) << kOpcodeShift, |
343 SPECIAL2 = ((3 << 3) + 4) << kOpcodeShift, | 344 SPECIAL2 = ((3U << 3) + 4) << kOpcodeShift, |
344 SPECIAL3 = ((3 << 3) + 7) << kOpcodeShift, | 345 SPECIAL3 = ((3U << 3) + 7) << kOpcodeShift, |
345 | 346 |
346 LB = ((4 << 3) + 0) << kOpcodeShift, | 347 LB = ((4U << 3) + 0) << kOpcodeShift, |
347 LH = ((4 << 3) + 1) << kOpcodeShift, | 348 LH = ((4U << 3) + 1) << kOpcodeShift, |
348 LWL = ((4 << 3) + 2) << kOpcodeShift, | 349 LWL = ((4U << 3) + 2) << kOpcodeShift, |
349 LW = ((4 << 3) + 3) << kOpcodeShift, | 350 LW = ((4U << 3) + 3) << kOpcodeShift, |
350 LBU = ((4 << 3) + 4) << kOpcodeShift, | 351 LBU = ((4U << 3) + 4) << kOpcodeShift, |
351 LHU = ((4 << 3) + 5) << kOpcodeShift, | 352 LHU = ((4U << 3) + 5) << kOpcodeShift, |
352 LWR = ((4 << 3) + 6) << kOpcodeShift, | 353 LWR = ((4U << 3) + 6) << kOpcodeShift, |
353 LWU = ((4 << 3) + 7) << kOpcodeShift, | 354 LWU = ((4U << 3) + 7) << kOpcodeShift, |
354 | 355 |
355 SB = ((5 << 3) + 0) << kOpcodeShift, | 356 SB = ((5U << 3) + 0) << kOpcodeShift, |
356 SH = ((5 << 3) + 1) << kOpcodeShift, | 357 SH = ((5U << 3) + 1) << kOpcodeShift, |
357 SWL = ((5 << 3) + 2) << kOpcodeShift, | 358 SWL = ((5U << 3) + 2) << kOpcodeShift, |
358 SW = ((5 << 3) + 3) << kOpcodeShift, | 359 SW = ((5U << 3) + 3) << kOpcodeShift, |
359 SDL = ((5 << 3) + 4) << kOpcodeShift, | 360 SDL = ((5U << 3) + 4) << kOpcodeShift, |
360 SDR = ((5 << 3) + 5) << kOpcodeShift, | 361 SDR = ((5U << 3) + 5) << kOpcodeShift, |
361 SWR = ((5 << 3) + 6) << kOpcodeShift, | 362 SWR = ((5U << 3) + 6) << kOpcodeShift, |
362 | 363 |
363 LWC1 = ((6 << 3) + 1) << kOpcodeShift, | 364 LWC1 = ((6U << 3) + 1) << kOpcodeShift, |
364 BC = ((6 << 3) + 2) << kOpcodeShift, | 365 BC = ((6U << 3) + 2) << kOpcodeShift, |
365 LLD = ((6 << 3) + 4) << kOpcodeShift, | 366 LLD = ((6U << 3) + 4) << kOpcodeShift, |
366 LDC1 = ((6 << 3) + 5) << kOpcodeShift, | 367 LDC1 = ((6U << 3) + 5) << kOpcodeShift, |
367 POP66 = ((6 << 3) + 6) << kOpcodeShift, | 368 POP66 = ((6U << 3) + 6) << kOpcodeShift, |
368 LD = ((6 << 3) + 7) << kOpcodeShift, | 369 LD = ((6U << 3) + 7) << kOpcodeShift, |
369 | 370 |
370 PREF = ((6 << 3) + 3) << kOpcodeShift, | 371 PREF = ((6U << 3) + 3) << kOpcodeShift, |
371 | 372 |
372 SWC1 = ((7 << 3) + 1) << kOpcodeShift, | 373 SWC1 = ((7U << 3) + 1) << kOpcodeShift, |
373 BALC = ((7 << 3) + 2) << kOpcodeShift, | 374 BALC = ((7U << 3) + 2) << kOpcodeShift, |
374 PCREL = ((7 << 3) + 3) << kOpcodeShift, | 375 PCREL = ((7U << 3) + 3) << kOpcodeShift, |
375 SCD = ((7 << 3) + 4) << kOpcodeShift, | 376 SCD = ((7U << 3) + 4) << kOpcodeShift, |
376 SDC1 = ((7 << 3) + 5) << kOpcodeShift, | 377 SDC1 = ((7U << 3) + 5) << kOpcodeShift, |
377 POP76 = ((7 << 3) + 6) << kOpcodeShift, | 378 POP76 = ((7U << 3) + 6) << kOpcodeShift, |
378 SD = ((7 << 3) + 7) << kOpcodeShift, | 379 SD = ((7U << 3) + 7) << kOpcodeShift, |
379 | 380 |
380 COP1X = ((1 << 4) + 3) << kOpcodeShift | 381 COP1X = ((1U << 4) + 3) << kOpcodeShift, |
| 382 |
| 383 // New r6 instruction. |
| 384 POP06 = BLEZ, // bgeuc/bleuc, blezalc, bgezalc |
| 385 POP07 = BGTZ, // bltuc/bgtuc, bgtzalc, bltzalc |
| 386 POP10 = ADDI, // beqzalc, bovc, beqc |
| 387 POP26 = BLEZL, // bgezc, blezc, bgec/blec |
| 388 POP27 = BGTZL, // bgtzc, bltzc, bltc/bgtc |
| 389 POP30 = DADDI, // bnezalc, bnvc, bnec |
381 }; | 390 }; |
382 | 391 |
383 enum SecondaryField { | 392 enum SecondaryField : uint32_t { |
384 // SPECIAL Encoding of Function Field. | 393 // SPECIAL Encoding of Function Field. |
385 SLL = ((0 << 3) + 0), | 394 SLL = ((0U << 3) + 0), |
386 MOVCI = ((0 << 3) + 1), | 395 MOVCI = ((0U << 3) + 1), |
387 SRL = ((0 << 3) + 2), | 396 SRL = ((0U << 3) + 2), |
388 SRA = ((0 << 3) + 3), | 397 SRA = ((0U << 3) + 3), |
389 SLLV = ((0 << 3) + 4), | 398 SLLV = ((0U << 3) + 4), |
390 LSA = ((0 << 3) + 5), | 399 LSA = ((0U << 3) + 5), |
391 SRLV = ((0 << 3) + 6), | 400 SRLV = ((0U << 3) + 6), |
392 SRAV = ((0 << 3) + 7), | 401 SRAV = ((0U << 3) + 7), |
393 | 402 |
394 JR = ((1 << 3) + 0), | 403 JR = ((1U << 3) + 0), |
395 JALR = ((1 << 3) + 1), | 404 JALR = ((1U << 3) + 1), |
396 MOVZ = ((1 << 3) + 2), | 405 MOVZ = ((1U << 3) + 2), |
397 MOVN = ((1 << 3) + 3), | 406 MOVN = ((1U << 3) + 3), |
398 BREAK = ((1 << 3) + 5), | 407 BREAK = ((1U << 3) + 5), |
399 | 408 |
400 MFHI = ((2 << 3) + 0), | 409 MFHI = ((2U << 3) + 0), |
401 CLZ_R6 = ((2 << 3) + 0), | 410 CLZ_R6 = ((2U << 3) + 0), |
402 CLO_R6 = ((2 << 3) + 1), | 411 CLO_R6 = ((2U << 3) + 1), |
403 MFLO = ((2 << 3) + 2), | 412 MFLO = ((2U << 3) + 2), |
404 DCLZ_R6 = ((2 << 3) + 2), | 413 DCLZ_R6 = ((2U << 3) + 2), |
405 DCLO_R6 = ((2 << 3) + 3), | 414 DCLO_R6 = ((2U << 3) + 3), |
406 DSLLV = ((2 << 3) + 4), | 415 DSLLV = ((2U << 3) + 4), |
407 DLSA = ((2 << 3) + 5), | 416 DLSA = ((2U << 3) + 5), |
408 DSRLV = ((2 << 3) + 6), | 417 DSRLV = ((2U << 3) + 6), |
409 DSRAV = ((2 << 3) + 7), | 418 DSRAV = ((2U << 3) + 7), |
410 | 419 |
411 MULT = ((3 << 3) + 0), | 420 MULT = ((3U << 3) + 0), |
412 MULTU = ((3 << 3) + 1), | 421 MULTU = ((3U << 3) + 1), |
413 DIV = ((3 << 3) + 2), | 422 DIV = ((3U << 3) + 2), |
414 DIVU = ((3 << 3) + 3), | 423 DIVU = ((3U << 3) + 3), |
415 DMULT = ((3 << 3) + 4), | 424 DMULT = ((3U << 3) + 4), |
416 DMULTU = ((3 << 3) + 5), | 425 DMULTU = ((3U << 3) + 5), |
417 DDIV = ((3 << 3) + 6), | 426 DDIV = ((3U << 3) + 6), |
418 DDIVU = ((3 << 3) + 7), | 427 DDIVU = ((3U << 3) + 7), |
419 | 428 |
420 ADD = ((4 << 3) + 0), | 429 ADD = ((4U << 3) + 0), |
421 ADDU = ((4 << 3) + 1), | 430 ADDU = ((4U << 3) + 1), |
422 SUB = ((4 << 3) + 2), | 431 SUB = ((4U << 3) + 2), |
423 SUBU = ((4 << 3) + 3), | 432 SUBU = ((4U << 3) + 3), |
424 AND = ((4 << 3) + 4), | 433 AND = ((4U << 3) + 4), |
425 OR = ((4 << 3) + 5), | 434 OR = ((4U << 3) + 5), |
426 XOR = ((4 << 3) + 6), | 435 XOR = ((4U << 3) + 6), |
427 NOR = ((4 << 3) + 7), | 436 NOR = ((4U << 3) + 7), |
428 | 437 |
429 SLT = ((5 << 3) + 2), | 438 SLT = ((5U << 3) + 2), |
430 SLTU = ((5 << 3) + 3), | 439 SLTU = ((5U << 3) + 3), |
431 DADD = ((5 << 3) + 4), | 440 DADD = ((5U << 3) + 4), |
432 DADDU = ((5 << 3) + 5), | 441 DADDU = ((5U << 3) + 5), |
433 DSUB = ((5 << 3) + 6), | 442 DSUB = ((5U << 3) + 6), |
434 DSUBU = ((5 << 3) + 7), | 443 DSUBU = ((5U << 3) + 7), |
435 | 444 |
436 TGE = ((6 << 3) + 0), | 445 TGE = ((6U << 3) + 0), |
437 TGEU = ((6 << 3) + 1), | 446 TGEU = ((6U << 3) + 1), |
438 TLT = ((6 << 3) + 2), | 447 TLT = ((6U << 3) + 2), |
439 TLTU = ((6 << 3) + 3), | 448 TLTU = ((6U << 3) + 3), |
440 TEQ = ((6 << 3) + 4), | 449 TEQ = ((6U << 3) + 4), |
441 SELEQZ_S = ((6 << 3) + 5), | 450 SELEQZ_S = ((6U << 3) + 5), |
442 TNE = ((6 << 3) + 6), | 451 TNE = ((6U << 3) + 6), |
443 SELNEZ_S = ((6 << 3) + 7), | 452 SELNEZ_S = ((6U << 3) + 7), |
444 | 453 |
445 DSLL = ((7 << 3) + 0), | 454 DSLL = ((7U << 3) + 0), |
446 DSRL = ((7 << 3) + 2), | 455 DSRL = ((7U << 3) + 2), |
447 DSRA = ((7 << 3) + 3), | 456 DSRA = ((7U << 3) + 3), |
448 DSLL32 = ((7 << 3) + 4), | 457 DSLL32 = ((7U << 3) + 4), |
449 DSRL32 = ((7 << 3) + 6), | 458 DSRL32 = ((7U << 3) + 6), |
450 DSRA32 = ((7 << 3) + 7), | 459 DSRA32 = ((7U << 3) + 7), |
451 | 460 |
452 // Multiply integers in r6. | 461 // Multiply integers in r6. |
453 MUL_MUH = ((3 << 3) + 0), // MUL, MUH. | 462 MUL_MUH = ((3U << 3) + 0), // MUL, MUH. |
454 MUL_MUH_U = ((3 << 3) + 1), // MUL_U, MUH_U. | 463 MUL_MUH_U = ((3U << 3) + 1), // MUL_U, MUH_U. |
455 D_MUL_MUH = ((7 << 2) + 0), // DMUL, DMUH. | 464 D_MUL_MUH = ((7U << 2) + 0), // DMUL, DMUH. |
456 D_MUL_MUH_U = ((7 << 2) + 1), // DMUL_U, DMUH_U. | 465 D_MUL_MUH_U = ((7U << 2) + 1), // DMUL_U, DMUH_U. |
457 RINT = ((3 << 3) + 2), | 466 RINT = ((3U << 3) + 2), |
458 | 467 |
459 MUL_OP = ((0 << 3) + 2), | 468 MUL_OP = ((0U << 3) + 2), |
460 MUH_OP = ((0 << 3) + 3), | 469 MUH_OP = ((0U << 3) + 3), |
461 DIV_OP = ((0 << 3) + 2), | 470 DIV_OP = ((0U << 3) + 2), |
462 MOD_OP = ((0 << 3) + 3), | 471 MOD_OP = ((0U << 3) + 3), |
463 | 472 |
464 DIV_MOD = ((3 << 3) + 2), | 473 DIV_MOD = ((3U << 3) + 2), |
465 DIV_MOD_U = ((3 << 3) + 3), | 474 DIV_MOD_U = ((3U << 3) + 3), |
466 D_DIV_MOD = ((3 << 3) + 6), | 475 D_DIV_MOD = ((3U << 3) + 6), |
467 D_DIV_MOD_U = ((3 << 3) + 7), | 476 D_DIV_MOD_U = ((3U << 3) + 7), |
468 | 477 |
469 // drotr in special4? | 478 // drotr in special4? |
470 | 479 |
471 // SPECIAL2 Encoding of Function Field. | 480 // SPECIAL2 Encoding of Function Field. |
472 MUL = ((0 << 3) + 2), | 481 MUL = ((0U << 3) + 2), |
473 CLZ = ((4 << 3) + 0), | 482 CLZ = ((4U << 3) + 0), |
474 CLO = ((4 << 3) + 1), | 483 CLO = ((4U << 3) + 1), |
475 DCLZ = ((4 << 3) + 4), | 484 DCLZ = ((4U << 3) + 4), |
476 DCLO = ((4 << 3) + 5), | 485 DCLO = ((4U << 3) + 5), |
477 | 486 |
478 // SPECIAL3 Encoding of Function Field. | 487 // SPECIAL3 Encoding of Function Field. |
479 EXT = ((0 << 3) + 0), | 488 EXT = ((0U << 3) + 0), |
480 DEXTM = ((0 << 3) + 1), | 489 DEXTM = ((0U << 3) + 1), |
481 DEXTU = ((0 << 3) + 2), | 490 DEXTU = ((0U << 3) + 2), |
482 DEXT = ((0 << 3) + 3), | 491 DEXT = ((0U << 3) + 3), |
483 INS = ((0 << 3) + 4), | 492 INS = ((0U << 3) + 4), |
484 DINSM = ((0 << 3) + 5), | 493 DINSM = ((0U << 3) + 5), |
485 DINSU = ((0 << 3) + 6), | 494 DINSU = ((0U << 3) + 6), |
486 DINS = ((0 << 3) + 7), | 495 DINS = ((0U << 3) + 7), |
487 | 496 |
488 BSHFL = ((4 << 3) + 0), | 497 BSHFL = ((4U << 3) + 0), |
489 DBSHFL = ((4 << 3) + 4), | 498 DBSHFL = ((4U << 3) + 4), |
490 | 499 |
491 // SPECIAL3 Encoding of sa Field. | 500 // SPECIAL3 Encoding of sa Field. |
492 BITSWAP = ((0 << 3) + 0), | 501 BITSWAP = ((0U << 3) + 0), |
493 ALIGN = ((0 << 3) + 2), | 502 ALIGN = ((0U << 3) + 2), |
494 WSBH = ((0 << 3) + 2), | 503 WSBH = ((0U << 3) + 2), |
495 SEB = ((2 << 3) + 0), | 504 SEB = ((2U << 3) + 0), |
496 SEH = ((3 << 3) + 0), | 505 SEH = ((3U << 3) + 0), |
497 | 506 |
498 DBITSWAP = ((0 << 3) + 0), | 507 DBITSWAP = ((0U << 3) + 0), |
499 DALIGN = ((0 << 3) + 1), | 508 DALIGN = ((0U << 3) + 1), |
500 DBITSWAP_SA = ((0 << 3) + 0) << kSaShift, | 509 DBITSWAP_SA = ((0U << 3) + 0) << kSaShift, |
501 DSBH = ((0 << 3) + 2), | 510 DSBH = ((0U << 3) + 2), |
502 DSHD = ((0 << 3) + 5), | 511 DSHD = ((0U << 3) + 5), |
503 | 512 |
504 // REGIMM encoding of rt Field. | 513 // REGIMM encoding of rt Field. |
505 BLTZ = ((0 << 3) + 0) << 16, | 514 BLTZ = ((0U << 3) + 0) << 16, |
506 BGEZ = ((0 << 3) + 1) << 16, | 515 BGEZ = ((0U << 3) + 1) << 16, |
507 BLTZAL = ((2 << 3) + 0) << 16, | 516 BLTZAL = ((2U << 3) + 0) << 16, |
508 BGEZAL = ((2 << 3) + 1) << 16, | 517 BGEZAL = ((2U << 3) + 1) << 16, |
509 BGEZALL = ((2 << 3) + 3) << 16, | 518 BGEZALL = ((2U << 3) + 3) << 16, |
510 DAHI = ((0 << 3) + 6) << 16, | 519 DAHI = ((0U << 3) + 6) << 16, |
511 DATI = ((3 << 3) + 6) << 16, | 520 DATI = ((3U << 3) + 6) << 16, |
512 | 521 |
513 // COP1 Encoding of rs Field. | 522 // COP1 Encoding of rs Field. |
514 MFC1 = ((0 << 3) + 0) << 21, | 523 MFC1 = ((0U << 3) + 0) << 21, |
515 DMFC1 = ((0 << 3) + 1) << 21, | 524 DMFC1 = ((0U << 3) + 1) << 21, |
516 CFC1 = ((0 << 3) + 2) << 21, | 525 CFC1 = ((0U << 3) + 2) << 21, |
517 MFHC1 = ((0 << 3) + 3) << 21, | 526 MFHC1 = ((0U << 3) + 3) << 21, |
518 MTC1 = ((0 << 3) + 4) << 21, | 527 MTC1 = ((0U << 3) + 4) << 21, |
519 DMTC1 = ((0 << 3) + 5) << 21, | 528 DMTC1 = ((0U << 3) + 5) << 21, |
520 CTC1 = ((0 << 3) + 6) << 21, | 529 CTC1 = ((0U << 3) + 6) << 21, |
521 MTHC1 = ((0 << 3) + 7) << 21, | 530 MTHC1 = ((0U << 3) + 7) << 21, |
522 BC1 = ((1 << 3) + 0) << 21, | 531 BC1 = ((1U << 3) + 0) << 21, |
523 S = ((2 << 3) + 0) << 21, | 532 S = ((2U << 3) + 0) << 21, |
524 D = ((2 << 3) + 1) << 21, | 533 D = ((2U << 3) + 1) << 21, |
525 W = ((2 << 3) + 4) << 21, | 534 W = ((2U << 3) + 4) << 21, |
526 L = ((2 << 3) + 5) << 21, | 535 L = ((2U << 3) + 5) << 21, |
527 PS = ((2 << 3) + 6) << 21, | 536 PS = ((2U << 3) + 6) << 21, |
528 // COP1 Encoding of Function Field When rs=S. | 537 // COP1 Encoding of Function Field When rs=S. |
529 | 538 |
530 ADD_S = ((0 << 3) + 0), | 539 ADD_S = ((0U << 3) + 0), |
531 SUB_S = ((0 << 3) + 1), | 540 SUB_S = ((0U << 3) + 1), |
532 MUL_S = ((0 << 3) + 2), | 541 MUL_S = ((0U << 3) + 2), |
533 DIV_S = ((0 << 3) + 3), | 542 DIV_S = ((0U << 3) + 3), |
534 ABS_S = ((0 << 3) + 5), | 543 ABS_S = ((0U << 3) + 5), |
535 SQRT_S = ((0 << 3) + 4), | 544 SQRT_S = ((0U << 3) + 4), |
536 MOV_S = ((0 << 3) + 6), | 545 MOV_S = ((0U << 3) + 6), |
537 NEG_S = ((0 << 3) + 7), | 546 NEG_S = ((0U << 3) + 7), |
538 ROUND_L_S = ((1 << 3) + 0), | 547 ROUND_L_S = ((1U << 3) + 0), |
539 TRUNC_L_S = ((1 << 3) + 1), | 548 TRUNC_L_S = ((1U << 3) + 1), |
540 CEIL_L_S = ((1 << 3) + 2), | 549 CEIL_L_S = ((1U << 3) + 2), |
541 FLOOR_L_S = ((1 << 3) + 3), | 550 FLOOR_L_S = ((1U << 3) + 3), |
542 ROUND_W_S = ((1 << 3) + 4), | 551 ROUND_W_S = ((1U << 3) + 4), |
543 TRUNC_W_S = ((1 << 3) + 5), | 552 TRUNC_W_S = ((1U << 3) + 5), |
544 CEIL_W_S = ((1 << 3) + 6), | 553 CEIL_W_S = ((1U << 3) + 6), |
545 FLOOR_W_S = ((1 << 3) + 7), | 554 FLOOR_W_S = ((1U << 3) + 7), |
546 RECIP_S = ((2 << 3) + 5), | 555 RECIP_S = ((2U << 3) + 5), |
547 RSQRT_S = ((2 << 3) + 6), | 556 RSQRT_S = ((2U << 3) + 6), |
548 CLASS_S = ((3 << 3) + 3), | 557 CLASS_S = ((3U << 3) + 3), |
549 CVT_D_S = ((4 << 3) + 1), | 558 CVT_D_S = ((4U << 3) + 1), |
550 CVT_W_S = ((4 << 3) + 4), | 559 CVT_W_S = ((4U << 3) + 4), |
551 CVT_L_S = ((4 << 3) + 5), | 560 CVT_L_S = ((4U << 3) + 5), |
552 CVT_PS_S = ((4 << 3) + 6), | 561 CVT_PS_S = ((4U << 3) + 6), |
553 // COP1 Encoding of Function Field When rs=D. | 562 // COP1 Encoding of Function Field When rs=D. |
554 ADD_D = ((0 << 3) + 0), | 563 ADD_D = ((0U << 3) + 0), |
555 SUB_D = ((0 << 3) + 1), | 564 SUB_D = ((0U << 3) + 1), |
556 MUL_D = ((0 << 3) + 2), | 565 MUL_D = ((0U << 3) + 2), |
557 DIV_D = ((0 << 3) + 3), | 566 DIV_D = ((0U << 3) + 3), |
558 SQRT_D = ((0 << 3) + 4), | 567 SQRT_D = ((0U << 3) + 4), |
559 ABS_D = ((0 << 3) + 5), | 568 ABS_D = ((0U << 3) + 5), |
560 MOV_D = ((0 << 3) + 6), | 569 MOV_D = ((0U << 3) + 6), |
561 NEG_D = ((0 << 3) + 7), | 570 NEG_D = ((0U << 3) + 7), |
562 ROUND_L_D = ((1 << 3) + 0), | 571 ROUND_L_D = ((1U << 3) + 0), |
563 TRUNC_L_D = ((1 << 3) + 1), | 572 TRUNC_L_D = ((1U << 3) + 1), |
564 CEIL_L_D = ((1 << 3) + 2), | 573 CEIL_L_D = ((1U << 3) + 2), |
565 FLOOR_L_D = ((1 << 3) + 3), | 574 FLOOR_L_D = ((1U << 3) + 3), |
566 ROUND_W_D = ((1 << 3) + 4), | 575 ROUND_W_D = ((1U << 3) + 4), |
567 TRUNC_W_D = ((1 << 3) + 5), | 576 TRUNC_W_D = ((1U << 3) + 5), |
568 CEIL_W_D = ((1 << 3) + 6), | 577 CEIL_W_D = ((1U << 3) + 6), |
569 FLOOR_W_D = ((1 << 3) + 7), | 578 FLOOR_W_D = ((1U << 3) + 7), |
570 RECIP_D = ((2 << 3) + 5), | 579 RECIP_D = ((2U << 3) + 5), |
571 RSQRT_D = ((2 << 3) + 6), | 580 RSQRT_D = ((2U << 3) + 6), |
572 CLASS_D = ((3 << 3) + 3), | 581 CLASS_D = ((3U << 3) + 3), |
573 MIN = ((3 << 3) + 4), | 582 MIN = ((3U << 3) + 4), |
574 MINA = ((3 << 3) + 5), | 583 MINA = ((3U << 3) + 5), |
575 MAX = ((3 << 3) + 6), | 584 MAX = ((3U << 3) + 6), |
576 MAXA = ((3 << 3) + 7), | 585 MAXA = ((3U << 3) + 7), |
577 CVT_S_D = ((4 << 3) + 0), | 586 CVT_S_D = ((4U << 3) + 0), |
578 CVT_W_D = ((4 << 3) + 4), | 587 CVT_W_D = ((4U << 3) + 4), |
579 CVT_L_D = ((4 << 3) + 5), | 588 CVT_L_D = ((4U << 3) + 5), |
580 C_F_D = ((6 << 3) + 0), | 589 C_F_D = ((6U << 3) + 0), |
581 C_UN_D = ((6 << 3) + 1), | 590 C_UN_D = ((6U << 3) + 1), |
582 C_EQ_D = ((6 << 3) + 2), | 591 C_EQ_D = ((6U << 3) + 2), |
583 C_UEQ_D = ((6 << 3) + 3), | 592 C_UEQ_D = ((6U << 3) + 3), |
584 C_OLT_D = ((6 << 3) + 4), | 593 C_OLT_D = ((6U << 3) + 4), |
585 C_ULT_D = ((6 << 3) + 5), | 594 C_ULT_D = ((6U << 3) + 5), |
586 C_OLE_D = ((6 << 3) + 6), | 595 C_OLE_D = ((6U << 3) + 6), |
587 C_ULE_D = ((6 << 3) + 7), | 596 C_ULE_D = ((6U << 3) + 7), |
588 | 597 |
589 // COP1 Encoding of Function Field When rs=W or L. | 598 // COP1 Encoding of Function Field When rs=W or L. |
590 CVT_S_W = ((4 << 3) + 0), | 599 CVT_S_W = ((4U << 3) + 0), |
591 CVT_D_W = ((4 << 3) + 1), | 600 CVT_D_W = ((4U << 3) + 1), |
592 CVT_S_L = ((4 << 3) + 0), | 601 CVT_S_L = ((4U << 3) + 0), |
593 CVT_D_L = ((4 << 3) + 1), | 602 CVT_D_L = ((4U << 3) + 1), |
594 BC1EQZ = ((2 << 2) + 1) << 21, | 603 BC1EQZ = ((2U << 2) + 1) << 21, |
595 BC1NEZ = ((3 << 2) + 1) << 21, | 604 BC1NEZ = ((3U << 2) + 1) << 21, |
596 // COP1 CMP positive predicates Bit 5..4 = 00. | 605 // COP1 CMP positive predicates Bit 5..4 = 00. |
597 CMP_AF = ((0 << 3) + 0), | 606 CMP_AF = ((0U << 3) + 0), |
598 CMP_UN = ((0 << 3) + 1), | 607 CMP_UN = ((0U << 3) + 1), |
599 CMP_EQ = ((0 << 3) + 2), | 608 CMP_EQ = ((0U << 3) + 2), |
600 CMP_UEQ = ((0 << 3) + 3), | 609 CMP_UEQ = ((0U << 3) + 3), |
601 CMP_LT = ((0 << 3) + 4), | 610 CMP_LT = ((0U << 3) + 4), |
602 CMP_ULT = ((0 << 3) + 5), | 611 CMP_ULT = ((0U << 3) + 5), |
603 CMP_LE = ((0 << 3) + 6), | 612 CMP_LE = ((0U << 3) + 6), |
604 CMP_ULE = ((0 << 3) + 7), | 613 CMP_ULE = ((0U << 3) + 7), |
605 CMP_SAF = ((1 << 3) + 0), | 614 CMP_SAF = ((1U << 3) + 0), |
606 CMP_SUN = ((1 << 3) + 1), | 615 CMP_SUN = ((1U << 3) + 1), |
607 CMP_SEQ = ((1 << 3) + 2), | 616 CMP_SEQ = ((1U << 3) + 2), |
608 CMP_SUEQ = ((1 << 3) + 3), | 617 CMP_SUEQ = ((1U << 3) + 3), |
609 CMP_SSLT = ((1 << 3) + 4), | 618 CMP_SSLT = ((1U << 3) + 4), |
610 CMP_SSULT = ((1 << 3) + 5), | 619 CMP_SSULT = ((1U << 3) + 5), |
611 CMP_SLE = ((1 << 3) + 6), | 620 CMP_SLE = ((1U << 3) + 6), |
612 CMP_SULE = ((1 << 3) + 7), | 621 CMP_SULE = ((1U << 3) + 7), |
613 // COP1 CMP negative predicates Bit 5..4 = 01. | 622 // COP1 CMP negative predicates Bit 5..4 = 01. |
614 CMP_AT = ((2 << 3) + 0), // Reserved, not implemented. | 623 CMP_AT = ((2U << 3) + 0), // Reserved, not implemented. |
615 CMP_OR = ((2 << 3) + 1), | 624 CMP_OR = ((2U << 3) + 1), |
616 CMP_UNE = ((2 << 3) + 2), | 625 CMP_UNE = ((2U << 3) + 2), |
617 CMP_NE = ((2 << 3) + 3), | 626 CMP_NE = ((2U << 3) + 3), |
618 CMP_UGE = ((2 << 3) + 4), // Reserved, not implemented. | 627 CMP_UGE = ((2U << 3) + 4), // Reserved, not implemented. |
619 CMP_OGE = ((2 << 3) + 5), // Reserved, not implemented. | 628 CMP_OGE = ((2U << 3) + 5), // Reserved, not implemented. |
620 CMP_UGT = ((2 << 3) + 6), // Reserved, not implemented. | 629 CMP_UGT = ((2U << 3) + 6), // Reserved, not implemented. |
621 CMP_OGT = ((2 << 3) + 7), // Reserved, not implemented. | 630 CMP_OGT = ((2U << 3) + 7), // Reserved, not implemented. |
622 CMP_SAT = ((3 << 3) + 0), // Reserved, not implemented. | 631 CMP_SAT = ((3U << 3) + 0), // Reserved, not implemented. |
623 CMP_SOR = ((3 << 3) + 1), | 632 CMP_SOR = ((3U << 3) + 1), |
624 CMP_SUNE = ((3 << 3) + 2), | 633 CMP_SUNE = ((3U << 3) + 2), |
625 CMP_SNE = ((3 << 3) + 3), | 634 CMP_SNE = ((3U << 3) + 3), |
626 CMP_SUGE = ((3 << 3) + 4), // Reserved, not implemented. | 635 CMP_SUGE = ((3U << 3) + 4), // Reserved, not implemented. |
627 CMP_SOGE = ((3 << 3) + 5), // Reserved, not implemented. | 636 CMP_SOGE = ((3U << 3) + 5), // Reserved, not implemented. |
628 CMP_SUGT = ((3 << 3) + 6), // Reserved, not implemented. | 637 CMP_SUGT = ((3U << 3) + 6), // Reserved, not implemented. |
629 CMP_SOGT = ((3 << 3) + 7), // Reserved, not implemented. | 638 CMP_SOGT = ((3U << 3) + 7), // Reserved, not implemented. |
630 | 639 |
631 SEL = ((2 << 3) + 0), | 640 SEL = ((2U << 3) + 0), |
632 MOVF = ((2 << 3) + 1), // Function field for MOVT.fmt and MOVF.fmt | 641 MOVF = ((2U << 3) + 1), // Function field for MOVT.fmt and MOVF.fmt |
633 MOVZ_C = ((2 << 3) + 2), // COP1 on FPR registers. | 642 MOVZ_C = ((2U << 3) + 2), // COP1 on FPR registers. |
634 MOVN_C = ((2 << 3) + 3), // COP1 on FPR registers. | 643 MOVN_C = ((2U << 3) + 3), // COP1 on FPR registers. |
635 SELEQZ_C = ((2 << 3) + 4), // COP1 on FPR registers. | 644 SELEQZ_C = ((2U << 3) + 4), // COP1 on FPR registers. |
636 SELNEZ_C = ((2 << 3) + 7), // COP1 on FPR registers. | 645 SELNEZ_C = ((2U << 3) + 7), // COP1 on FPR registers. |
637 | 646 |
638 // COP1 Encoding of Function Field When rs=PS. | 647 // COP1 Encoding of Function Field When rs=PS. |
639 // COP1X Encoding of Function Field. | 648 // COP1X Encoding of Function Field. |
640 MADD_D = ((4 << 3) + 1), | 649 MADD_D = ((4U << 3) + 1), |
641 | 650 |
642 // PCREL Encoding of rt Field. | 651 // PCREL Encoding of rt Field. |
643 ADDIUPC = ((0 << 2) + 0), | 652 ADDIUPC = ((0U << 2) + 0), |
644 LWPC = ((0 << 2) + 1), | 653 LWPC = ((0U << 2) + 1), |
645 LWUPC = ((0 << 2) + 2), | 654 LWUPC = ((0U << 2) + 2), |
646 LDPC = ((0 << 3) + 6), | 655 LDPC = ((0U << 3) + 6), |
647 // reserved ((1 << 3) + 6), | 656 // reserved ((1U << 3) + 6), |
648 AUIPC = ((3 << 3) + 6), | 657 AUIPC = ((3U << 3) + 6), |
649 ALUIPC = ((3 << 3) + 7), | 658 ALUIPC = ((3U << 3) + 7), |
650 | 659 |
651 // POP66 Encoding of rs Field. | 660 // POP66 Encoding of rs Field. |
652 JIC = ((0 << 5) + 0), | 661 JIC = ((0U << 5) + 0), |
653 | 662 |
654 // POP76 Encoding of rs Field. | 663 // POP76 Encoding of rs Field. |
655 JIALC = ((0 << 5) + 0), | 664 JIALC = ((0U << 5) + 0), |
656 | 665 |
657 NULLSF = 0 | 666 NULLSF = 0U |
658 }; | 667 }; |
659 | 668 |
660 | 669 |
661 // ----- Emulated conditions. | 670 // ----- Emulated conditions. |
662 // On MIPS we use this enum to abstract from conditional branch instructions. | 671 // On MIPS we use this enum to abstract from conditional branch instructions. |
663 // The 'U' prefix is used to specify unsigned comparisons. | 672 // The 'U' prefix is used to specify unsigned comparisons. |
664 // Opposite conditions must be paired as odd/even numbers | 673 // Opposite conditions must be paired as odd/even numbers |
665 // because 'NegateCondition' function flips LSB to negate condition. | 674 // because 'NegateCondition' function flips LSB to negate condition. |
666 enum Condition { | 675 enum Condition { |
667 // Any value < 0 is considered no_condition. | 676 // Any value < 0 is considered no_condition. |
(...skipping 202 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
870 extern const Instr kRtMask; | 879 extern const Instr kRtMask; |
871 extern const Instr kLwSwInstrTypeMask; | 880 extern const Instr kLwSwInstrTypeMask; |
872 extern const Instr kLwSwInstrArgumentMask; | 881 extern const Instr kLwSwInstrArgumentMask; |
873 extern const Instr kLwSwOffsetMask; | 882 extern const Instr kLwSwOffsetMask; |
874 | 883 |
875 // Break 0xfffff, reserved for redirected real time call. | 884 // Break 0xfffff, reserved for redirected real time call. |
876 const Instr rtCallRedirInstr = SPECIAL | BREAK | call_rt_redirected << 6; | 885 const Instr rtCallRedirInstr = SPECIAL | BREAK | call_rt_redirected << 6; |
877 // A nop instruction. (Encoding of sll 0 0 0). | 886 // A nop instruction. (Encoding of sll 0 0 0). |
878 const Instr nopInstr = 0; | 887 const Instr nopInstr = 0; |
879 | 888 |
| 889 static constexpr uint64_t OpcodeToBitNumber(Opcode opcode) { |
| 890 return 1ULL << (static_cast<uint32_t>(opcode) >> kOpcodeShift); |
| 891 } |
| 892 |
| 893 |
880 class Instruction { | 894 class Instruction { |
881 public: | 895 public: |
882 enum { | 896 enum { |
883 kInstrSize = 4, | 897 kInstrSize = 4, |
884 kInstrSizeLog2 = 2, | 898 kInstrSizeLog2 = 2, |
885 // On MIPS PC cannot actually be directly accessed. We behave as if PC was | 899 // On MIPS PC cannot actually be directly accessed. We behave as if PC was |
886 // always the value of the current instruction being executed. | 900 // always the value of the current instruction being executed. |
887 kPCReadOffset = 0 | 901 kPCReadOffset = 0 |
888 }; | 902 }; |
889 | 903 |
890 // Get the raw instruction bits. | 904 // Get the raw instruction bits. |
891 inline Instr InstructionBits() const { | 905 inline Instr InstructionBits() const { |
892 return *reinterpret_cast<const Instr*>(this); | 906 return *reinterpret_cast<const Instr*>(this); |
893 } | 907 } |
894 | 908 |
895 // Set the raw instruction bits to value. | 909 // Set the raw instruction bits to value. |
896 inline void SetInstructionBits(Instr value) { | 910 inline void SetInstructionBits(Instr value) { |
897 *reinterpret_cast<Instr*>(this) = value; | 911 *reinterpret_cast<Instr*>(this) = value; |
898 } | 912 } |
899 | 913 |
900 // Read one particular bit out of the instruction bits. | 914 // Read one particular bit out of the instruction bits. |
901 inline int Bit(int nr) const { | 915 inline int Bit(int nr) const { |
902 return (InstructionBits() >> nr) & 1; | 916 return (InstructionBits() >> nr) & 1; |
903 } | 917 } |
904 | 918 |
905 // Read a bit field out of the instruction bits. | 919 // Read a bit field out of the instruction bits. |
906 inline int Bits(int hi, int lo) const { | 920 inline int Bits(int hi, int lo) const { |
907 return (InstructionBits() >> lo) & ((2 << (hi - lo)) - 1); | 921 return (InstructionBits() >> lo) & ((2U << (hi - lo)) - 1); |
908 } | 922 } |
909 | 923 |
910 // Instruction type. | 924 // Instruction type. |
911 enum Type { | 925 enum Type { |
912 kRegisterType, | 926 kRegisterType, |
913 kImmediateType, | 927 kImmediateType, |
914 kJumpType, | 928 kJumpType, |
915 kUnsupported = -1 | 929 kUnsupported = -1 |
916 }; | 930 }; |
917 | 931 |
918 enum TypeChecks { NORMAL, EXTRA }; | 932 enum TypeChecks { NORMAL, EXTRA }; |
919 | 933 |
920 | 934 |
921 #define OpcodeToBitNumber(opcode) \ | 935 static constexpr uint64_t kOpcodeImmediateTypeMask = |
922 (1ULL << (static_cast<uint32_t>(opcode) >> kOpcodeShift)) | |
923 | |
924 static const uint64_t kOpcodeImmediateTypeMask = | |
925 OpcodeToBitNumber(REGIMM) | OpcodeToBitNumber(BEQ) | | 936 OpcodeToBitNumber(REGIMM) | OpcodeToBitNumber(BEQ) | |
926 OpcodeToBitNumber(BNE) | OpcodeToBitNumber(BLEZ) | | 937 OpcodeToBitNumber(BNE) | OpcodeToBitNumber(BLEZ) | |
927 OpcodeToBitNumber(BGTZ) | OpcodeToBitNumber(ADDI) | | 938 OpcodeToBitNumber(BGTZ) | OpcodeToBitNumber(ADDI) | |
928 OpcodeToBitNumber(DADDI) | OpcodeToBitNumber(ADDIU) | | 939 OpcodeToBitNumber(DADDI) | OpcodeToBitNumber(ADDIU) | |
929 OpcodeToBitNumber(DADDIU) | OpcodeToBitNumber(SLTI) | | 940 OpcodeToBitNumber(DADDIU) | OpcodeToBitNumber(SLTI) | |
930 OpcodeToBitNumber(SLTIU) | OpcodeToBitNumber(ANDI) | | 941 OpcodeToBitNumber(SLTIU) | OpcodeToBitNumber(ANDI) | |
931 OpcodeToBitNumber(ORI) | OpcodeToBitNumber(XORI) | | 942 OpcodeToBitNumber(ORI) | OpcodeToBitNumber(XORI) | |
932 OpcodeToBitNumber(LUI) | OpcodeToBitNumber(BEQL) | | 943 OpcodeToBitNumber(LUI) | OpcodeToBitNumber(BEQL) | |
933 OpcodeToBitNumber(BNEL) | OpcodeToBitNumber(BLEZL) | | 944 OpcodeToBitNumber(BNEL) | OpcodeToBitNumber(BLEZL) | |
934 OpcodeToBitNumber(BGTZL) | OpcodeToBitNumber(POP66) | | 945 OpcodeToBitNumber(BGTZL) | OpcodeToBitNumber(POP66) | |
(...skipping 169 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1104 return FunctionValue(); | 1115 return FunctionValue(); |
1105 case COP1: | 1116 case COP1: |
1106 return RsValue(); | 1117 return RsValue(); |
1107 case REGIMM: | 1118 case REGIMM: |
1108 return RtValue(); | 1119 return RtValue(); |
1109 default: | 1120 default: |
1110 return NULLSF; | 1121 return NULLSF; |
1111 } | 1122 } |
1112 } | 1123 } |
1113 | 1124 |
| 1125 inline int32_t ImmValue(int bits) const { |
| 1126 DCHECK(InstructionType() == kImmediateType); |
| 1127 return Bits(bits - 1, 0); |
| 1128 } |
| 1129 |
1114 inline int32_t Imm16Value() const { | 1130 inline int32_t Imm16Value() const { |
1115 DCHECK(InstructionType() == kImmediateType); | 1131 DCHECK(InstructionType() == kImmediateType); |
1116 return Bits(kImm16Shift + kImm16Bits - 1, kImm16Shift); | 1132 return Bits(kImm16Shift + kImm16Bits - 1, kImm16Shift); |
1117 } | 1133 } |
1118 | 1134 |
1119 inline int32_t Imm18Value() const { | 1135 inline int32_t Imm18Value() const { |
1120 DCHECK(InstructionType() == kImmediateType); | 1136 DCHECK(InstructionType() == kImmediateType); |
1121 return Bits(kImm18Shift + kImm18Bits - 1, kImm18Shift); | 1137 return Bits(kImm18Shift + kImm18Bits - 1, kImm18Shift); |
1122 } | 1138 } |
1123 | 1139 |
1124 inline int32_t Imm19Value() const { | 1140 inline int32_t Imm19Value() const { |
1125 DCHECK(InstructionType() == kImmediateType); | 1141 DCHECK(InstructionType() == kImmediateType); |
1126 return Bits(kImm19Shift + kImm19Bits - 1, kImm19Shift); | 1142 return Bits(kImm19Shift + kImm19Bits - 1, kImm19Shift); |
1127 } | 1143 } |
1128 | 1144 |
1129 inline int32_t Imm21Value() const { | 1145 inline int32_t Imm21Value() const { |
1130 DCHECK(InstructionType() == kImmediateType); | 1146 DCHECK(InstructionType() == kImmediateType); |
1131 return Bits(kImm21Shift + kImm21Bits - 1, kImm21Shift); | 1147 return Bits(kImm21Shift + kImm21Bits - 1, kImm21Shift); |
1132 } | 1148 } |
1133 | 1149 |
1134 inline int32_t Imm26Value() const { | 1150 inline int32_t Imm26Value() const { |
1135 DCHECK((InstructionType() == kJumpType) || | 1151 DCHECK((InstructionType() == kJumpType) || |
1136 (InstructionType() == kImmediateType)); | 1152 (InstructionType() == kImmediateType)); |
1137 return Bits(kImm26Shift + kImm26Bits - 1, kImm26Shift); | 1153 return Bits(kImm26Shift + kImm26Bits - 1, kImm26Shift); |
1138 } | 1154 } |
1139 | 1155 |
1140 // Say if the instruction should not be used in a branch delay slot. | 1156 static bool IsForbiddenAfterBranchInstr(Instr instr); |
1141 bool IsForbiddenInBranchDelay() const; | 1157 |
| 1158 // Say if the instruction should not be used in a branch delay slot or |
| 1159 // immediately after a compact branch. |
| 1160 inline bool IsForbiddenAfterBranch() const { |
| 1161 return IsForbiddenAfterBranchInstr(InstructionBits()); |
| 1162 } |
| 1163 |
1142 // Say if the instruction 'links'. e.g. jal, bal. | 1164 // Say if the instruction 'links'. e.g. jal, bal. |
1143 bool IsLinkingInstruction() const; | 1165 bool IsLinkingInstruction() const; |
1144 // Say if the instruction is a break or a trap. | 1166 // Say if the instruction is a break or a trap. |
1145 bool IsTrap() const; | 1167 bool IsTrap() const; |
1146 | 1168 |
1147 // Instructions are read of out a code stream. The only way to get a | 1169 // Instructions are read of out a code stream. The only way to get a |
1148 // reference to an instruction is to convert a pointer. There is no way | 1170 // reference to an instruction is to convert a pointer. There is no way |
1149 // to allocate or create instances of class Instruction. | 1171 // to allocate or create instances of class Instruction. |
1150 // Use the At(pc) function to create references to Instruction. | 1172 // Use the At(pc) function to create references to Instruction. |
1151 static Instruction* At(byte* pc) { | 1173 static Instruction* At(byte* pc) { |
(...skipping 122 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1274 } | 1296 } |
1275 return kUnsupported; | 1297 return kUnsupported; |
1276 } | 1298 } |
1277 | 1299 |
1278 #undef OpcodeToBitNumber | 1300 #undef OpcodeToBitNumber |
1279 #undef FunctionFieldToBitNumber | 1301 #undef FunctionFieldToBitNumber |
1280 } // namespace internal | 1302 } // namespace internal |
1281 } // namespace v8 | 1303 } // namespace v8 |
1282 | 1304 |
1283 #endif // #ifndef V8_MIPS_CONSTANTS_H_ | 1305 #endif // #ifndef V8_MIPS_CONSTANTS_H_ |
OLD | NEW |