OLD | NEW |
1 // Copyright 2012 the V8 project authors. All rights reserved. | 1 // Copyright 2012 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 <stdarg.h> | 5 #include <stdarg.h> |
6 #include <stdlib.h> | 6 #include <stdlib.h> |
7 #include <cmath> | 7 #include <cmath> |
8 | 8 |
9 #if V8_TARGET_ARCH_ARM | 9 #if V8_TARGET_ARCH_ARM |
10 | 10 |
(...skipping 3975 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
3986 int Vm = instr->VFPMRegValue(kSimd128Precision); | 3986 int Vm = instr->VFPMRegValue(kSimd128Precision); |
3987 int Vn = instr->VFPNRegValue(kSimd128Precision); | 3987 int Vn = instr->VFPNRegValue(kSimd128Precision); |
3988 float src1[4], src2[4]; | 3988 float src1[4], src2[4]; |
3989 get_q_register(Vn, src1); | 3989 get_q_register(Vn, src1); |
3990 get_q_register(Vm, src2); | 3990 get_q_register(Vm, src2); |
3991 uint32_t dst[4]; | 3991 uint32_t dst[4]; |
3992 for (int i = 0; i < 4; i++) { | 3992 for (int i = 0; i < 4; i++) { |
3993 dst[i] = (src1[i] == src2[i]) ? 0xFFFFFFFF : 0; | 3993 dst[i] = (src1[i] == src2[i]) ? 0xFFFFFFFF : 0; |
3994 } | 3994 } |
3995 set_q_register(Vd, dst); | 3995 set_q_register(Vd, dst); |
3996 | 3996 } else if (instr->Bit(20) == 0 && instr->Bits(11, 8) == 0xf && |
| 3997 instr->Bit(6) == 1 && instr->Bit(4) == 1) { |
| 3998 int Vd = instr->VFPDRegValue(kSimd128Precision); |
| 3999 int Vm = instr->VFPMRegValue(kSimd128Precision); |
| 4000 int Vn = instr->VFPNRegValue(kSimd128Precision); |
| 4001 float src1[4], src2[4]; |
| 4002 get_q_register(Vn, src1); |
| 4003 get_q_register(Vm, src2); |
| 4004 if (instr->Bit(21) == 0) { |
| 4005 // vrecps.f32 Qd, Qm, Qn. |
| 4006 for (int i = 0; i < 4; i++) { |
| 4007 src1[i] = 2.0f - src1[i] * src2[i]; |
| 4008 } |
| 4009 } else { |
| 4010 // vrsqrts.f32 Qd, Qm, Qn. |
| 4011 for (int i = 0; i < 4; i++) { |
| 4012 src1[i] = (3.0f - src1[i] * src2[i]) * 0.5f; |
| 4013 } |
| 4014 } |
| 4015 set_q_register(Vd, src1); |
3997 } else { | 4016 } else { |
3998 UNIMPLEMENTED(); | 4017 UNIMPLEMENTED(); |
3999 } | 4018 } |
4000 break; | 4019 break; |
4001 case 5: | 4020 case 5: |
4002 if ((instr->Bits(18, 16) == 0) && (instr->Bits(11, 6) == 0x28) && | 4021 if ((instr->Bits(18, 16) == 0) && (instr->Bits(11, 6) == 0x28) && |
4003 (instr->Bit(4) == 1)) { | 4022 (instr->Bit(4) == 1)) { |
4004 // vmovl signed | 4023 // vmovl signed |
4005 if ((instr->VdValue() & 1) != 0) UNIMPLEMENTED(); | 4024 if ((instr->VdValue() & 1) != 0) UNIMPLEMENTED(); |
4006 int Vd = (instr->Bit(22) << 3) | (instr->VdValue() >> 1); | 4025 int Vd = (instr->Bit(22) << 3) | (instr->VdValue() >> 1); |
(...skipping 512 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
4519 break; | 4538 break; |
4520 } | 4539 } |
4521 default: | 4540 default: |
4522 UNIMPLEMENTED(); | 4541 UNIMPLEMENTED(); |
4523 break; | 4542 break; |
4524 } | 4543 } |
4525 } | 4544 } |
4526 } else { | 4545 } else { |
4527 UNIMPLEMENTED(); | 4546 UNIMPLEMENTED(); |
4528 } | 4547 } |
| 4548 } else if (instr->Bits(19, 18) == 0x2 && instr->Bits(11, 8) == 0x5) { |
| 4549 // vrecpe/vrsqrte.f32 Qd, Qm. |
| 4550 int Vd = instr->VFPDRegValue(kSimd128Precision); |
| 4551 int Vm = instr->VFPMRegValue(kSimd128Precision); |
| 4552 uint32_t src[4]; |
| 4553 get_q_register(Vm, src); |
| 4554 if (instr->Bit(7) == 0) { |
| 4555 for (int i = 0; i < 4; i++) { |
| 4556 float denom = bit_cast<float>(src[i]); |
| 4557 div_zero_vfp_flag_ = (denom == 0); |
| 4558 float result = 1.0f / denom; |
| 4559 result = canonicalizeNaN(result); |
| 4560 src[i] = bit_cast<uint32_t>(result); |
| 4561 } |
| 4562 } else { |
| 4563 lazily_initialize_fast_sqrt(isolate_); |
| 4564 for (int i = 0; i < 4; i++) { |
| 4565 float radicand = bit_cast<float>(src[i]); |
| 4566 float result = 1.0f / fast_sqrt(radicand, isolate_); |
| 4567 result = canonicalizeNaN(result); |
| 4568 src[i] = bit_cast<uint32_t>(result); |
| 4569 } |
| 4570 } |
| 4571 set_q_register(Vd, src); |
4529 } else { | 4572 } else { |
4530 UNIMPLEMENTED(); | 4573 UNIMPLEMENTED(); |
4531 } | 4574 } |
4532 } else { | 4575 } else { |
4533 UNIMPLEMENTED(); | 4576 UNIMPLEMENTED(); |
4534 } | 4577 } |
4535 break; | 4578 break; |
4536 case 8: | 4579 case 8: |
4537 if (instr->Bits(21, 20) == 0) { | 4580 if (instr->Bits(21, 20) == 0) { |
4538 // vst1 | 4581 // vst1 |
(...skipping 503 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
5042 set_register(sp, current_sp + sizeof(uintptr_t)); | 5085 set_register(sp, current_sp + sizeof(uintptr_t)); |
5043 return address; | 5086 return address; |
5044 } | 5087 } |
5045 | 5088 |
5046 } // namespace internal | 5089 } // namespace internal |
5047 } // namespace v8 | 5090 } // namespace v8 |
5048 | 5091 |
5049 #endif // USE_SIMULATOR | 5092 #endif // USE_SIMULATOR |
5050 | 5093 |
5051 #endif // V8_TARGET_ARCH_ARM | 5094 #endif // V8_TARGET_ARCH_ARM |
OLD | NEW |