| OLD | NEW |
| 1 // Copyright 2011 the V8 project authors. All rights reserved. | 1 // Copyright 2011 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 219 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 230 } | 230 } |
| 231 | 231 |
| 232 | 232 |
| 233 void LIsSmiAndBranch::PrintDataTo(StringStream* stream) { | 233 void LIsSmiAndBranch::PrintDataTo(StringStream* stream) { |
| 234 stream->Add("if is_smi("); | 234 stream->Add("if is_smi("); |
| 235 InputAt(0)->PrintTo(stream); | 235 InputAt(0)->PrintTo(stream); |
| 236 stream->Add(") then B%d else B%d", true_block_id(), false_block_id()); | 236 stream->Add(") then B%d else B%d", true_block_id(), false_block_id()); |
| 237 } | 237 } |
| 238 | 238 |
| 239 | 239 |
| 240 void LIsUndetectableAndBranch::PrintDataTo(StringStream* stream) { |
| 241 stream->Add("if is_undetectable("); |
| 242 InputAt(0)->PrintTo(stream); |
| 243 stream->Add(") then B%d else B%d", true_block_id(), false_block_id()); |
| 244 } |
| 245 |
| 246 |
| 240 void LHasInstanceTypeAndBranch::PrintDataTo(StringStream* stream) { | 247 void LHasInstanceTypeAndBranch::PrintDataTo(StringStream* stream) { |
| 241 stream->Add("if has_instance_type("); | 248 stream->Add("if has_instance_type("); |
| 242 InputAt(0)->PrintTo(stream); | 249 InputAt(0)->PrintTo(stream); |
| 243 stream->Add(") then B%d else B%d", true_block_id(), false_block_id()); | 250 stream->Add(") then B%d else B%d", true_block_id(), false_block_id()); |
| 244 } | 251 } |
| 245 | 252 |
| 246 | 253 |
| 247 void LHasCachedArrayIndexAndBranch::PrintDataTo(StringStream* stream) { | 254 void LHasCachedArrayIndexAndBranch::PrintDataTo(StringStream* stream) { |
| 248 stream->Add("if has_cached_array_index("); | 255 stream->Add("if has_cached_array_index("); |
| 249 InputAt(0)->PrintTo(stream); | 256 InputAt(0)->PrintTo(stream); |
| (...skipping 758 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1008 ASSERT(ast_id != AstNode::kNoNumber); | 1015 ASSERT(ast_id != AstNode::kNoNumber); |
| 1009 int value_count = hydrogen_env->length(); | 1016 int value_count = hydrogen_env->length(); |
| 1010 LEnvironment* result = new LEnvironment(hydrogen_env->closure(), | 1017 LEnvironment* result = new LEnvironment(hydrogen_env->closure(), |
| 1011 ast_id, | 1018 ast_id, |
| 1012 hydrogen_env->parameter_count(), | 1019 hydrogen_env->parameter_count(), |
| 1013 argument_count_, | 1020 argument_count_, |
| 1014 value_count, | 1021 value_count, |
| 1015 outer); | 1022 outer); |
| 1016 int argument_index = 0; | 1023 int argument_index = 0; |
| 1017 for (int i = 0; i < value_count; ++i) { | 1024 for (int i = 0; i < value_count; ++i) { |
| 1025 if (hydrogen_env->is_special_index(i)) continue; |
| 1026 |
| 1018 HValue* value = hydrogen_env->values()->at(i); | 1027 HValue* value = hydrogen_env->values()->at(i); |
| 1019 LOperand* op = NULL; | 1028 LOperand* op = NULL; |
| 1020 if (value->IsArgumentsObject()) { | 1029 if (value->IsArgumentsObject()) { |
| 1021 op = NULL; | 1030 op = NULL; |
| 1022 } else if (value->IsPushArgument()) { | 1031 } else if (value->IsPushArgument()) { |
| 1023 op = new LArgument(argument_index++); | 1032 op = new LArgument(argument_index++); |
| 1024 } else { | 1033 } else { |
| 1025 op = UseAny(value); | 1034 op = UseAny(value); |
| 1026 } | 1035 } |
| 1027 result->AddValue(op, value->representation()); | 1036 result->AddValue(op, value->representation()); |
| (...skipping 44 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1072 LOperand* right_operand = UseFixed(right, reversed ? r1 : r0); | 1081 LOperand* right_operand = UseFixed(right, reversed ? r1 : r0); |
| 1073 LInstruction* result = new LCmpTAndBranch(left_operand, | 1082 LInstruction* result = new LCmpTAndBranch(left_operand, |
| 1074 right_operand); | 1083 right_operand); |
| 1075 return MarkAsCall(result, instr); | 1084 return MarkAsCall(result, instr); |
| 1076 } | 1085 } |
| 1077 } else if (v->IsIsSmi()) { | 1086 } else if (v->IsIsSmi()) { |
| 1078 HIsSmi* compare = HIsSmi::cast(v); | 1087 HIsSmi* compare = HIsSmi::cast(v); |
| 1079 ASSERT(compare->value()->representation().IsTagged()); | 1088 ASSERT(compare->value()->representation().IsTagged()); |
| 1080 | 1089 |
| 1081 return new LIsSmiAndBranch(Use(compare->value())); | 1090 return new LIsSmiAndBranch(Use(compare->value())); |
| 1091 } else if (v->IsIsUndetectable()) { |
| 1092 HIsUndetectable* compare = HIsUndetectable::cast(v); |
| 1093 ASSERT(compare->value()->representation().IsTagged()); |
| 1094 |
| 1095 return new LIsUndetectableAndBranch(UseRegisterAtStart(compare->value()), |
| 1096 TempRegister()); |
| 1082 } else if (v->IsHasInstanceType()) { | 1097 } else if (v->IsHasInstanceType()) { |
| 1083 HHasInstanceType* compare = HHasInstanceType::cast(v); | 1098 HHasInstanceType* compare = HHasInstanceType::cast(v); |
| 1084 ASSERT(compare->value()->representation().IsTagged()); | 1099 ASSERT(compare->value()->representation().IsTagged()); |
| 1085 return new LHasInstanceTypeAndBranch( | 1100 return new LHasInstanceTypeAndBranch( |
| 1086 UseRegisterAtStart(compare->value())); | 1101 UseRegisterAtStart(compare->value())); |
| 1087 } else if (v->IsHasCachedArrayIndex()) { | 1102 } else if (v->IsHasCachedArrayIndex()) { |
| 1088 HHasCachedArrayIndex* compare = HHasCachedArrayIndex::cast(v); | 1103 HHasCachedArrayIndex* compare = HHasCachedArrayIndex::cast(v); |
| 1089 ASSERT(compare->value()->representation().IsTagged()); | 1104 ASSERT(compare->value()->representation().IsTagged()); |
| 1090 | 1105 |
| 1091 return new LHasCachedArrayIndexAndBranch( | 1106 return new LHasCachedArrayIndexAndBranch( |
| 1092 UseRegisterAtStart(compare->value())); | 1107 UseRegisterAtStart(compare->value())); |
| 1093 } else if (v->IsIsNull()) { | 1108 } else if (v->IsIsNull()) { |
| 1094 HIsNull* compare = HIsNull::cast(v); | 1109 HIsNull* compare = HIsNull::cast(v); |
| 1095 ASSERT(compare->value()->representation().IsTagged()); | 1110 ASSERT(compare->value()->representation().IsTagged()); |
| 1096 | 1111 |
| 1097 return new LIsNullAndBranch(UseRegisterAtStart(compare->value())); | 1112 return new LIsNullAndBranch(UseRegisterAtStart(compare->value())); |
| 1098 } else if (v->IsIsObject()) { | 1113 } else if (v->IsIsObject()) { |
| 1099 HIsObject* compare = HIsObject::cast(v); | 1114 HIsObject* compare = HIsObject::cast(v); |
| 1100 ASSERT(compare->value()->representation().IsTagged()); | 1115 ASSERT(compare->value()->representation().IsTagged()); |
| 1101 | 1116 |
| 1102 LOperand* temp = TempRegister(); | 1117 LOperand* temp = TempRegister(); |
| 1103 return new LIsObjectAndBranch(UseRegisterAtStart(compare->value()), temp); | 1118 return new LIsObjectAndBranch(UseRegisterAtStart(compare->value()), temp); |
| 1104 } else if (v->IsCompareJSObjectEq()) { | 1119 } else if (v->IsCompareJSObjectEq()) { |
| 1105 HCompareJSObjectEq* compare = HCompareJSObjectEq::cast(v); | 1120 HCompareJSObjectEq* compare = HCompareJSObjectEq::cast(v); |
| 1106 return new LCmpJSObjectEqAndBranch(UseRegisterAtStart(compare->left()), | 1121 return new LCmpJSObjectEqAndBranch(UseRegisterAtStart(compare->left()), |
| 1107 UseRegisterAtStart(compare->right())); | 1122 UseRegisterAtStart(compare->right())); |
| 1123 } else if (v->IsCompareSymbolEq()) { |
| 1124 HCompareSymbolEq* compare = HCompareSymbolEq::cast(v); |
| 1125 return new LCmpSymbolEqAndBranch(UseRegisterAtStart(compare->left()), |
| 1126 UseRegisterAtStart(compare->right())); |
| 1108 } else if (v->IsInstanceOf()) { | 1127 } else if (v->IsInstanceOf()) { |
| 1109 HInstanceOf* instance_of = HInstanceOf::cast(v); | 1128 HInstanceOf* instance_of = HInstanceOf::cast(v); |
| 1110 LInstruction* result = | 1129 LInstruction* result = |
| 1111 new LInstanceOfAndBranch(UseFixed(instance_of->left(), r0), | 1130 new LInstanceOfAndBranch(UseFixed(instance_of->left(), r0), |
| 1112 UseFixed(instance_of->right(), r1)); | 1131 UseFixed(instance_of->right(), r1)); |
| 1113 return MarkAsCall(result, instr); | 1132 return MarkAsCall(result, instr); |
| 1114 } else if (v->IsTypeofIs()) { | 1133 } else if (v->IsTypeofIs()) { |
| 1115 HTypeofIs* typeof_is = HTypeofIs::cast(v); | 1134 HTypeofIs* typeof_is = HTypeofIs::cast(v); |
| 1116 return new LTypeofIsAndBranch(UseTempRegister(typeof_is->value())); | 1135 return new LTypeofIsAndBranch(UseTempRegister(typeof_is->value())); |
| 1117 } else if (v->IsIsConstructCall()) { | 1136 } else if (v->IsIsConstructCall()) { |
| (...skipping 62 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1180 | 1199 |
| 1181 | 1200 |
| 1182 LInstruction* LChunkBuilder::DoPushArgument(HPushArgument* instr) { | 1201 LInstruction* LChunkBuilder::DoPushArgument(HPushArgument* instr) { |
| 1183 ++argument_count_; | 1202 ++argument_count_; |
| 1184 LOperand* argument = Use(instr->argument()); | 1203 LOperand* argument = Use(instr->argument()); |
| 1185 return new LPushArgument(argument); | 1204 return new LPushArgument(argument); |
| 1186 } | 1205 } |
| 1187 | 1206 |
| 1188 | 1207 |
| 1189 LInstruction* LChunkBuilder::DoContext(HContext* instr) { | 1208 LInstruction* LChunkBuilder::DoContext(HContext* instr) { |
| 1190 return DefineAsRegister(new LContext); | 1209 return instr->HasNoUses() ? NULL : DefineAsRegister(new LContext); |
| 1191 } | 1210 } |
| 1192 | 1211 |
| 1193 | 1212 |
| 1194 LInstruction* LChunkBuilder::DoOuterContext(HOuterContext* instr) { | 1213 LInstruction* LChunkBuilder::DoOuterContext(HOuterContext* instr) { |
| 1195 LOperand* context = UseRegisterAtStart(instr->value()); | 1214 LOperand* context = UseRegisterAtStart(instr->value()); |
| 1196 return DefineAsRegister(new LOuterContext(context)); | 1215 return DefineAsRegister(new LOuterContext(context)); |
| 1197 } | 1216 } |
| 1198 | 1217 |
| 1199 | 1218 |
| 1200 LInstruction* LChunkBuilder::DoGlobalObject(HGlobalObject* instr) { | 1219 LInstruction* LChunkBuilder::DoGlobalObject(HGlobalObject* instr) { |
| (...skipping 297 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1498 | 1517 |
| 1499 LInstruction* LChunkBuilder::DoCompareJSObjectEq( | 1518 LInstruction* LChunkBuilder::DoCompareJSObjectEq( |
| 1500 HCompareJSObjectEq* instr) { | 1519 HCompareJSObjectEq* instr) { |
| 1501 LOperand* left = UseRegisterAtStart(instr->left()); | 1520 LOperand* left = UseRegisterAtStart(instr->left()); |
| 1502 LOperand* right = UseRegisterAtStart(instr->right()); | 1521 LOperand* right = UseRegisterAtStart(instr->right()); |
| 1503 LCmpJSObjectEq* result = new LCmpJSObjectEq(left, right); | 1522 LCmpJSObjectEq* result = new LCmpJSObjectEq(left, right); |
| 1504 return DefineAsRegister(result); | 1523 return DefineAsRegister(result); |
| 1505 } | 1524 } |
| 1506 | 1525 |
| 1507 | 1526 |
| 1527 LInstruction* LChunkBuilder::DoCompareSymbolEq( |
| 1528 HCompareSymbolEq* instr) { |
| 1529 LOperand* left = UseRegisterAtStart(instr->left()); |
| 1530 LOperand* right = UseRegisterAtStart(instr->right()); |
| 1531 LCmpSymbolEq* result = new LCmpSymbolEq(left, right); |
| 1532 return DefineAsRegister(result); |
| 1533 } |
| 1534 |
| 1535 |
| 1508 LInstruction* LChunkBuilder::DoIsNull(HIsNull* instr) { | 1536 LInstruction* LChunkBuilder::DoIsNull(HIsNull* instr) { |
| 1509 ASSERT(instr->value()->representation().IsTagged()); | 1537 ASSERT(instr->value()->representation().IsTagged()); |
| 1510 LOperand* value = UseRegisterAtStart(instr->value()); | 1538 LOperand* value = UseRegisterAtStart(instr->value()); |
| 1511 | 1539 |
| 1512 return DefineAsRegister(new LIsNull(value)); | 1540 return DefineAsRegister(new LIsNull(value)); |
| 1513 } | 1541 } |
| 1514 | 1542 |
| 1515 | 1543 |
| 1516 LInstruction* LChunkBuilder::DoIsObject(HIsObject* instr) { | 1544 LInstruction* LChunkBuilder::DoIsObject(HIsObject* instr) { |
| 1517 ASSERT(instr->value()->representation().IsTagged()); | 1545 ASSERT(instr->value()->representation().IsTagged()); |
| 1518 LOperand* value = UseRegisterAtStart(instr->value()); | 1546 LOperand* value = UseRegisterAtStart(instr->value()); |
| 1519 | 1547 |
| 1520 return DefineAsRegister(new LIsObject(value)); | 1548 return DefineAsRegister(new LIsObject(value)); |
| 1521 } | 1549 } |
| 1522 | 1550 |
| 1523 | 1551 |
| 1524 LInstruction* LChunkBuilder::DoIsSmi(HIsSmi* instr) { | 1552 LInstruction* LChunkBuilder::DoIsSmi(HIsSmi* instr) { |
| 1525 ASSERT(instr->value()->representation().IsTagged()); | 1553 ASSERT(instr->value()->representation().IsTagged()); |
| 1526 LOperand* value = UseAtStart(instr->value()); | 1554 LOperand* value = UseAtStart(instr->value()); |
| 1527 | 1555 |
| 1528 return DefineAsRegister(new LIsSmi(value)); | 1556 return DefineAsRegister(new LIsSmi(value)); |
| 1529 } | 1557 } |
| 1530 | 1558 |
| 1531 | 1559 |
| 1560 LInstruction* LChunkBuilder::DoIsUndetectable(HIsUndetectable* instr) { |
| 1561 ASSERT(instr->value()->representation().IsTagged()); |
| 1562 LOperand* value = UseRegisterAtStart(instr->value()); |
| 1563 |
| 1564 return DefineAsRegister(new LIsUndetectable(value)); |
| 1565 } |
| 1566 |
| 1567 |
| 1532 LInstruction* LChunkBuilder::DoHasInstanceType(HHasInstanceType* instr) { | 1568 LInstruction* LChunkBuilder::DoHasInstanceType(HHasInstanceType* instr) { |
| 1533 ASSERT(instr->value()->representation().IsTagged()); | 1569 ASSERT(instr->value()->representation().IsTagged()); |
| 1534 LOperand* value = UseRegisterAtStart(instr->value()); | 1570 LOperand* value = UseRegisterAtStart(instr->value()); |
| 1535 | 1571 |
| 1536 return DefineAsRegister(new LHasInstanceType(value)); | 1572 return DefineAsRegister(new LHasInstanceType(value)); |
| 1537 } | 1573 } |
| 1538 | 1574 |
| 1539 | 1575 |
| 1540 LInstruction* LChunkBuilder::DoGetCachedArrayIndex( | 1576 LInstruction* LChunkBuilder::DoGetCachedArrayIndex( |
| 1541 HGetCachedArrayIndex* instr) { | 1577 HGetCachedArrayIndex* instr) { |
| (...skipping 58 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1600 return NULL; | 1636 return NULL; |
| 1601 } | 1637 } |
| 1602 | 1638 |
| 1603 | 1639 |
| 1604 LInstruction* LChunkBuilder::DoThrow(HThrow* instr) { | 1640 LInstruction* LChunkBuilder::DoThrow(HThrow* instr) { |
| 1605 LOperand* value = UseFixed(instr->value(), r0); | 1641 LOperand* value = UseFixed(instr->value(), r0); |
| 1606 return MarkAsCall(new LThrow(value), instr); | 1642 return MarkAsCall(new LThrow(value), instr); |
| 1607 } | 1643 } |
| 1608 | 1644 |
| 1609 | 1645 |
| 1646 LInstruction* LChunkBuilder::DoForceRepresentation(HForceRepresentation* bad) { |
| 1647 // All HForceRepresentation instructions should be eliminated in the |
| 1648 // representation change phase of Hydrogen. |
| 1649 UNREACHABLE(); |
| 1650 return NULL; |
| 1651 } |
| 1652 |
| 1653 |
| 1610 LInstruction* LChunkBuilder::DoChange(HChange* instr) { | 1654 LInstruction* LChunkBuilder::DoChange(HChange* instr) { |
| 1611 Representation from = instr->from(); | 1655 Representation from = instr->from(); |
| 1612 Representation to = instr->to(); | 1656 Representation to = instr->to(); |
| 1613 if (from.IsTagged()) { | 1657 if (from.IsTagged()) { |
| 1614 if (to.IsDouble()) { | 1658 if (to.IsDouble()) { |
| 1615 LOperand* value = UseRegister(instr->value()); | 1659 LOperand* value = UseRegister(instr->value()); |
| 1616 LNumberUntagD* res = new LNumberUntagD(value); | 1660 LNumberUntagD* res = new LNumberUntagD(value); |
| 1617 return AssignEnvironment(DefineAsRegister(res)); | 1661 return AssignEnvironment(DefineAsRegister(res)); |
| 1618 } else { | 1662 } else { |
| 1619 ASSERT(to.IsInteger32()); | 1663 ASSERT(to.IsInteger32()); |
| (...skipping 88 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1708 } | 1752 } |
| 1709 | 1753 |
| 1710 | 1754 |
| 1711 LInstruction* LChunkBuilder::DoCheckMap(HCheckMap* instr) { | 1755 LInstruction* LChunkBuilder::DoCheckMap(HCheckMap* instr) { |
| 1712 LOperand* value = UseRegisterAtStart(instr->value()); | 1756 LOperand* value = UseRegisterAtStart(instr->value()); |
| 1713 LInstruction* result = new LCheckMap(value); | 1757 LInstruction* result = new LCheckMap(value); |
| 1714 return AssignEnvironment(result); | 1758 return AssignEnvironment(result); |
| 1715 } | 1759 } |
| 1716 | 1760 |
| 1717 | 1761 |
| 1762 LInstruction* LChunkBuilder::DoClampToUint8(HClampToUint8* instr) { |
| 1763 HValue* value = instr->value(); |
| 1764 Representation input_rep = value->representation(); |
| 1765 LOperand* reg = UseRegister(value); |
| 1766 if (input_rep.IsDouble()) { |
| 1767 return DefineAsRegister(new LClampDToUint8(reg, FixedTemp(d1))); |
| 1768 } else if (input_rep.IsInteger32()) { |
| 1769 return DefineAsRegister(new LClampIToUint8(reg)); |
| 1770 } else { |
| 1771 ASSERT(input_rep.IsTagged()); |
| 1772 // Register allocator doesn't (yet) support allocation of double |
| 1773 // temps. Reserve d1 explicitly. |
| 1774 LClampTToUint8* result = new LClampTToUint8(reg, FixedTemp(d1)); |
| 1775 return AssignEnvironment(DefineAsRegister(result)); |
| 1776 } |
| 1777 } |
| 1778 |
| 1779 |
| 1718 LInstruction* LChunkBuilder::DoReturn(HReturn* instr) { | 1780 LInstruction* LChunkBuilder::DoReturn(HReturn* instr) { |
| 1719 return new LReturn(UseFixed(instr->value(), r0)); | 1781 return new LReturn(UseFixed(instr->value(), r0)); |
| 1720 } | 1782 } |
| 1721 | 1783 |
| 1722 | 1784 |
| 1723 LInstruction* LChunkBuilder::DoConstant(HConstant* instr) { | 1785 LInstruction* LChunkBuilder::DoConstant(HConstant* instr) { |
| 1724 Representation r = instr->representation(); | 1786 Representation r = instr->representation(); |
| 1725 if (r.IsInteger32()) { | 1787 if (r.IsInteger32()) { |
| 1726 return DefineAsRegister(new LConstantI); | 1788 return DefineAsRegister(new LConstantI); |
| 1727 } else if (r.IsDouble()) { | 1789 } else if (r.IsDouble()) { |
| (...skipping 126 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1854 HLoadKeyedSpecializedArrayElement* instr) { | 1916 HLoadKeyedSpecializedArrayElement* instr) { |
| 1855 ExternalArrayType array_type = instr->array_type(); | 1917 ExternalArrayType array_type = instr->array_type(); |
| 1856 Representation representation(instr->representation()); | 1918 Representation representation(instr->representation()); |
| 1857 ASSERT( | 1919 ASSERT( |
| 1858 (representation.IsInteger32() && (array_type != kExternalFloatArray && | 1920 (representation.IsInteger32() && (array_type != kExternalFloatArray && |
| 1859 array_type != kExternalDoubleArray)) || | 1921 array_type != kExternalDoubleArray)) || |
| 1860 (representation.IsDouble() && (array_type == kExternalFloatArray || | 1922 (representation.IsDouble() && (array_type == kExternalFloatArray || |
| 1861 array_type == kExternalDoubleArray))); | 1923 array_type == kExternalDoubleArray))); |
| 1862 ASSERT(instr->key()->representation().IsInteger32()); | 1924 ASSERT(instr->key()->representation().IsInteger32()); |
| 1863 LOperand* external_pointer = UseRegister(instr->external_pointer()); | 1925 LOperand* external_pointer = UseRegister(instr->external_pointer()); |
| 1864 LOperand* key = UseRegister(instr->key()); | 1926 LOperand* key = UseRegisterOrConstant(instr->key()); |
| 1865 LLoadKeyedSpecializedArrayElement* result = | 1927 LLoadKeyedSpecializedArrayElement* result = |
| 1866 new LLoadKeyedSpecializedArrayElement(external_pointer, key); | 1928 new LLoadKeyedSpecializedArrayElement(external_pointer, key); |
| 1867 LInstruction* load_instr = DefineAsRegister(result); | 1929 LInstruction* load_instr = DefineAsRegister(result); |
| 1868 // An unsigned int array load might overflow and cause a deopt, make sure it | 1930 // An unsigned int array load might overflow and cause a deopt, make sure it |
| 1869 // has an environment. | 1931 // has an environment. |
| 1870 return (array_type == kExternalUnsignedIntArray) ? | 1932 return (array_type == kExternalUnsignedIntArray) ? |
| 1871 AssignEnvironment(load_instr) : load_instr; | 1933 AssignEnvironment(load_instr) : load_instr; |
| 1872 } | 1934 } |
| 1873 | 1935 |
| 1874 | 1936 |
| (...skipping 37 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1912 array_type == kExternalDoubleArray))); | 1974 array_type == kExternalDoubleArray))); |
| 1913 ASSERT(instr->external_pointer()->representation().IsExternal()); | 1975 ASSERT(instr->external_pointer()->representation().IsExternal()); |
| 1914 ASSERT(instr->key()->representation().IsInteger32()); | 1976 ASSERT(instr->key()->representation().IsInteger32()); |
| 1915 | 1977 |
| 1916 LOperand* external_pointer = UseRegister(instr->external_pointer()); | 1978 LOperand* external_pointer = UseRegister(instr->external_pointer()); |
| 1917 bool val_is_temp_register = array_type == kExternalPixelArray || | 1979 bool val_is_temp_register = array_type == kExternalPixelArray || |
| 1918 array_type == kExternalFloatArray; | 1980 array_type == kExternalFloatArray; |
| 1919 LOperand* val = val_is_temp_register | 1981 LOperand* val = val_is_temp_register |
| 1920 ? UseTempRegister(instr->value()) | 1982 ? UseTempRegister(instr->value()) |
| 1921 : UseRegister(instr->value()); | 1983 : UseRegister(instr->value()); |
| 1922 LOperand* key = UseRegister(instr->key()); | 1984 LOperand* key = UseRegisterOrConstant(instr->key()); |
| 1923 | 1985 |
| 1924 return new LStoreKeyedSpecializedArrayElement(external_pointer, | 1986 return new LStoreKeyedSpecializedArrayElement(external_pointer, |
| 1925 key, | 1987 key, |
| 1926 val); | 1988 val); |
| 1927 } | 1989 } |
| 1928 | 1990 |
| 1929 | 1991 |
| 1930 LInstruction* LChunkBuilder::DoStoreKeyedGeneric(HStoreKeyedGeneric* instr) { | 1992 LInstruction* LChunkBuilder::DoStoreKeyedGeneric(HStoreKeyedGeneric* instr) { |
| 1931 LOperand* obj = UseFixed(instr->object(), r2); | 1993 LOperand* obj = UseFixed(instr->object(), r2); |
| 1932 LOperand* key = UseFixed(instr->key(), r1); | 1994 LOperand* key = UseFixed(instr->key(), r1); |
| (...skipping 211 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2144 | 2206 |
| 2145 LInstruction* LChunkBuilder::DoIn(HIn* instr) { | 2207 LInstruction* LChunkBuilder::DoIn(HIn* instr) { |
| 2146 LOperand* key = UseRegisterAtStart(instr->key()); | 2208 LOperand* key = UseRegisterAtStart(instr->key()); |
| 2147 LOperand* object = UseRegisterAtStart(instr->object()); | 2209 LOperand* object = UseRegisterAtStart(instr->object()); |
| 2148 LIn* result = new LIn(key, object); | 2210 LIn* result = new LIn(key, object); |
| 2149 return MarkAsCall(DefineFixed(result, r0), instr); | 2211 return MarkAsCall(DefineFixed(result, r0), instr); |
| 2150 } | 2212 } |
| 2151 | 2213 |
| 2152 | 2214 |
| 2153 } } // namespace v8::internal | 2215 } } // namespace v8::internal |
| OLD | NEW |