Changeset 189458 in webkit


Ignore:
Timestamp:
Sep 6, 2015 11:17:53 PM (9 years ago)
Author:
commit-queue@webkit.org
Message:

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

Patch by Sukolsak Sakshuwong <Sukolsak Sakshuwong> on 2015-09-06
Reviewed by Saam Barati.

This patch implements the relational instructions for 32-bit integers in
WebAssembly.

  • tests/stress/wasm-arithmetic.js:
  • tests/stress/wasm-locals.js:
  • tests/stress/wasm-relational.js: Added.

(shouldBe):

  • tests/stress/wasm/arithmetic.wasm: Renamed from Source/JavaScriptCore/tests/stress/wasm-arithmetic.wasm.
  • tests/stress/wasm/locals.wasm: Renamed from Source/JavaScriptCore/tests/stress/wasm-locals.wasm.
  • tests/stress/wasm/relational.wasm: Added.
  • wasm/WASMFunctionCompiler.h:

(JSC::WASMFunctionCompiler::buildRelationalI32):

  • wasm/WASMFunctionParser.cpp:

(JSC::WASMFunctionParser::parseExpressionI32):
(JSC::WASMFunctionParser::parseRelationalI32ExpressionI32):

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

(JSC::WASMFunctionSyntaxChecker::buildRelationalI32):

Location:
trunk/Source/JavaScriptCore
Files:
3 added
7 edited
2 moved

Legend:

