Add WASM support for i64 simple opcodes.
authorkeith_miller@apple.com <keith_miller@apple.com@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Thu, 18 Aug 2016 01:35:55 +0000 (01:35 +0000)
committerkeith_miller@apple.com <keith_miller@apple.com@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Thu, 18 Aug 2016 01:35:55 +0000 (01:35 +0000)
https://bugs.webkit.org/show_bug.cgi?id=160928

Reviewed by Michael Saboff.

This patch also removes the unsigned int32 mod operator, which is not supported by B3 yet.

* wasm/WASMB3IRGenerator.cpp:
(JSC::WASM::toB3Op):
(JSC::WASM::B3IRGenerator::unaryOp):
* wasm/WASMFunctionParser.h:
(JSC::WASM::WASMFunctionParser<Context>::parseExpression):
* wasm/WASMOps.h:

git-svn-id: https://svn.webkit.org/repository/webkit/trunk@204588 268f45cc-cd09-0410-ab3c-d52691b4dbfc

Source/JavaScriptCore/ChangeLog
Source/JavaScriptCore/wasm/WASMB3IRGenerator.cpp
Source/JavaScriptCore/wasm/WASMFunctionParser.h
Source/JavaScriptCore/wasm/WASMOps.h

index a97f5ff..0f46c3b 100644 (file)
@@ -1,3 +1,19 @@
+2016-08-17  Keith Miller  <keith_miller@apple.com>
+
+        Add WASM support for i64 simple opcodes.
+        https://bugs.webkit.org/show_bug.cgi?id=160928
+
+        Reviewed by Michael Saboff.
+
+        This patch also removes the unsigned int32 mod operator, which is not supported by B3 yet.
+
+        * wasm/WASMB3IRGenerator.cpp:
+        (JSC::WASM::toB3Op):
+        (JSC::WASM::B3IRGenerator::unaryOp):
+        * wasm/WASMFunctionParser.h:
+        (JSC::WASM::WASMFunctionParser<Context>::parseExpression):
+        * wasm/WASMOps.h:
+
 2016-08-17  JF Bastien  <jfbastien@apple.com>
 
         We allow assignments to const variables when in a for-in/for-of loop
