| OLD | NEW |
| 1 // Copyright 2012 the V8 project authors. All rights reserved. | 1 // Copyright 2012 the V8 project authors. All rights reserved. |
| 2 // Redistribution and use in source and binary forms, with or without | 2 // Redistribution and use in source and binary forms, with or without |
| 3 // modification, are permitted provided that the following conditions are | 3 // modification, are permitted provided that the following conditions are |
| 4 // met: | 4 // met: |
| 5 // | 5 // |
| 6 // * Redistributions of source code must retain the above copyright | 6 // * Redistributions of source code must retain the above copyright |
| 7 // notice, this list of conditions and the following disclaimer. | 7 // notice, this list of conditions and the following disclaimer. |
| 8 // * Redistributions in binary form must reproduce the above | 8 // * Redistributions in binary form must reproduce the above |
| 9 // copyright notice, this list of conditions and the following | 9 // copyright notice, this list of conditions and the following |
| 10 // disclaimer in the documentation and/or other materials provided | 10 // disclaimer in the documentation and/or other materials provided |
| (...skipping 835 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 846 if ((regs & (1 << i)) != 0) { | 846 if ((regs & (1 << i)) != 0) { |
| 847 lw(ToRegister(i), MemOperand(sp, stack_offset)); | 847 lw(ToRegister(i), MemOperand(sp, stack_offset)); |
| 848 stack_offset += kPointerSize; | 848 stack_offset += kPointerSize; |
| 849 } | 849 } |
| 850 } | 850 } |
| 851 addiu(sp, sp, stack_offset); | 851 addiu(sp, sp, stack_offset); |
| 852 } | 852 } |
| 853 | 853 |
| 854 | 854 |
| 855 void MacroAssembler::MultiPushFPU(RegList regs) { | 855 void MacroAssembler::MultiPushFPU(RegList regs) { |
| 856 CpuFeatures::Scope scope(FPU); | 856 CpuFeatureScope scope(this, FPU); |
| 857 int16_t num_to_push = NumberOfBitsSet(regs); | 857 int16_t num_to_push = NumberOfBitsSet(regs); |
| 858 int16_t stack_offset = num_to_push * kDoubleSize; | 858 int16_t stack_offset = num_to_push * kDoubleSize; |
| 859 | 859 |
| 860 Subu(sp, sp, Operand(stack_offset)); | 860 Subu(sp, sp, Operand(stack_offset)); |
| 861 for (int16_t i = kNumRegisters - 1; i >= 0; i--) { | 861 for (int16_t i = kNumRegisters - 1; i >= 0; i--) { |
| 862 if ((regs & (1 << i)) != 0) { | 862 if ((regs & (1 << i)) != 0) { |
| 863 stack_offset -= kDoubleSize; | 863 stack_offset -= kDoubleSize; |
| 864 sdc1(FPURegister::from_code(i), MemOperand(sp, stack_offset)); | 864 sdc1(FPURegister::from_code(i), MemOperand(sp, stack_offset)); |
| 865 } | 865 } |
| 866 } | 866 } |
| 867 } | 867 } |
| 868 | 868 |
| 869 | 869 |
| 870 void MacroAssembler::MultiPushReversedFPU(RegList regs) { | 870 void MacroAssembler::MultiPushReversedFPU(RegList regs) { |
| 871 CpuFeatures::Scope scope(FPU); | 871 CpuFeatureScope scope(this, FPU); |
| 872 int16_t num_to_push = NumberOfBitsSet(regs); | 872 int16_t num_to_push = NumberOfBitsSet(regs); |
| 873 int16_t stack_offset = num_to_push * kDoubleSize; | 873 int16_t stack_offset = num_to_push * kDoubleSize; |
| 874 | 874 |
| 875 Subu(sp, sp, Operand(stack_offset)); | 875 Subu(sp, sp, Operand(stack_offset)); |
| 876 for (int16_t i = 0; i < kNumRegisters; i++) { | 876 for (int16_t i = 0; i < kNumRegisters; i++) { |
| 877 if ((regs & (1 << i)) != 0) { | 877 if ((regs & (1 << i)) != 0) { |
| 878 stack_offset -= kDoubleSize; | 878 stack_offset -= kDoubleSize; |
| 879 sdc1(FPURegister::from_code(i), MemOperand(sp, stack_offset)); | 879 sdc1(FPURegister::from_code(i), MemOperand(sp, stack_offset)); |
| 880 } | 880 } |
| 881 } | 881 } |
| 882 } | 882 } |
| 883 | 883 |
| 884 | 884 |
| 885 void MacroAssembler::MultiPopFPU(RegList regs) { | 885 void MacroAssembler::MultiPopFPU(RegList regs) { |
| 886 CpuFeatures::Scope scope(FPU); | 886 CpuFeatureScope scope(this, FPU); |
| 887 int16_t stack_offset = 0; | 887 int16_t stack_offset = 0; |
| 888 | 888 |
| 889 for (int16_t i = 0; i < kNumRegisters; i++) { | 889 for (int16_t i = 0; i < kNumRegisters; i++) { |
| 890 if ((regs & (1 << i)) != 0) { | 890 if ((regs & (1 << i)) != 0) { |
| 891 ldc1(FPURegister::from_code(i), MemOperand(sp, stack_offset)); | 891 ldc1(FPURegister::from_code(i), MemOperand(sp, stack_offset)); |
| 892 stack_offset += kDoubleSize; | 892 stack_offset += kDoubleSize; |
| 893 } | 893 } |
| 894 } | 894 } |
| 895 addiu(sp, sp, stack_offset); | 895 addiu(sp, sp, stack_offset); |
| 896 } | 896 } |
| 897 | 897 |
| 898 | 898 |
| 899 void MacroAssembler::MultiPopReversedFPU(RegList regs) { | 899 void MacroAssembler::MultiPopReversedFPU(RegList regs) { |
| 900 CpuFeatures::Scope scope(FPU); | 900 CpuFeatureScope scope(this, FPU); |
| 901 int16_t stack_offset = 0; | 901 int16_t stack_offset = 0; |
| 902 | 902 |
| 903 for (int16_t i = kNumRegisters - 1; i >= 0; i--) { | 903 for (int16_t i = kNumRegisters - 1; i >= 0; i--) { |
| 904 if ((regs & (1 << i)) != 0) { | 904 if ((regs & (1 << i)) != 0) { |
| 905 ldc1(FPURegister::from_code(i), MemOperand(sp, stack_offset)); | 905 ldc1(FPURegister::from_code(i), MemOperand(sp, stack_offset)); |
| 906 stack_offset += kDoubleSize; | 906 stack_offset += kDoubleSize; |
| 907 } | 907 } |
| 908 } | 908 } |
| 909 addiu(sp, sp, stack_offset); | 909 addiu(sp, sp, stack_offset); |
| 910 } | 910 } |
| (...skipping 247 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1158 }; | 1158 }; |
| 1159 } | 1159 } |
| 1160 | 1160 |
| 1161 if (bd == PROTECT) { | 1161 if (bd == PROTECT) { |
| 1162 nop(); | 1162 nop(); |
| 1163 } | 1163 } |
| 1164 } | 1164 } |
| 1165 | 1165 |
| 1166 | 1166 |
| 1167 void MacroAssembler::Move(FPURegister dst, double imm) { | 1167 void MacroAssembler::Move(FPURegister dst, double imm) { |
| 1168 ASSERT(CpuFeatures::IsEnabled(FPU)); | 1168 ASSERT(IsEnabled(FPU)); |
| 1169 static const DoubleRepresentation minus_zero(-0.0); | 1169 static const DoubleRepresentation minus_zero(-0.0); |
| 1170 static const DoubleRepresentation zero(0.0); | 1170 static const DoubleRepresentation zero(0.0); |
| 1171 DoubleRepresentation value(imm); | 1171 DoubleRepresentation value(imm); |
| 1172 // Handle special values first. | 1172 // Handle special values first. |
| 1173 bool force_load = dst.is(kDoubleRegZero); | 1173 bool force_load = dst.is(kDoubleRegZero); |
| 1174 if (value.bits == zero.bits && !force_load) { | 1174 if (value.bits == zero.bits && !force_load) { |
| 1175 mov_d(dst, kDoubleRegZero); | 1175 mov_d(dst, kDoubleRegZero); |
| 1176 } else if (value.bits == minus_zero.bits && !force_load) { | 1176 } else if (value.bits == minus_zero.bits && !force_load) { |
| 1177 neg_d(dst, kDoubleRegZero); | 1177 neg_d(dst, kDoubleRegZero); |
| 1178 } else { | 1178 } else { |
| (...skipping 159 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1338 if (!CpuFeatures::IsSupported(FPU)) { | 1338 if (!CpuFeatures::IsSupported(FPU)) { |
| 1339 // We have a shifted exponent between 0 and 30 in scratch2. | 1339 // We have a shifted exponent between 0 and 30 in scratch2. |
| 1340 srl(dest, scratch2, HeapNumber::kExponentShift); | 1340 srl(dest, scratch2, HeapNumber::kExponentShift); |
| 1341 // We now have the exponent in dest. Subtract from 30 to get | 1341 // We now have the exponent in dest. Subtract from 30 to get |
| 1342 // how much to shift down. | 1342 // how much to shift down. |
| 1343 li(at, Operand(30)); | 1343 li(at, Operand(30)); |
| 1344 subu(dest, at, dest); | 1344 subu(dest, at, dest); |
| 1345 } | 1345 } |
| 1346 bind(&right_exponent); | 1346 bind(&right_exponent); |
| 1347 if (CpuFeatures::IsSupported(FPU)) { | 1347 if (CpuFeatures::IsSupported(FPU)) { |
| 1348 CpuFeatures::Scope scope(FPU); | 1348 CpuFeatureScope scope(this, FPU); |
| 1349 // MIPS FPU instructions implementing double precision to integer | 1349 // MIPS FPU instructions implementing double precision to integer |
| 1350 // conversion using round to zero. Since the FP value was qualified | 1350 // conversion using round to zero. Since the FP value was qualified |
| 1351 // above, the resulting integer should be a legal int32. | 1351 // above, the resulting integer should be a legal int32. |
| 1352 // The original 'Exponent' word is still in scratch. | 1352 // The original 'Exponent' word is still in scratch. |
| 1353 lwc1(double_scratch, FieldMemOperand(source, HeapNumber::kMantissaOffset)); | 1353 lwc1(double_scratch, FieldMemOperand(source, HeapNumber::kMantissaOffset)); |
| 1354 mtc1(scratch, FPURegister::from_code(double_scratch.code() + 1)); | 1354 mtc1(scratch, FPURegister::from_code(double_scratch.code() + 1)); |
| 1355 trunc_w_d(double_scratch, double_scratch); | 1355 trunc_w_d(double_scratch, double_scratch); |
| 1356 mfc1(dest, double_scratch); | 1356 mfc1(dest, double_scratch); |
| 1357 } else { | 1357 } else { |
| 1358 // On entry, dest has final downshift, scratch has original sign/exp/mant. | 1358 // On entry, dest has final downshift, scratch has original sign/exp/mant. |
| (...skipping 40 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1399 DoubleRegister double_input, | 1399 DoubleRegister double_input, |
| 1400 Register scratch, | 1400 Register scratch, |
| 1401 DoubleRegister double_scratch, | 1401 DoubleRegister double_scratch, |
| 1402 Register except_flag, | 1402 Register except_flag, |
| 1403 CheckForInexactConversion check_inexact) { | 1403 CheckForInexactConversion check_inexact) { |
| 1404 ASSERT(!result.is(scratch)); | 1404 ASSERT(!result.is(scratch)); |
| 1405 ASSERT(!double_input.is(double_scratch)); | 1405 ASSERT(!double_input.is(double_scratch)); |
| 1406 ASSERT(!except_flag.is(scratch)); | 1406 ASSERT(!except_flag.is(scratch)); |
| 1407 | 1407 |
| 1408 ASSERT(CpuFeatures::IsSupported(FPU)); | 1408 ASSERT(CpuFeatures::IsSupported(FPU)); |
| 1409 CpuFeatures::Scope scope(FPU); | 1409 CpuFeatureScope scope(this, FPU); |
| 1410 Label done; | 1410 Label done; |
| 1411 | 1411 |
| 1412 // Clear the except flag (0 = no exception) | 1412 // Clear the except flag (0 = no exception) |
| 1413 mov(except_flag, zero_reg); | 1413 mov(except_flag, zero_reg); |
| 1414 | 1414 |
| 1415 // Test for values that can be exactly represented as a signed 32-bit integer. | 1415 // Test for values that can be exactly represented as a signed 32-bit integer. |
| 1416 cvt_w_d(double_scratch, double_input); | 1416 cvt_w_d(double_scratch, double_input); |
| 1417 mfc1(result, double_scratch); | 1417 mfc1(result, double_scratch); |
| 1418 cvt_d_w(double_scratch, double_scratch); | 1418 cvt_d_w(double_scratch, double_scratch); |
| 1419 BranchF(&done, NULL, eq, double_input, double_scratch); | 1419 BranchF(&done, NULL, eq, double_input, double_scratch); |
| (...skipping 121 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1541 bind(&done); | 1541 bind(&done); |
| 1542 } | 1542 } |
| 1543 | 1543 |
| 1544 | 1544 |
| 1545 void MacroAssembler::EmitECMATruncate(Register result, | 1545 void MacroAssembler::EmitECMATruncate(Register result, |
| 1546 FPURegister double_input, | 1546 FPURegister double_input, |
| 1547 FPURegister single_scratch, | 1547 FPURegister single_scratch, |
| 1548 Register scratch, | 1548 Register scratch, |
| 1549 Register scratch2, | 1549 Register scratch2, |
| 1550 Register scratch3) { | 1550 Register scratch3) { |
| 1551 CpuFeatures::Scope scope(FPU); | 1551 CpuFeatureScope scope(this, FPU); |
| 1552 ASSERT(!scratch2.is(result)); | 1552 ASSERT(!scratch2.is(result)); |
| 1553 ASSERT(!scratch3.is(result)); | 1553 ASSERT(!scratch3.is(result)); |
| 1554 ASSERT(!scratch3.is(scratch2)); | 1554 ASSERT(!scratch3.is(scratch2)); |
| 1555 ASSERT(!scratch.is(result) && | 1555 ASSERT(!scratch.is(result) && |
| 1556 !scratch.is(scratch2) && | 1556 !scratch.is(scratch2) && |
| 1557 !scratch.is(scratch3)); | 1557 !scratch.is(scratch3)); |
| 1558 ASSERT(!single_scratch.is(double_input)); | 1558 ASSERT(!single_scratch.is(double_input)); |
| 1559 | 1559 |
| 1560 Label done; | 1560 Label done; |
| 1561 Label manual; | 1561 Label manual; |
| (...skipping 1915 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 3477 SmiUntag(untagged_value, value_reg); | 3477 SmiUntag(untagged_value, value_reg); |
| 3478 FloatingPointHelper::ConvertIntToDouble(this, | 3478 FloatingPointHelper::ConvertIntToDouble(this, |
| 3479 untagged_value, | 3479 untagged_value, |
| 3480 destination, | 3480 destination, |
| 3481 f0, | 3481 f0, |
| 3482 mantissa_reg, | 3482 mantissa_reg, |
| 3483 exponent_reg, | 3483 exponent_reg, |
| 3484 scratch4, | 3484 scratch4, |
| 3485 f2); | 3485 f2); |
| 3486 if (destination == FloatingPointHelper::kFPURegisters) { | 3486 if (destination == FloatingPointHelper::kFPURegisters) { |
| 3487 CpuFeatures::Scope scope(FPU); | 3487 CpuFeatureScope scope(this, FPU); |
| 3488 sdc1(f0, MemOperand(scratch1, 0)); | 3488 sdc1(f0, MemOperand(scratch1, 0)); |
| 3489 } else { | 3489 } else { |
| 3490 sw(mantissa_reg, MemOperand(scratch1, 0)); | 3490 sw(mantissa_reg, MemOperand(scratch1, 0)); |
| 3491 sw(exponent_reg, MemOperand(scratch1, Register::kSizeInBytes)); | 3491 sw(exponent_reg, MemOperand(scratch1, Register::kSizeInBytes)); |
| 3492 } | 3492 } |
| 3493 bind(&done); | 3493 bind(&done); |
| 3494 } | 3494 } |
| 3495 | 3495 |
| 3496 | 3496 |
| 3497 void MacroAssembler::CompareMapAndBranch(Register obj, | 3497 void MacroAssembler::CompareMapAndBranch(Register obj, |
| (...skipping 72 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 3570 if (smi_check_type == DO_SMI_CHECK) { | 3570 if (smi_check_type == DO_SMI_CHECK) { |
| 3571 JumpIfSmi(obj, fail); | 3571 JumpIfSmi(obj, fail); |
| 3572 } | 3572 } |
| 3573 lw(scratch, FieldMemOperand(obj, HeapObject::kMapOffset)); | 3573 lw(scratch, FieldMemOperand(obj, HeapObject::kMapOffset)); |
| 3574 LoadRoot(at, index); | 3574 LoadRoot(at, index); |
| 3575 Branch(fail, ne, scratch, Operand(at)); | 3575 Branch(fail, ne, scratch, Operand(at)); |
| 3576 } | 3576 } |
| 3577 | 3577 |
| 3578 | 3578 |
| 3579 void MacroAssembler::GetCFunctionDoubleResult(const DoubleRegister dst) { | 3579 void MacroAssembler::GetCFunctionDoubleResult(const DoubleRegister dst) { |
| 3580 CpuFeatures::Scope scope(FPU); | 3580 CpuFeatureScope scope(this, FPU); |
| 3581 if (IsMipsSoftFloatABI) { | 3581 if (IsMipsSoftFloatABI) { |
| 3582 Move(dst, v0, v1); | 3582 Move(dst, v0, v1); |
| 3583 } else { | 3583 } else { |
| 3584 Move(dst, f0); // Reg f0 is o32 ABI FP return value. | 3584 Move(dst, f0); // Reg f0 is o32 ABI FP return value. |
| 3585 } | 3585 } |
| 3586 } | 3586 } |
| 3587 | 3587 |
| 3588 | 3588 |
| 3589 void MacroAssembler::SetCallCDoubleArguments(DoubleRegister dreg) { | 3589 void MacroAssembler::SetCallCDoubleArguments(DoubleRegister dreg) { |
| 3590 CpuFeatures::Scope scope(FPU); | 3590 CpuFeatureScope scope(this, FPU); |
| 3591 if (!IsMipsSoftFloatABI) { | 3591 if (!IsMipsSoftFloatABI) { |
| 3592 Move(f12, dreg); | 3592 Move(f12, dreg); |
| 3593 } else { | 3593 } else { |
| 3594 Move(a0, a1, dreg); | 3594 Move(a0, a1, dreg); |
| 3595 } | 3595 } |
| 3596 } | 3596 } |
| 3597 | 3597 |
| 3598 | 3598 |
| 3599 void MacroAssembler::SetCallCDoubleArguments(DoubleRegister dreg1, | 3599 void MacroAssembler::SetCallCDoubleArguments(DoubleRegister dreg1, |
| 3600 DoubleRegister dreg2) { | 3600 DoubleRegister dreg2) { |
| 3601 CpuFeatures::Scope scope(FPU); | 3601 CpuFeatureScope scope(this, FPU); |
| 3602 if (!IsMipsSoftFloatABI) { | 3602 if (!IsMipsSoftFloatABI) { |
| 3603 if (dreg2.is(f12)) { | 3603 if (dreg2.is(f12)) { |
| 3604 ASSERT(!dreg1.is(f14)); | 3604 ASSERT(!dreg1.is(f14)); |
| 3605 Move(f14, dreg2); | 3605 Move(f14, dreg2); |
| 3606 Move(f12, dreg1); | 3606 Move(f12, dreg1); |
| 3607 } else { | 3607 } else { |
| 3608 Move(f12, dreg1); | 3608 Move(f12, dreg1); |
| 3609 Move(f14, dreg2); | 3609 Move(f14, dreg2); |
| 3610 } | 3610 } |
| 3611 } else { | 3611 } else { |
| 3612 Move(a0, a1, dreg1); | 3612 Move(a0, a1, dreg1); |
| 3613 Move(a2, a3, dreg2); | 3613 Move(a2, a3, dreg2); |
| 3614 } | 3614 } |
| 3615 } | 3615 } |
| 3616 | 3616 |
| 3617 | 3617 |
| 3618 void MacroAssembler::SetCallCDoubleArguments(DoubleRegister dreg, | 3618 void MacroAssembler::SetCallCDoubleArguments(DoubleRegister dreg, |
| 3619 Register reg) { | 3619 Register reg) { |
| 3620 CpuFeatures::Scope scope(FPU); | 3620 CpuFeatureScope scope(this, FPU); |
| 3621 if (!IsMipsSoftFloatABI) { | 3621 if (!IsMipsSoftFloatABI) { |
| 3622 Move(f12, dreg); | 3622 Move(f12, dreg); |
| 3623 Move(a2, reg); | 3623 Move(a2, reg); |
| 3624 } else { | 3624 } else { |
| 3625 Move(a2, reg); | 3625 Move(a2, reg); |
| 3626 Move(a0, a1, dreg); | 3626 Move(a0, a1, dreg); |
| 3627 } | 3627 } |
| 3628 } | 3628 } |
| 3629 | 3629 |
| 3630 | 3630 |
| (...skipping 994 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 4625 sw(t8, MemOperand(fp, ExitFrameConstants::kCodeOffset)); | 4625 sw(t8, MemOperand(fp, ExitFrameConstants::kCodeOffset)); |
| 4626 | 4626 |
| 4627 // Save the frame pointer and the context in top. | 4627 // Save the frame pointer and the context in top. |
| 4628 li(t8, Operand(ExternalReference(Isolate::kCEntryFPAddress, isolate()))); | 4628 li(t8, Operand(ExternalReference(Isolate::kCEntryFPAddress, isolate()))); |
| 4629 sw(fp, MemOperand(t8)); | 4629 sw(fp, MemOperand(t8)); |
| 4630 li(t8, Operand(ExternalReference(Isolate::kContextAddress, isolate()))); | 4630 li(t8, Operand(ExternalReference(Isolate::kContextAddress, isolate()))); |
| 4631 sw(cp, MemOperand(t8)); | 4631 sw(cp, MemOperand(t8)); |
| 4632 | 4632 |
| 4633 const int frame_alignment = MacroAssembler::ActivationFrameAlignment(); | 4633 const int frame_alignment = MacroAssembler::ActivationFrameAlignment(); |
| 4634 if (save_doubles) { | 4634 if (save_doubles) { |
| 4635 CpuFeatures::Scope scope(FPU); | 4635 CpuFeatureScope scope(this, FPU); |
| 4636 // The stack must be allign to 0 modulo 8 for stores with sdc1. | 4636 // The stack must be allign to 0 modulo 8 for stores with sdc1. |
| 4637 ASSERT(kDoubleSize == frame_alignment); | 4637 ASSERT(kDoubleSize == frame_alignment); |
| 4638 if (frame_alignment > 0) { | 4638 if (frame_alignment > 0) { |
| 4639 ASSERT(IsPowerOf2(frame_alignment)); | 4639 ASSERT(IsPowerOf2(frame_alignment)); |
| 4640 And(sp, sp, Operand(-frame_alignment)); // Align stack. | 4640 And(sp, sp, Operand(-frame_alignment)); // Align stack. |
| 4641 } | 4641 } |
| 4642 int space = FPURegister::kMaxNumRegisters * kDoubleSize; | 4642 int space = FPURegister::kMaxNumRegisters * kDoubleSize; |
| 4643 Subu(sp, sp, Operand(space)); | 4643 Subu(sp, sp, Operand(space)); |
| 4644 // Remember: we only need to save every 2nd double FPU value. | 4644 // Remember: we only need to save every 2nd double FPU value. |
| 4645 for (int i = 0; i < FPURegister::kMaxNumRegisters; i+=2) { | 4645 for (int i = 0; i < FPURegister::kMaxNumRegisters; i+=2) { |
| (...skipping 17 matching lines...) Expand all Loading... |
| 4663 addiu(at, sp, kPointerSize); | 4663 addiu(at, sp, kPointerSize); |
| 4664 sw(at, MemOperand(fp, ExitFrameConstants::kSPOffset)); | 4664 sw(at, MemOperand(fp, ExitFrameConstants::kSPOffset)); |
| 4665 } | 4665 } |
| 4666 | 4666 |
| 4667 | 4667 |
| 4668 void MacroAssembler::LeaveExitFrame(bool save_doubles, | 4668 void MacroAssembler::LeaveExitFrame(bool save_doubles, |
| 4669 Register argument_count, | 4669 Register argument_count, |
| 4670 bool do_return) { | 4670 bool do_return) { |
| 4671 // Optionally restore all double registers. | 4671 // Optionally restore all double registers. |
| 4672 if (save_doubles) { | 4672 if (save_doubles) { |
| 4673 CpuFeatures::Scope scope(FPU); | 4673 CpuFeatureScope scope(this, FPU); |
| 4674 // Remember: we only need to restore every 2nd double FPU value. | 4674 // Remember: we only need to restore every 2nd double FPU value. |
| 4675 lw(t8, MemOperand(fp, ExitFrameConstants::kSPOffset)); | 4675 lw(t8, MemOperand(fp, ExitFrameConstants::kSPOffset)); |
| 4676 for (int i = 0; i < FPURegister::kMaxNumRegisters; i+=2) { | 4676 for (int i = 0; i < FPURegister::kMaxNumRegisters; i+=2) { |
| 4677 FPURegister reg = FPURegister::from_code(i); | 4677 FPURegister reg = FPURegister::from_code(i); |
| 4678 ldc1(reg, MemOperand(t8, i * kDoubleSize + kPointerSize)); | 4678 ldc1(reg, MemOperand(t8, i * kDoubleSize + kPointerSize)); |
| 4679 } | 4679 } |
| 4680 } | 4680 } |
| 4681 | 4681 |
| 4682 // Clear top frame. | 4682 // Clear top frame. |
| 4683 li(t8, Operand(ExternalReference(Isolate::kCEntryFPAddress, isolate()))); | 4683 li(t8, Operand(ExternalReference(Isolate::kCEntryFPAddress, isolate()))); |
| (...skipping 847 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 5531 opcode == BGTZL); | 5531 opcode == BGTZL); |
| 5532 opcode = (cond == eq) ? BEQ : BNE; | 5532 opcode = (cond == eq) ? BEQ : BNE; |
| 5533 instr = (instr & ~kOpcodeMask) | opcode; | 5533 instr = (instr & ~kOpcodeMask) | opcode; |
| 5534 masm_.emit(instr); | 5534 masm_.emit(instr); |
| 5535 } | 5535 } |
| 5536 | 5536 |
| 5537 | 5537 |
| 5538 } } // namespace v8::internal | 5538 } } // namespace v8::internal |
| 5539 | 5539 |
| 5540 #endif // V8_TARGET_ARCH_MIPS | 5540 #endif // V8_TARGET_ARCH_MIPS |
| OLD | NEW |