| OLD | NEW |
| 1 // Copyright 2013 the V8 project authors. All rights reserved. | 1 // Copyright 2013 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 570 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 581 | 581 |
| 582 void MacroAssembler::Fcmp(const FPRegister& fn, const FPRegister& fm) { | 582 void MacroAssembler::Fcmp(const FPRegister& fn, const FPRegister& fm) { |
| 583 ASSERT(allow_macro_instructions_); | 583 ASSERT(allow_macro_instructions_); |
| 584 fcmp(fn, fm); | 584 fcmp(fn, fm); |
| 585 } | 585 } |
| 586 | 586 |
| 587 | 587 |
| 588 void MacroAssembler::Fcmp(const FPRegister& fn, double value) { | 588 void MacroAssembler::Fcmp(const FPRegister& fn, double value) { |
| 589 ASSERT(allow_macro_instructions_); | 589 ASSERT(allow_macro_instructions_); |
| 590 if (value != 0.0) { | 590 if (value != 0.0) { |
| 591 FPRegister tmp = AppropriateTempFor(fn); | 591 UseScratchRegisterScope temps(this); |
| 592 FPRegister tmp = temps.AcquireSameSizeAs(fn); |
| 592 Fmov(tmp, value); | 593 Fmov(tmp, value); |
| 593 fcmp(fn, tmp); | 594 fcmp(fn, tmp); |
| 594 } else { | 595 } else { |
| 595 fcmp(fn, value); | 596 fcmp(fn, value); |
| 596 } | 597 } |
| 597 } | 598 } |
| 598 | 599 |
| 599 | 600 |
| 600 void MacroAssembler::Fcsel(const FPRegister& fd, | 601 void MacroAssembler::Fcsel(const FPRegister& fd, |
| 601 const FPRegister& fn, | 602 const FPRegister& fn, |
| (...skipping 133 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 735 | 736 |
| 736 | 737 |
| 737 void MacroAssembler::Fmov(FPRegister fd, double imm) { | 738 void MacroAssembler::Fmov(FPRegister fd, double imm) { |
| 738 ASSERT(allow_macro_instructions_); | 739 ASSERT(allow_macro_instructions_); |
| 739 if ((fd.Is64Bits() && IsImmFP64(imm)) || | 740 if ((fd.Is64Bits() && IsImmFP64(imm)) || |
| 740 (fd.Is32Bits() && IsImmFP32(imm)) || | 741 (fd.Is32Bits() && IsImmFP32(imm)) || |
| 741 ((imm == 0.0) && (copysign(1.0, imm) == 1.0))) { | 742 ((imm == 0.0) && (copysign(1.0, imm) == 1.0))) { |
| 742 // These cases can be handled by the Assembler. | 743 // These cases can be handled by the Assembler. |
| 743 fmov(fd, imm); | 744 fmov(fd, imm); |
| 744 } else { | 745 } else { |
| 746 UseScratchRegisterScope temps(this); |
| 745 // TODO(all): The Assembler would try to relocate the immediate with | 747 // TODO(all): The Assembler would try to relocate the immediate with |
| 746 // Assembler::ldr(const FPRegister& ft, double imm) but it is not | 748 // Assembler::ldr(const FPRegister& ft, double imm) but it is not |
| 747 // implemented yet. | 749 // implemented yet. |
| 748 if (fd.SizeInBits() == kDRegSize) { | 750 if (fd.SizeInBits() == kDRegSize) { |
| 749 Mov(Tmp0(), double_to_rawbits(imm)); | 751 Register tmp = temps.AcquireX(); |
| 750 Fmov(fd, Tmp0()); | 752 Mov(tmp, double_to_rawbits(imm)); |
| 753 Fmov(fd, tmp); |
| 751 } else { | 754 } else { |
| 752 ASSERT(fd.SizeInBits() == kSRegSize); | 755 ASSERT(fd.SizeInBits() == kSRegSize); |
| 753 Mov(WTmp0(), float_to_rawbits(static_cast<float>(imm))); | 756 Register tmp = temps.AcquireW(); |
| 754 Fmov(fd, WTmp0()); | 757 Mov(tmp, float_to_rawbits(static_cast<float>(imm))); |
| 758 Fmov(fd, tmp); |
| 755 } | 759 } |
| 756 } | 760 } |
| 757 } | 761 } |
| 758 | 762 |
| 759 | 763 |
| 760 void MacroAssembler::Fmov(Register rd, FPRegister fn) { | 764 void MacroAssembler::Fmov(Register rd, FPRegister fn) { |
| 761 ASSERT(allow_macro_instructions_); | 765 ASSERT(allow_macro_instructions_); |
| 762 ASSERT(!rd.IsZero()); | 766 ASSERT(!rd.IsZero()); |
| 763 fmov(rd, fn); | 767 fmov(rd, fn); |
| 764 } | 768 } |
| (...skipping 579 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1344 void MacroAssembler::JumpIfNotSmi(Register value, Label* not_smi_label) { | 1348 void MacroAssembler::JumpIfNotSmi(Register value, Label* not_smi_label) { |
| 1345 JumpIfSmi(value, NULL, not_smi_label); | 1349 JumpIfSmi(value, NULL, not_smi_label); |
| 1346 } | 1350 } |
| 1347 | 1351 |
| 1348 | 1352 |
| 1349 void MacroAssembler::JumpIfBothSmi(Register value1, | 1353 void MacroAssembler::JumpIfBothSmi(Register value1, |
| 1350 Register value2, | 1354 Register value2, |
| 1351 Label* both_smi_label, | 1355 Label* both_smi_label, |
| 1352 Label* not_smi_label) { | 1356 Label* not_smi_label) { |
| 1353 STATIC_ASSERT((kSmiTagSize == 1) && (kSmiTag == 0)); | 1357 STATIC_ASSERT((kSmiTagSize == 1) && (kSmiTag == 0)); |
| 1358 UseScratchRegisterScope temps(this); |
| 1359 Register tmp = temps.AcquireX(); |
| 1354 // Check if both tag bits are clear. | 1360 // Check if both tag bits are clear. |
| 1355 Orr(Tmp0(), value1, value2); | 1361 Orr(tmp, value1, value2); |
| 1356 JumpIfSmi(Tmp0(), both_smi_label, not_smi_label); | 1362 JumpIfSmi(tmp, both_smi_label, not_smi_label); |
| 1357 } | 1363 } |
| 1358 | 1364 |
| 1359 | 1365 |
| 1360 void MacroAssembler::JumpIfEitherSmi(Register value1, | 1366 void MacroAssembler::JumpIfEitherSmi(Register value1, |
| 1361 Register value2, | 1367 Register value2, |
| 1362 Label* either_smi_label, | 1368 Label* either_smi_label, |
| 1363 Label* not_smi_label) { | 1369 Label* not_smi_label) { |
| 1364 STATIC_ASSERT((kSmiTagSize == 1) && (kSmiTag == 0)); | 1370 STATIC_ASSERT((kSmiTagSize == 1) && (kSmiTag == 0)); |
| 1371 UseScratchRegisterScope temps(this); |
| 1372 Register tmp = temps.AcquireX(); |
| 1365 // Check if either tag bit is clear. | 1373 // Check if either tag bit is clear. |
| 1366 And(Tmp0(), value1, value2); | 1374 And(tmp, value1, value2); |
| 1367 JumpIfSmi(Tmp0(), either_smi_label, not_smi_label); | 1375 JumpIfSmi(tmp, either_smi_label, not_smi_label); |
| 1368 } | 1376 } |
| 1369 | 1377 |
| 1370 | 1378 |
| 1371 void MacroAssembler::JumpIfEitherNotSmi(Register value1, | 1379 void MacroAssembler::JumpIfEitherNotSmi(Register value1, |
| 1372 Register value2, | 1380 Register value2, |
| 1373 Label* not_smi_label) { | 1381 Label* not_smi_label) { |
| 1374 JumpIfBothSmi(value1, value2, NULL, not_smi_label); | 1382 JumpIfBothSmi(value1, value2, NULL, not_smi_label); |
| 1375 } | 1383 } |
| 1376 | 1384 |
| 1377 | 1385 |
| (...skipping 52 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1430 } else if (not_string == NULL) { | 1438 } else if (not_string == NULL) { |
| 1431 TestAndBranchIfAllClear(type.W(), kIsNotStringMask, string); | 1439 TestAndBranchIfAllClear(type.W(), kIsNotStringMask, string); |
| 1432 } else { | 1440 } else { |
| 1433 TestAndBranchIfAnySet(type.W(), kIsNotStringMask, not_string); | 1441 TestAndBranchIfAnySet(type.W(), kIsNotStringMask, not_string); |
| 1434 B(string); | 1442 B(string); |
| 1435 } | 1443 } |
| 1436 } | 1444 } |
| 1437 | 1445 |
| 1438 | 1446 |
| 1439 void MacroAssembler::Push(Handle<Object> handle) { | 1447 void MacroAssembler::Push(Handle<Object> handle) { |
| 1440 Mov(Tmp0(), Operand(handle)); | 1448 UseScratchRegisterScope temps(this); |
| 1441 Push(Tmp0()); | 1449 Register tmp = temps.AcquireX(); |
| 1450 Mov(tmp, Operand(handle)); |
| 1451 Push(tmp); |
| 1442 } | 1452 } |
| 1443 | 1453 |
| 1444 | 1454 |
| 1445 void MacroAssembler::Claim(uint64_t count, uint64_t unit_size) { | 1455 void MacroAssembler::Claim(uint64_t count, uint64_t unit_size) { |
| 1446 uint64_t size = count * unit_size; | 1456 uint64_t size = count * unit_size; |
| 1447 | 1457 |
| 1448 if (size == 0) { | 1458 if (size == 0) { |
| 1449 return; | 1459 return; |
| 1450 } | 1460 } |
| 1451 | 1461 |
| (...skipping 187 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1639 // characters are reserved for controlling features of the instrumentation. | 1649 // characters are reserved for controlling features of the instrumentation. |
| 1640 ASSERT(isprint(marker_name[0]) && isprint(marker_name[1])); | 1650 ASSERT(isprint(marker_name[0]) && isprint(marker_name[1])); |
| 1641 | 1651 |
| 1642 InstructionAccurateScope scope(this, 1); | 1652 InstructionAccurateScope scope(this, 1); |
| 1643 movn(xzr, (marker_name[1] << 8) | marker_name[0]); | 1653 movn(xzr, (marker_name[1] << 8) | marker_name[0]); |
| 1644 } | 1654 } |
| 1645 | 1655 |
| 1646 } } // namespace v8::internal | 1656 } } // namespace v8::internal |
| 1647 | 1657 |
| 1648 #endif // V8_A64_MACRO_ASSEMBLER_A64_INL_H_ | 1658 #endif // V8_A64_MACRO_ASSEMBLER_A64_INL_H_ |
| OLD | NEW |