| 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 #ifndef V8_ARM_MACRO_ASSEMBLER_ARM_H_ | 5 #ifndef V8_ARM_MACRO_ASSEMBLER_ARM_H_ |
| 6 #define V8_ARM_MACRO_ASSEMBLER_ARM_H_ | 6 #define V8_ARM_MACRO_ASSEMBLER_ARM_H_ |
| 7 | 7 |
| 8 #include "src/assembler.h" | 8 #include "src/assembler.h" |
| 9 #include "src/bailout-reason.h" | 9 #include "src/bailout-reason.h" |
| 10 #include "src/frames.h" | 10 #include "src/frames.h" |
| (...skipping 152 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 163 // Register move. May do nothing if the registers are identical. | 163 // Register move. May do nothing if the registers are identical. |
| 164 void Move(Register dst, Smi* smi) { mov(dst, Operand(smi)); } | 164 void Move(Register dst, Smi* smi) { mov(dst, Operand(smi)); } |
| 165 void Move(Register dst, Handle<Object> value); | 165 void Move(Register dst, Handle<Object> value); |
| 166 void Move(Register dst, Register src, Condition cond = al); | 166 void Move(Register dst, Register src, Condition cond = al); |
| 167 void Move(Register dst, const Operand& src, SBit sbit = LeaveCC, | 167 void Move(Register dst, const Operand& src, SBit sbit = LeaveCC, |
| 168 Condition cond = al) { | 168 Condition cond = al) { |
| 169 if (!src.is_reg() || !src.rm().is(dst) || sbit != LeaveCC) { | 169 if (!src.is_reg() || !src.rm().is(dst) || sbit != LeaveCC) { |
| 170 mov(dst, src, sbit, cond); | 170 mov(dst, src, sbit, cond); |
| 171 } | 171 } |
| 172 } | 172 } |
| 173 void Move(SwVfpRegister dst, SwVfpRegister src); | 173 void Move(SwVfpRegister dst, SwVfpRegister src, Condition cond = al); |
| 174 void Move(DwVfpRegister dst, DwVfpRegister src); | 174 void Move(DwVfpRegister dst, DwVfpRegister src, Condition cond = al); |
| 175 | 175 |
| 176 void Load(Register dst, const MemOperand& src, Representation r); | 176 void Load(Register dst, const MemOperand& src, Representation r); |
| 177 void Store(Register src, const MemOperand& dst, Representation r); | 177 void Store(Register src, const MemOperand& dst, Representation r); |
| 178 | 178 |
| 179 // Load an object from the root table. | 179 // Load an object from the root table. |
| 180 void LoadRoot(Register destination, | 180 void LoadRoot(Register destination, |
| 181 Heap::RootListIndex index, | 181 Heap::RootListIndex index, |
| 182 Condition cond = al); | 182 Condition cond = al); |
| 183 // Store an object to the root table. | 183 // Store an object to the root table. |
| 184 void StoreRoot(Register source, | 184 void StoreRoot(Register source, |
| (...skipping 890 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1075 void CheckFor32DRegs(Register scratch); | 1075 void CheckFor32DRegs(Register scratch); |
| 1076 | 1076 |
| 1077 // Does a runtime check for 16/32 FP registers. Either way, pushes 32 double | 1077 // Does a runtime check for 16/32 FP registers. Either way, pushes 32 double |
| 1078 // values to location, saving [d0..(d15|d31)]. | 1078 // values to location, saving [d0..(d15|d31)]. |
| 1079 void SaveFPRegs(Register location, Register scratch); | 1079 void SaveFPRegs(Register location, Register scratch); |
| 1080 | 1080 |
| 1081 // Does a runtime check for 16/32 FP registers. Either way, pops 32 double | 1081 // Does a runtime check for 16/32 FP registers. Either way, pops 32 double |
| 1082 // values to location, restoring [d0..(d15|d31)]. | 1082 // values to location, restoring [d0..(d15|d31)]. |
| 1083 void RestoreFPRegs(Register location, Register scratch); | 1083 void RestoreFPRegs(Register location, Register scratch); |
| 1084 | 1084 |
| 1085 // Perform a floating-point min or max operation with the |
| 1086 // (IEEE-754-compatible) semantics of ARM64's fmin/fmax. Some cases, typically |
| 1087 // NaNs or +/-0.0, are expected to be rare and are handled in out-of-line |
| 1088 // code. The specific behaviour depends on supported instructions. |
| 1089 // |
| 1090 // These functions assume (and assert) that !left.is(right). It is permitted |
| 1091 // for the result to alias either input register. |
| 1092 void FloatMax(SwVfpRegister result, SwVfpRegister left, SwVfpRegister right, |
| 1093 Label* out_of_line); |
| 1094 void FloatMin(SwVfpRegister result, SwVfpRegister left, SwVfpRegister right, |
| 1095 Label* out_of_line); |
| 1096 void FloatMax(DwVfpRegister result, DwVfpRegister left, DwVfpRegister right, |
| 1097 Label* out_of_line); |
| 1098 void FloatMin(DwVfpRegister result, DwVfpRegister left, DwVfpRegister right, |
| 1099 Label* out_of_line); |
| 1100 |
| 1101 // Generate out-of-line cases for the macros above. |
| 1102 void FloatMaxOutOfLine(SwVfpRegister result, SwVfpRegister left, |
| 1103 SwVfpRegister right); |
| 1104 void FloatMinOutOfLine(SwVfpRegister result, SwVfpRegister left, |
| 1105 SwVfpRegister right); |
| 1106 void FloatMaxOutOfLine(DwVfpRegister result, DwVfpRegister left, |
| 1107 DwVfpRegister right); |
| 1108 void FloatMinOutOfLine(DwVfpRegister result, DwVfpRegister left, |
| 1109 DwVfpRegister right); |
| 1110 |
| 1085 // --------------------------------------------------------------------------- | 1111 // --------------------------------------------------------------------------- |
| 1086 // Runtime calls | 1112 // Runtime calls |
| 1087 | 1113 |
| 1088 // Call a code stub. | 1114 // Call a code stub. |
| 1089 void CallStub(CodeStub* stub, | 1115 void CallStub(CodeStub* stub, |
| 1090 TypeFeedbackId ast_id = TypeFeedbackId::None(), | 1116 TypeFeedbackId ast_id = TypeFeedbackId::None(), |
| 1091 Condition cond = al); | 1117 Condition cond = al); |
| 1092 | 1118 |
| 1093 // Call a code stub. | 1119 // Call a code stub. |
| 1094 void TailCallStub(CodeStub* stub, Condition cond = al); | 1120 void TailCallStub(CodeStub* stub, Condition cond = al); |
| (...skipping 411 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1506 // the position of the first bit. Leaves addr_reg unchanged. | 1532 // the position of the first bit. Leaves addr_reg unchanged. |
| 1507 inline void GetMarkBits(Register addr_reg, | 1533 inline void GetMarkBits(Register addr_reg, |
| 1508 Register bitmap_reg, | 1534 Register bitmap_reg, |
| 1509 Register mask_reg); | 1535 Register mask_reg); |
| 1510 | 1536 |
| 1511 // Compute memory operands for safepoint stack slots. | 1537 // Compute memory operands for safepoint stack slots. |
| 1512 static int SafepointRegisterStackIndex(int reg_code); | 1538 static int SafepointRegisterStackIndex(int reg_code); |
| 1513 MemOperand SafepointRegisterSlot(Register reg); | 1539 MemOperand SafepointRegisterSlot(Register reg); |
| 1514 MemOperand SafepointRegistersAndDoublesSlot(Register reg); | 1540 MemOperand SafepointRegistersAndDoublesSlot(Register reg); |
| 1515 | 1541 |
| 1542 // Implementation helpers for FloatMin and FloatMax. |
| 1543 template <typename T> |
| 1544 void FloatMaxHelper(T result, T left, T right, Label* out_of_line); |
| 1545 template <typename T> |
| 1546 void FloatMinHelper(T result, T left, T right, Label* out_of_line); |
| 1547 template <typename T> |
| 1548 void FloatMaxOutOfLineHelper(T result, T left, T right); |
| 1549 template <typename T> |
| 1550 void FloatMinOutOfLineHelper(T result, T left, T right); |
| 1551 |
| 1516 bool generating_stub_; | 1552 bool generating_stub_; |
| 1517 bool has_frame_; | 1553 bool has_frame_; |
| 1518 // This handle will be patched with the code object on installation. | 1554 // This handle will be patched with the code object on installation. |
| 1519 Handle<Object> code_object_; | 1555 Handle<Object> code_object_; |
| 1520 | 1556 |
| 1521 // Needs access to SafepointRegisterStackIndex for compiled frame | 1557 // Needs access to SafepointRegisterStackIndex for compiled frame |
| 1522 // traversal. | 1558 // traversal. |
| 1523 friend class StandardFrame; | 1559 friend class StandardFrame; |
| 1524 }; | 1560 }; |
| 1525 | 1561 |
| (...skipping 46 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1572 inline MemOperand NativeContextMemOperand() { | 1608 inline MemOperand NativeContextMemOperand() { |
| 1573 return ContextMemOperand(cp, Context::NATIVE_CONTEXT_INDEX); | 1609 return ContextMemOperand(cp, Context::NATIVE_CONTEXT_INDEX); |
| 1574 } | 1610 } |
| 1575 | 1611 |
| 1576 #define ACCESS_MASM(masm) masm-> | 1612 #define ACCESS_MASM(masm) masm-> |
| 1577 | 1613 |
| 1578 } // namespace internal | 1614 } // namespace internal |
| 1579 } // namespace v8 | 1615 } // namespace v8 |
| 1580 | 1616 |
| 1581 #endif // V8_ARM_MACRO_ASSEMBLER_ARM_H_ | 1617 #endif // V8_ARM_MACRO_ASSEMBLER_ARM_H_ |
| OLD | NEW |