index f9cbc68..857ff15 100644 (file)
@@ -41,7 +41,7 @@ namespace WASM {
 
 using namespace B3;
 
-inline JSC::B3::Opcode toB3Op(WASMBinaryOpType op)
+inline B3::Opcode toB3Op(WASMBinaryOpType op)
 {
     switch (op) {
 #define CREATE_CASE(name, op, b3op) case WASMBinaryOpType::name: return b3op;
@@ -50,6 +50,15 @@ inline JSC::B3::Opcode toB3Op(WASMBinaryOpType op)
     }
 }
 
+inline B3::Opcode toB3Op(WASMUnaryOpType op)
+{
+    switch (op) {
+#define CREATE_CASE(name, op, b3op) case WASMUnaryOpType::name: return b3op;
+    FOR_EACH_WASM_UNARY_OP(CREATE_CASE)
+#undef CREATE_CASE
+    }
+}
+
 class B3IRGenerator {
 public:
     typedef Value* ExpressionType;
@@ -60,6 +69,7 @@ public:
     ExpressionType addConstant(WASMValueType, uint64_t);
 
     bool WARN_UNUSED_RETURN binaryOp(WASMBinaryOpType, ExpressionType left, ExpressionType right, ExpressionType& result);
+    bool WARN_UNUSED_RETURN unaryOp(WASMUnaryOpType, ExpressionType arg, ExpressionType& result);
 
     bool WARN_UNUSED_RETURN addBlock();
     bool WARN_UNUSED_RETURN endBlock(Vector<ExpressionType>& expressionStack);
@@ -89,6 +99,12 @@ void B3IRGenerator::addLocal(WASMValueType, uint32_t)
     // TODO: Add locals.
 }
 
+bool B3IRGenerator::unaryOp(WASMUnaryOpType op, ExpressionType arg, ExpressionType& result)
+{
+    result = m_currentBlock->appendNew<Value>(m_proc, toB3Op(op), Origin(), arg);
+    return true;
+}
+
 bool B3IRGenerator::binaryOp(WASMBinaryOpType op, ExpressionType left, ExpressionType right, ExpressionType& result)
 {
     result = m_currentBlock->appendNew<Value>(m_proc, toB3Op(op), Origin(), left, right);
index e9a7079..28bee92 100644 (file)
@@ -112,7 +112,6 @@ bool WASMFunctionParser<Context>::parseExpression(WASMOpType op)
     switch (op) {
 #define CREATE_CASE(name, id, b3op) case name:
     FOR_EACH_WASM_BINARY_OP(CREATE_CASE) {
-#undef CREATE_CASE
         ExpressionType left = m_expressionStack.takeLast();
         ExpressionType right = m_expressionStack.takeLast();
         ExpressionType result;
@@ -122,6 +121,16 @@ bool WASMFunctionParser<Context>::parseExpression(WASMOpType op)
         return true;
     }
 
+    FOR_EACH_WASM_UNARY_OP(CREATE_CASE) {
+        ExpressionType arg = m_expressionStack.takeLast();
+        ExpressionType result;
+        if (!m_context.unaryOp(static_cast<WASMUnaryOpType>(op), arg, result))
+            return false;
+        m_expressionStack.append(result);
+        return true;
+    }
+#undef CREATE_CASE
+
     case WASMOpType::I32Const: {
         uint32_t constant;
         if (!parseVarUInt32(constant))
index 3c09ae6..5fd6bbf 100644 (file)
@@ -39,7 +39,15 @@ namespace WASM {
     macro(Return, 0x09, NA) \
     macro(End, 0x0f, NA)
 
-#define FOR_EACH_WASM_UNARY_OP(macro)
+#define FOR_EACH_WASM_UNARY_OP(macro) \
+    macro(I32Clz, 0x57, Clz) \
+    /* macro(I32Ctz, 0x58) */ \
+    /* macro(I32PopCnt, 0x59) */ \
+    /* macro(I32Eqz, 0x5a) */ \
+    macro(I64Clz, 0x72, Clz) \
+    /* macro(I64Ctz, 0x73) */ \
+    /* macro(I64PopCnt, 0x74) */ \
+    /* macro(I64Eqz, 0xba) */
 
 #define FOR_EACH_WASM_BINARY_OP(macro) \
     macro(I32Add, 0x40, Add) \
@@ -48,7 +56,7 @@ namespace WASM {
     macro(I32DivS, 0x43, Div) \
     /* macro(I32DivU, 0x44) */ \
     macro(I32RemS, 0x45, Mod) \
-    macro(I32RemU, 0x46, Mod) \
+    /* macro(I32RemU, 0x46, Mod) */ \
     macro(I32And, 0x47, BitAnd) \
     macro(I32Or, 0x48, BitOr) \
     macro(I32Xor, 0x49, BitXor) \
@@ -67,6 +75,28 @@ namespace WASM {
     macro(I32GeS, 0x54, GreaterEqual) \
     macro(I32GtU, 0x55, Above) \
     macro(I32GeU, 0x56, AboveEqual) \
+    macro(I64Add, 0x5b, Add) \
+    macro(I64Sub, 0x5c, Sub) \
+    macro(I64Mul, 0x5d, Mul) \
+    macro(I64DivS, 0x5e, Div) \
+    /* macro(I64DivU, 0x5f) */ \
+    macro(I64RemS, 0x60, Mod) \
+    /* macro(I64RemU, 0x61) */ \
+    macro(I64And, 0x62, BitAnd) \
+    macro(I64Or, 0x63, BitOr) \
+    macro(I64Xor, 0x64, BitXor) \
+    macro(I64Shl, 0x65, Shl) \
+    macro(I64ShrU, 0x66, SShr) \
+    macro(I64ShrS, 0x67, ZShr) \
+    /* macro(I64RotR, 0xb8) */ \
+    /* macro(I64RotL, 0xb9) */ \
+    macro(I64Eq, 0x68, Equal) \
+    macro(I64Ne, 0x69, NotEqual) \
+    macro(I64LtS, 0x6a, LessThan) \
+    macro(I64LeS, 0x6b, LessEqual) \
+    macro(I64LtU, 0x6c, Below) \
+    macro(I64LeU, 0x6d, BelowEqual) \
+
 
 #define FOR_EACH_WASM_OP(macro) \
     FOR_EACH_WASM_SPECIAL_OP(macro) \
@@ -80,16 +110,18 @@ enum WASMOpType : uint8_t {
     FOR_EACH_WASM_OP(CREATE_ENUM_VALUE)
 };
 
-
-
 enum class WASMBinaryOpType : uint8_t {
     FOR_EACH_WASM_BINARY_OP(CREATE_ENUM_VALUE)
 };
 
+enum class WASMUnaryOpType : uint8_t {
+    FOR_EACH_WASM_UNARY_OP(CREATE_ENUM_VALUE)
+};
+
+#undef CREATE_ENUM_VALUE
+
 } // namespace WASM
 
 } // namespace JSC
 
-#undef CREATE_ENUM_VALUE
-
 #endif // ENABLE(WEBASSEMBLY)