Skip to content

Commit

Permalink
Browse files Browse the repository at this point in the history
[JSC] Use 3 operands Add in more places
https://bugs.webkit.org/show_bug.cgi?id=155082

Reviewed by Filip Pizlo.

* assembler/MacroAssembler.h:
(JSC::MacroAssembler::addPtr):
(JSC::MacroAssembler::add32):
* assembler/MacroAssemblerARMv7.h:
(JSC::MacroAssemblerARMv7::add32):
* dfg/DFGSpeculativeJIT.cpp:
(JSC::DFG::SpeculativeJIT::compileArithAdd):
The case with child1 constant is useless.
The canonical form will have the constant as child2.

Also add register reuse for the fast-add.
Registers are a scarce resource on x86.

* jit/CCallHelpers.h:
(JSC::CCallHelpers::prepareForTailCallSlow):
* yarr/YarrJIT.cpp:
(JSC::Yarr::YarrGenerator::generate):


Canonical link: https://commits.webkit.org/173187@main
git-svn-id: https://svn.webkit.org/repository/webkit/trunk@197653 268f45cc-cd09-0410-ab3c-d52691b4dbfc
  • Loading branch information
BenjaminPoulain committed Mar 7, 2016
1 parent e24abe7 commit b5545f4
Show file tree
Hide file tree
Showing 6 changed files with 66 additions and 37 deletions.
25 changes: 25 additions & 0 deletions Source/JavaScriptCore/ChangeLog
@@ -1,3 +1,28 @@
2016-03-06 Benjamin Poulain <benjamin@webkit.org>

[JSC] Use 3 operands Add in more places
https://bugs.webkit.org/show_bug.cgi?id=155082

Reviewed by Filip Pizlo.

* assembler/MacroAssembler.h:
(JSC::MacroAssembler::addPtr):
(JSC::MacroAssembler::add32):
* assembler/MacroAssemblerARMv7.h:
(JSC::MacroAssemblerARMv7::add32):
* dfg/DFGSpeculativeJIT.cpp:
(JSC::DFG::SpeculativeJIT::compileArithAdd):
The case with child1 constant is useless.
The canonical form will have the constant as child2.

Also add register reuse for the fast-add.
Registers are a scarce resource on x86.

* jit/CCallHelpers.h:
(JSC::CCallHelpers::prepareForTailCallSlow):
* yarr/YarrJIT.cpp:
(JSC::Yarr::YarrGenerator::generate):

2016-03-06 Benjamin Poulain <bpoulain@apple.com>

[JSC] Improve codegen of Compare and Test
Expand Down
20 changes: 20 additions & 0 deletions Source/JavaScriptCore/assembler/MacroAssembler.h
Expand Up @@ -521,6 +521,11 @@ class MacroAssembler : public MacroAssemblerBase {
add32(src, dest);
}

void addPtr(RegisterID left, RegisterID right, RegisterID dest)
{
add32(left, right, dest);
}

