Chromium Code Reviews| 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 522 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 533 Register dst, | 533 Register dst, |
| 534 Register heap_number_map, | 534 Register heap_number_map, |
| 535 Register scratch, | 535 Register scratch, |
| 536 DwVfpRegister double_scratch0, | 536 DwVfpRegister double_scratch0, |
| 537 LowDwVfpRegister double_scratch1, | 537 LowDwVfpRegister double_scratch1, |
| 538 Label* not_int32); | 538 Label* not_int32); |
| 539 | 539 |
| 540 // Generates function and stub prologue code. | 540 // Generates function and stub prologue code. |
| 541 void Prologue(PrologueFrameMode frame_mode); | 541 void Prologue(PrologueFrameMode frame_mode); |
| 542 | 542 |
| 543 // Loads the constant pool pointer (pp) register. | |
| 544 void LoadConstantPoolPointerRegister(); | |
| 545 | |
| 546 // Enter exit frame. | 543 // Enter exit frame. |
| 547 // stack_space - extra stack space, used for alignment before call to C. | 544 // stack_space - extra stack space, used for alignment before call to C. |
| 548 void EnterExitFrame(bool save_doubles, int stack_space = 0); | 545 void EnterExitFrame(bool save_doubles, int stack_space = 0); |
| 549 | 546 |
| 550 // Leave the current exit frame. Expects the return value in r0. | 547 // Leave the current exit frame. Expects the return value in r0. |
| 551 // Expect the number of values, pushed prior to the exit frame, to | 548 // Expect the number of values, pushed prior to the exit frame, to |
| 552 // remove in a register (or no_reg, if there is nothing to remove). | 549 // remove in a register (or no_reg, if there is nothing to remove). |
| 553 void LeaveExitFrame(bool save_doubles, | 550 void LeaveExitFrame(bool save_doubles, |
| 554 Register argument_count, | 551 Register argument_count, |
| 555 bool restore_context); | 552 bool restore_context); |
| (...skipping 820 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1376 | 1373 |
| 1377 template<typename Field> | 1374 template<typename Field> |
| 1378 void DecodeField(Register reg) { | 1375 void DecodeField(Register reg) { |
| 1379 static const int shift = Field::kShift; | 1376 static const int shift = Field::kShift; |
| 1380 static const int mask = (Field::kMask >> shift) << kSmiTagSize; | 1377 static const int mask = (Field::kMask >> shift) << kSmiTagSize; |
| 1381 mov(reg, Operand(reg, LSR, shift)); | 1378 mov(reg, Operand(reg, LSR, shift)); |
| 1382 and_(reg, reg, Operand(mask)); | 1379 and_(reg, reg, Operand(mask)); |
| 1383 } | 1380 } |
| 1384 | 1381 |
| 1385 // Activation support. | 1382 // Activation support. |
| 1386 void EnterFrame(StackFrame::Type type); | 1383 void EnterFrame(StackFrame::Type type, bool load_constant_pool = false); |
| 1387 // Returns the pc offset at which the frame ends. | 1384 // Returns the pc offset at which the frame ends. |
| 1388 int LeaveFrame(StackFrame::Type type); | 1385 int LeaveFrame(StackFrame::Type type); |
| 1389 | 1386 |
| 1390 // Expects object in r0 and returns map with validated enum cache | 1387 // Expects object in r0 and returns map with validated enum cache |
| 1391 // in r0. Assumes that any other register can be used as a scratch. | 1388 // in r0. Assumes that any other register can be used as a scratch. |
| 1392 void CheckEnumCache(Register null_value, Label* call_runtime); | 1389 void CheckEnumCache(Register null_value, Label* call_runtime); |
| 1393 | 1390 |
| 1394 // AllocationMemento support. Arrays may have an associated | 1391 // AllocationMemento support. Arrays may have an associated |
| 1395 // AllocationMemento object that can be checked for in order to pretransition | 1392 // AllocationMemento object that can be checked for in order to pretransition |
| 1396 // to another type. | 1393 // to another type. |
| (...skipping 56 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1453 | 1450 |
| 1454 // Helper for throwing exceptions. Compute a handler address and jump to | 1451 // Helper for throwing exceptions. Compute a handler address and jump to |
| 1455 // it. See the implementation for register usage. | 1452 // it. See the implementation for register usage. |
| 1456 void JumpToHandlerEntry(); | 1453 void JumpToHandlerEntry(); |
| 1457 | 1454 |
| 1458 // Compute memory operands for safepoint stack slots. | 1455 // Compute memory operands for safepoint stack slots. |
| 1459 static int SafepointRegisterStackIndex(int reg_code); | 1456 static int SafepointRegisterStackIndex(int reg_code); |
| 1460 MemOperand SafepointRegisterSlot(Register reg); | 1457 MemOperand SafepointRegisterSlot(Register reg); |
| 1461 MemOperand SafepointRegistersAndDoublesSlot(Register reg); | 1458 MemOperand SafepointRegistersAndDoublesSlot(Register reg); |
| 1462 | 1459 |
| 1460 // Loads the constant pool pointer (pp) register. | |
| 1461 void LoadConstantPoolPointerRegister(); | |
| 1462 | |
| 1463 bool generating_stub_; | 1463 bool generating_stub_; |
| 1464 bool has_frame_; | 1464 bool has_frame_; |
| 1465 // This handle will be patched with the code object on installation. | 1465 // This handle will be patched with the code object on installation. |
| 1466 Handle<Object> code_object_; | 1466 Handle<Object> code_object_; |
| 1467 | 1467 |
| 1468 // Needs access to SafepointRegisterStackIndex for compiled frame | 1468 // Needs access to SafepointRegisterStackIndex for compiled frame |
| 1469 // traversal. | 1469 // traversal. |
| 1470 friend class StandardFrame; | 1470 friend class StandardFrame; |
| 1471 }; | 1471 }; |
| 1472 | 1472 |
| (...skipping 29 matching lines...) Expand all Loading... | |
| 1502 void EmitCondition(Condition cond); | 1502 void EmitCondition(Condition cond); |
| 1503 | 1503 |
| 1504 private: | 1504 private: |
| 1505 byte* address_; // The address of the code being patched. | 1505 byte* address_; // The address of the code being patched. |
| 1506 int size_; // Number of bytes of the expected patch size. | 1506 int size_; // Number of bytes of the expected patch size. |
| 1507 MacroAssembler masm_; // Macro assembler used to generate the code. | 1507 MacroAssembler masm_; // Macro assembler used to generate the code. |
| 1508 FlushICache flush_cache_; // Whether to flush the I cache after patching. | 1508 FlushICache flush_cache_; // Whether to flush the I cache after patching. |
| 1509 }; | 1509 }; |
| 1510 | 1510 |
| 1511 | 1511 |
| 1512 class FrameAndConstantPoolScope { | |
| 1513 public: | |
| 1514 FrameAndConstantPoolScope(MacroAssembler* masm, StackFrame::Type type) | |
| 1515 : masm_(masm), | |
| 1516 type_(type), | |
| 1517 old_has_frame_(masm->has_frame()), | |
| 1518 old_constant_pool_available_(masm->is_constant_pool_available()) { | |
| 1519 // The constant pool load happens in EnterFrame, so this must not be a | |
| 1520 // manual or none frame type. | |
|
ulan
2014/03/11 13:00:46
Did you mean to assert (type_ != StackFrame::MANUA
rmcilroy
2014/03/11 16:36:34
Ahh originally had this assert, but changed it to
| |
| 1521 masm->set_has_frame(true); | |
| 1522 masm->set_constant_pool_available(true); | |
| 1523 if (type_ != StackFrame::MANUAL && type_ != StackFrame::NONE) { | |
| 1524 masm->EnterFrame(type, !old_constant_pool_available_); | |
| 1525 } | |
| 1526 } | |
| 1527 | |
| 1528 ~FrameAndConstantPoolScope() { | |
| 1529 masm_->LeaveFrame(type_); | |
| 1530 masm_->set_has_frame(old_has_frame_); | |
| 1531 masm_->set_constant_pool_available(old_has_frame_); | |
|
Rodolph Perfetta (ARM)
2014/03/11 13:28:34
old_constant_pool_available_
rmcilroy
2014/03/11 16:36:34
Done thanks (I had this change, but it seemed to h
| |
| 1532 } | |
| 1533 | |
| 1534 // Normally we generate the leave-frame code when this object goes | |
| 1535 // out of scope. Sometimes we may need to generate the code somewhere else | |
| 1536 // in addition. Calling this will achieve that, but the object stays in | |
| 1537 // scope, the MacroAssembler is still marked as being in a frame scope, and | |
| 1538 // the code will be generated again when it goes out of scope. | |
| 1539 void GenerateLeaveFrame() { | |
| 1540 ASSERT(type_ != StackFrame::MANUAL && type_ != StackFrame::NONE); | |
| 1541 masm_->LeaveFrame(type_); | |
| 1542 } | |
| 1543 | |
| 1544 private: | |
| 1545 MacroAssembler* masm_; | |
| 1546 StackFrame::Type type_; | |
| 1547 bool old_has_frame_; | |
| 1548 bool old_constant_pool_available_; | |
| 1549 | |
| 1550 DISALLOW_IMPLICIT_CONSTRUCTORS(FrameAndConstantPoolScope); | |
| 1551 }; | |
| 1552 | |
| 1553 | |
| 1554 // Class for scoping the the unavailability of constant pool access. | |
| 1555 class ConstantPoolUnavailableScope { | |
| 1556 public: | |
| 1557 explicit ConstantPoolUnavailableScope(MacroAssembler* masm) | |
| 1558 : masm_(masm), | |
| 1559 old_constant_pool_available_(masm->is_constant_pool_available()) { | |
| 1560 if (FLAG_enable_ool_constant_pool) { | |
| 1561 masm_->set_constant_pool_available(false); | |
| 1562 } | |
| 1563 } | |
| 1564 ~ConstantPoolUnavailableScope() { | |
| 1565 if (FLAG_enable_ool_constant_pool) { | |
| 1566 masm_->set_constant_pool_available(old_constant_pool_available_); | |
| 1567 } | |
| 1568 } | |
| 1569 | |
| 1570 private: | |
| 1571 MacroAssembler* masm_; | |
| 1572 int old_constant_pool_available_; | |
| 1573 | |
| 1574 DISALLOW_IMPLICIT_CONSTRUCTORS(ConstantPoolUnavailableScope); | |
| 1575 }; | |
| 1576 | |
| 1577 | |
| 1512 // ----------------------------------------------------------------------------- | 1578 // ----------------------------------------------------------------------------- |
| 1513 // Static helper functions. | 1579 // Static helper functions. |
| 1514 | 1580 |
| 1515 inline MemOperand ContextOperand(Register context, int index) { | 1581 inline MemOperand ContextOperand(Register context, int index) { |
| 1516 return MemOperand(context, Context::SlotOffset(index)); | 1582 return MemOperand(context, Context::SlotOffset(index)); |
| 1517 } | 1583 } |
| 1518 | 1584 |
| 1519 | 1585 |
| 1520 inline MemOperand GlobalObjectOperand() { | 1586 inline MemOperand GlobalObjectOperand() { |
| 1521 return ContextOperand(cp, Context::GLOBAL_OBJECT_INDEX); | 1587 return ContextOperand(cp, Context::GLOBAL_OBJECT_INDEX); |
| 1522 } | 1588 } |
| 1523 | 1589 |
| 1524 | 1590 |
| 1525 #ifdef GENERATED_CODE_COVERAGE | 1591 #ifdef GENERATED_CODE_COVERAGE |
| 1526 #define CODE_COVERAGE_STRINGIFY(x) #x | 1592 #define CODE_COVERAGE_STRINGIFY(x) #x |
| 1527 #define CODE_COVERAGE_TOSTRING(x) CODE_COVERAGE_STRINGIFY(x) | 1593 #define CODE_COVERAGE_TOSTRING(x) CODE_COVERAGE_STRINGIFY(x) |
| 1528 #define __FILE_LINE__ __FILE__ ":" CODE_COVERAGE_TOSTRING(__LINE__) | 1594 #define __FILE_LINE__ __FILE__ ":" CODE_COVERAGE_TOSTRING(__LINE__) |
| 1529 #define ACCESS_MASM(masm) masm->stop(__FILE_LINE__); masm-> | 1595 #define ACCESS_MASM(masm) masm->stop(__FILE_LINE__); masm-> |
| 1530 #else | 1596 #else |
| 1531 #define ACCESS_MASM(masm) masm-> | 1597 #define ACCESS_MASM(masm) masm-> |
| 1532 #endif | 1598 #endif |
| 1533 | 1599 |
| 1534 | 1600 |
| 1535 } } // namespace v8::internal | 1601 } } // namespace v8::internal |
| 1536 | 1602 |
| 1537 #endif // V8_ARM_MACRO_ASSEMBLER_ARM_H_ | 1603 #endif // V8_ARM_MACRO_ASSEMBLER_ARM_H_ |
| OLD | NEW |