1257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch// Copyright 2011 the V8 project authors. All rights reserved.
23100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu// Redistribution and use in source and binary forms, with or without
33100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu// modification, are permitted provided that the following conditions are
43100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu// met:
53100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu//
63100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu//     * Redistributions of source code must retain the above copyright
73100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu//       notice, this list of conditions and the following disclaimer.
83100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu//     * Redistributions in binary form must reproduce the above
93100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu//       copyright notice, this list of conditions and the following
103100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu//       disclaimer in the documentation and/or other materials provided
113100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu//       with the distribution.
123100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu//     * Neither the name of Google Inc. nor the names of its
133100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu//       contributors may be used to endorse or promote products derived
143100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu//       from this software without specific prior written permission.
153100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu//
163100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
173100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
183100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
193100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
203100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
213100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
223100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
233100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
243100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
253100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
263100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
273100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu
283100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu#include "v8.h"
29f7060e27768c550ace7ec48ad8c093466db52dfaLeon Clarke
30f7060e27768c550ace7ec48ad8c093466db52dfaLeon Clarke#if defined(V8_TARGET_ARCH_MIPS)
31f7060e27768c550ace7ec48ad8c093466db52dfaLeon Clarke
323100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu#include "constants-mips.h"
333100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu
3444f0eee88ff00398ff7f715fab053374d808c90dSteve Blocknamespace v8 {
3544f0eee88ff00398ff7f715fab053374d808c90dSteve Blocknamespace internal {
363100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu
373100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu
383100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu// -----------------------------------------------------------------------------
39257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch// Registers.
403100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu
413100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu
423100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu// These register names are defined in a way to match the native disassembler
433100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu// formatting. See for example the command "objdump -d <binary file>".
443100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescuconst char* Registers::names_[kNumSimuRegisters] = {
453100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu  "zero_reg",
463100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu  "at",
473100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu  "v0", "v1",
483100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu  "a0", "a1", "a2", "a3",
493100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu  "t0", "t1", "t2", "t3", "t4", "t5", "t6", "t7",
503100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu  "s0", "s1", "s2", "s3", "s4", "s5", "s6", "s7",
513100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu  "t8", "t9",
523100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu  "k0", "k1",
533100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu  "gp",
543100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu  "sp",
553100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu  "fp",
563100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu  "ra",
573100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu  "LO", "HI",
583100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu  "pc"
593100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu};
603100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu
613100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu// List of alias names which can be used when referring to MIPS registers.
623100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescuconst Registers::RegisterAlias Registers::aliases_[] = {
633100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu  {0, "zero"},
643100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu  {23, "cp"},
653100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu  {30, "s8"},
663100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu  {30, "s8_fp"},
673100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu  {kInvalidRegister, NULL}
683100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu};
693100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu
703100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescuconst char* Registers::Name(int reg) {
713100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu  const char* result;
723100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu  if ((0 <= reg) && (reg < kNumSimuRegisters)) {
733100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu    result = names_[reg];
743100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu  } else {
753100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu    result = "noreg";
763100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu  }
773100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu  return result;
783100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu}
793100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu
803100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu
813100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescuint Registers::Number(const char* name) {
823100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu  // Look through the canonical names.
833100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu  for (int i = 0; i < kNumSimuRegisters; i++) {
843100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu    if (strcmp(names_[i], name) == 0) {
853100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu      return i;
863100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu    }
873100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu  }
883100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu
893100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu  // Look through the alias names.
903100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu  int i = 0;
913100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu  while (aliases_[i].reg != kInvalidRegister) {
923100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu    if (strcmp(aliases_[i].name, name) == 0) {
933100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu      return aliases_[i].reg;
943100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu    }
953100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu    i++;
963100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu  }
973100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu
983100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu  // No register with the reguested name found.
993100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu  return kInvalidRegister;
1003100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu}
1013100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu
1023100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu
10344f0eee88ff00398ff7f715fab053374d808c90dSteve Blockconst char* FPURegisters::names_[kNumFPURegisters] = {
1043100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu  "f0", "f1", "f2", "f3", "f4", "f5", "f6", "f7", "f8", "f9", "f10", "f11",
1053100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu  "f12", "f13", "f14", "f15", "f16", "f17", "f18", "f19", "f20", "f21",
1063100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu  "f22", "f23", "f24", "f25", "f26", "f27", "f28", "f29", "f30", "f31"
1073100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu};
1083100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu
1093100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu// List of alias names which can be used when referring to MIPS registers.
11044f0eee88ff00398ff7f715fab053374d808c90dSteve Blockconst FPURegisters::RegisterAlias FPURegisters::aliases_[] = {
1113100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu  {kInvalidRegister, NULL}
1123100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu};
1133100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu
11444f0eee88ff00398ff7f715fab053374d808c90dSteve Blockconst char* FPURegisters::Name(int creg) {
1153100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu  const char* result;
11644f0eee88ff00398ff7f715fab053374d808c90dSteve Block  if ((0 <= creg) && (creg < kNumFPURegisters)) {
1173100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu    result = names_[creg];
1183100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu  } else {
1193100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu    result = "nocreg";
1203100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu  }
1213100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu  return result;
1223100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu}
1233100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu
1243100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu
12544f0eee88ff00398ff7f715fab053374d808c90dSteve Blockint FPURegisters::Number(const char* name) {
1263100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu  // Look through the canonical names.
12744f0eee88ff00398ff7f715fab053374d808c90dSteve Block  for (int i = 0; i < kNumFPURegisters; i++) {
1283100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu    if (strcmp(names_[i], name) == 0) {
1293100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu      return i;
1303100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu    }
1313100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu  }
1323100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu
1333100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu  // Look through the alias names.
1343100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu  int i = 0;
1353100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu  while (aliases_[i].creg != kInvalidRegister) {
1363100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu    if (strcmp(aliases_[i].name, name) == 0) {
1373100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu      return aliases_[i].creg;
1383100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu    }
1393100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu    i++;
1403100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu  }
1413100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu
1423100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu  // No Cregister with the reguested name found.
1433100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu  return kInvalidFPURegister;
1443100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu}
1453100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu
1463100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu
1473100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu// -----------------------------------------------------------------------------
148257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch// Instructions.
1493100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu
15044f0eee88ff00398ff7f715fab053374d808c90dSteve Blockbool Instruction::IsForbiddenInBranchDelay() const {
15144f0eee88ff00398ff7f715fab053374d808c90dSteve Block  const int op = OpcodeFieldRaw();
1523100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu  switch (op) {
1533100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu    case J:
1543100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu    case JAL:
1553100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu    case BEQ:
1563100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu    case BNE:
1573100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu    case BLEZ:
1583100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu    case BGTZ:
1593100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu    case BEQL:
1603100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu    case BNEL:
1613100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu    case BLEZL:
1623100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu    case BGTZL:
1633100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu      return true;
1643100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu    case REGIMM:
1653100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu      switch (RtFieldRaw()) {
1663100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu        case BLTZ:
1673100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu        case BGEZ:
1683100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu        case BLTZAL:
1693100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu        case BGEZAL:
1703100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu          return true;
1713100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu        default:
1723100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu          return false;
1733100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu      };
1743100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu      break;
1753100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu    case SPECIAL:
1763100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu      switch (FunctionFieldRaw()) {
1773100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu        case JR:
1783100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu        case JALR:
1793100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu          return true;
1803100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu        default:
1813100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu          return false;
1823100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu      };
1833100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu      break;
1843100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu    default:
1853100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu      return false;
1863100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu  };
1873100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu}
1883100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu
1893100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu
19044f0eee88ff00398ff7f715fab053374d808c90dSteve Blockbool Instruction::IsLinkingInstruction() const {
19144f0eee88ff00398ff7f715fab053374d808c90dSteve Block  const int op = OpcodeFieldRaw();
1923100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu  switch (op) {
1933100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu    case JAL:
194589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch      return true;
19544f0eee88ff00398ff7f715fab053374d808c90dSteve Block    case REGIMM:
19644f0eee88ff00398ff7f715fab053374d808c90dSteve Block      switch (RtFieldRaw()) {
19744f0eee88ff00398ff7f715fab053374d808c90dSteve Block        case BGEZAL:
19844f0eee88ff00398ff7f715fab053374d808c90dSteve Block        case BLTZAL:
19944f0eee88ff00398ff7f715fab053374d808c90dSteve Block          return true;
20044f0eee88ff00398ff7f715fab053374d808c90dSteve Block      default:
20144f0eee88ff00398ff7f715fab053374d808c90dSteve Block        return false;
20244f0eee88ff00398ff7f715fab053374d808c90dSteve Block      };
2033100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu    case SPECIAL:
2043100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu      switch (FunctionFieldRaw()) {
2053100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu        case JALR:
2063100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu          return true;
2073100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu        default:
2083100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu          return false;
2093100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu      };
2103100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu    default:
2113100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu      return false;
2123100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu  };
2133100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu}
2143100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu
2153100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu
21644f0eee88ff00398ff7f715fab053374d808c90dSteve Blockbool Instruction::IsTrap() const {
2173100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu  if (OpcodeFieldRaw() != SPECIAL) {
2183100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu    return false;
2193100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu  } else {
2203100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu    switch (FunctionFieldRaw()) {
2213100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu      case BREAK:
2223100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu      case TGE:
2233100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu      case TGEU:
2243100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu      case TLT:
2253100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu      case TLTU:
2263100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu      case TEQ:
2273100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu      case TNE:
2283100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu        return true;
2293100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu      default:
2303100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu        return false;
2313100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu    };
2323100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu  }
2333100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu}
2343100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu
2353100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu
2363100271588b61cbc1dc472a3f2f105d2eed8497fAndrei PopescuInstruction::Type Instruction::InstructionType() const {
2373100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu  switch (OpcodeFieldRaw()) {
2383100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu    case SPECIAL:
2393100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu      switch (FunctionFieldRaw()) {
2403100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu        case JR:
2413100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu        case JALR:
2423100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu        case BREAK:
2433100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu        case SLL:
2443100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu        case SRL:
2453100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu        case SRA:
2463100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu        case SLLV:
2473100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu        case SRLV:
2483100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu        case SRAV:
2493100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu        case MFHI:
2503100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu        case MFLO:
2513100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu        case MULT:
2523100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu        case MULTU:
2533100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu        case DIV:
2543100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu        case DIVU:
2553100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu        case ADD:
2563100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu        case ADDU:
2573100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu        case SUB:
2583100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu        case SUBU:
2593100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu        case AND:
2603100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu        case OR:
2613100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu        case XOR:
2623100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu        case NOR:
2633100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu        case SLT:
2643100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu        case SLTU:
2653100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu        case TGE:
2663100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu        case TGEU:
2673100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu        case TLT:
2683100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu        case TLTU:
2693100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu        case TEQ:
2703100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu        case TNE:
27144f0eee88ff00398ff7f715fab053374d808c90dSteve Block        case MOVZ:
27244f0eee88ff00398ff7f715fab053374d808c90dSteve Block        case MOVN:
27344f0eee88ff00398ff7f715fab053374d808c90dSteve Block        case MOVCI:
2743100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu          return kRegisterType;
2753100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu        default:
276589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch          return kUnsupported;
2773100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu      };
2783100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu      break;
2793100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu    case SPECIAL2:
2803100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu      switch (FunctionFieldRaw()) {
2813100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu        case MUL:
28244f0eee88ff00398ff7f715fab053374d808c90dSteve Block        case CLZ:
2833100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu          return kRegisterType;
2843100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu        default:
285589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch          return kUnsupported;
2863100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu      };
2873100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu      break;
28844f0eee88ff00398ff7f715fab053374d808c90dSteve Block    case SPECIAL3:
2893100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu      switch (FunctionFieldRaw()) {
29044f0eee88ff00398ff7f715fab053374d808c90dSteve Block        case INS:
29144f0eee88ff00398ff7f715fab053374d808c90dSteve Block        case EXT:
29244f0eee88ff00398ff7f715fab053374d808c90dSteve Block          return kRegisterType;
29344f0eee88ff00398ff7f715fab053374d808c90dSteve Block        default:
294589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch          return kUnsupported;
29544f0eee88ff00398ff7f715fab053374d808c90dSteve Block      };
29644f0eee88ff00398ff7f715fab053374d808c90dSteve Block      break;
297257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch    case COP1:    // Coprocessor instructions.
29844f0eee88ff00398ff7f715fab053374d808c90dSteve Block      switch (RsFieldRawNoAssert()) {
299257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch        case BC1:   // Branch on coprocessor condition.
3003100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu          return kImmediateType;
3013100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu        default:
3023100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu          return kRegisterType;
3033100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu      };
3043100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu      break;
3053ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    // 16 bits Immediate type instructions. e.g.: addi dest, src, imm16.
3063100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu    case REGIMM:
3073100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu    case BEQ:
3083100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu    case BNE:
3093100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu    case BLEZ:
3103100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu    case BGTZ:
3113100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu    case ADDI:
3123100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu    case ADDIU:
3133100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu    case SLTI:
3143100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu    case SLTIU:
3153100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu    case ANDI:
3163100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu    case ORI:
3173100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu    case XORI:
3183100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu    case LUI:
3193100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu    case BEQL:
3203100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu    case BNEL:
3213100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu    case BLEZL:
3223100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu    case BGTZL:
3233100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu    case LB:
32444f0eee88ff00398ff7f715fab053374d808c90dSteve Block    case LH:
32544f0eee88ff00398ff7f715fab053374d808c90dSteve Block    case LWL:
3263100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu    case LW:
3273100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu    case LBU:
32844f0eee88ff00398ff7f715fab053374d808c90dSteve Block    case LHU:
32944f0eee88ff00398ff7f715fab053374d808c90dSteve Block    case LWR:
3303100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu    case SB:
33144f0eee88ff00398ff7f715fab053374d808c90dSteve Block    case SH:
33244f0eee88ff00398ff7f715fab053374d808c90dSteve Block    case SWL:
3333100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu    case SW:
33444f0eee88ff00398ff7f715fab053374d808c90dSteve Block    case SWR:
3353100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu    case LWC1:
3363100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu    case LDC1:
3373100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu    case SWC1:
3383100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu    case SDC1:
3393100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu      return kImmediateType;
3403ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    // 26 bits immediate type instructions. e.g.: j imm26.
3413100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu    case J:
3423100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu    case JAL:
3433100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu      return kJumpType;
3443100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu    default:
345589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch      return kUnsupported;
3463100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu  };
3473100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu  return kUnsupported;
3483100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu}
3493100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu
35044f0eee88ff00398ff7f715fab053374d808c90dSteve Block
35144f0eee88ff00398ff7f715fab053374d808c90dSteve Block} }   // namespace v8::internal
352f7060e27768c550ace7ec48ad8c093466db52dfaLeon Clarke
353f7060e27768c550ace7ec48ad8c093466db52dfaLeon Clarke#endif  // V8_TARGET_ARCH_MIPS
354