Changeset 167325 in webkit for trunk/Source/JavaScriptCore/ftl/FTLLowerDFGToLLVM.cpp
- Timestamp:
- Apr 15, 2014, 1:26:16 PM (11 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/Source/JavaScriptCore/ftl/FTLLowerDFGToLLVM.cpp
r167189 r167325 187 187 LType type; 188 188 switch (node->flags() & NodeResultMask) { 189 case NodeResult Number:189 case NodeResultDouble: 190 190 type = m_out.doubleType; 191 191 break; … … 283 283 case JSConstant: 284 284 break; 285 case DoubleConstant: 286 compileDoubleConstant(); 287 break; 288 case Int52Constant: 289 compileInt52Constant(); 290 break; 285 291 case WeakJSConstant: 286 292 compileWeakJSConstant(); … … 288 294 case PhantomArguments: 289 295 compilePhantomArguments(); 296 break; 297 case DoubleRep: 298 compileDoubleRep(); 299 break; 300 case ValueRep: 301 compileValueRep(); 302 break; 303 case Int52Rep: 304 compileInt52Rep(); 305 break; 306 case ValueToInt32: 307 compileValueToInt32(); 290 308 break; 291 309 case GetArgument: … … 378 396 case UInt32ToNumber: 379 397 compileUInt32ToNumber(); 380 break;381 case Int32ToDouble:382 compileInt32ToDouble();383 398 break; 384 399 case CheckStructure: … … 569 584 case InvalidationPoint: 570 585 compileInvalidationPoint(); 571 break;572 case ValueToInt32:573 compileValueToInt32();574 break;575 case Int52ToValue:576 compileInt52ToValue();577 586 break; 578 587 case CheckArgumentsNotCreated: … … 634 643 } 635 644 645 void compileUpsilon() 646 { 647 LValue destination = m_phis.get(m_node->phi()); 648 649 switch (m_node->child1().useKind()) { 650 case DoubleRepUse: 651 m_out.set(lowDouble(m_node->child1()), destination); 652 break; 653 case Int32Use: 654 m_out.set(lowInt32(m_node->child1()), destination); 655 break; 656 case Int52RepUse: 657 m_out.set(lowInt52(m_node->child1()), destination); 658 break; 659 case BooleanUse: 660 m_out.set(lowBoolean(m_node->child1()), destination); 661 break; 662 case CellUse: 663 m_out.set(lowCell(m_node->child1()), destination); 664 break; 665 case UntypedUse: 666 m_out.set(lowJSValue(m_node->child1()), destination); 667 break; 668 default: 669 RELEASE_ASSERT_NOT_REACHED(); 670 break; 671 } 672 } 673 674 void compilePhi() 675 { 676 LValue source = m_phis.get(m_node); 677 678 switch (m_node->flags() & NodeResultMask) { 679 case NodeResultDouble: 680 setDouble(m_out.get(source)); 681 break; 682 case NodeResultInt32: 683 setInt32(m_out.get(source)); 684 break; 685 case NodeResultInt52: 686 setInt52(m_out.get(source)); 687 break; 688 case NodeResultBoolean: 689 setBoolean(m_out.get(source)); 690 break; 691 case NodeResultJS: 692 setJSValue(m_out.get(source)); 693 break; 694 default: 695 RELEASE_ASSERT_NOT_REACHED(); 696 break; 697 } 698 } 699 700 void compileDoubleConstant() 701 { 702 setDouble(m_out.constDouble(m_graph.valueOfNumberConstant(m_node))); 703 } 704 705 void compileInt52Constant() 706 { 707 int64_t value = m_graph.valueOfJSConstant(m_node).asMachineInt(); 708 709 setInt52(m_out.constInt64(value << JSValue::int52ShiftAmount)); 710 setStrictInt52(m_out.constInt64(value)); 711 } 712 713 void compileWeakJSConstant() 714 { 715 setJSValue(weakPointer(m_node->weakConstant())); 716 } 717 718 void compilePhantomArguments() 719 { 720 setJSValue(m_out.constInt64(JSValue::encode(JSValue()))); 721 } 722 723 void compileDoubleRep() 724 { 725 switch (m_node->child1().useKind()) { 726 case NumberUse: { 727 LValue value = lowJSValue(m_node->child1(), ManualOperandSpeculation); 728 setDouble(jsValueToDouble(m_node->child1(), value)); 729 return; 730 } 731 732 case Int52RepUse: { 733 setDouble(strictInt52ToDouble(lowStrictInt52(m_node->child1()))); 734 return; 735 } 736 737 default: 738 RELEASE_ASSERT_NOT_REACHED(); 739 } 740 } 741 742 void compileValueRep() 743 { 744 switch (m_node->child1().useKind()) { 745 case DoubleRepUse: { 746 setJSValue(boxDouble(lowDouble(m_node->child1()))); 747 return; 748 } 749 750 case Int52RepUse: { 751 setJSValue(strictInt52ToJSValue(lowStrictInt52(m_node->child1()))); 752 return; 753 } 754 755 default: 756 RELEASE_ASSERT_NOT_REACHED(); 757 } 758 } 759 760 void compileInt52Rep() 761 { 762 setStrictInt52(m_out.signExt(lowInt32(m_node->child1()), m_out.int64)); 763 } 764 636 765 void compileValueToInt32() 637 766 { … … 641 770 break; 642 771 643 case MachineIntUse:772 case Int52RepUse: 644 773 setInt32(m_out.castToInt32(lowStrictInt52(m_node->child1()))); 774 break; 775 776 case DoubleRepUse: 777 setInt32(doubleToInt32(lowDouble(m_node->child1()))); 645 778 break; 646 779 … … 659 792 } 660 793 661 value = m_doubleValues.get(m_node->child1().node());662 if (isValid(value)) {663 setInt32(doubleToInt32(value.value()));664 break;665 }666 667 794 // We'll basically just get here for constants. But it's good to have this 668 795 // catch-all since we often add new representations into the mix. … … 684 811 } 685 812 686 void compileInt52ToValue()687 {688 setJSValue(lowJSValue(m_node->child1()));689 }690 691 void compileUpsilon()692 {693 LValue destination = m_phis.get(m_node->phi());694 695 switch (m_node->child1().useKind()) {696 case NumberUse:697 m_out.set(lowDouble(m_node->child1()), destination);698 break;699 case Int32Use:700 m_out.set(lowInt32(m_node->child1()), destination);701 break;702 case MachineIntUse:703 m_out.set(lowInt52(m_node->child1()), destination);704 break;705 case BooleanUse:706 m_out.set(lowBoolean(m_node->child1()), destination);707 break;708 case CellUse:709 m_out.set(lowCell(m_node->child1()), destination);710 break;711 case UntypedUse:712 m_out.set(lowJSValue(m_node->child1()), destination);713 break;714 default:715 RELEASE_ASSERT_NOT_REACHED();716 break;717 }718 }719 720 void compilePhi()721 {722 LValue source = m_phis.get(m_node);723 724 switch (m_node->flags() & NodeResultMask) {725 case NodeResultNumber:726 setDouble(m_out.get(source));727 break;728 case NodeResultInt32:729 setInt32(m_out.get(source));730 break;731 case NodeResultInt52:732 setInt52(m_out.get(source));733 break;734 case NodeResultBoolean:735 setBoolean(m_out.get(source));736 break;737 case NodeResultJS:738 setJSValue(m_out.get(source));739 break;740 default:741 RELEASE_ASSERT_NOT_REACHED();742 break;743 }744 }745 746 void compilePhantomArguments()747 {748 setJSValue(m_out.constInt64(JSValue::encode(JSValue())));749 }750 751 void compileWeakJSConstant()752 {753 setJSValue(weakPointer(m_node->weakConstant()));754 }755 756 813 void compileGetArgument() 757 814 { … … 967 1024 } 968 1025 969 case MachineIntUse: {1026 case Int52RepUse: { 970 1027 if (!m_state.forNode(m_node->child1()).couldBeType(SpecInt52) 971 1028 && !m_state.forNode(m_node->child2()).couldBeType(SpecInt52)) { … … 1017 1074 } 1018 1075 1019 case NumberUse: {1076 case DoubleRepUse: { 1020 1077 LValue C1 = lowDouble(m_node->child1()); 1021 1078 LValue C2 = lowDouble(m_node->child2()); … … 1066 1123 } 1067 1124 1068 case MachineIntUse: {1125 case Int52RepUse: { 1069 1126 Int52Kind kind; 1070 1127 LValue left = lowWhicheverInt52(m_node->child1(), kind); … … 1093 1150 } 1094 1151 1095 case NumberUse: {1152 case DoubleRepUse: { 1096 1153 setDouble( 1097 1154 m_out.doubleMul(lowDouble(m_node->child1()), lowDouble(m_node->child2()))); … … 1196 1253 } 1197 1254 1198 case NumberUse: {1255 case DoubleRepUse: { 1199 1256 setDouble(m_out.doubleDiv( 1200 1257 lowDouble(m_node->child1()), lowDouble(m_node->child2()))); … … 1294 1351 } 1295 1352 1296 case NumberUse: {1353 case DoubleRepUse: { 1297 1354 setDouble( 1298 1355 m_out.doubleRem(lowDouble(m_node->child1()), lowDouble(m_node->child2()))); … … 1322 1379 } 1323 1380 1324 case NumberUse: {1381 case DoubleRepUse: { 1325 1382 LValue left = lowDouble(m_node->child1()); 1326 1383 LValue right = lowDouble(m_node->child2()); … … 1372 1429 } 1373 1430 1374 case NumberUse: {1431 case DoubleRepUse: { 1375 1432 setDouble(m_out.doubleAbs(lowDouble(m_node->child1()))); 1376 1433 break; … … 1419 1476 } 1420 1477 1421 case MachineIntUse: {1478 case Int52RepUse: { 1422 1479 if (!m_state.forNode(m_node->child1()).couldBeType(SpecInt52)) { 1423 1480 Int52Kind kind; … … 1439 1496 } 1440 1497 1441 case NumberUse: {1498 case DoubleRepUse: { 1442 1499 setDouble(m_out.doubleNeg(lowDouble(m_node->child1()))); 1443 1500 break; … … 1497 1554 speculate(Overflow, noValue(), 0, m_out.lessThan(value, m_out.int32Zero)); 1498 1555 setInt32(value); 1499 }1500 1501 void compileInt32ToDouble()1502 {1503 setDouble(lowDouble(m_node->child1()));1504 1556 } 1505 1557 … … 2214 2266 LValue intValue; 2215 2267 switch (child3.useKind()) { 2216 case MachineIntUse:2268 case Int52RepUse: 2217 2269 case Int32Use: { 2218 2270 if (child3.useKind() == Int32Use) … … 2247 2299 } 2248 2300 2249 case NumberUse: {2301 case DoubleRepUse: { 2250 2302 LValue doubleValue = lowDouble(child3); 2251 2303 … … 3329 3381 { 3330 3382 if (m_node->isBinaryUseKind(Int32Use) 3331 || m_node->isBinaryUseKind( MachineIntUse)3332 || m_node->isBinaryUseKind( NumberUse)3383 || m_node->isBinaryUseKind(Int52RepUse) 3384 || m_node->isBinaryUseKind(DoubleRepUse) 3333 3385 || m_node->isBinaryUseKind(ObjectUse) 3334 3386 || m_node->isBinaryUseKind(BooleanUse) … … 3372 3424 } 3373 3425 3374 if (m_node->isBinaryUseKind( MachineIntUse)) {3426 if (m_node->isBinaryUseKind(Int52RepUse)) { 3375 3427 Int52Kind kind; 3376 3428 LValue left = lowWhicheverInt52(m_node->child1(), kind); … … 3380 3432 } 3381 3433 3382 if (m_node->isBinaryUseKind( NumberUse)) {3434 if (m_node->isBinaryUseKind(DoubleRepUse)) { 3383 3435 setBoolean( 3384 3436 m_out.doubleEqual(lowDouble(m_node->child1()), lowDouble(m_node->child2()))); … … 4124 4176 } 4125 4177 4126 if (m_node->isBinaryUseKind( MachineIntUse)) {4178 if (m_node->isBinaryUseKind(Int52RepUse)) { 4127 4179 Int52Kind kind; 4128 4180 LValue left = lowWhicheverInt52(m_node->child1(), kind); … … 4132 4184 } 4133 4185 4134 if (m_node->isBinaryUseKind( NumberUse)) {4186 if (m_node->isBinaryUseKind(DoubleRepUse)) { 4135 4187 LValue left = lowDouble(m_node->child1()); 4136 4188 LValue right = lowDouble(m_node->child2()); … … 4389 4441 case Int32Use: 4390 4442 return m_out.notZero32(lowInt32(m_node->child1())); 4391 case NumberUse:4443 case DoubleRepUse: 4392 4444 return m_out.doubleNotEqual(lowDouble(edge), m_out.doubleZero); 4393 4445 case ObjectOrOtherUse: … … 4735 4787 4736 4788 enum Int52Kind { StrictInt52, Int52 }; 4737 LValue lowInt52(Edge edge, Int52Kind kind, OperandSpeculationMode mode = AutomaticOperandSpeculation) 4738 { 4739 ASSERT_UNUSED(mode, mode == ManualOperandSpeculation || edge.useKind() == MachineIntUse); 4740 4741 if (edge->hasConstant()) { 4742 JSValue value = m_graph.valueOfJSConstant(edge.node()); 4743 if (!value.isMachineInt()) { 4744 terminate(Uncountable); 4745 return m_out.int64Zero; 4746 } 4747 int64_t result = value.asMachineInt(); 4748 if (kind == Int52) 4749 result <<= JSValue::int52ShiftAmount; 4750 return m_out.constInt64(result); 4751 } 4789 LValue lowInt52(Edge edge, Int52Kind kind) 4790 { 4791 RELEASE_ASSERT(edge.useKind() == Int52RepUse); 4752 4792 4753 4793 LoweredNodeValue value; … … 4774 4814 break; 4775 4815 } 4776 4777 value = m_int32Values.get(edge.node()); 4778 if (isValid(value)) { 4779 return setInt52WithStrictValue( 4780 edge.node(), m_out.signExt(value.value(), m_out.int64), kind); 4781 } 4782 4783 RELEASE_ASSERT(!(m_state.forNode(edge).m_type & SpecInt52)); 4784 4785 value = m_jsValueValues.get(edge.node()); 4786 if (isValid(value)) { 4787 LValue boxedResult = value.value(); 4788 FTL_TYPE_CHECK( 4789 jsValueValue(boxedResult), edge, SpecMachineInt, isNotInt32(boxedResult)); 4790 return setInt52WithStrictValue( 4791 edge.node(), m_out.signExt(unboxInt32(boxedResult), m_out.int64), kind); 4792 } 4793 4794 RELEASE_ASSERT(!(m_state.forNode(edge).m_type & SpecMachineInt)); 4816 4817 RELEASE_ASSERT(!m_state.forNode(edge).m_type); 4795 4818 terminate(Uncountable); 4796 4819 return m_out.int64Zero; 4797 4820 } 4798 4821 4799 LValue lowInt52(Edge edge , OperandSpeculationMode mode = AutomaticOperandSpeculation)4800 { 4801 return lowInt52(edge, Int52 , mode);4802 } 4803 4804 LValue lowStrictInt52(Edge edge , OperandSpeculationMode mode = AutomaticOperandSpeculation)4805 { 4806 return lowInt52(edge, StrictInt52 , mode);4822 LValue lowInt52(Edge edge) 4823 { 4824 return lowInt52(edge, Int52); 4825 } 4826 4827 LValue lowStrictInt52(Edge edge) 4828 { 4829 return lowInt52(edge, StrictInt52); 4807 4830 } 4808 4831 … … 4831 4854 } 4832 4855 4833 LValue lowWhicheverInt52(Edge edge, Int52Kind& kind , OperandSpeculationMode mode = AutomaticOperandSpeculation)4856 LValue lowWhicheverInt52(Edge edge, Int52Kind& kind) 4834 4857 { 4835 4858 kind = bestInt52Kind(edge); 4836 return lowInt52(edge, kind , mode);4859 return lowInt52(edge, kind); 4837 4860 } 4838 4861 … … 4932 4955 } 4933 4956 4934 LValue lowDouble(Edge edge, OperandSpeculationMode mode = AutomaticOperandSpeculation) 4935 { 4936 ASSERT_UNUSED(mode, mode == ManualOperandSpeculation || isDouble(edge.useKind())); 4937 4938 if (edge->hasConstant()) { 4939 JSValue value = m_graph.valueOfJSConstant(edge.node()); 4940 if (!value.isNumber()) { 4941 terminate(Uncountable); 4942 return m_out.doubleZero; 4943 } 4944 return m_out.constDouble(value.asNumber()); 4945 } 4957 LValue lowDouble(Edge edge) 4958 { 4959 RELEASE_ASSERT(isDouble(edge.useKind())); 4946 4960 4947 4961 LoweredNodeValue value = m_doubleValues.get(edge.node()); … … 4949 4963 return value.value(); 4950 4964 4951 value = m_int32Values.get(edge.node()); 4952 if (isValid(value)) { 4953 LValue result = m_out.intToDouble(value.value()); 4954 setDouble(edge.node(), result); 4955 return result; 4956 } 4957 4958 value = m_strictInt52Values.get(edge.node()); 4959 if (isValid(value)) 4960 return strictInt52ToDouble(edge, value.value()); 4961 4962 value = m_int52Values.get(edge.node()); 4963 if (isValid(value)) 4964 return strictInt52ToDouble(edge, int52ToStrictInt52(value.value())); 4965 4966 value = m_jsValueValues.get(edge.node()); 4967 if (isValid(value)) { 4968 LValue boxedResult = value.value(); 4969 4970 LBasicBlock intCase = FTL_NEW_BLOCK(m_out, ("Double unboxing int case")); 4971 LBasicBlock doubleCase = FTL_NEW_BLOCK(m_out, ("Double unboxing double case")); 4972 LBasicBlock continuation = FTL_NEW_BLOCK(m_out, ("Double unboxing continuation")); 4973 4974 m_out.branch(isNotInt32(boxedResult), unsure(doubleCase), unsure(intCase)); 4975 4976 LBasicBlock lastNext = m_out.appendTo(intCase, doubleCase); 4977 4978 ValueFromBlock intToDouble = m_out.anchor( 4979 m_out.intToDouble(unboxInt32(boxedResult))); 4980 m_out.jump(continuation); 4981 4982 m_out.appendTo(doubleCase, continuation); 4983 4984 FTL_TYPE_CHECK( 4985 jsValueValue(boxedResult), edge, SpecFullNumber, isCellOrMisc(boxedResult)); 4986 4987 ValueFromBlock unboxedDouble = m_out.anchor(unboxDouble(boxedResult)); 4988 m_out.jump(continuation); 4989 4990 m_out.appendTo(continuation, lastNext); 4991 4992 LValue result = m_out.phi(m_out.doubleType, intToDouble, unboxedDouble); 4993 4994 setDouble(edge.node(), result); 4995 return result; 4996 } 4997 4998 RELEASE_ASSERT(!(m_state.forNode(edge).m_type & SpecFullNumber)); 4965 RELEASE_ASSERT(!m_state.forNode(edge).m_type); 4999 4966 terminate(Uncountable); 5000 4967 return m_out.doubleZero; … … 5004 4971 { 5005 4972 ASSERT_UNUSED(mode, mode == ManualOperandSpeculation || edge.useKind() == UntypedUse); 4973 RELEASE_ASSERT(!isDouble(edge.useKind())); 4974 RELEASE_ASSERT(edge.useKind() != Int52RepUse); 5006 4975 5007 4976 if (edge->hasConstant()) … … 5019 4988 } 5020 4989 5021 value = m_strictInt52Values.get(edge.node());5022 if (isValid(value))5023 return strictInt52ToJSValue(value.value());5024 5025 value = m_int52Values.get(edge.node());5026 if (isValid(value))5027 return strictInt52ToJSValue(int52ToStrictInt52(value.value()));5028 5029 4990 value = m_booleanValues.get(edge.node()); 5030 4991 if (isValid(value)) { 5031 4992 LValue result = boxBoolean(value.value()); 5032 setJSValue(edge.node(), result);5033 return result;5034 }5035 5036 value = m_doubleValues.get(edge.node());5037 if (isValid(value)) {5038 LValue result = boxDouble(value.value());5039 4993 setJSValue(edge.node(), result); 5040 4994 return result; … … 5066 5020 } 5067 5021 5068 LValue strictInt52ToDouble(Edge edge, LValue value) 5069 { 5070 LValue result = m_out.intToDouble(value); 5071 setDouble(edge.node(), result); 5072 return result; 5022 LValue strictInt52ToDouble(LValue value) 5023 { 5024 return m_out.intToDouble(value); 5073 5025 } 5074 5026 … … 5100 5052 } 5101 5053 5102 LValue setInt52WithStrictValue(Node* node, LValue value, Int52Kind kind)5103 {5104 switch (kind) {5105 case StrictInt52:5106 setStrictInt52(node, value);5107 return value;5108 5109 case Int52:5110 value = strictInt52ToInt52(value);5111 setInt52(node, value);5112 return value;5113 }5114 5115 RELEASE_ASSERT_NOT_REACHED();5116 return 0;5117 }5118 5119 5054 LValue strictInt52ToInt52(LValue value) 5120 5055 { … … 5148 5083 return m_out.testNonZero64(jsValue, m_tagTypeNumber); 5149 5084 } 5085 5150 5086 LValue unboxDouble(LValue jsValue) 5151 5087 { … … 5155 5091 { 5156 5092 return m_out.sub(m_out.bitCast(doubleValue, m_out.int64), m_tagTypeNumber); 5093 } 5094 LValue jsValueToDouble(Edge edge, LValue boxedValue) 5095 { 5096 LBasicBlock intCase = FTL_NEW_BLOCK(m_out, ("DoubleRep unboxing int case")); 5097 LBasicBlock doubleCase = FTL_NEW_BLOCK(m_out, ("DoubleRep unboxing double case")); 5098 LBasicBlock continuation = FTL_NEW_BLOCK(m_out, ("DoubleRep unboxing continuation")); 5099 5100 LValue isNotInt32; 5101 if (!m_interpreter.needsTypeCheck(edge, SpecInt32)) 5102 isNotInt32 = m_out.booleanFalse; 5103 else if (!m_interpreter.needsTypeCheck(edge, ~SpecInt32)) 5104 isNotInt32 = m_out.booleanTrue; 5105 else 5106 isNotInt32 = this->isNotInt32(boxedValue); 5107 m_out.branch(isNotInt32, unsure(doubleCase), unsure(intCase)); 5108 5109 LBasicBlock lastNext = m_out.appendTo(intCase, doubleCase); 5110 5111 ValueFromBlock intToDouble = m_out.anchor( 5112 m_out.intToDouble(unboxInt32(boxedValue))); 5113 m_out.jump(continuation); 5114 5115 m_out.appendTo(doubleCase, continuation); 5116 5117 FTL_TYPE_CHECK( 5118 jsValueValue(boxedValue), edge, SpecBytecodeNumber, isCellOrMisc(boxedValue)); 5119 5120 ValueFromBlock unboxedDouble = m_out.anchor(unboxDouble(boxedValue)); 5121 m_out.jump(continuation); 5122 5123 m_out.appendTo(continuation, lastNext); 5124 5125 return m_out.phi(m_out.doubleType, intToDouble, unboxedDouble); 5157 5126 } 5158 5127 … … 5227 5196 break; 5228 5197 case KnownInt32Use: 5229 case KnownNumberUse:5230 5198 case KnownStringUse: 5199 case DoubleRepUse: 5200 case Int52RepUse: 5231 5201 ASSERT(!m_interpreter.needsTypeCheck(edge)); 5232 5202 break; … … 5261 5231 speculateStringOrStringObject(edge); 5262 5232 break; 5263 case RealNumberUse:5264 speculateRealNumber(edge);5265 break;5266 5233 case NumberUse: 5267 5234 speculateNumber(edge); 5268 5235 break; 5269 case MachineIntUse:5270 speculate MachineInt(edge);5236 case DoubleRepRealUse: 5237 speculateDoubleReal(edge); 5271 5238 break; 5272 5239 case BooleanUse: … … 5530 5497 void speculateNumber(Edge edge) 5531 5498 { 5499 LValue value = lowJSValue(edge, ManualOperandSpeculation); 5500 FTL_TYPE_CHECK(jsValueValue(value), edge, SpecBytecodeNumber, isNotNumber(value)); 5501 } 5502 5503 void speculateDoubleReal(Edge edge) 5504 { 5532 5505 // Do an early return here because lowDouble() can create a lot of control flow. 5533 5506 if (!m_interpreter.needsTypeCheck(edge)) 5534 5507 return; 5535 5508 5536 lowDouble(edge);5537 }5538 5539 void speculateRealNumber(Edge edge)5540 {5541 // Do an early return here because lowDouble() can create a lot of control flow.5542 if (!m_interpreter.needsTypeCheck(edge))5543 return;5544 5545 5509 LValue value = lowDouble(edge); 5546 5510 FTL_TYPE_CHECK( 5547 doubleValue(value), edge, Spec FullRealNumber,5511 doubleValue(value), edge, SpecDoubleReal, 5548 5512 m_out.doubleNotEqualOrUnordered(value, value)); 5549 }5550 5551 void speculateMachineInt(Edge edge)5552 {5553 if (!m_interpreter.needsTypeCheck(edge))5554 return;5555 5556 Int52Kind kind;5557 lowWhicheverInt52(edge, kind);5558 5513 } 5559 5514
Note:
See TracChangeset
for help on using the changeset viewer.