Changeset 219038 in webkit for trunk/Source/JavaScriptCore/b3/testb3.cpp
- Timestamp:
- Jun 30, 2017, 8:35:47 PM (8 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/Source/JavaScriptCore/b3/testb3.cpp
r219026 r219038 15471 15471 15472 15472 CHECK(!!compileAndRun<int32_t>(proc) == std::get<1>(test)(a, b)); 15473 } 15474 } 15475 15476 void testFloatEqualOrUnorderedFolding() 15477 { 15478 for (auto& first : floatingPointOperands<float>()) { 15479 for (auto& second : floatingPointOperands<float>()) { 15480 float a = first.value; 15481 float b = second.value; 15482 bool expectedResult = (a == b) || std::isunordered(a, b); 15483 Procedure proc; 15484 BasicBlock* root = proc.addBlock(); 15485 Value* constA = root->appendNew<ConstFloatValue>(proc, Origin(), a); 15486 Value* constB = root->appendNew<ConstFloatValue>(proc, Origin(), b); 15487 15488 root->appendNewControlValue(proc, Return, Origin(), 15489 root->appendNew<Value>( 15490 proc, EqualOrUnordered, Origin(), 15491 constA, 15492 constB)); 15493 CHECK(!!compileAndRun<int32_t>(proc) == expectedResult); 15494 } 15495 } 15496 } 15497 15498 void testFloatEqualOrUnorderedFoldingNaN() 15499 { 15500 std::list<float> nans = { 15501 bitwise_cast<float>(0xfffffffd), 15502 bitwise_cast<float>(0xfffffffe), 15503 bitwise_cast<float>(0xfffffff0), 15504 static_cast<float>(PNaN), 15505 }; 15506 15507 unsigned i = 0; 15508 for (float nan : nans) { 15509 RELEASE_ASSERT(std::isnan(nan)); 15510 Procedure proc; 15511 BasicBlock* root = proc.addBlock(); 15512 Value* a = root->appendNew<ConstFloatValue>(proc, Origin(), nan); 15513 Value* b = root->appendNew<Value>(proc, DoubleToFloat, Origin(), 15514 root->appendNew<ArgumentRegValue>(proc, Origin(), FPRInfo::argumentFPR0)); 15515 15516 if (i % 2) 15517 std::swap(a, b); 15518 ++i; 15519 root->appendNewControlValue(proc, Return, Origin(), 15520 root->appendNew<Value>(proc, EqualOrUnordered, Origin(), a, b)); 15521 CHECK(!!compileAndRun<int32_t>(proc, static_cast<double>(1.0))); 15522 } 15523 } 15524 15525 void testFloatEqualOrUnorderedDontFold() 15526 { 15527 for (auto& first : floatingPointOperands<float>()) { 15528 float a = first.value; 15529 Procedure proc; 15530 BasicBlock* root = proc.addBlock(); 15531 Value* constA = root->appendNew<ConstFloatValue>(proc, Origin(), a); 15532 Value* b = root->appendNew<Value>(proc, DoubleToFloat, Origin(), 15533 root->appendNew<ArgumentRegValue>(proc, Origin(), FPRInfo::argumentFPR0)); 15534 root->appendNewControlValue(proc, Return, Origin(), 15535 root->appendNew<Value>( 15536 proc, EqualOrUnordered, Origin(), constA, b)); 15537 15538 auto code = compileProc(proc); 15539 15540 for (auto& second : floatingPointOperands<float>()) { 15541 float b = second.value; 15542 bool expectedResult = (a == b) || std::isunordered(a, b); 15543 CHECK(!!invoke<int32_t>(*code, static_cast<double>(b)) == expectedResult); 15544 } 15473 15545 } 15474 15546 } … … 17013 17085 RUN(testDoubleLiteralComparison(125.3144446948242, 125.3144446948241)); 17014 17086 17087 RUN(testFloatEqualOrUnorderedFolding()); 17088 RUN(testFloatEqualOrUnorderedFoldingNaN()); 17089 RUN(testFloatEqualOrUnorderedDontFold()); 17090 17015 17091 if (isX86()) { 17016 17092 RUN(testBranchBitAndImmFusion(Identity, Int64, 1, Air::BranchTest32, Air::Arg::Tmp));
Note:
See TracChangeset
for help on using the changeset viewer.