Changeset 247011 in webkit
- Timestamp:
- Jul 1, 2019 9:59:33 AM (5 years ago)
- Location:
- trunk
- Files:
-
- 3 deleted
- 8 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/JSTests/ChangeLog
r246946 r247011 1 2019-07-01 Ryan Haddad <ryanhaddad@apple.com> 2 3 Unreviewed, rolling out r246946. 4 5 Caused JSC test crashes on arm64 6 7 Reverted changeset: 8 9 "Add b3 macro lowering for CheckMul on arm64" 10 https://bugs.webkit.org/show_bug.cgi?id=199251 11 https://trac.webkit.org/changeset/246946 12 1 13 2019-06-28 Justin Michaud <justin_michaud@apple.com> 2 14 -
trunk/Source/JavaScriptCore/ChangeLog
r246946 r247011 1 2019-07-01 Ryan Haddad <ryanhaddad@apple.com> 2 3 Unreviewed, rolling out r246946. 4 5 Caused JSC test crashes on arm64 6 7 Reverted changeset: 8 9 "Add b3 macro lowering for CheckMul on arm64" 10 https://bugs.webkit.org/show_bug.cgi?id=199251 11 https://trac.webkit.org/changeset/246946 12 1 13 2019-06-28 Justin Michaud <justin_michaud@apple.com> 2 14 -
trunk/Source/JavaScriptCore/assembler/MacroAssemblerARM64.h
r246946 r247011 570 570 } 571 571 572 void multiplySignExtend32(RegisterID left, RegisterID right, RegisterID dest)573 {574 m_assembler.smull(dest, left, right);575 }576 577 572 void div32(RegisterID dividend, RegisterID divisor, RegisterID dest) 578 573 { -
trunk/Source/JavaScriptCore/assembler/testmasm.cpp
r246946 r247011 352 352 } 353 353 354 #if CPU(ARM64)355 void testMul32SignExtend()356 {357 for (auto value : int32Operands()) {358 auto mul = compile([=] (CCallHelpers& jit) {359 jit.emitFunctionPrologue();360 361 jit.multiplySignExtend32(GPRInfo::argumentGPR0, GPRInfo::argumentGPR1, GPRInfo::returnValueGPR);362 363 jit.emitFunctionEpilogue();364 jit.ret();365 });366 367 for (auto value2 : int32Operands())368 CHECK_EQ(invoke<long int>(mul, value, value2), ((long int) value) * ((long int) value2));369 }370 }371 #endif372 373 354 #if CPU(X86) || CPU(X86_64) || CPU(ARM64) 374 355 void testCompareFloat(MacroAssembler::DoubleCondition condition) … … 1130 1111 RUN(testMul32WithImmediates()); 1131 1112 1132 #if CPU(ARM64)1133 RUN(testMul32SignExtend());1134 #endif1135 1136 1113 #if CPU(X86) || CPU(X86_64) || CPU(ARM64) 1137 1114 RUN(testCompareFloat(MacroAssembler::DoubleEqual)); -
trunk/Source/JavaScriptCore/b3/B3LowerMacros.cpp
r246946 r247011 178 178 } 179 179 180 case CheckMul: {181 if (isARM64() && m_value->child(0)->type() == Int32) {182 CheckValue* checkMul = m_value->as<CheckValue>();183 184 Value* left = m_insertionSet.insert<Value>(m_index, SExt32, m_origin, m_value->child(0));185 Value* right = m_insertionSet.insert<Value>(m_index, SExt32, m_origin, m_value->child(1));186 Value* mulResult = m_insertionSet.insert<Value>(m_index, Mul, m_origin, left, right);187 Value* mulResult32 = m_insertionSet.insert<Value>(m_index, Trunc, m_origin, mulResult);188 Value* upperResult = m_insertionSet.insert<Value>(m_index, Trunc, m_origin,189 m_insertionSet.insert<Value>(m_index, SShr, m_origin, mulResult, m_insertionSet.insert<Const32Value>(m_index, m_origin, 32)));190 Value* signBit = m_insertionSet.insert<Value>(m_index, SShr, m_origin,191 mulResult32,192 m_insertionSet.insert<Const32Value>(m_index, m_origin, 31));193 Value* hasOverflowed = m_insertionSet.insert<Value>(m_index, NotEqual, m_origin, upperResult, signBit);194 195 CheckValue* check = m_insertionSet.insert<CheckValue>(m_index, Check, m_origin, hasOverflowed);196 check->setGenerator(checkMul->generator());197 check->clobberEarly(checkMul->earlyClobbered());198 check->clobberLate(checkMul->lateClobbered());199 check->append(checkMul->constrainedChild(0));200 check->append(checkMul->constrainedChild(1));201 202 m_value->replaceWithIdentity(mulResult32);203 m_changed = true;204 }205 break;206 }207 208 180 case Switch: { 209 181 SwitchValue* switchValue = m_value->as<SwitchValue>(); -
trunk/Source/JavaScriptCore/b3/B3LowerToAir.cpp
r246946 r247011 2603 2603 2604 2604 case Mul: { 2605 if (m_value->type() == Int642606 && isValidForm(MultiplySignExtend32, Arg::Tmp, Arg::Tmp, Arg::Tmp)2607 && m_value->child(0)->opcode() == SExt322608 && !m_locked.contains(m_value->child(0))) {2609 Value* opLeft = m_value->child(0);2610 Value* left = opLeft->child(0);2611 Value* opRight = m_value->child(1);2612 Value* right = nullptr;2613 2614 if (opRight->opcode() == SExt32 && !m_locked.contains(opRight->child(0))) {2615 right = opRight->child(0);2616 } else if (m_value->child(1)->isRepresentableAs<int32_t>() && !m_locked.contains(m_value->child(1))) {2617 // We just use the 64-bit const int as a 32 bit const int directly2618 right = opRight;2619 }2620 2621 if (right) {2622 append(MultiplySignExtend32, tmp(left), tmp(right), tmp(m_value));2623 return;2624 }2625 }2626 2605 appendBinOp<Mul32, Mul64, MulDouble, MulFloat, Commutative>( 2627 2606 m_value->child(0), m_value->child(1)); -
trunk/Source/JavaScriptCore/b3/air/AirOpcode.opcodes
r246946 r247011 262 262 Tmp, Tmp, Tmp 263 263 264 arm64: MultiplySignExtend32 U:G:32, U:G:32, ZD:G:64265 Tmp, Tmp, Tmp266 267 264 arm64: Div32 U:G:32, U:G:32, ZD:G:32 268 265 Tmp, Tmp, Tmp -
trunk/Source/JavaScriptCore/b3/testb3.cpp
r246946 r247011 1190 1190 } 1191 1191 1192 void testMulArgs32SignExtend(int a, int b)1193 {1194 Procedure proc;1195 if (proc.optLevel() < 1)1196 return;1197 BasicBlock* root = proc.addBlock();1198 Value* arg1 = root->appendNew<Value>(1199 proc, Trunc, Origin(),1200 root->appendNew<ArgumentRegValue>(proc, Origin(), GPRInfo::argumentGPR0));1201 Value* arg2 = root->appendNew<Value>(1202 proc, Trunc, Origin(),1203 root->appendNew<ArgumentRegValue>(proc, Origin(), GPRInfo::argumentGPR1));1204 Value* arg164 = root->appendNew<Value>(proc, SExt32, Origin(), arg1);1205 Value* arg264 = root->appendNew<Value>(proc, SExt32, Origin(), arg2);1206 Value* mul = root->appendNew<Value>(proc, Mul, Origin(), arg164, arg264);1207 root->appendNewControlValue(proc, Return, Origin(), mul);1208 1209 auto code = compileProc(proc);1210 1211 CHECK(invoke<long int>(*code, a, b) == ((long int) a) * ((long int) b));1212 }1213 1214 void testMulImm32SignExtend(const int a, int b)1215 {1216 Procedure proc;1217 if (proc.optLevel() < 1)1218 return;1219 BasicBlock* root = proc.addBlock();1220 Value* arg1 = root->appendNew<Const64Value>(proc, Origin(), a);1221 Value* arg2 = root->appendNew<Value>(1222 proc, Trunc, Origin(),1223 root->appendNew<ArgumentRegValue>(proc, Origin(), GPRInfo::argumentGPR1));1224 Value* arg264 = root->appendNew<Value>(proc, SExt32, Origin(), arg2);1225 Value* mul = root->appendNew<Value>(proc, Mul, Origin(), arg1, arg264);1226 root->appendNewControlValue(proc, Return, Origin(), mul);1227 1228 auto code = compileProc(proc);1229 1230 CHECK(invoke<long int>(*code, b) == ((long int) a) * ((long int) b));1231 }1232 1233 1192 void testMulLoadTwice() 1234 1193 { … … 14677 14636 { 14678 14637 Procedure proc; 14679 14680 BasicBlock* root = proc.addBlock(); 14681 14638 14639 BasicBlock* root = proc.addBlock(); 14640 14682 14641 root->appendNew<FenceValue>(proc, Origin()); 14683 14642 root->appendNew<Value>(proc, Return, Origin(), root->appendIntConstant(proc, Origin(), Int32, 42)); 14684 14643 14685 14644 auto code = compileProc(proc); 14686 14645 CHECK_EQ(invoke<int>(*code), 42); … … 14688 14647 checkUsesInstruction(*code, "lock or $0x0, (%rsp)"); 14689 14648 if (isARM64()) 14690 checkUsesInstruction(*code, "dmb 14649 checkUsesInstruction(*code, "dmb ish"); 14691 14650 checkDoesNotUseInstruction(*code, "mfence"); 14692 checkDoesNotUseInstruction(*code, "dmb 14651 checkDoesNotUseInstruction(*code, "dmb ishst"); 14693 14652 } 14694 14653 … … 14696 14655 { 14697 14656 Procedure proc; 14698 14699 BasicBlock* root = proc.addBlock(); 14700 14657 14658 BasicBlock* root = proc.addBlock(); 14659 14701 14660 root->appendNew<FenceValue>(proc, Origin(), HeapRange::top(), HeapRange()); 14702 14661 root->appendNew<Value>(proc, Return, Origin(), root->appendIntConstant(proc, Origin(), Int32, 42)); 14703 14662 14704 14663 auto code = compileProc(proc); 14705 14664 CHECK_EQ(invoke<int>(*code), 42); … … 14707 14666 checkDoesNotUseInstruction(*code, "mfence"); 14708 14667 if (isARM64()) 14709 checkUsesInstruction(*code, "dmb 14668 checkUsesInstruction(*code, "dmb ishst"); 14710 14669 } 14711 14670 … … 14713 14672 { 14714 14673 Procedure proc; 14715 14716 BasicBlock* root = proc.addBlock(); 14717 14674 14675 BasicBlock* root = proc.addBlock(); 14676 14718 14677 root->appendNew<FenceValue>(proc, Origin(), HeapRange(), HeapRange::top()); 14719 14678 root->appendNew<Value>(proc, Return, Origin(), root->appendIntConstant(proc, Origin(), Int32, 42)); 14720 14679 14721 14680 auto code = compileProc(proc); 14722 14681 CHECK_EQ(invoke<int>(*code), 42); … … 14724 14683 checkDoesNotUseInstruction(*code, "mfence"); 14725 14684 if (isARM64()) 14726 checkUsesInstruction(*code, "dmb 14727 checkDoesNotUseInstruction(*code, "dmb 14685 checkUsesInstruction(*code, "dmb ish"); 14686 checkDoesNotUseInstruction(*code, "dmb ishst"); 14728 14687 } 14729 14688 … … 15003 14962 CHECK_EQ(usesCSRs, !pin); 15004 14963 }; 15005 14964 15006 14965 go(true); 15007 14966 go(false); … … 17199 17158 17200 17159 auto shouldRun = [&] (const char* testName) -> bool { 17201 // FIXME: These tests fail <https://bugs.webkit.org/show_bug.cgi?id=199330>.17202 if (!filter && isARM64()) {17203 for (auto& failingTest : {17204 "testReportUsedRegistersLateUseFollowedByEarlyDefDoesNotMarkUseAsDead",17205 "testNegFloatWithUselessDoubleConversion",17206 "testPinRegisters",17207 }) {17208 if (WTF::findIgnoringASCIICaseWithoutLength(testName, failingTest) != WTF::notFound) {17209 dataLogLn("*** Warning: Skipping known-bad test: ", testName);17210 return false;17211 }17212 }17213 }17214 if (!filter && isX86()) {17215 for (auto& failingTest : {17216 "testReportUsedRegistersLateUseFollowedByEarlyDefDoesNotMarkUseAsDead",17217 }) {17218 if (WTF::findIgnoringASCIICaseWithoutLength(testName, failingTest) != WTF::notFound) {17219 dataLogLn("*** Warning: Skipping known-bad test: ", testName);17220 return false;17221 }17222 }17223 }17224 17160 return !filter || WTF::findIgnoringASCIICaseWithoutLength(testName, filter) != WTF::notFound; 17225 17161 }; … … 17342 17278 RUN(testMulImmArg(1, 0)); 17343 17279 RUN(testMulImmArg(3, 3)); 17344 RUN(testMulImm32SignExtend(1, 2));17345 RUN(testMulImm32SignExtend(0, 2));17346 RUN(testMulImm32SignExtend(1, 0));17347 RUN(testMulImm32SignExtend(3, 3));17348 RUN(testMulImm32SignExtend(0xFFFFFFFF, 0xFFFFFFFF));17349 RUN(testMulImm32SignExtend(0xFFFFFFFE, 0xFFFFFFFF));17350 RUN(testMulImm32SignExtend(0xFFFFFFFF, 0xFFFFFFFE));17351 17280 RUN(testMulArgs32(1, 1)); 17352 17281 RUN(testMulArgs32(1, 2)); 17353 RUN(testMulArgs32(0xFFFFFFFF, 0xFFFFFFFF));17354 RUN(testMulArgs32(0xFFFFFFFE, 0xFFFFFFFF));17355 RUN(testMulArgs32SignExtend(1, 1));17356 RUN(testMulArgs32SignExtend(1, 2));17357 RUN(testMulArgs32SignExtend(0xFFFFFFFF, 0xFFFFFFFF));17358 RUN(testMulArgs32SignExtend(0xFFFFFFFE, 0xFFFFFFFF));17359 17282 RUN(testMulLoadTwice()); 17360 17283 RUN(testMulAddArgsLeft());
Note: See TracChangeset
for help on using the changeset viewer.