| OLD | NEW |
| 1 // Copyright (c) 2013, the Dart project authors. Please see the AUTHORS file | 1 // Copyright (c) 2013, the Dart project authors. Please see the AUTHORS file |
| 2 // for details. All rights reserved. Use of this source code is governed by a | 2 // for details. All rights reserved. Use of this source code is governed by a |
| 3 // BSD-style license that can be found in the LICENSE file. | 3 // BSD-style license that can be found in the LICENSE file. |
| 4 | 4 |
| 5 #include <math.h> // for isnan. | 5 #include <math.h> // for isnan. |
| 6 #include <setjmp.h> | 6 #include <setjmp.h> |
| 7 #include <stdlib.h> | 7 #include <stdlib.h> |
| 8 | 8 |
| 9 #include "vm/globals.h" | 9 #include "vm/globals.h" |
| 10 #if defined(TARGET_ARCH_ARM) | 10 #if defined(TARGET_ARCH_ARM) |
| (...skipping 742 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 753 // The sp is initialized to point to the bottom (high address) of the | 753 // The sp is initialized to point to the bottom (high address) of the |
| 754 // allocated stack area. | 754 // allocated stack area. |
| 755 registers_[SP] = StackTop(); | 755 registers_[SP] = StackTop(); |
| 756 // The lr and pc are initialized to a known bad value that will cause an | 756 // The lr and pc are initialized to a known bad value that will cause an |
| 757 // access violation if the simulator ever tries to execute it. | 757 // access violation if the simulator ever tries to execute it. |
| 758 registers_[PC] = kBadLR; | 758 registers_[PC] = kBadLR; |
| 759 registers_[LR] = kBadLR; | 759 registers_[LR] = kBadLR; |
| 760 | 760 |
| 761 // All double-precision registers are initialized to zero. | 761 // All double-precision registers are initialized to zero. |
| 762 for (int i = 0; i < kNumberOfDRegisters; i++) { | 762 for (int i = 0; i < kNumberOfDRegisters; i++) { |
| 763 dregisters_[i] = 0.0; | 763 dregisters_[i] = 0; |
| 764 } | 764 } |
| 765 // Since VFP registers are overlapping, single-precision registers should | 765 // Since VFP registers are overlapping, single-precision registers should |
| 766 // already be initialized. | 766 // already be initialized. |
| 767 ASSERT(2*kNumberOfDRegisters >= kNumberOfSRegisters); | 767 ASSERT(2*kNumberOfDRegisters >= kNumberOfSRegisters); |
| 768 for (int i = 0; i < kNumberOfSRegisters; i++) { | 768 for (int i = 0; i < kNumberOfSRegisters; i++) { |
| 769 ASSERT(sregisters_[i] == 0.0); | 769 ASSERT(sregisters_[i] == 0.0); |
| 770 } | 770 } |
| 771 fp_n_flag_ = false; | 771 fp_n_flag_ = false; |
| 772 fp_z_flag_ = false; | 772 fp_z_flag_ = false; |
| 773 fp_c_flag_ = false; | 773 fp_c_flag_ = false; |
| (...skipping 120 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 894 | 894 |
| 895 // Raw access to the PC register without the special adjustment when reading. | 895 // Raw access to the PC register without the special adjustment when reading. |
| 896 int32_t Simulator::get_pc() const { | 896 int32_t Simulator::get_pc() const { |
| 897 return registers_[PC]; | 897 return registers_[PC]; |
| 898 } | 898 } |
| 899 | 899 |
| 900 | 900 |
| 901 // Accessors for VFP register state. | 901 // Accessors for VFP register state. |
| 902 void Simulator::set_sregister(SRegister reg, float value) { | 902 void Simulator::set_sregister(SRegister reg, float value) { |
| 903 ASSERT((reg >= 0) && (reg < kNumberOfSRegisters)); | 903 ASSERT((reg >= 0) && (reg < kNumberOfSRegisters)); |
| 904 sregisters_[reg] = bit_cast<int32_t, float>(value); |
| 905 } |
| 906 |
| 907 |
| 908 float Simulator::get_sregister(SRegister reg) const { |
| 909 ASSERT((reg >= 0) && (reg < kNumberOfSRegisters)); |
| 910 return bit_cast<float, int32_t>(sregisters_[reg]); |
| 911 } |
| 912 |
| 913 |
| 914 void Simulator::set_dregister(DRegister reg, double value) { |
| 915 ASSERT((reg >= 0) && (reg < kNumberOfDRegisters)); |
| 916 dregisters_[reg] = bit_cast<int64_t, double>(value); |
| 917 } |
| 918 |
| 919 |
| 920 double Simulator::get_dregister(DRegister reg) const { |
| 921 ASSERT((reg >= 0) && (reg < kNumberOfDRegisters)); |
| 922 return bit_cast<double, int64_t>(dregisters_[reg]); |
| 923 } |
| 924 |
| 925 |
| 926 void Simulator::set_sregister_bits(SRegister reg, int32_t value) { |
| 927 ASSERT((reg >= 0) && (reg < kNumberOfSRegisters)); |
| 904 sregisters_[reg] = value; | 928 sregisters_[reg] = value; |
| 905 } | 929 } |
| 906 | 930 |
| 907 | 931 |
| 908 float Simulator::get_sregister(SRegister reg) const { | 932 int32_t Simulator::get_sregister_bits(SRegister reg) const { |
| 909 ASSERT((reg >= 0) && (reg < kNumberOfSRegisters)); | 933 ASSERT((reg >= 0) && (reg < kNumberOfSRegisters)); |
| 910 return sregisters_[reg]; | 934 return sregisters_[reg]; |
| 911 } | 935 } |
| 912 | 936 |
| 913 | 937 |
| 914 void Simulator::set_dregister(DRegister reg, double value) { | 938 void Simulator::set_dregister_bits(DRegister reg, int64_t value) { |
| 915 ASSERT((reg >= 0) && (reg < kNumberOfDRegisters)); | 939 ASSERT((reg >= 0) && (reg < kNumberOfDRegisters)); |
| 916 dregisters_[reg] = value; | 940 dregisters_[reg] = value; |
| 917 } | 941 } |
| 918 | 942 |
| 919 | 943 |
| 920 double Simulator::get_dregister(DRegister reg) const { | 944 int64_t Simulator::get_dregister_bits(DRegister reg) const { |
| 921 ASSERT((reg >= 0) && (reg < kNumberOfDRegisters)); | 945 ASSERT((reg >= 0) && (reg < kNumberOfDRegisters)); |
| 922 return dregisters_[reg]; | 946 return dregisters_[reg]; |
| 923 } | 947 } |
| 924 | 948 |
| 925 | 949 |
| 926 void Simulator::HandleIllegalAccess(uword addr, Instr* instr) { | 950 void Simulator::HandleIllegalAccess(uword addr, Instr* instr) { |
| 927 uword fault_pc = get_pc(); | 951 uword fault_pc = get_pc(); |
| 928 // The debugger will not be able to single step past this instruction, but | 952 // The debugger will not be able to single step past this instruction, but |
| 929 // it will be possible to disassemble the code and inspect registers. | 953 // it will be possible to disassemble the code and inspect registers. |
| 930 char buffer[128]; | 954 char buffer[128]; |
| (...skipping 1433 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2364 void Simulator::DecodeType6(Instr* instr) { | 2388 void Simulator::DecodeType6(Instr* instr) { |
| 2365 if (instr->IsVFPDoubleTransfer()) { | 2389 if (instr->IsVFPDoubleTransfer()) { |
| 2366 Register rd = instr->RdField(); | 2390 Register rd = instr->RdField(); |
| 2367 Register rn = instr->RnField(); | 2391 Register rn = instr->RnField(); |
| 2368 if (instr->Bit(8) == 0) { | 2392 if (instr->Bit(8) == 0) { |
| 2369 SRegister sm = instr->SmField(); | 2393 SRegister sm = instr->SmField(); |
| 2370 SRegister sm1 = static_cast<SRegister>(sm + 1); | 2394 SRegister sm1 = static_cast<SRegister>(sm + 1); |
| 2371 ASSERT(sm1 < kNumberOfSRegisters); | 2395 ASSERT(sm1 < kNumberOfSRegisters); |
| 2372 if (instr->Bit(20) == 1) { | 2396 if (instr->Bit(20) == 1) { |
| 2373 // Format(instr, "vmovrrs'cond 'rd, 'rn, {'sm', 'sm1}"); | 2397 // Format(instr, "vmovrrs'cond 'rd, 'rn, {'sm', 'sm1}"); |
| 2374 set_register(rd, bit_cast<int32_t, float>(get_sregister(sm))); | 2398 set_register(rd, get_sregister_bits(sm)); |
| 2375 set_register(rn, bit_cast<int32_t, float>(get_sregister(sm1))); | 2399 set_register(rn, get_sregister_bits(sm1)); |
| 2376 } else { | 2400 } else { |
| 2377 // Format(instr, "vmovsrr'cond {'sm, 'sm1}, 'rd', 'rn"); | 2401 // Format(instr, "vmovsrr'cond {'sm, 'sm1}, 'rd', 'rn"); |
| 2378 set_sregister(sm, bit_cast<float, int32_t>(get_register(rd))); | 2402 set_sregister_bits(sm, get_register(rd)); |
| 2379 set_sregister(sm1, bit_cast<float, int32_t>(get_register(rn))); | 2403 set_sregister_bits(sm1, get_register(rn)); |
| 2380 } | 2404 } |
| 2381 } else { | 2405 } else { |
| 2382 DRegister dm = instr->DmField(); | 2406 DRegister dm = instr->DmField(); |
| 2383 if (instr->Bit(20) == 1) { | 2407 if (instr->Bit(20) == 1) { |
| 2384 // Format(instr, "vmovrrd'cond 'rd, 'rn, 'dm"); | 2408 // Format(instr, "vmovrrd'cond 'rd, 'rn, 'dm"); |
| 2385 int64_t dm_val = bit_cast<int64_t, double>(get_dregister(dm)); | 2409 int64_t dm_val = get_dregister_bits(dm); |
| 2386 set_register(rd, Utils::Low32Bits(dm_val)); | 2410 set_register(rd, Utils::Low32Bits(dm_val)); |
| 2387 set_register(rn, Utils::High32Bits(dm_val)); | 2411 set_register(rn, Utils::High32Bits(dm_val)); |
| 2388 } else { | 2412 } else { |
| 2389 // Format(instr, "vmovdrr'cond 'dm, 'rd, 'rn"); | 2413 // Format(instr, "vmovdrr'cond 'dm, 'rd, 'rn"); |
| 2390 int64_t dm_val = Utils::LowHighTo64Bits(get_register(rd), | 2414 int64_t dm_val = Utils::LowHighTo64Bits(get_register(rd), |
| 2391 get_register(rn)); | 2415 get_register(rn)); |
| 2392 set_dregister(dm, bit_cast<double, int64_t>(dm_val)); | 2416 set_dregister_bits(dm, dm_val); |
| 2393 } | 2417 } |
| 2394 } | 2418 } |
| 2395 } else if (instr-> IsVFPLoadStore()) { | 2419 } else if (instr-> IsVFPLoadStore()) { |
| 2396 Register rn = instr->RnField(); | 2420 Register rn = instr->RnField(); |
| 2397 int32_t addr = get_register(rn); | 2421 int32_t addr = get_register(rn); |
| 2398 int32_t imm_val = instr->Bits(0, 8) << 2; | 2422 int32_t imm_val = instr->Bits(0, 8) << 2; |
| 2399 if (instr->Bit(23) == 1) { | 2423 if (instr->Bit(23) == 1) { |
| 2400 addr += imm_val; | 2424 addr += imm_val; |
| 2401 } else { | 2425 } else { |
| 2402 addr -= imm_val; | 2426 addr -= imm_val; |
| 2403 } | 2427 } |
| 2404 if (IsIllegalAddress(addr)) { | 2428 if (IsIllegalAddress(addr)) { |
| 2405 HandleIllegalAccess(addr, instr); | 2429 HandleIllegalAccess(addr, instr); |
| 2406 } else { | 2430 } else { |
| 2407 if (instr->Bit(8) == 0) { | 2431 if (instr->Bit(8) == 0) { |
| 2408 SRegister sd = instr->SdField(); | 2432 SRegister sd = instr->SdField(); |
| 2409 if (instr->Bit(20) == 1) { // vldrs | 2433 if (instr->Bit(20) == 1) { // vldrs |
| 2410 // Format(instr, "vldrs'cond 'sd, ['rn, #+'off10]"); | 2434 // Format(instr, "vldrs'cond 'sd, ['rn, #+'off10]"); |
| 2411 // Format(instr, "vldrs'cond 'sd, ['rn, #-'off10]"); | 2435 // Format(instr, "vldrs'cond 'sd, ['rn, #-'off10]"); |
| 2412 set_sregister(sd, bit_cast<float, int32_t>(ReadW(addr, instr))); | 2436 set_sregister_bits(sd, ReadW(addr, instr)); |
| 2413 } else { // vstrs | 2437 } else { // vstrs |
| 2414 // Format(instr, "vstrs'cond 'sd, ['rn, #+'off10]"); | 2438 // Format(instr, "vstrs'cond 'sd, ['rn, #+'off10]"); |
| 2415 // Format(instr, "vstrs'cond 'sd, ['rn, #-'off10]"); | 2439 // Format(instr, "vstrs'cond 'sd, ['rn, #-'off10]"); |
| 2416 WriteW(addr, bit_cast<int32_t, float>(get_sregister(sd)), instr); | 2440 WriteW(addr, get_sregister_bits(sd), instr); |
| 2417 } | 2441 } |
| 2418 } else { | 2442 } else { |
| 2419 DRegister dd = instr->DdField(); | 2443 DRegister dd = instr->DdField(); |
| 2420 if (instr->Bit(20) == 1) { // vldrd | 2444 if (instr->Bit(20) == 1) { // vldrd |
| 2421 // Format(instr, "vldrd'cond 'dd, ['rn, #+'off10]"); | 2445 // Format(instr, "vldrd'cond 'dd, ['rn, #+'off10]"); |
| 2422 // Format(instr, "vldrd'cond 'dd, ['rn, #-'off10]"); | 2446 // Format(instr, "vldrd'cond 'dd, ['rn, #-'off10]"); |
| 2423 int64_t dd_val = Utils::LowHighTo64Bits(ReadW(addr, instr), | 2447 int64_t dd_val = Utils::LowHighTo64Bits(ReadW(addr, instr), |
| 2424 ReadW(addr + 4, instr)); | 2448 ReadW(addr + 4, instr)); |
| 2425 set_dregister(dd, bit_cast<double, int64_t>(dd_val)); | 2449 set_dregister_bits(dd, dd_val); |
| 2426 } else { // vstrd | 2450 } else { // vstrd |
| 2427 // Format(instr, "vstrd'cond 'dd, ['rn, #+'off10]"); | 2451 // Format(instr, "vstrd'cond 'dd, ['rn, #+'off10]"); |
| 2428 // Format(instr, "vstrd'cond 'dd, ['rn, #-'off10]"); | 2452 // Format(instr, "vstrd'cond 'dd, ['rn, #-'off10]"); |
| 2429 int64_t dd_val = bit_cast<int64_t, double>(get_dregister(dd)); | 2453 int64_t dd_val = get_dregister_bits(dd); |
| 2430 WriteW(addr, Utils::Low32Bits(dd_val), instr); | 2454 WriteW(addr, Utils::Low32Bits(dd_val), instr); |
| 2431 WriteW(addr + 4, Utils::High32Bits(dd_val), instr); | 2455 WriteW(addr + 4, Utils::High32Bits(dd_val), instr); |
| 2432 } | 2456 } |
| 2433 } | 2457 } |
| 2434 } | 2458 } |
| 2435 } else if (instr->IsVFPMultipleLoadStore()) { | 2459 } else if (instr->IsVFPMultipleLoadStore()) { |
| 2436 Register rn = instr->RnField(); | 2460 Register rn = instr->RnField(); |
| 2437 int32_t addr = get_register(rn); | 2461 int32_t addr = get_register(rn); |
| 2438 int32_t imm_val = instr->Bits(0, 8); | 2462 int32_t imm_val = instr->Bits(0, 8); |
| 2439 if (instr->Bit(23) == 0) { | 2463 if (instr->Bit(23) == 0) { |
| 2440 addr -= (imm_val << 2); | 2464 addr -= (imm_val << 2); |
| 2441 } | 2465 } |
| 2442 if (instr->HasW()) { | 2466 if (instr->HasW()) { |
| 2443 if (instr->Bit(23) == 1) { | 2467 if (instr->Bit(23) == 1) { |
| 2444 set_register(rn, addr + (imm_val << 2)); | 2468 set_register(rn, addr + (imm_val << 2)); |
| 2445 } else { | 2469 } else { |
| 2446 set_register(rn, addr); // already subtracted from addr | 2470 set_register(rn, addr); // already subtracted from addr |
| 2447 } | 2471 } |
| 2448 } | 2472 } |
| 2449 if (IsIllegalAddress(addr)) { | 2473 if (IsIllegalAddress(addr)) { |
| 2450 HandleIllegalAccess(addr, instr); | 2474 HandleIllegalAccess(addr, instr); |
| 2451 } else { | 2475 } else { |
| 2452 if (instr->Bit(8) == 0) { | 2476 if (instr->Bit(8) == 0) { |
| 2453 int32_t regs_cnt = imm_val; | 2477 int32_t regs_cnt = imm_val; |
| 2454 int32_t start = instr->Bit(22) | (instr->Bits(12, 4) << 1); | 2478 int32_t start = instr->Bit(22) | (instr->Bits(12, 4) << 1); |
| 2455 for (int i = start; i < start + regs_cnt; i++) { | 2479 for (int i = start; i < start + regs_cnt; i++) { |
| 2456 SRegister sd = static_cast<SRegister>(i); | 2480 SRegister sd = static_cast<SRegister>(i); |
| 2457 if (instr->Bit(20) == 1) { | 2481 if (instr->Bit(20) == 1) { |
| 2458 // Format(instr, "vldms'cond'pu 'rn'w, 'slist"); | 2482 // Format(instr, "vldms'cond'pu 'rn'w, 'slist"); |
| 2459 set_sregister(sd, bit_cast<float, int32_t>(ReadW(addr, instr))); | 2483 set_sregister_bits(sd, ReadW(addr, instr)); |
| 2460 } else { | 2484 } else { |
| 2461 // Format(instr, "vstms'cond'pu 'rn'w, 'slist"); | 2485 // Format(instr, "vstms'cond'pu 'rn'w, 'slist"); |
| 2462 WriteW(addr, bit_cast<int32_t, float>(get_sregister(sd)), instr); | 2486 WriteW(addr, get_sregister_bits(sd), instr); |
| 2463 } | 2487 } |
| 2464 addr += 4; | 2488 addr += 4; |
| 2465 } | 2489 } |
| 2466 } else { | 2490 } else { |
| 2467 int32_t regs_cnt = imm_val >> 1; | 2491 int32_t regs_cnt = imm_val >> 1; |
| 2468 int32_t start = (instr->Bit(22) << 4) | instr->Bits(12, 4); | 2492 int32_t start = (instr->Bit(22) << 4) | instr->Bits(12, 4); |
| 2469 for (int i = start; i < start + regs_cnt; i++) { | 2493 for (int i = start; i < start + regs_cnt; i++) { |
| 2470 DRegister dd = static_cast<DRegister>(i); | 2494 DRegister dd = static_cast<DRegister>(i); |
| 2471 if (instr->Bit(20) == 1) { | 2495 if (instr->Bit(20) == 1) { |
| 2472 // Format(instr, "vldmd'cond'pu 'rn'w, 'dlist"); | 2496 // Format(instr, "vldmd'cond'pu 'rn'w, 'dlist"); |
| 2473 int64_t dd_val = Utils::LowHighTo64Bits(ReadW(addr, instr), | 2497 int64_t dd_val = Utils::LowHighTo64Bits(ReadW(addr, instr), |
| 2474 ReadW(addr + 4, instr)); | 2498 ReadW(addr + 4, instr)); |
| 2475 set_dregister(dd, bit_cast<double, int64_t>(dd_val)); | 2499 set_dregister_bits(dd, dd_val); |
| 2476 } else { | 2500 } else { |
| 2477 // Format(instr, "vstmd'cond'pu 'rn'w, 'dlist"); | 2501 // Format(instr, "vstmd'cond'pu 'rn'w, 'dlist"); |
| 2478 int64_t dd_val = bit_cast<int64_t, double>(get_dregister(dd)); | 2502 int64_t dd_val = get_dregister_bits(dd); |
| 2479 WriteW(addr, Utils::Low32Bits(dd_val), instr); | 2503 WriteW(addr, Utils::Low32Bits(dd_val), instr); |
| 2480 WriteW(addr + 4, Utils::High32Bits(dd_val), instr); | 2504 WriteW(addr + 4, Utils::High32Bits(dd_val), instr); |
| 2481 } | 2505 } |
| 2482 addr += 8; | 2506 addr += 8; |
| 2483 } | 2507 } |
| 2484 } | 2508 } |
| 2485 } | 2509 } |
| 2486 } else { | 2510 } else { |
| 2487 UnimplementedInstruction(instr); | 2511 UnimplementedInstruction(instr); |
| 2488 } | 2512 } |
| (...skipping 230 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2719 set_dregister(dd, static_cast<double>(get_sregister(sm))); | 2743 set_dregister(dd, static_cast<double>(get_sregister(sm))); |
| 2720 } else { | 2744 } else { |
| 2721 // Format(instr, "vcvtsd'cond 'sd, 'dm"); | 2745 // Format(instr, "vcvtsd'cond 'sd, 'dm"); |
| 2722 sd = instr->SdField(); | 2746 sd = instr->SdField(); |
| 2723 set_sregister(sd, static_cast<float>(get_dregister(dm))); | 2747 set_sregister(sd, static_cast<float>(get_dregister(dm))); |
| 2724 } | 2748 } |
| 2725 break; | 2749 break; |
| 2726 } | 2750 } |
| 2727 case 8: { // vcvt, vcvtr between floating-point and integer | 2751 case 8: { // vcvt, vcvtr between floating-point and integer |
| 2728 sm = instr->SmField(); | 2752 sm = instr->SmField(); |
| 2729 float sm_val = get_sregister(sm); | 2753 int32_t sm_int = get_sregister_bits(sm); |
| 2730 uint32_t ud_val = 0; | 2754 uint32_t ud_val = 0; |
| 2731 int32_t id_val = 0; | 2755 int32_t id_val = 0; |
| 2732 if (instr->Bit(7) == 0) { // vcvtsu, vcvtdu | 2756 if (instr->Bit(7) == 0) { // vcvtsu, vcvtdu |
| 2733 ud_val = bit_cast<uint32_t, float>(sm_val); | 2757 ud_val = static_cast<uint32_t>(sm_int); |
| 2734 } else { // vcvtsi, vcvtdi | 2758 } else { // vcvtsi, vcvtdi |
| 2735 id_val = bit_cast<int32_t, float>(sm_val); | 2759 id_val = sm_int; |
| 2736 } | 2760 } |
| 2737 if (instr->Bit(8) == 0) { | 2761 if (instr->Bit(8) == 0) { |
| 2738 float sd_val; | 2762 float sd_val; |
| 2739 if (instr->Bit(7) == 0) { | 2763 if (instr->Bit(7) == 0) { |
| 2740 // Format(instr, "vcvtsu'cond 'sd, 'sm"); | 2764 // Format(instr, "vcvtsu'cond 'sd, 'sm"); |
| 2741 sd_val = static_cast<float>(ud_val); | 2765 sd_val = static_cast<float>(ud_val); |
| 2742 } else { | 2766 } else { |
| 2743 // Format(instr, "vcvtsi'cond 'sd, 'sm"); | 2767 // Format(instr, "vcvtsi'cond 'sd, 'sm"); |
| 2744 sd_val = static_cast<float>(id_val); | 2768 sd_val = static_cast<float>(id_val); |
| 2745 } | 2769 } |
| (...skipping 57 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2803 if (dm_val <= INT_MIN) { | 2827 if (dm_val <= INT_MIN) { |
| 2804 id_val = INT_MIN; | 2828 id_val = INT_MIN; |
| 2805 } else if (dm_val >= INT_MAX) { | 2829 } else if (dm_val >= INT_MAX) { |
| 2806 id_val = INT_MAX; | 2830 id_val = INT_MAX; |
| 2807 } else { | 2831 } else { |
| 2808 id_val = static_cast<int32_t>(dm_val); | 2832 id_val = static_cast<int32_t>(dm_val); |
| 2809 } | 2833 } |
| 2810 ASSERT((id_val >= 0) || !(dm_val >= 0.0)); | 2834 ASSERT((id_val >= 0) || !(dm_val >= 0.0)); |
| 2811 } | 2835 } |
| 2812 } | 2836 } |
| 2813 float sd_val; | 2837 int32_t sd_val; |
| 2814 if (instr->Bit(16) == 0) { | 2838 if (instr->Bit(16) == 0) { |
| 2815 sd_val = bit_cast<float, uint32_t>(ud_val); | 2839 sd_val = static_cast<int32_t>(ud_val); |
| 2816 } else { | 2840 } else { |
| 2817 sd_val = bit_cast<float, int32_t>(id_val); | 2841 sd_val = id_val; |
| 2818 } | 2842 } |
| 2819 set_sregister(sd, sd_val); | 2843 set_sregister_bits(sd, sd_val); |
| 2820 break; | 2844 break; |
| 2821 } | 2845 } |
| 2822 case 2: // vcvtb, vcvtt | 2846 case 2: // vcvtb, vcvtt |
| 2823 case 3: // vcvtb, vcvtt | 2847 case 3: // vcvtb, vcvtt |
| 2824 case 9: // undefined | 2848 case 9: // undefined |
| 2825 case 10: // vcvt between floating-point and fixed-point | 2849 case 10: // vcvt between floating-point and fixed-point |
| 2826 case 11: // vcvt between floating-point and fixed-point | 2850 case 11: // vcvt between floating-point and fixed-point |
| 2827 case 14: // vcvt between floating-point and fixed-point | 2851 case 14: // vcvt between floating-point and fixed-point |
| 2828 case 15: // vcvt between floating-point and fixed-point | 2852 case 15: // vcvt between floating-point and fixed-point |
| 2829 default: { | 2853 default: { |
| 2830 UnimplementedInstruction(instr); | 2854 UnimplementedInstruction(instr); |
| 2831 break; | 2855 break; |
| 2832 } | 2856 } |
| 2833 } | 2857 } |
| 2834 } | 2858 } |
| 2835 break; | 2859 break; |
| 2836 } | 2860 } |
| 2837 } else { | 2861 } else { |
| 2838 // 8, 16, or 32-bit Transfer between ARM Core and VFP | 2862 // 8, 16, or 32-bit Transfer between ARM Core and VFP |
| 2839 if ((instr->Bits(21, 3) == 0) && (instr->Bit(8) == 0)) { | 2863 if ((instr->Bits(21, 3) == 0) && (instr->Bit(8) == 0)) { |
| 2840 Register rd = instr->RdField(); | 2864 Register rd = instr->RdField(); |
| 2841 SRegister sn = instr->SnField(); | 2865 SRegister sn = instr->SnField(); |
| 2842 if (instr->Bit(20) == 0) { | 2866 if (instr->Bit(20) == 0) { |
| 2843 // Format(instr, "vmovs'cond 'sn, 'rd"); | 2867 // Format(instr, "vmovs'cond 'sn, 'rd"); |
| 2844 set_sregister(sn, bit_cast<float, int32_t>(get_register(rd))); | 2868 set_sregister_bits(sn, get_register(rd)); |
| 2845 } else { | 2869 } else { |
| 2846 // Format(instr, "vmovr'cond 'rd, 'sn"); | 2870 // Format(instr, "vmovr'cond 'rd, 'sn"); |
| 2847 set_register(rd, bit_cast<int32_t, float>(get_sregister(sn))); | 2871 set_register(rd, get_sregister_bits(sn)); |
| 2848 } | 2872 } |
| 2849 } else if ((instr->Bits(20, 4) == 0xf) && (instr->Bit(8) == 0) && | 2873 } else if ((instr->Bits(20, 4) == 0xf) && (instr->Bit(8) == 0) && |
| 2850 (instr->Bits(12, 4) == 0xf)) { | 2874 (instr->Bits(12, 4) == 0xf)) { |
| 2851 // Format(instr, "vmstat'cond"); | 2875 // Format(instr, "vmstat'cond"); |
| 2852 n_flag_ = fp_n_flag_; | 2876 n_flag_ = fp_n_flag_; |
| 2853 z_flag_ = fp_z_flag_; | 2877 z_flag_ = fp_z_flag_; |
| 2854 c_flag_ = fp_c_flag_; | 2878 c_flag_ = fp_c_flag_; |
| 2855 v_flag_ = fp_v_flag_; | 2879 v_flag_ = fp_v_flag_; |
| 2856 } else { | 2880 } else { |
| 2857 UnimplementedInstruction(instr); | 2881 UnimplementedInstruction(instr); |
| (...skipping 235 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 3093 set_register(kExceptionObjectReg, bit_cast<int32_t>(raw_exception)); | 3117 set_register(kExceptionObjectReg, bit_cast<int32_t>(raw_exception)); |
| 3094 set_register(kStackTraceObjectReg, bit_cast<int32_t>(raw_stacktrace)); | 3118 set_register(kStackTraceObjectReg, bit_cast<int32_t>(raw_stacktrace)); |
| 3095 buf->Longjmp(); | 3119 buf->Longjmp(); |
| 3096 } | 3120 } |
| 3097 | 3121 |
| 3098 } // namespace dart | 3122 } // namespace dart |
| 3099 | 3123 |
| 3100 #endif // !defined(HOST_ARCH_ARM) | 3124 #endif // !defined(HOST_ARCH_ARM) |
| 3101 | 3125 |
| 3102 #endif // defined TARGET_ARCH_ARM | 3126 #endif // defined TARGET_ARCH_ARM |
| OLD | NEW |