source: webkit/trunk/Source/JavaScriptCore/jit/JITAddGenerator.cpp

Last change on this file was 281355, checked in by [email protected], 4 years ago

[JSC] Simplify moveIntsToDouble
https://bugs.webkit.org/show_bug.cgi?id=229351

Reviewed by Saam Barati.

MacroAssembler::moveIntsToDouble required scratch FPRReg. But it was only required for MacroAssemblerX86, and it is already removed.
This means that we no longer need this scratch FPRReg. This change makes a lot of IC code, property access code simpler.
This patch removes that scratch FPRReg, and removed scratch FPRReg of many arithmetic ICs. This patch is important for PutByVal modern
IC since some of property access requires FPRReg because of MacroAssembler::moveIntsToDouble, and it requires adding new m_scratch2FPR
to AccessCase. But after this simplification, this is no longer necessary.

  • assembler/MacroAssemblerARMv7.h:

(JSC::MacroAssemblerARMv7::moveIntsToDouble):

  • assembler/MacroAssemblerMIPS.h:

(JSC::MacroAssemblerMIPS::moveIntsToDouble):

  • dfg/DFGSpeculativeJIT.cpp:

(JSC::DFG::SpeculativeJIT::compileValueToInt32):
(JSC::DFG::SpeculativeJIT::compileDoubleRep):
(JSC::DFG::SpeculativeJIT::emitUntypedOrBigIntRightShiftBitOp):
(JSC::DFG::SpeculativeJIT::compileValueAdd):
(JSC::DFG::SpeculativeJIT::compileValueSub):
(JSC::DFG::SpeculativeJIT::compileMathIC):
(JSC::DFG::SpeculativeJIT::compileValueNegate):
(JSC::DFG::SpeculativeJIT::compileValueMul):
(JSC::DFG::SpeculativeJIT::speculateRealNumber):
(JSC::DFG::SpeculativeJIT::compileNormalizeMapKey):

  • dfg/DFGSpeculativeJIT.h:

(JSC::DFG::SpeculativeJIT::unboxDouble):

  • ftl/FTLLowerDFGToB3.cpp:

(JSC::FTL::DFG::LowerDFGToB3::compileBinaryMathIC):
(JSC::FTL::DFG::LowerDFGToB3::compileCompareStrictEq):

  • jit/AssemblyHelpers.cpp:

(JSC::AssemblyHelpers::emitConvertValueToBoolean):
(JSC::AssemblyHelpers::branchIfValue):

  • jit/AssemblyHelpers.h:

(JSC::AssemblyHelpers::unboxDoubleNonDestructive):
(JSC::AssemblyHelpers::unboxDouble):

  • jit/JITAddGenerator.cpp:

(JSC::JITAddGenerator::generateFastPath):

  • jit/JITAddGenerator.h:

(JSC::JITAddGenerator::JITAddGenerator):

  • jit/JITArithmetic.cpp:

(JSC::JIT::emitRightShiftFastPath):
(JSC::JIT::emitMathICFast):

  • jit/JITDivGenerator.cpp:

(JSC::JITDivGenerator::loadOperand):

  • jit/JITMulGenerator.cpp:

(JSC::JITMulGenerator::generateInline):
(JSC::JITMulGenerator::generateFastPath):

  • jit/JITMulGenerator.h:

(JSC::JITMulGenerator::JITMulGenerator):

  • jit/JITPropertyAccess.cpp:

(JSC::JIT::emitFloatTypedArrayPutByVal):

  • jit/JITPropertyAccess32_64.cpp:

(JSC::JIT::emitGenericContiguousPutByVal):

  • jit/JITRightShiftGenerator.cpp:

(JSC::JITRightShiftGenerator::generateFastPath):

  • jit/JITRightShiftGenerator.h:

(JSC::JITRightShiftGenerator::JITRightShiftGenerator):

  • jit/JITSubGenerator.cpp:

(JSC::JITSubGenerator::generateInline):
(JSC::JITSubGenerator::generateFastPath):

  • jit/JITSubGenerator.h:

(JSC::JITSubGenerator::JITSubGenerator):

