Changeset 189645 in webkit


Ignore:
Timestamp:
Sep 11, 2015 5:57:43 PM (9 years ago)
Author:
commit-queue@webkit.org
Message:

Implement the relational instructions for floats in WebAssembly
https://bugs.webkit.org/show_bug.cgi?id=149080

Patch by Sukolsak Sakshuwong <Sukolsak Sakshuwong> on 2015-09-11
Reviewed by Geoffrey Garen.

This patch implements the relational instructions for floats (float32)
in WebAssembly by converting float operands to doubles and then
comparing them using the existing double comparison instructions in the
macro assembler.

  • tests/stress/wasm-relational.js:
  • tests/stress/wasm/relational.wasm:
  • wasm/WASMFunctionCompiler.h:

(JSC::WASMFunctionCompiler::buildRelationalF32):

  • wasm/WASMFunctionParser.cpp:

(JSC::WASMFunctionParser::parseExpressionI32):
(JSC::WASMFunctionParser::parseRelationalF32ExpressionI32):

  • wasm/WASMFunctionParser.h:
  • wasm/WASMFunctionSyntaxChecker.h:

(JSC::WASMFunctionSyntaxChecker::buildRelationalF32):

Location:
trunk/Source/JavaScriptCore
Files:
7 edited

Legend:

Unmodified
Added
Removed
  • trunk/Source/JavaScriptCore/ChangeLog

    r189642 r189645  
     12015-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
    1242015-09-11  Nan Wang  <n_wang@apple.com>
    225
  • trunk/Source/JavaScriptCore/tests/stress/wasm-relational.js

    r189549 r189645  
    7070        y = y | 0;
    7171        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;
    72108    }
    73109
     
    119155        unsignedGreaterThan: unsignedGreaterThan,
    120156        unsignedGreaterThanOrEqual: unsignedGreaterThanOrEqual,
     157
     158        floatEqual: floatEqual,
     159        floatNotEqual: floatNotEqual,
     160        floatLessThan: floatLessThan,
     161        floatLessThanOrEqual: floatLessThanOrEqual,
     162        floatGreaterThan: floatGreaterThan,
     163        floatGreaterThanOrEqual: floatGreaterThanOrEqual,
    121164
    122165        doubleEqual: doubleEqual,
     
    152195shouldBe(module.unsignedGreaterThanOrEqual(-1, 2), 1);
    153196shouldBe(module.unsignedGreaterThanOrEqual(2, -1), 0);
     197
     198shouldBe(module.floatEqual(0.1, 0.1), 1);
     199shouldBe(module.floatEqual(0.1, 0.2), 0);
     200shouldBe(module.floatNotEqual(0.1, 0.2), 1);
     201shouldBe(module.floatNotEqual(0.1, 0.1), 0);
     202shouldBe(module.floatLessThan(-0.1, 0.2), 1);
     203shouldBe(module.floatLessThan(0.1, 0.1), 0);
     204shouldBe(module.floatLessThanOrEqual(0.1, 0.1), 1);
     205shouldBe(module.floatLessThanOrEqual(0.2, 0.1), 0);
     206shouldBe(module.floatGreaterThan(0.2, -0.1), 1);
     207shouldBe(module.floatGreaterThan(0.1, 0.1), 0);
     208shouldBe(module.floatGreaterThanOrEqual(0.1, 0.1), 1);
     209shouldBe(module.floatGreaterThanOrEqual(0.1, 0.2), 0);
     210shouldBe(module.floatEqual(NaN, NaN), 0);
     211shouldBe(module.floatNotEqual(NaN, NaN), 0);
     212shouldBe(module.floatNotEqual(NaN, 0.1), 0);
     213shouldBe(module.floatGreaterThan(NaN, 0.1), 0);
     214shouldBe(module.floatLessThan(NaN, 0.1), 0);
     215shouldBe(module.floatEqual(Infinity, Infinity), 1);
     216shouldBe(module.floatGreaterThan(Infinity, 0.1), 1);
     217shouldBe(module.floatGreaterThan(Infinity, NaN), 0);
     218shouldBe(module.floatLessThan(Infinity, NaN), 0);
    154219
    155220shouldBe(module.doubleEqual(0.1, 0.1), 1);
  • trunk/Source/JavaScriptCore/wasm/WASMFunctionCompiler.h

    r189624 r189645  
    514514    }
    515515
     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
    516555    int buildRelationalF64(int, int, WASMOpExpressionI32 op)
    517556    {
  • trunk/Source/JavaScriptCore/wasm/WASMFunctionParser.cpp

    r189624 r189645  
    562562        case WASMOpExpressionI32::UGreaterThanOrEqualI32:
    563563            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);
    564571        case WASMOpExpressionI32::EqualF64:
    565572        case WASMOpExpressionI32::NotEqualF64:
     
    593600        case WASMOpExpressionI32::FromF32:
    594601        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:
    601602        case WASMOpExpressionI32::SMin:
    602603        case WASMOpExpressionI32::UMin:
     
    710711    PROPAGATE_ERROR();
    711712    return context.buildRelationalI32(left, right, op);
     713}
     714
     715template <class Context>
     716ContextExpression 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);
    712723}
    713724
  • trunk/Source/JavaScriptCore/wasm/WASMFunctionParser.h

    r189624 r189645  
    9494    template <class Context> ContextExpression parseBinaryExpressionI32(Context&, WASMOpExpressionI32);
    9595    template <class Context> ContextExpression parseRelationalI32ExpressionI32(Context&, WASMOpExpressionI32);
     96    template <class Context> ContextExpression parseRelationalF32ExpressionI32(Context&, WASMOpExpressionI32);
    9697    template <class Context> ContextExpression parseRelationalF64ExpressionI32(Context&, WASMOpExpressionI32);
    9798
  • trunk/Source/JavaScriptCore/wasm/WASMFunctionSyntaxChecker.h

    r189624 r189645  
    119119    }
    120120
     121    int buildRelationalF32(int, int, WASMOpExpressionI32)
     122    {
     123        m_tempStackTop--;
     124        return UNUSED;
     125    }
     126
    121127    int buildRelationalF64(int, int, WASMOpExpressionI32)
    122128    {
Note: See TracChangeset for help on using the changeset viewer.