| OLD | NEW |
| 1 // Copyright 2011 the V8 project authors. All rights reserved. | 1 // Copyright 2011 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 #include <limits.h> | 5 #include <limits.h> |
| 6 #include <stdarg.h> | 6 #include <stdarg.h> |
| 7 #include <stdlib.h> | 7 #include <stdlib.h> |
| 8 #include <cmath> | 8 #include <cmath> |
| 9 | 9 |
| 10 #if V8_TARGET_ARCH_MIPS64 | 10 #if V8_TARGET_ARCH_MIPS64 |
| (...skipping 3959 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 3970 0x10101LU >> | 3970 0x10101LU >> |
| 3971 16); | 3971 16); |
| 3972 | 3972 |
| 3973 output = output | (static_cast<uint32_t>(o_byte << 24)); | 3973 output = output | (static_cast<uint32_t>(o_byte << 24)); |
| 3974 input = input >> 8; | 3974 input = input >> 8; |
| 3975 } | 3975 } |
| 3976 | 3976 |
| 3977 alu_out = static_cast<int64_t>(static_cast<int32_t>(output)); | 3977 alu_out = static_cast<int64_t>(static_cast<int32_t>(output)); |
| 3978 break; | 3978 break; |
| 3979 } | 3979 } |
| 3980 case SEB: | 3980 case SEB: { |
| 3981 case SEH: | 3981 int8_t input = static_cast<int8_t>(rt()); |
| 3982 case WSBH: | 3982 int32_t output = 0x000000FF & input; |
| 3983 alu_out = 0x12345678; | 3983 int32_t mask = 0x00000080; |
| 3984 UNREACHABLE(); | 3984 |
| 3985 if (mask & input) output += 0xFFFFFF00; |
| 3986 |
| 3987 alu_out = static_cast<int32_t>(output); |
| 3985 break; | 3988 break; |
| 3989 } |
| 3990 case SEH: { |
| 3991 int16_t input = static_cast<int16_t>(rt()); |
| 3992 int32_t output = 0x0000FFFF & input; |
| 3993 int32_t mask = 0x00008000; |
| 3994 |
| 3995 if (mask & input) output += 0xFFFF0000; |
| 3996 |
| 3997 alu_out = static_cast<int32_t>(output); |
| 3998 break; |
| 3999 } |
| 4000 case WSBH: { |
| 4001 int32_t input = static_cast<int32_t>(rt()); |
| 4002 int32_t output = 0; |
| 4003 |
| 4004 uint32_t mask = 0xFF000000; |
| 4005 for (int i = 0; i < 4; i++) { |
| 4006 uint32_t tmp = mask & input; |
| 4007 if (i % 2 == 0) { |
| 4008 tmp = tmp >> 8; |
| 4009 } else { |
| 4010 tmp = tmp << 8; |
| 4011 } |
| 4012 output = output | tmp; |
| 4013 mask = mask >> 8; |
| 4014 } |
| 4015 mask = 0x80000000; |
| 4016 |
| 4017 if (mask & output) output += 0XFFFFFFFF00000000; |
| 4018 |
| 4019 alu_out = static_cast<int64_t>(output); |
| 4020 break; |
| 4021 } |
| 3986 default: { | 4022 default: { |
| 3987 const uint8_t bp2 = get_instr()->Bp2Value(); | 4023 const uint8_t bp2 = get_instr()->Bp2Value(); |
| 3988 sa >>= kBp2Bits; | 4024 sa >>= kBp2Bits; |
| 3989 switch (sa) { | 4025 switch (sa) { |
| 3990 case ALIGN: { | 4026 case ALIGN: { |
| 3991 if (bp2 == 0) { | 4027 if (bp2 == 0) { |
| 3992 alu_out = static_cast<int32_t>(rt()); | 4028 alu_out = static_cast<int32_t>(rt()); |
| 3993 } else { | 4029 } else { |
| 3994 uint64_t rt_hi = rt() << (8 * bp2); | 4030 uint64_t rt_hi = rt() << (8 * bp2); |
| 3995 uint64_t rs_lo = rs() >> (8 * (4 - bp2)); | 4031 uint64_t rs_lo = rs() >> (8 * (4 - bp2)); |
| (...skipping 38 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 4034 output = output | ((static_cast<uint64_t>(o_byte) << 56)); | 4070 output = output | ((static_cast<uint64_t>(o_byte) << 56)); |
| 4035 input = input >> 8; | 4071 input = input >> 8; |
| 4036 } | 4072 } |
| 4037 | 4073 |
| 4038 alu_out = static_cast<int64_t>(output); | 4074 alu_out = static_cast<int64_t>(output); |
| 4039 break; | 4075 break; |
| 4040 } | 4076 } |
| 4041 } | 4077 } |
| 4042 break; | 4078 break; |
| 4043 } | 4079 } |
| 4044 case DSBH: | 4080 case DSBH: { |
| 4045 case DSHD: | 4081 int64_t input = static_cast<int64_t>(rt()); |
| 4046 alu_out = 0x12345678; | 4082 int64_t output = 0; |
| 4047 UNREACHABLE(); | 4083 |
| 4084 uint64_t mask = 0xFF00000000000000; |
| 4085 for (int i = 0; i < 8; i++) { |
| 4086 uint64_t tmp = mask & input; |
| 4087 if (i % 2 == 0) |
| 4088 tmp = tmp >> 8; |
| 4089 else |
| 4090 tmp = tmp << 8; |
| 4091 |
| 4092 output = output | tmp; |
| 4093 mask = mask >> 8; |
| 4094 } |
| 4095 |
| 4096 alu_out = static_cast<int64_t>(output); |
| 4048 break; | 4097 break; |
| 4098 } |
| 4099 case DSHD: { |
| 4100 int64_t input = static_cast<int64_t>(rt()); |
| 4101 int64_t output = 0; |
| 4102 |
| 4103 uint64_t mask = 0xFFFF000000000000; |
| 4104 for (int i = 0; i < 4; i++) { |
| 4105 uint64_t tmp = mask & input; |
| 4106 if (i == 0) |
| 4107 tmp = tmp >> 48; |
| 4108 else if (i == 1) |
| 4109 tmp = tmp >> 16; |
| 4110 else if (i == 2) |
| 4111 tmp = tmp << 16; |
| 4112 else |
| 4113 tmp = tmp << 48; |
| 4114 output = output | tmp; |
| 4115 mask = mask >> 16; |
| 4116 } |
| 4117 |
| 4118 alu_out = static_cast<int64_t>(output); |
| 4119 break; |
| 4120 } |
| 4049 default: { | 4121 default: { |
| 4050 const uint8_t bp3 = get_instr()->Bp3Value(); | 4122 const uint8_t bp3 = get_instr()->Bp3Value(); |
| 4051 sa >>= kBp3Bits; | 4123 sa >>= kBp3Bits; |
| 4052 switch (sa) { | 4124 switch (sa) { |
| 4053 case DALIGN: { | 4125 case DALIGN: { |
| 4054 if (bp3 == 0) { | 4126 if (bp3 == 0) { |
| 4055 alu_out = static_cast<int64_t>(rt()); | 4127 alu_out = static_cast<int64_t>(rt()); |
| 4056 } else { | 4128 } else { |
| 4057 uint64_t rt_hi = rt() << (8 * bp3); | 4129 uint64_t rt_hi = rt() << (8 * bp3); |
| 4058 uint64_t rs_lo = rs() >> (8 * (8 - bp3)); | 4130 uint64_t rs_lo = rs() >> (8 * (8 - bp3)); |
| (...skipping 29 matching lines...) Expand all Loading... |
| 4088 case COP1X: | 4160 case COP1X: |
| 4089 DecodeTypeRegisterCOP1X(); | 4161 DecodeTypeRegisterCOP1X(); |
| 4090 break; | 4162 break; |
| 4091 case SPECIAL: | 4163 case SPECIAL: |
| 4092 DecodeTypeRegisterSPECIAL(); | 4164 DecodeTypeRegisterSPECIAL(); |
| 4093 break; | 4165 break; |
| 4094 case SPECIAL2: | 4166 case SPECIAL2: |
| 4095 DecodeTypeRegisterSPECIAL2(); | 4167 DecodeTypeRegisterSPECIAL2(); |
| 4096 break; | 4168 break; |
| 4097 case SPECIAL3: | 4169 case SPECIAL3: |
| 4098 switch (instr->FunctionFieldRaw()) { | 4170 DecodeTypeRegisterSPECIAL3(); |
| 4099 case BSHFL: { | |
| 4100 int32_t saVal = sa(); | |
| 4101 saVal >>= kBp2Bits; | |
| 4102 switch (saVal) { | |
| 4103 case ALIGN: { | |
| 4104 DecodeTypeRegisterSPECIAL3(); | |
| 4105 break; | |
| 4106 } | |
| 4107 } | |
| 4108 } | |
| 4109 case DBSHFL: { | |
| 4110 int32_t saVal = sa(); | |
| 4111 saVal >>= kBp2Bits; | |
| 4112 switch (saVal) { | |
| 4113 case DALIGN: { | |
| 4114 DecodeTypeRegisterSPECIAL3(); | |
| 4115 break; | |
| 4116 } | |
| 4117 } | |
| 4118 } | |
| 4119 default: | |
| 4120 DecodeTypeRegisterSPECIAL3(); | |
| 4121 break; | |
| 4122 } | |
| 4123 break; | 4171 break; |
| 4124 // Unimplemented opcodes raised an error in the configuration step before, | 4172 // Unimplemented opcodes raised an error in the configuration step before, |
| 4125 // so we can use the default here to set the destination register in common | 4173 // so we can use the default here to set the destination register in common |
| 4126 // cases. | 4174 // cases. |
| 4127 default: | 4175 default: |
| 4128 UNREACHABLE(); | 4176 UNREACHABLE(); |
| 4129 } | 4177 } |
| 4130 } | 4178 } |
| 4131 | 4179 |
| 4132 | 4180 |
| (...skipping 804 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 4937 } | 4985 } |
| 4938 | 4986 |
| 4939 | 4987 |
| 4940 #undef UNSUPPORTED | 4988 #undef UNSUPPORTED |
| 4941 } // namespace internal | 4989 } // namespace internal |
| 4942 } // namespace v8 | 4990 } // namespace v8 |
| 4943 | 4991 |
| 4944 #endif // USE_SIMULATOR | 4992 #endif // USE_SIMULATOR |
| 4945 | 4993 |
| 4946 #endif // V8_TARGET_ARCH_MIPS64 | 4994 #endif // V8_TARGET_ARCH_MIPS64 |
| OLD | NEW |