Modified: trunk/Source/_javascript_Core/assembler/MacroAssembler.h (281325 => 281326)
--- trunk/Source/_javascript_Core/assembler/MacroAssembler.h 2021-08-20 17:50:51 UTC (rev 281325)
+++ trunk/Source/_javascript_Core/assembler/MacroAssembler.h 2021-08-20 18:09:48 UTC (rev 281326)
@@ -1757,6 +1757,16 @@
} else
sub32(imm.asTrustedImm32(), dest);
}
+
+ void sub32(RegisterID src, Imm32 imm, RegisterID dest)
+ {
+ if (shouldBlind(imm)) {
+ BlindedImm32 key = additionBlindedConstant(imm);
+ sub32(src, key.value1, dest);
+ sub32(key.value2, dest);
+ } else
+ sub32(src, imm.asTrustedImm32(), dest);
+ }
void subPtr(Imm32 imm, RegisterID dest)
{
Modified: trunk/Source/_javascript_Core/assembler/MacroAssemblerARMv7.h (281325 => 281326)
--- trunk/Source/_javascript_Core/assembler/MacroAssemblerARMv7.h 2021-08-20 17:50:51 UTC (rev 281325)
+++ trunk/Source/_javascript_Core/assembler/MacroAssemblerARMv7.h 2021-08-20 18:09:48 UTC (rev 281326)
@@ -540,6 +540,17 @@
m_assembler.sub(dest, left, right);
}
+ void sub32(RegisterID left, TrustedImm32 right, RegisterID dest)
+ {
+ ARMThumbImmediate armImm = ARMThumbImmediate::makeUInt12OrEncodedImm(right.m_value);
+ if (armImm.isValid())
+ m_assembler.sub(dest, left, armImm);
+ else {
+ move(right, dataTempRegister);
+ m_assembler.sub(dest, left, dataTempRegister);
+ }
+ }
+
void sub32(TrustedImm32 imm, RegisterID dest)
{
ARMThumbImmediate armImm = ARMThumbImmediate::makeUInt12OrEncodedImm(imm.m_value);
Modified: trunk/Source/_javascript_Core/assembler/testmasm.cpp (281325 => 281326)
--- trunk/Source/_javascript_Core/assembler/testmasm.cpp 2021-08-20 17:50:51 UTC (rev 281325)
+++ trunk/Source/_javascript_Core/assembler/testmasm.cpp 2021-08-20 18:09:48 UTC (rev 281326)
@@ -1025,23 +1025,6 @@
}
}
-void testSub32ArgImm()
-{
- for (auto immediate : int32Operands()) {
- auto sub = compile([=] (CCallHelpers& jit) {
- emitFunctionPrologue(jit);
-
- jit.sub32(GPRInfo::argumentGPR0, CCallHelpers::TrustedImm32(immediate), GPRInfo::returnValueGPR);
-
- emitFunctionEpilogue(jit);
- jit.ret();
- });
-
- for (auto value : int32Operands())
- CHECK_EQ(invoke<uint32_t>(sub, value), static_cast<uint32_t>(value - immediate));
- }
-}
-
void testSub64Imm32()
{
for (auto immediate : int64Operands()) {
@@ -3963,6 +3946,23 @@
CHECK_EQ(buffer[9], initialValue + 9);
}
+void testSub32ArgImm()
+{
+ for (auto immediate : int32Operands()) {
+ auto sub = compile([=] (CCallHelpers& jit) {
+ emitFunctionPrologue(jit);
+
+ jit.sub32(GPRInfo::argumentGPR0, CCallHelpers::TrustedImm32(immediate), GPRInfo::returnValueGPR);
+
+ emitFunctionEpilogue(jit);
+ jit.ret();
+ });
+
+ for (auto value : int32Operands())
+ CHECK_EQ(invoke<uint32_t>(sub, value), static_cast<uint32_t>(value - immediate));
+ }
+}
+
#if CPU(ARM64)
void testLoadStorePair64Int64()
{
@@ -5645,6 +5645,7 @@
RUN(testMul32WithImmediates());
RUN(testLoadStorePair32());
+ RUN(testSub32ArgImm());
#if CPU(X86_64)
RUN(testBranchTestBit32RegReg());
@@ -5673,7 +5674,6 @@
RUN(testSub32Args());
RUN(testSub32Imm());
- RUN(testSub32ArgImm());
RUN(testSub64Imm32());
RUN(testSub64ArgImm32());
RUN(testSub64Imm64());
Modified: trunk/Source/_javascript_Core/yarr/YarrJIT.cpp (281325 => 281326)
--- trunk/Source/_javascript_Core/yarr/YarrJIT.cpp 2021-08-20 17:50:51 UTC (rev 281325)
+++ trunk/Source/_javascript_Core/yarr/YarrJIT.cpp 2021-08-20 18:09:48 UTC (rev 281326)
@@ -1704,10 +1704,9 @@
if (m_decodeSurrogatePairs)
op.m_jumps.append(jumpIfNoAvailableInput());
- move(index, countRegister);
Checked<unsigned> scaledMaxCount = term->quantityMaxCount;
scaledMaxCount *= U_IS_BMP(ch) ? 1 : 2;
- sub32(Imm32(scaledMaxCount), countRegister);
+ sub32(index, Imm32(scaledMaxCount), countRegister);
Label loop(this);
readCharacter(m_checkedOffset - term->inputPosition - scaledMaxCount, character, countRegister);
@@ -1911,15 +1910,12 @@
if (m_decodeSurrogatePairs)
op.m_jumps.append(jumpIfNoAvailableInput());
- move(index, countRegister);
-
Checked<unsigned> scaledMaxCount = term->quantityMaxCount;
-
#if ENABLE(YARR_JIT_UNICODE_EXPRESSIONS)
if (m_decodeSurrogatePairs && term->characterClass->hasOnlyNonBMPCharacters() && !term->invert())
scaledMaxCount *= 2;
#endif
- sub32(Imm32(scaledMaxCount), countRegister);
+ sub32(index, Imm32(scaledMaxCount), countRegister);
Label loop(this);
JumpList matchDest;
@@ -2485,8 +2481,7 @@
if (!m_pattern.m_body->m_hasFixedSize) {
outOfLengthFailure.link(this);
if (alternative->m_minimumSize) {
- move(index, regT0);
- sub32(Imm32(alternative->m_minimumSize), regT0);
+ sub32(index, Imm32(alternative->m_minimumSize), regT0);
setMatchStart(regT0);
} else
setMatchStart(index);
@@ -2500,8 +2495,7 @@
// by BoyerMoore search.
if (!m_pattern.m_body->m_hasFixedSize) {
if (alternative->m_minimumSize) {
- move(index, regT0);
- sub32(Imm32(alternative->m_minimumSize), regT0);
+ sub32(index, Imm32(alternative->m_minimumSize), regT0);
setMatchStart(regT0);
} else
setMatchStart(index);
@@ -2525,9 +2519,10 @@
// not have yet set the value in the first
ASSERT(index != returnRegister);
if (m_pattern.m_body->m_hasFixedSize) {
- move(index, returnRegister);
if (priorAlternative->m_minimumSize)
- sub32(Imm32(priorAlternative->m_minimumSize), returnRegister);
+ sub32(index, Imm32(priorAlternative->m_minimumSize), returnRegister);
+ else
+ move(index, returnRegister);
if (m_compileMode == JITCompileMode::IncludeSubpatterns)
storePair32(returnRegister, index, output, TrustedImm32(0));
} else {
@@ -2718,8 +2713,7 @@
if (term->quantityType == QuantifierType::FixedCount)
inputOffset += term->parentheses.disjunction->m_minimumSize;
if (inputOffset) {
- move(index, indexTemporary);
- sub32(Imm32(inputOffset), indexTemporary);
+ sub32(index, Imm32(inputOffset), indexTemporary);
setSubpatternStart(indexTemporary, term->parentheses.subpatternId);
} else
setSubpatternStart(index, term->parentheses.subpatternId);
@@ -2746,8 +2740,7 @@
if (term->capture() && m_compileMode == JITCompileMode::IncludeSubpatterns) {
unsigned inputOffset = m_checkedOffset - term->inputPosition;
if (inputOffset) {
- move(index, indexTemporary);
- sub32(Imm32(inputOffset), indexTemporary);
+ sub32(index, Imm32(inputOffset), indexTemporary);
setSubpatternEnd(indexTemporary, term->parentheses.subpatternId);
} else
setSubpatternEnd(index, term->parentheses.subpatternId);
@@ -2855,8 +2848,7 @@
if (term->quantityType == QuantifierType::FixedCount)
inputOffset += term->parentheses.disjunction->m_minimumSize;
if (inputOffset) {
- move(index, indexTemporary);
- sub32(Imm32(inputOffset), indexTemporary);
+ sub32(index, Imm32(inputOffset), indexTemporary);
setSubpatternStart(indexTemporary, term->parentheses.subpatternId);
} else
setSubpatternStart(index, term->parentheses.subpatternId);
@@ -2895,8 +2887,7 @@
unsigned inputOffset = m_checkedOffset - term->inputPosition;
if (inputOffset) {
- move(index, indexTemporary);
- sub32(Imm32(inputOffset), indexTemporary);
+ sub32(index, Imm32(inputOffset), indexTemporary);
setSubpatternEnd(indexTemporary, term->parentheses.subpatternId);
} else
setSubpatternEnd(index, term->parentheses.subpatternId);
@@ -3070,11 +3061,10 @@
if (alternative->m_minimumSize == 1)
setMatchStart(index);
else {
- move(index, regT0);
if (alternative->m_minimumSize)
- sub32(Imm32(alternative->m_minimumSize - 1), regT0);
+ sub32(index, Imm32(alternative->m_minimumSize - 1), regT0);
else
- add32(TrustedImm32(1), regT0);
+ add32(TrustedImm32(1), index, regT0);
setMatchStart(regT0);
}
}
@@ -3188,8 +3178,7 @@
if (!m_pattern.m_body->m_minimumSize)
setMatchStart(index);
else {
- move(index, regT0);
- sub32(Imm32(m_pattern.m_body->m_minimumSize), regT0);
+ sub32(index, Imm32(m_pattern.m_body->m_minimumSize), regT0);
setMatchStart(regT0);
}
}