Unmodified
Added
Removed
  • trunk/Source/JavaScriptCore/ChangeLog

    r189454 r189458  
     12015-09-06  Sukolsak Sakshuwong  <sukolsak@gmail.com>
     2
     3        Implement the relational instructions in WebAssembly
     4        https://bugs.webkit.org/show_bug.cgi?id=148838
     5
     6        Reviewed by Saam Barati.
     7
     8        This patch implements the relational instructions for 32-bit integers in
     9        WebAssembly.
     10
     11        * tests/stress/wasm-arithmetic.js:
     12        * tests/stress/wasm-locals.js:
     13        * tests/stress/wasm-relational.js: Added.
     14        (shouldBe):
     15        * tests/stress/wasm/arithmetic.wasm: Renamed from Source/JavaScriptCore/tests/stress/wasm-arithmetic.wasm.
     16        * tests/stress/wasm/locals.wasm: Renamed from Source/JavaScriptCore/tests/stress/wasm-locals.wasm.
     17        * tests/stress/wasm/relational.wasm: Added.
     18        * wasm/WASMFunctionCompiler.h:
     19        (JSC::WASMFunctionCompiler::buildRelationalI32):
     20        * wasm/WASMFunctionParser.cpp:
     21        (JSC::WASMFunctionParser::parseExpressionI32):
     22        (JSC::WASMFunctionParser::parseRelationalI32ExpressionI32):
     23        * wasm/WASMFunctionParser.h:
     24        * wasm/WASMFunctionSyntaxChecker.h:
     25        (JSC::WASMFunctionSyntaxChecker::buildRelationalI32):
     26
    1272015-09-06  Mark Lam  <mark.lam@apple.com>
    228
  • trunk/Source/JavaScriptCore/tests/stress/wasm-arithmetic.js

    r189405 r189458  
    2020
    2121/*
    22 wasm-arithmetic.wasm is generated by pack-asmjs <https://github.com/WebAssembly/polyfill-prototype-1> from the following script:
     22wasm/arithmetic.wasm is generated by pack-asmjs <https://github.com/WebAssembly/polyfill-prototype-1> from the following script:
    2323
    2424function asmModule(global, env, buffer) {
     
    9595*/
    9696
    97 var module = loadWebAssembly("wasm-arithmetic.wasm");
     97var module = loadWebAssembly("wasm/arithmetic.wasm");
    9898
    9999shouldBe(module.addSubtract(), 42);
  • trunk/Source/JavaScriptCore/tests/stress/wasm-locals.js

    r189382 r189458  
    77
    88/*
    9 wasm-locals.wasm is generated by pack-asmjs <https://github.com/WebAssembly/polyfill-prototype-1> from the following script:
     9wasm/locals.wasm is generated by pack-asmjs <https://github.com/WebAssembly/polyfill-prototype-1> from the following script:
    1010
    1111function asmModule(global, env, buffer) {
     
    3232*/
    3333
    34 var module = loadWebAssembly("wasm-locals.wasm");
     34var module = loadWebAssembly("wasm/locals.wasm");
    3535
    3636shouldBe(module.sum(12, 30), 42);
  • trunk/Source/JavaScriptCore/wasm/WASMFunctionCompiler.h

    r189405 r189458  
    294294    }
    295295
     296    int buildRelationalI32(int, int, WASMOpExpressionI32 op)
     297    {
     298        load32(temporaryAddress(m_tempStackTop - 2), GPRInfo::regT0);
     299        load32(temporaryAddress(m_tempStackTop - 1), GPRInfo::regT1);
     300        RelationalCondition condition;
     301        switch (op) {
     302        case WASMOpExpressionI32::EqualI32:
     303            condition = Equal;
     304            break;
     305        case WASMOpExpressionI32::NotEqualI32:
     306            condition = NotEqual;
     307            break;
     308        case WASMOpExpressionI32::SLessThanI32:
     309            condition = LessThan;
     310            break;
     311        case WASMOpExpressionI32::ULessThanI32:
     312            condition = Below;
     313            break;
     314        case WASMOpExpressionI32::SLessThanOrEqualI32:
     315            condition = LessThanOrEqual;
     316            break;
     317        case WASMOpExpressionI32::ULessThanOrEqualI32:
     318            condition = BelowOrEqual;
     319            break;
     320        case WASMOpExpressionI32::SGreaterThanI32:
     321            condition = GreaterThan;
     322            break;
     323        case WASMOpExpressionI32::UGreaterThanI32:
     324            condition = Above;
     325            break;
     326        case WASMOpExpressionI32::SGreaterThanOrEqualI32:
     327            condition = GreaterThanOrEqual;
     328            break;
     329        case WASMOpExpressionI32::UGreaterThanOrEqualI32:
     330            condition = AboveOrEqual;
     331            break;
     332        default:
     333            RELEASE_ASSERT_NOT_REACHED();
     334        }
     335        compare32(condition, GPRInfo::regT0, GPRInfo::regT1, GPRInfo::regT0);
     336        m_tempStackTop--;
     337        store32(GPRInfo::regT0, temporaryAddress(m_tempStackTop - 1));
     338        return UNUSED;
     339    }
     340
    296341private:
    297342    union StackSlot {
  • trunk/Source/JavaScriptCore/wasm/WASMFunctionParser.cpp

    r189405 r189458  
    438438        case WASMOpExpressionI32::UMod:
    439439            return parseBinaryExpressionI32(context, op);
     440        case WASMOpExpressionI32::EqualI32:
     441        case WASMOpExpressionI32::NotEqualI32:
     442        case WASMOpExpressionI32::SLessThanI32:
     443        case WASMOpExpressionI32::ULessThanI32:
     444        case WASMOpExpressionI32::SLessThanOrEqualI32:
     445        case WASMOpExpressionI32::ULessThanOrEqualI32:
     446        case WASMOpExpressionI32::SGreaterThanI32:
     447        case WASMOpExpressionI32::UGreaterThanI32:
     448        case WASMOpExpressionI32::SGreaterThanOrEqualI32:
     449        case WASMOpExpressionI32::UGreaterThanOrEqualI32:
     450            return parseRelationalI32ExpressionI32(context, op);
    440451        case WASMOpExpressionI32::GetGlobal:
    441452        case WASMOpExpressionI32::SetLocal:
     
    475486        case WASMOpExpressionI32::CountLeadingZeros:
    476487        case WASMOpExpressionI32::LogicalNot:
    477         case WASMOpExpressionI32::EqualI32:
    478488        case WASMOpExpressionI32::EqualF32:
    479489        case WASMOpExpressionI32::EqualF64:
    480         case WASMOpExpressionI32::NotEqualI32:
    481490        case WASMOpExpressionI32::NotEqualF32:
    482491        case WASMOpExpressionI32::NotEqualF64:
    483         case WASMOpExpressionI32::SLessThanI32:
    484         case WASMOpExpressionI32::ULessThanI32:
    485492        case WASMOpExpressionI32::LessThanF32:
    486493        case WASMOpExpressionI32::LessThanF64:
    487         case WASMOpExpressionI32::SLessThanOrEqualI32:
    488         case WASMOpExpressionI32::ULessThanOrEqualI32:
    489494        case WASMOpExpressionI32::LessThanOrEqualF32:
    490495        case WASMOpExpressionI32::LessThanOrEqualF64:
    491         case WASMOpExpressionI32::SGreaterThanI32:
    492         case WASMOpExpressionI32::UGreaterThanI32:
    493496        case WASMOpExpressionI32::GreaterThanF32:
    494497        case WASMOpExpressionI32::GreaterThanF64:
    495         case WASMOpExpressionI32::SGreaterThanOrEqualI32:
    496         case WASMOpExpressionI32::UGreaterThanOrEqualI32:
    497498        case WASMOpExpressionI32::GreaterThanOrEqualF32:
    498499        case WASMOpExpressionI32::GreaterThanOrEqualF64:
     
    577578}
    578579
     580template <class Context>
     581ContextExpression WASMFunctionParser::parseRelationalI32ExpressionI32(Context& context, WASMOpExpressionI32 op)
     582{
     583    ContextExpression left = parseExpressionI32(context);
     584    PROPAGATE_ERROR();
     585    ContextExpression right = parseExpressionI32(context);
     586    PROPAGATE_ERROR();
     587    return context.buildRelationalI32(left, right, op);
     588}
     589
    579590} // namespace JSC
    580591
  • trunk/Source/JavaScriptCore/wasm/WASMFunctionParser.h

    r189405 r189458  
    8686    template <class Context> ContextExpression parseGetLocalExpressionI32(Context&);
    8787    template <class Context> ContextExpression parseBinaryExpressionI32(Context&, WASMOpExpressionI32);
     88    template <class Context> ContextExpression parseRelationalI32ExpressionI32(Context&, WASMOpExpressionI32);
    8889
    8990    JSWASMModule* m_module;
  • trunk/Source/JavaScriptCore/wasm/WASMFunctionSyntaxChecker.h

    r189382 r189458  
    7979    }
    8080
     81    int buildRelationalI32(int, int, WASMOpExpressionI32)
     82    {
     83        m_tempStackTop--;
     84        return UNUSED;
     85    }
     86
    8187    unsigned stackHeight()
    8288    {
Note: See TracChangeset for help on using the changeset viewer.