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 |