void addPtr(TrustedImm32 imm, RegisterID srcDest)
{
add32(imm, srcDest);
Expand Down Expand Up @@ -793,6 +798,11 @@ class MacroAssembler : public MacroAssemblerBase {
{
add64(src, dest);
}

void addPtr(RegisterID left, RegisterID right, RegisterID dest)
{
add64(left, right, dest);
}

void addPtr(Address src, RegisterID dest)
{
Expand Down Expand Up @@ -1457,6 +1467,16 @@ class MacroAssembler : public MacroAssemblerBase {
} else
add32(imm.asTrustedImm32(), dest);
}

void add32(Imm32 imm, RegisterID src, RegisterID dest)
{
if (shouldBlind(imm)) {
BlindedImm32 key = additionBlindedConstant(imm);
add32(key.value1, src, dest);
add32(key.value2, dest);
} else
add32(imm.asTrustedImm32(), src, dest);
}

void addPtr(Imm32 imm, RegisterID dest)
{
Expand Down
5 changes: 5 additions & 0 deletions Source/JavaScriptCore/assembler/MacroAssemblerARMv7.h
Expand Up @@ -155,6 +155,11 @@ class MacroAssemblerARMv7 : public AbstractMacroAssembler<ARMv7Assembler, MacroA
m_assembler.add(dest, dest, src);
}

void add32(RegisterID left, RegisterID right, RegisterID dest)
{
m_assembler.add(dest, left, right);
}

void add32(TrustedImm32 imm, RegisterID dest)
{
add32(imm, dest, dest);
Expand Down
44 changes: 13 additions & 31 deletions Source/JavaScriptCore/dfg/DFGSpeculativeJIT.cpp
Expand Up @@ -3256,32 +3256,20 @@ void SpeculativeJIT::compileArithAdd(Node* node)
switch (node->binaryUseKind()) {
case Int32Use: {
ASSERT(!shouldCheckNegativeZero(node->arithMode()));

if (node->child1()->isInt32Constant()) {
int32_t imm1 = node->child1()->asInt32();
SpeculateInt32Operand op2(this, node->child2());
GPRTemporary result(this);

if (!shouldCheckOverflow(node->arithMode())) {
m_jit.move(op2.gpr(), result.gpr());
m_jit.add32(Imm32(imm1), result.gpr());
} else
speculationCheck(Overflow, JSValueRegs(), 0, m_jit.branchAdd32(MacroAssembler::Overflow, op2.gpr(), Imm32(imm1), result.gpr()));

int32Result(result.gpr(), node);
return;
}

if (node->child2()->isInt32Constant()) {
SpeculateInt32Operand op1(this, node->child1());
int32_t imm2 = node->child2()->asInt32();
GPRTemporary result(this);


if (!shouldCheckOverflow(node->arithMode())) {
m_jit.move(op1.gpr(), result.gpr());
m_jit.add32(Imm32(imm2), result.gpr());
} else
speculationCheck(Overflow, JSValueRegs(), 0, m_jit.branchAdd32(MacroAssembler::Overflow, op1.gpr(), Imm32(imm2), result.gpr()));
GPRTemporary result(this, Reuse, op1);
m_jit.add32(Imm32(imm2), op1.gpr(), result.gpr());
int32Result(result.gpr(), node);
return;
}

GPRTemporary result(this);
speculationCheck(Overflow, JSValueRegs(), 0, m_jit.branchAdd32(MacroAssembler::Overflow, op1.gpr(), Imm32(imm2), result.gpr()));

int32Result(result.gpr(), node);
return;
Expand All @@ -3295,14 +3283,9 @@ void SpeculativeJIT::compileArithAdd(Node* node)
GPRReg gpr2 = op2.gpr();
GPRReg gprResult = result.gpr();

if (!shouldCheckOverflow(node->arithMode())) {
if (gpr1 == gprResult)
m_jit.add32(gpr2, gprResult);
else {
m_jit.move(gpr2, gprResult);
m_jit.add32(gpr1, gprResult);
}
} else {
if (!shouldCheckOverflow(node->arithMode()))
m_jit.add32(gpr1, gpr2, gprResult);
else {
MacroAssembler::Jump check = m_jit.branchAdd32(MacroAssembler::Overflow, gpr1, gpr2, gprResult);

if (gpr1 == gprResult)
Expand All @@ -3329,8 +3312,7 @@ void SpeculativeJIT::compileArithAdd(Node* node)
SpeculateWhicheverInt52Operand op1(this, node->child1());
SpeculateWhicheverInt52Operand op2(this, node->child2(), op1);
GPRTemporary result(this, Reuse, op1);
m_jit.move(op1.gpr(), result.gpr());
m_jit.add64(op2.gpr(), result.gpr());
m_jit.add64(op1.gpr(), op2.gpr(), result.gpr());
int52Result(result.gpr(), node, op1.format());
return;
}
Expand Down
3 changes: 1 addition & 2 deletions Source/JavaScriptCore/jit/CCallHelpers.h
Expand Up @@ -2157,8 +2157,7 @@ class CCallHelpers : public AssemblyHelpers {

// The new frame pointer is at framePointer + oldFrameSize - newFrameSize
ASSERT(newFramePointer != oldFrameSizeGPR);
move(framePointerRegister, newFramePointer);
addPtr(oldFrameSizeGPR, newFramePointer);
addPtr(framePointerRegister, oldFrameSizeGPR, newFramePointer);

// The new frame size is just the number of arguments plus the
// frame header size, aligned
Expand Down
6 changes: 2 additions & 4 deletions Source/JavaScriptCore/yarr/YarrJIT.cpp
Expand Up @@ -1626,8 +1626,7 @@ class YarrGenerator : private MacroAssembler {
if (term->quantityType == QuantifierFixedCount)
inputOffset -= term->parentheses.disjunction->m_minimumSize;
if (inputOffset) {
move(index, indexTemporary);
add32(Imm32(inputOffset), indexTemporary);
add32(Imm32(inputOffset), index, indexTemporary);
setSubpatternStart(indexTemporary, term->parentheses.subpatternId);
} else
setSubpatternStart(index, term->parentheses.subpatternId);
Expand Down Expand Up @@ -1657,8 +1656,7 @@ class YarrGenerator : private MacroAssembler {
if (term->capture() && compileMode == IncludeSubpatterns) {
int inputOffset = term->inputPosition - m_checked;
if (inputOffset) {
move(index, indexTemporary);
add32(Imm32(inputOffset), indexTemporary);
add32(Imm32(inputOffset), index, indexTemporary);
setSubpatternEnd(indexTemporary, term->parentheses.subpatternId);
} else
setSubpatternEnd(index, term->parentheses.subpatternId);
Expand Down

0 comments on commit b5545f4

Please sign in to comment.