Chromium Code Reviews| Index: src/arm/simulator-arm.cc |
| diff --git a/src/arm/simulator-arm.cc b/src/arm/simulator-arm.cc |
| index 394ef27eb5cfee3c09b7fb1e422a81a13ca58218..c538e1748688e1579fba9387decf5ed7aceffcd2 100644 |
| --- a/src/arm/simulator-arm.cc |
| +++ b/src/arm/simulator-arm.cc |
| @@ -945,73 +945,31 @@ unsigned int Simulator::get_s_register(int sreg) const { |
| } |
| -void Simulator::set_s_register_from_float(int sreg, const float flt) { |
| - ASSERT((sreg >= 0) && (sreg < num_s_registers)); |
| - // Read the bits from the single precision floating point value |
| - // into the unsigned integer element of vfp_register[] given by index=sreg. |
| - char buffer[sizeof(vfp_register[0])]; |
| - memcpy(buffer, &flt, sizeof(vfp_register[0])); |
| - memcpy(&vfp_register[sreg], buffer, sizeof(vfp_register[0])); |
| -} |
| - |
| - |
| -void Simulator::set_s_register_from_sinteger(int sreg, const int sint) { |
| - ASSERT((sreg >= 0) && (sreg < num_s_registers)); |
| - // Read the bits from the integer value into the unsigned integer element of |
| - // vfp_register[] given by index=sreg. |
| - char buffer[sizeof(vfp_register[0])]; |
| - memcpy(buffer, &sint, sizeof(vfp_register[0])); |
| - memcpy(&vfp_register[sreg], buffer, sizeof(vfp_register[0])); |
| -} |
| - |
| - |
| -void Simulator::set_d_register_from_double(int dreg, const double& dbl) { |
| - ASSERT((dreg >= 0) && (dreg < num_d_registers)); |
| - // Read the bits from the double precision floating point value into the two |
| - // consecutive unsigned integer elements of vfp_register[] given by index |
| - // 2*sreg and 2*sreg+1. |
| - char buffer[2 * sizeof(vfp_register[0])]; |
| - memcpy(buffer, &dbl, 2 * sizeof(vfp_register[0])); |
| - memcpy(&vfp_register[dreg * 2], buffer, 2 * sizeof(vfp_register[0])); |
| -} |
| - |
| +template<class InputType, int register_size> |
| +void Simulator::SetVFPRegister(int reg_index, const InputType& value) { |
| + ASSERT(reg_index >= 0); |
| + if (register_size == 1) ASSERT(reg_index < num_s_registers); |
| + if (register_size == 2) ASSERT(reg_index < num_d_registers); |
| -float Simulator::get_float_from_s_register(int sreg) { |
| - ASSERT((sreg >= 0) && (sreg < num_s_registers)); |
| - |
| - float sm_val = 0.0; |
| - // Read the bits from the unsigned integer vfp_register[] array |
| - // into the single precision floating point value and return it. |
| - char buffer[sizeof(vfp_register[0])]; |
| - memcpy(buffer, &vfp_register[sreg], sizeof(vfp_register[0])); |
| - memcpy(&sm_val, buffer, sizeof(vfp_register[0])); |
| - return(sm_val); |
| + char buffer[register_size * sizeof(vfp_register[0])]; |
| + memcpy(buffer, &value, register_size * sizeof(vfp_register[0])); |
| + memcpy(&vfp_register[reg_index * register_size], buffer, |
| + register_size * sizeof(vfp_register[0])); |
| } |
| -int Simulator::get_sinteger_from_s_register(int sreg) { |
| - ASSERT((sreg >= 0) && (sreg < num_s_registers)); |
| +template<class ReturnType, int register_size> |
| +ReturnType Simulator::GetFromVFPRegister(int reg_index) { |
| + ASSERT(reg_index >= 0); |
| + if (register_size == 1) ASSERT(reg_index < num_s_registers); |
| + if (register_size == 2) ASSERT(reg_index < num_d_registers); |
| - int sm_val = 0; |
| - // Read the bits from the unsigned integer vfp_register[] array |
| - // into the single precision floating point value and return it. |
| - char buffer[sizeof(vfp_register[0])]; |
| - memcpy(buffer, &vfp_register[sreg], sizeof(vfp_register[0])); |
| - memcpy(&sm_val, buffer, sizeof(vfp_register[0])); |
| - return(sm_val); |
| -} |
| - |
| - |
| -double Simulator::get_double_from_d_register(int dreg) { |
| - ASSERT((dreg >= 0) && (dreg < num_d_registers)); |
| - |
| - double dm_val = 0.0; |
| - // Read the bits from the unsigned integer vfp_register[] array |
| - // into the double precision floating point value and return it. |
| - char buffer[2 * sizeof(vfp_register[0])]; |
| - memcpy(buffer, &vfp_register[2 * dreg], 2 * sizeof(vfp_register[0])); |
| - memcpy(&dm_val, buffer, 2 * sizeof(vfp_register[0])); |
| - return(dm_val); |
| + ReturnType value = 0; |
| + char buffer[register_size * sizeof(vfp_register[0])]; |
| + memcpy(buffer, &vfp_register[register_size * reg_index], |
| + register_size * sizeof(vfp_register[0])); |
| + memcpy(&value, buffer, register_size * sizeof(vfp_register[0])); |
| + return value; |
| } |
| @@ -2711,6 +2669,30 @@ void Simulator::DecodeType7(Instruction* instr) { |
| } |
| +// Currently supports: |
| +// Dd = vorr(Dn, Dm) |
| +void Simulator::DecodeSpecialCondition(Instruction* instr) { |
| + // See ARM DDI 0406A, A7-12 for how to detect which instruction this is. |
| + if (instr->Bits(11, 8) == 0x1 && |
| + instr->Bit(4) == 0x1 && |
| + instr->Bit(24) == 0x0 && |
| + instr->Opc1Value() == 0x2) { |
|
Erik Corry
2012/08/06 10:44:40
Same question here as in the disassembler?
Jakob Kummerow
2012/08/06 14:08:43
Same answer: removed vorr.
|
| + // vorr |
| + |
| + // Obtain double precision register codes. |
| + int vm = instr->VFPMRegValue(kDoublePrecision); |
| + int vd = instr->VFPDRegValue(kDoublePrecision); |
| + int vn = instr->VFPNRegValue(kDoublePrecision); |
| + |
| + int64_t dn_value = get_raw_bits_from_d_register(vn); |
| + int64_t dm_value = get_raw_bits_from_d_register(vm); |
| + set_d_register_from_raw_bits(vd, dn_value | dm_value); |
| + } else { |
| + UNREACHABLE(); // Not used by V8. |
| + } |
| +} |
| + |
| + |
| // void Simulator::DecodeTypeVFP(Instruction* instr) |
| // The Following ARMv7 VFPv instructions are currently supported. |
| // vmov :Sn = Rt |
| @@ -3240,7 +3222,7 @@ void Simulator::InstructionDecode(Instruction* instr) { |
| PrintF(" 0x%08x %s\n", reinterpret_cast<intptr_t>(instr), buffer.start()); |
| } |
| if (instr->ConditionField() == kSpecialCondition) { |
| - UNIMPLEMENTED(); |
| + DecodeSpecialCondition(instr); |
| } else if (ConditionallyExecute(instr)) { |
| switch (instr->TypeValue()) { |
| case 0: |