Changeset 190105 in webkit


Ignore:
Timestamp:
Sep 21, 2015 11:01:14 PM (9 years ago)
Author:
Sukolsak Sakshuwong
Message:

Implement the comma instruction in WebAssembly
https://bugs.webkit.org/show_bug.cgi?id=149425

Reviewed by Geoffrey Garen.

This patch implements the comma instruction in WebAssembly. The comma
instruction evaluates the left operand and then the right operand and
returns the value of the right operand.

  • tests/stress/wasm-comma.js: Added.

(shouldBe):

  • wasm/WASMFunctionCompiler.h:

(JSC::WASMFunctionCompiler::discard):

  • wasm/WASMFunctionParser.cpp:

(JSC::WASMFunctionParser::parseExpressionI32):
(JSC::WASMFunctionParser::parseExpressionF32):
(JSC::WASMFunctionParser::parseExpressionF64):
(JSC::WASMFunctionParser::parseComma):

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

(JSC::WASMFunctionSyntaxChecker::discard):

Location:
trunk/Source/JavaScriptCore
Files:
2 added
5 edited

Legend:

Unmodified
Added
Removed
  • trunk/Source/JavaScriptCore/ChangeLog

    r190103 r190105  
     12015-09-21  Sukolsak Sakshuwong  <sukolsak@gmail.com>
     2
     3        Implement the comma instruction in WebAssembly
     4        https://bugs.webkit.org/show_bug.cgi?id=149425
     5
     6        Reviewed by Geoffrey Garen.
     7
     8        This patch implements the comma instruction in WebAssembly. The comma
     9        instruction evaluates the left operand and then the right operand and
     10        returns the value of the right operand.
     11
     12        * tests/stress/wasm-comma.js: Added.
     13        (shouldBe):
     14        * wasm/WASMFunctionCompiler.h:
     15        (JSC::WASMFunctionCompiler::discard):
     16        * wasm/WASMFunctionParser.cpp:
     17        (JSC::WASMFunctionParser::parseExpressionI32):
     18        (JSC::WASMFunctionParser::parseExpressionF32):
     19        (JSC::WASMFunctionParser::parseExpressionF64):
     20        (JSC::WASMFunctionParser::parseComma):
     21        * wasm/WASMFunctionParser.h:
     22        * wasm/WASMFunctionSyntaxChecker.h:
     23        (JSC::WASMFunctionSyntaxChecker::discard):
     24
    1252015-09-21  Filip Pizlo  <fpizlo@apple.com>
    226
  • trunk/Source/JavaScriptCore/wasm/WASMFunctionCompiler.h

    r190062 r190105  
    10501050    void appendExpressionList(int&, int) { }
    10511051
     1052    void discard(int)
     1053    {
     1054        m_tempStackTop--;
     1055    }
     1056
    10521057    void linkTarget(JumpTarget& target)
    10531058    {
  • trunk/Source/JavaScriptCore/wasm/WASMFunctionParser.cpp

    r190080 r190105  
    4040#define READ_COMPACT_INT32_OR_FAIL(result, errorMessage) do { if (!m_reader.readCompactInt32(result)) FAIL_WITH_MESSAGE(errorMessage); } while (0)
    4141#define READ_COMPACT_UINT32_OR_FAIL(result, errorMessage) do { if (!m_reader.readCompactUInt32(result)) FAIL_WITH_MESSAGE(errorMessage); } while (0)
     42#define READ_EXPRESSION_TYPE_OR_FAIL(result, errorMessage) do { if (!m_reader.readExpressionType(result)) FAIL_WITH_MESSAGE(errorMessage); } while (0)
    4243#define READ_OP_STATEMENT_OR_FAIL(hasImmediate, op, opWithImmediate, immediate, errorMessage) do { if (!m_reader.readOpStatement(hasImmediate, op, opWithImmediate, immediate)) FAIL_WITH_MESSAGE(errorMessage); } while (0)
    4344#define READ_OP_EXPRESSION_I32_OR_FAIL(hasImmediate, op, opWithImmediate, immediate, errorMessage) do { if (!m_reader.readOpExpressionI32(hasImmediate, op, opWithImmediate, immediate)) FAIL_WITH_MESSAGE(errorMessage); } while (0)
     
    570571        case WASMOpExpressionI32::CallImport:
    571572            return parseCallImport(context, WASMOpKind::Expression, WASMExpressionType::I32);
     573        case WASMOpExpressionI32::Comma:
     574            return parseComma(context, WASMExpressionType::I32);
    572575        case WASMOpExpressionI32::FromF32:
    573576            return parseConvertType(context, WASMExpressionType::F32, WASMExpressionType::I32, WASMTypeConversion::ConvertSigned);
     
    620623            return parseRelationalF64ExpressionI32(context, op);
    621624        case WASMOpExpressionI32::Conditional:
    622         case WASMOpExpressionI32::Comma:
    623625        case WASMOpExpressionI32::SMin:
    624626        case WASMOpExpressionI32::UMin:
     
    756758        case WASMOpExpressionF32::CallIndirect:
    757759            return parseCallIndirect(context, WASMOpKind::Expression, WASMExpressionType::F32);
     760        case WASMOpExpressionF32::Comma:
     761            return parseComma(context, WASMExpressionType::F32);
    758762        case WASMOpExpressionF32::FromS32:
    759763            return parseConvertType(context, WASMExpressionType::I32, WASMExpressionType::F32, WASMTypeConversion::ConvertSigned);
     
    774778            return parseBinaryExpressionF32(context, op);
    775779        case WASMOpExpressionF32::Conditional:
    776         case WASMOpExpressionF32::Comma:
    777780            // FIXME: Implement these instructions.
    778781            FAIL_WITH_MESSAGE("Unsupported instruction.");
     
    870873        case WASMOpExpressionF64::CallIndirect:
    871874            return parseCallIndirect(context, WASMOpKind::Expression, WASMExpressionType::F64);
     875        case WASMOpExpressionF64::Comma:
     876            return parseComma(context, WASMExpressionType::F64);
    872877        case WASMOpExpressionF64::FromS32:
    873878            return parseConvertType(context, WASMExpressionType::I32, WASMExpressionType::F64, WASMTypeConversion::ConvertSigned);
     
    899904            return parseBinaryExpressionF64(context, op);
    900905        case WASMOpExpressionF64::Conditional:
    901         case WASMOpExpressionF64::Comma:
    902906        case WASMOpExpressionF64::Min:
    903907        case WASMOpExpressionF64::Max:
     
    11391143
    11401144template <class Context>
     1145ContextExpression WASMFunctionParser::parseComma(Context& context, WASMExpressionType expressionType)
     1146{
     1147    WASMExpressionType leftExpressionType;
     1148    READ_EXPRESSION_TYPE_OR_FAIL(leftExpressionType, "Cannot read the expression type.");
     1149    ContextExpression leftExpression = parseExpression(context, leftExpressionType);
     1150    PROPAGATE_ERROR();
     1151    if (leftExpressionType != WASMExpressionType::Void)
     1152        context.discard(leftExpression);
     1153    return parseExpression(context, expressionType);
     1154}
     1155
     1156template <class Context>
    11411157ContextExpression WASMFunctionParser::parseConvertType(Context& context, WASMExpressionType fromType, WASMExpressionType toType, WASMTypeConversion conversion)
    11421158{
  • trunk/Source/JavaScriptCore/wasm/WASMFunctionParser.h

    r190080 r190105  
    120120    template <class Context> ContextExpression parseCallIndirect(Context&, WASMOpKind, WASMExpressionType returnType);
    121121    template <class Context> ContextExpression parseCallImport(Context&, WASMOpKind, WASMExpressionType returnType);
     122    template <class Context> ContextExpression parseComma(Context&, WASMExpressionType);
    122123    template <class Context> ContextExpression parseConvertType(Context&, WASMExpressionType fromType, WASMExpressionType toType, WASMTypeConversion);
    123124
  • trunk/Source/JavaScriptCore/wasm/WASMFunctionSyntaxChecker.h

    r190062 r190105  
    215215    void appendExpressionList(int&, int) { }
    216216
     217    void discard(int)
     218    {
     219        m_tempStackTop--;
     220    }
     221
    217222    void linkTarget(const int&) { }
    218223    void jumpToTarget(const int&) { }
Note: See TracChangeset for help on using the changeset viewer.