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 |