Changeset 189645 in webkit
- Timestamp:
- Sep 11, 2015 5:57:43 PM (9 years ago)
- Location:
- trunk/Source/JavaScriptCore
- Files:
-
- 7 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/Source/JavaScriptCore/ChangeLog
r189642 r189645 1 2015-09-11 Sukolsak Sakshuwong <sukolsak@gmail.com> 2 3 Implement the relational instructions for floats in WebAssembly 4 https://bugs.webkit.org/show_bug.cgi?id=149080 5 6 Reviewed by Geoffrey Garen. 7 8 This patch implements the relational instructions for floats (float32) 9 in WebAssembly by converting float operands to doubles and then 10 comparing them using the existing double comparison instructions in the 11 macro assembler. 12 13 * tests/stress/wasm-relational.js: 14 * tests/stress/wasm/relational.wasm: 15 * wasm/WASMFunctionCompiler.h: 16 (JSC::WASMFunctionCompiler::buildRelationalF32): 17 * wasm/WASMFunctionParser.cpp: 18 (JSC::WASMFunctionParser::parseExpressionI32): 19 (JSC::WASMFunctionParser::parseRelationalF32ExpressionI32): 20 * wasm/WASMFunctionParser.h: 21 * wasm/WASMFunctionSyntaxChecker.h: 22 (JSC::WASMFunctionSyntaxChecker::buildRelationalF32): 23 1 24 2015-09-11 Nan Wang <n_wang@apple.com> 2 25 -
trunk/Source/JavaScriptCore/tests/stress/wasm-relational.js
r189549 r189645 70 70 y = y | 0; 71 71 return ((x >>> 0) >= (y >>> 0)) | 0; 72 } 73 74 function floatEqual(x, y) { 75 x = fround(x); 76 y = fround(y); 77 return (x == y) | 0; 78 } 79 80 function floatNotEqual(x, y) { 81 x = fround(x); 82 y = fround(y); 83 return (x != y) | 0; 84 } 85 86 function floatLessThan(x, y) { 87 x = fround(x); 88 y = fround(y); 89 return (x < y) | 0; 90 } 91 92 function floatLessThanOrEqual(x, y) { 93 x = fround(x); 94 y = fround(y); 95 return (x <= y) | 0; 96 } 97 98 function floatGreaterThan(x, y) { 99 x = fround(x); 100 y = fround(y); 101 return (x > y) | 0; 102 } 103 104 function floatGreaterThanOrEqual(x, y) { 105 x = fround(x); 106 y = fround(y); 107 return (x >= y) | 0; 72 108 } 73 109 … … 119 155 unsignedGreaterThan: unsignedGreaterThan, 120 156 unsignedGreaterThanOrEqual: unsignedGreaterThanOrEqual, 157 158 floatEqual: floatEqual, 159 floatNotEqual: floatNotEqual, 160 floatLessThan: floatLessThan, 161 floatLessThanOrEqual: floatLessThanOrEqual, 162 floatGreaterThan: floatGreaterThan, 163 floatGreaterThanOrEqual: floatGreaterThanOrEqual, 121 164 122 165 doubleEqual: doubleEqual, … … 152 195 shouldBe(module.unsignedGreaterThanOrEqual(-1, 2), 1); 153 196 shouldBe(module.unsignedGreaterThanOrEqual(2, -1), 0); 197 198 shouldBe(module.floatEqual(0.1, 0.1), 1); 199 shouldBe(module.floatEqual(0.1, 0.2), 0); 200 shouldBe(module.floatNotEqual(0.1, 0.2), 1); 201 shouldBe(module.floatNotEqual(0.1, 0.1), 0); 202 shouldBe(module.floatLessThan(-0.1, 0.2), 1); 203 shouldBe(module.floatLessThan(0.1, 0.1), 0); 204 shouldBe(module.floatLessThanOrEqual(0.1, 0.1), 1); 205 shouldBe(module.floatLessThanOrEqual(0.2, 0.1), 0); 206 shouldBe(module.floatGreaterThan(0.2, -0.1), 1); 207 shouldBe(module.floatGreaterThan(0.1, 0.1), 0); 208 shouldBe(module.floatGreaterThanOrEqual(0.1, 0.1), 1); 209 shouldBe(module.floatGreaterThanOrEqual(0.1, 0.2), 0); 210 shouldBe(module.floatEqual(NaN, NaN), 0); 211 shouldBe(module.floatNotEqual(NaN, NaN), 0); 212 shouldBe(module.floatNotEqual(NaN, 0.1), 0); 213 shouldBe(module.floatGreaterThan(NaN, 0.1), 0); 214 shouldBe(module.floatLessThan(NaN, 0.1), 0); 215 shouldBe(module.floatEqual(Infinity, Infinity), 1); 216 shouldBe(module.floatGreaterThan(Infinity, 0.1), 1); 217 shouldBe(module.floatGreaterThan(Infinity, NaN), 0); 218 shouldBe(module.floatLessThan(Infinity, NaN), 0); 154 219 155 220 shouldBe(module.doubleEqual(0.1, 0.1), 1); -
trunk/Source/JavaScriptCore/wasm/WASMFunctionCompiler.h
r189624 r189645 514 514 } 515 515 516 int buildRelationalF32(int, int, WASMOpExpressionI32 op) 517 { 518 loadDouble(temporaryAddress(m_tempStackTop - 2), FPRInfo::fpRegT0); 519 loadDouble(temporaryAddress(m_tempStackTop - 1), FPRInfo::fpRegT1); 520 convertFloatToDouble(FPRInfo::fpRegT0, FPRInfo::fpRegT0); 521 convertFloatToDouble(FPRInfo::fpRegT1, FPRInfo::fpRegT1); 522 DoubleCondition condition; 523 switch (op) { 524 case WASMOpExpressionI32::EqualF32: 525 condition = DoubleEqual; 526 break; 527 case WASMOpExpressionI32::NotEqualF32: 528 condition = DoubleNotEqual; 529 break; 530 case WASMOpExpressionI32::LessThanF32: 531 condition = DoubleLessThan; 532 break; 533 case WASMOpExpressionI32::LessThanOrEqualF32: 534 condition = DoubleLessThanOrEqual; 535 break; 536 case WASMOpExpressionI32::GreaterThanF32: 537 condition = DoubleGreaterThan; 538 break; 539 case WASMOpExpressionI32::GreaterThanOrEqualF32: 540 condition = DoubleGreaterThanOrEqual; 541 break; 542 default: 543 RELEASE_ASSERT_NOT_REACHED(); 544 } 545 m_tempStackTop--; 546 Jump trueCase = branchDouble(condition, FPRInfo::fpRegT0, FPRInfo::fpRegT1); 547 store32(TrustedImm32(0), temporaryAddress(m_tempStackTop - 1)); 548 Jump end = jump(); 549 trueCase.link(this); 550 store32(TrustedImm32(1), temporaryAddress(m_tempStackTop - 1)); 551 end.link(this); 552 return UNUSED; 553 } 554 516 555 int buildRelationalF64(int, int, WASMOpExpressionI32 op) 517 556 { -
trunk/Source/JavaScriptCore/wasm/WASMFunctionParser.cpp
r189624 r189645 562 562 case WASMOpExpressionI32::UGreaterThanOrEqualI32: 563 563 return parseRelationalI32ExpressionI32(context, op); 564 case WASMOpExpressionI32::EqualF32: 565 case WASMOpExpressionI32::NotEqualF32: 566 case WASMOpExpressionI32::LessThanF32: 567 case WASMOpExpressionI32::LessThanOrEqualF32: 568 case WASMOpExpressionI32::GreaterThanF32: 569 case WASMOpExpressionI32::GreaterThanOrEqualF32: 570 return parseRelationalF32ExpressionI32(context, op); 564 571 case WASMOpExpressionI32::EqualF64: 565 572 case WASMOpExpressionI32::NotEqualF64: … … 593 600 case WASMOpExpressionI32::FromF32: 594 601 case WASMOpExpressionI32::FromF64: 595 case WASMOpExpressionI32::EqualF32:596 case WASMOpExpressionI32::NotEqualF32:597 case WASMOpExpressionI32::LessThanF32:598 case WASMOpExpressionI32::LessThanOrEqualF32:599 case WASMOpExpressionI32::GreaterThanF32:600 case WASMOpExpressionI32::GreaterThanOrEqualF32:601 602 case WASMOpExpressionI32::SMin: 602 603 case WASMOpExpressionI32::UMin: … … 710 711 PROPAGATE_ERROR(); 711 712 return context.buildRelationalI32(left, right, op); 713 } 714 715 template <class Context> 716 ContextExpression WASMFunctionParser::parseRelationalF32ExpressionI32(Context& context, WASMOpExpressionI32 op) 717 { 718 ContextExpression left = parseExpressionF32(context); 719 PROPAGATE_ERROR(); 720 ContextExpression right = parseExpressionF32(context); 721 PROPAGATE_ERROR(); 722 return context.buildRelationalF32(left, right, op); 712 723 } 713 724 -
trunk/Source/JavaScriptCore/wasm/WASMFunctionParser.h
r189624 r189645 94 94 template <class Context> ContextExpression parseBinaryExpressionI32(Context&, WASMOpExpressionI32); 95 95 template <class Context> ContextExpression parseRelationalI32ExpressionI32(Context&, WASMOpExpressionI32); 96 template <class Context> ContextExpression parseRelationalF32ExpressionI32(Context&, WASMOpExpressionI32); 96 97 template <class Context> ContextExpression parseRelationalF64ExpressionI32(Context&, WASMOpExpressionI32); 97 98 -
trunk/Source/JavaScriptCore/wasm/WASMFunctionSyntaxChecker.h
r189624 r189645 119 119 } 120 120 121 int buildRelationalF32(int, int, WASMOpExpressionI32) 122 { 123 m_tempStackTop--; 124 return UNUSED; 125 } 126 121 127 int buildRelationalF64(int, int, WASMOpExpressionI32) 122 128 {
Note: See TracChangeset
for help on using the changeset viewer.