| 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 617 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 628 // Load the global object from the current context. | 628 // Load the global object from the current context. |
| 629 void LoadGlobalObject(Register dst) { | 629 void LoadGlobalObject(Register dst) { |
| 630 LoadNativeContextSlot(Context::EXTENSION_INDEX, dst); | 630 LoadNativeContextSlot(Context::EXTENSION_INDEX, dst); |
| 631 } | 631 } |
| 632 | 632 |
| 633 // Load the global proxy from the current context. | 633 // Load the global proxy from the current context. |
| 634 void LoadGlobalProxy(Register dst) { | 634 void LoadGlobalProxy(Register dst) { |
| 635 LoadNativeContextSlot(Context::GLOBAL_PROXY_INDEX, dst); | 635 LoadNativeContextSlot(Context::GLOBAL_PROXY_INDEX, dst); |
| 636 } | 636 } |
| 637 | 637 |
| 638 // Conditionally load the cached Array transitioned map of type | |
| 639 // transitioned_kind from the native context if the map in register | |
| 640 // map_in_out is the cached Array map in the native context of | |
| 641 // expected_kind. | |
| 642 void LoadTransitionedArrayMapConditional( | |
| 643 ElementsKind expected_kind, | |
| 644 ElementsKind transitioned_kind, | |
| 645 Register map_in_out, | |
| 646 Register scratch, | |
| 647 Label* no_map_match); | |
| 648 | |
| 649 void LoadNativeContextSlot(int index, Register dst); | 638 void LoadNativeContextSlot(int index, Register dst); |
| 650 | 639 |
| 651 // Load the initial map from the global function. The registers | 640 // Load the initial map from the global function. The registers |
| 652 // function and map can be the same, function is then overwritten. | 641 // function and map can be the same, function is then overwritten. |
| 653 void LoadGlobalFunctionInitialMap(Register function, | 642 void LoadGlobalFunctionInitialMap(Register function, |
| 654 Register map, | 643 Register map, |
| 655 Register scratch); | 644 Register scratch); |
| 656 | 645 |
| 657 void InitializeRootRegister() { | 646 void InitializeRootRegister() { |
| 658 ExternalReference roots_array_start = | 647 ExternalReference roots_array_start = |
| (...skipping 218 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 877 Register type_reg, | 866 Register type_reg, |
| 878 InstanceType type); | 867 InstanceType type); |
| 879 | 868 |
| 880 // Compare instance type in a map. map contains a valid map object whose | 869 // Compare instance type in a map. map contains a valid map object whose |
| 881 // object type should be compared with the given type. This both | 870 // object type should be compared with the given type. This both |
| 882 // sets the flags and leaves the object type in the type_reg register. | 871 // sets the flags and leaves the object type in the type_reg register. |
| 883 void CompareInstanceType(Register map, | 872 void CompareInstanceType(Register map, |
| 884 Register type_reg, | 873 Register type_reg, |
| 885 InstanceType type); | 874 InstanceType type); |
| 886 | 875 |
| 887 // Check if a map for a JSObject indicates that the object can have both smi | |
| 888 // and HeapObject elements. Jump to the specified label if it does not. | |
| 889 void CheckFastObjectElements(Register map, | |
| 890 Register scratch, | |
| 891 Label* fail); | |
| 892 | |
| 893 // Check if a map for a JSObject indicates that the object has fast smi only | |
| 894 // elements. Jump to the specified label if it does not. | |
| 895 void CheckFastSmiElements(Register map, | |
| 896 Register scratch, | |
| 897 Label* fail); | |
| 898 | |
| 899 // Check to see if maybe_number can be stored as a double in | |
| 900 // FastDoubleElements. If it can, store it at the index specified by key in | |
| 901 // the FastDoubleElements array elements. Otherwise jump to fail. | |
| 902 void StoreNumberToDoubleElements(Register value_reg, | |
| 903 Register key_reg, | |
| 904 Register elements_reg, | |
| 905 Register scratch1, | |
| 906 LowDwVfpRegister double_scratch, | |
| 907 Label* fail, | |
| 908 int elements_offset = 0); | |
| 909 | |
| 910 // Compare an object's map with the specified map and its transitioned | 876 // Compare an object's map with the specified map and its transitioned |
| 911 // elements maps if mode is ALLOW_ELEMENT_TRANSITION_MAPS. Condition flags are | 877 // elements maps if mode is ALLOW_ELEMENT_TRANSITION_MAPS. Condition flags are |
| 912 // set with result of map compare. If multiple map compares are required, the | 878 // set with result of map compare. If multiple map compares are required, the |
| 913 // compare sequences branches to early_success. | 879 // compare sequences branches to early_success. |
| 914 void CompareMap(Register obj, | 880 void CompareMap(Register obj, |
| 915 Register scratch, | 881 Register scratch, |
| 916 Handle<Map> map, | 882 Handle<Map> map, |
| 917 Label* early_success); | 883 Label* early_success); |
| 918 | 884 |
| 919 // As above, but the map of the object is already loaded into the register | 885 // As above, but the map of the object is already loaded into the register |
| (...skipping 360 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1280 mov(reg, Operand::SmiUntag(reg), s); | 1246 mov(reg, Operand::SmiUntag(reg), s); |
| 1281 } | 1247 } |
| 1282 void SmiUntag(Register dst, Register src, SBit s = LeaveCC) { | 1248 void SmiUntag(Register dst, Register src, SBit s = LeaveCC) { |
| 1283 mov(dst, Operand::SmiUntag(src), s); | 1249 mov(dst, Operand::SmiUntag(src), s); |
| 1284 } | 1250 } |
| 1285 | 1251 |
| 1286 // Untag the source value into destination and jump if source is a smi. | 1252 // Untag the source value into destination and jump if source is a smi. |
| 1287 // Souce and destination can be the same register. | 1253 // Souce and destination can be the same register. |
| 1288 void UntagAndJumpIfSmi(Register dst, Register src, Label* smi_case); | 1254 void UntagAndJumpIfSmi(Register dst, Register src, Label* smi_case); |
| 1289 | 1255 |
| 1290 // Untag the source value into destination and jump if source is not a smi. | |
| 1291 // Souce and destination can be the same register. | |
| 1292 void UntagAndJumpIfNotSmi(Register dst, Register src, Label* non_smi_case); | |
| 1293 | |
| 1294 // Test if the register contains a smi (Z == 0 (eq) if true). | 1256 // Test if the register contains a smi (Z == 0 (eq) if true). |
| 1295 inline void SmiTst(Register value) { | 1257 inline void SmiTst(Register value) { |
| 1296 tst(value, Operand(kSmiTagMask)); | 1258 tst(value, Operand(kSmiTagMask)); |
| 1297 } | 1259 } |
| 1298 inline void NonNegativeSmiTst(Register value) { | 1260 inline void NonNegativeSmiTst(Register value) { |
| 1299 tst(value, Operand(kSmiTagMask | kSmiSignMask)); | 1261 tst(value, Operand(kSmiTagMask | kSmiSignMask)); |
| 1300 } | 1262 } |
| 1301 // Jump if the register contains a smi. | 1263 // Jump if the register contains a smi. |
| 1302 inline void JumpIfSmi(Register value, Label* smi_label) { | 1264 inline void JumpIfSmi(Register value, Label* smi_label) { |
| 1303 tst(value, Operand(kSmiTagMask)); | 1265 tst(value, Operand(kSmiTagMask)); |
| (...skipping 153 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1457 // AllocationMemento support. Arrays may have an associated | 1419 // AllocationMemento support. Arrays may have an associated |
| 1458 // AllocationMemento object that can be checked for in order to pretransition | 1420 // AllocationMemento object that can be checked for in order to pretransition |
| 1459 // to another type. | 1421 // to another type. |
| 1460 // On entry, receiver_reg should point to the array object. | 1422 // On entry, receiver_reg should point to the array object. |
| 1461 // scratch_reg gets clobbered. | 1423 // scratch_reg gets clobbered. |
| 1462 // If allocation info is present, condition flags are set to eq. | 1424 // If allocation info is present, condition flags are set to eq. |
| 1463 void TestJSArrayForAllocationMemento(Register receiver_reg, | 1425 void TestJSArrayForAllocationMemento(Register receiver_reg, |
| 1464 Register scratch_reg, | 1426 Register scratch_reg, |
| 1465 Label* no_memento_found); | 1427 Label* no_memento_found); |
| 1466 | 1428 |
| 1467 void JumpIfJSArrayHasAllocationMemento(Register receiver_reg, | |
| 1468 Register scratch_reg, | |
| 1469 Label* memento_found) { | |
| 1470 Label no_memento_found; | |
| 1471 TestJSArrayForAllocationMemento(receiver_reg, scratch_reg, | |
| 1472 &no_memento_found); | |
| 1473 b(eq, memento_found); | |
| 1474 bind(&no_memento_found); | |
| 1475 } | |
| 1476 | |
| 1477 // Jumps to found label if a prototype map has dictionary elements. | |
| 1478 void JumpIfDictionaryInPrototypeChain(Register object, Register scratch0, | |
| 1479 Register scratch1, Label* found); | |
| 1480 | |
| 1481 // Loads the constant pool pointer (pp) register. | 1429 // Loads the constant pool pointer (pp) register. |
| 1482 void LoadConstantPoolPointerRegisterFromCodeTargetAddress( | 1430 void LoadConstantPoolPointerRegisterFromCodeTargetAddress( |
| 1483 Register code_target_address); | 1431 Register code_target_address); |
| 1484 void LoadConstantPoolPointerRegister(); | 1432 void LoadConstantPoolPointerRegister(); |
| 1485 | 1433 |
| 1486 private: | 1434 private: |
| 1487 void CallCFunctionHelper(Register function, | 1435 void CallCFunctionHelper(Register function, |
| 1488 int num_reg_arguments, | 1436 int num_reg_arguments, |
| 1489 int num_double_arguments); | 1437 int num_double_arguments); |
| 1490 | 1438 |
| (...skipping 100 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1591 inline MemOperand NativeContextMemOperand() { | 1539 inline MemOperand NativeContextMemOperand() { |
| 1592 return ContextMemOperand(cp, Context::NATIVE_CONTEXT_INDEX); | 1540 return ContextMemOperand(cp, Context::NATIVE_CONTEXT_INDEX); |
| 1593 } | 1541 } |
| 1594 | 1542 |
| 1595 #define ACCESS_MASM(masm) masm-> | 1543 #define ACCESS_MASM(masm) masm-> |
| 1596 | 1544 |
| 1597 } // namespace internal | 1545 } // namespace internal |
| 1598 } // namespace v8 | 1546 } // namespace v8 |
| 1599 | 1547 |
| 1600 #endif // V8_ARM_MACRO_ASSEMBLER_ARM_H_ | 1548 #endif // V8_ARM_MACRO_ASSEMBLER_ARM_H_ |
| OLD | NEW |