File size: 7.5 KB
Line 
1/*
2 * Copyright (C) 2015-2016 Apple Inc. All rights reserved.
3 *
4 * Redistribution and use in source and binary forms, with or without
5 * modification, are permitted provided that the following conditions
6 * are met:
7 * 1. Redistributions of source code must retain the above copyright
8 * notice, this list of conditions and the following disclaimer.
9 * 2. Redistributions in binary form must reproduce the above copyright
10 * notice, this list of conditions and the following disclaimer in the
11 * documentation and/or other materials provided with the distribution.
12 *
13 * THIS SOFTWARE IS PROVIDED BY APPLE INC. ``AS IS'' AND ANY
14 * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
15 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
16 * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR
17 * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
18 * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
19 * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
20 * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
21 * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
22 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
23 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
24 */
25
26#include "config.h"
27#include "JITAddGenerator.h"
28
29#include "ArithProfile.h"
30#include "JITMathIC.h"
31
32#if ENABLE(JIT)
33
34namespace JSC {
35
36JITMathICInlineResult JITAddGenerator::generateInline(CCallHelpers& jit, MathICGenerationState& state, const BinaryArithProfile* arithProfile)
37{
38 // We default to speculating int32.
39 ObservedType lhs = ObservedType().withInt32();
40 ObservedType rhs = ObservedType().withInt32();
41 if (arithProfile) {
42 lhs = arithProfile->lhsObservedType();
43 rhs = arithProfile->rhsObservedType();
44 }
45
46 if (lhs.isOnlyNonNumber() && rhs.isOnlyNonNumber())
47 return JITMathICInlineResult::DontGenerate;
48
49 if ((lhs.isOnlyInt32() || m_leftOperand.isConstInt32()) && (rhs.isOnlyInt32() || m_rightOperand.isConstInt32())) {
50 ASSERT(!m_leftOperand.isConstInt32() || !m_rightOperand.isConstInt32());
51 if (!m_leftOperand.isConstInt32())
52 state.slowPathJumps.append(jit.branchIfNotInt32(m_left));
53 if (!m_rightOperand.isConstInt32())
54 state.slowPathJumps.append(jit.branchIfNotInt32(m_right));
55
56 GPRReg scratch = m_scratchGPR;
57 if (m_leftOperand.isConstInt32() || m_rightOperand.isConstInt32()) {
58 JSValueRegs var = m_leftOperand.isConstInt32() ? m_right : m_left;
59 int32_t constValue = m_leftOperand.isConstInt32() ? m_leftOperand.asConstInt32() : m_rightOperand.asConstInt32();
60 if (var.payloadGPR() != m_result.payloadGPR())
61 scratch = m_result.payloadGPR();
62 state.slowPathJumps.append(jit.branchAdd32(CCallHelpers::Overflow, var.payloadGPR(), CCallHelpers::Imm32(constValue), scratch));
63 } else {
64 if (m_left.payloadGPR() != m_result.payloadGPR() && m_right.payloadGPR() != m_result.payloadGPR())
65 scratch = m_result.payloadGPR();
66 state.slowPathJumps.append(jit.branchAdd32(CCallHelpers::Overflow, m_right.payloadGPR(), m_left.payloadGPR(), scratch));
67 }
68 jit.boxInt32(scratch, m_result);
69 return JITMathICInlineResult::GeneratedFastPath;
70 }
71
72 return JITMathICInlineResult::GenerateFullSnippet;
73}
74
75bool JITAddGenerator::generateFastPath(CCallHelpers& jit, CCallHelpers::JumpList& endJumpList, CCallHelpers::JumpList& slowPathJumpList, const BinaryArithProfile* arithProfile, bool shouldEmitProfiling)
76{
77 ASSERT(m_scratchGPR != InvalidGPRReg);
78 ASSERT(m_scratchGPR != m_left.payloadGPR());
79 ASSERT(m_scratchGPR != m_right.payloadGPR());
80#if USE(JSVALUE32_64)
81 ASSERT(m_scratchGPR != m_left.tagGPR());
82 ASSERT(m_scratchGPR != m_right.tagGPR());
83#endif
84
85 ASSERT(!m_leftOperand.isConstInt32() || !m_rightOperand.isConstInt32());
86
87 if (!m_leftOperand.mightBeNumber() || !m_rightOperand.mightBeNumber())
88 return false;
89
90 if (m_leftOperand.isConstInt32() || m_rightOperand.isConstInt32()) {
91 JSValueRegs var = m_leftOperand.isConstInt32() ? m_right : m_left;
92 SnippetOperand& varOpr = m_leftOperand.isConstInt32() ? m_rightOperand : m_leftOperand;
93 SnippetOperand& constOpr = m_leftOperand.isConstInt32() ? m_leftOperand : m_rightOperand;
94
95 // Try to do intVar + intConstant.
96 CCallHelpers::Jump notInt32 = jit.branchIfNotInt32(var);
97
98 GPRReg scratch = m_scratchGPR;
99 if (var.payloadGPR() != m_result.payloadGPR())
100 scratch = m_result.payloadGPR();
101 slowPathJumpList.append(jit.branchAdd32(CCallHelpers::Overflow, var.payloadGPR(), CCallHelpers::Imm32(constOpr.asConstInt32()), scratch));
102
103 jit.boxInt32(scratch, m_result);
104 endJumpList.append(jit.jump());
105
106 if (!jit.supportsFloatingPoint()) {
107 slowPathJumpList.append(notInt32);
108 return true;
109 }
110
111 // Try to do doubleVar + double(intConstant).
112 notInt32.link(&jit);
113 if (!varOpr.definitelyIsNumber())
114 slowPathJumpList.append(jit.branchIfNotNumber(var, m_scratchGPR));
115
116 jit.unboxDoubleNonDestructive(var, m_leftFPR, m_scratchGPR);
117
118 jit.move(CCallHelpers::Imm32(constOpr.asConstInt32()), m_scratchGPR);
119 jit.convertInt32ToDouble(m_scratchGPR, m_rightFPR);
120
121 // Fall thru to doubleVar + doubleVar.
122
123 } else {
124 ASSERT(!m_leftOperand.isConstInt32() && !m_rightOperand.isConstInt32());
125 CCallHelpers::Jump leftNotInt;
126 CCallHelpers::Jump rightNotInt;
127
128 // Try to do intVar + intVar.
129 leftNotInt = jit.branchIfNotInt32(m_left);
130 rightNotInt = jit.branchIfNotInt32(m_right);
131
132 GPRReg scratch = m_scratchGPR;
133 if (m_left.payloadGPR() != m_result.payloadGPR() && m_right.payloadGPR() != m_result.payloadGPR())
134 scratch = m_result.payloadGPR();
135 slowPathJumpList.append(jit.branchAdd32(CCallHelpers::Overflow, m_right.payloadGPR(), m_left.payloadGPR(), scratch));
136
137 jit.boxInt32(scratch, m_result);
138 endJumpList.append(jit.jump());
139
140
141 if (!jit.supportsFloatingPoint()) {
142 slowPathJumpList.append(leftNotInt);
143 slowPathJumpList.append(rightNotInt);
144 return true;
145 }
146
147 leftNotInt.link(&jit);
148 if (!m_leftOperand.definitelyIsNumber())
149 slowPathJumpList.append(jit.branchIfNotNumber(m_left, m_scratchGPR));
150 if (!m_rightOperand.definitelyIsNumber())
151 slowPathJumpList.append(jit.branchIfNotNumber(m_right, m_scratchGPR));
152
153 jit.unboxDoubleNonDestructive(m_left, m_leftFPR, m_scratchGPR);
154 CCallHelpers::Jump rightIsDouble = jit.branchIfNotInt32(m_right);
155
156 jit.convertInt32ToDouble(m_right.payloadGPR(), m_rightFPR);
157 CCallHelpers::Jump rightWasInteger = jit.jump();
158
159 rightNotInt.link(&jit);
160 if (!m_rightOperand.definitelyIsNumber())
161 slowPathJumpList.append(jit.branchIfNotNumber(m_right, m_scratchGPR));
162
163 jit.convertInt32ToDouble(m_left.payloadGPR(), m_leftFPR);
164
165 rightIsDouble.link(&jit);
166 jit.unboxDoubleNonDestructive(m_right, m_rightFPR, m_scratchGPR);
167
168 rightWasInteger.link(&jit);
169
170 // Fall thru to doubleVar + doubleVar.
171 }
172
173 // Do doubleVar + doubleVar.
174 jit.addDouble(m_rightFPR, m_leftFPR);
175 if (arithProfile && shouldEmitProfiling)
176 arithProfile->emitSetDouble(jit);
177
178 jit.boxDouble(m_leftFPR, m_result);
179
180 return true;
181}
182
183} // namespace JSC
184
185#endif // ENABLE(JIT)
Note: See TracBrowser for help on using the repository browser.