diff --git a/libraries/stdlib/wasm/src/generated/_WasmOp.kt b/libraries/stdlib/wasm/src/generated/_WasmOp.kt index cf9528d2a08..36f58dca653 100644 --- a/libraries/stdlib/wasm/src/generated/_WasmOp.kt +++ b/libraries/stdlib/wasm/src/generated/_WasmOp.kt @@ -216,13 +216,34 @@ internal annotation class WasmOp(val name: String) { const val GLOBAL_SET = "GLOBAL_SET" const val REF_NULL = "REF_NULL" const val REF_IS_NULL = "REF_IS_NULL" - const val REF_EQ = "REF_EQ" const val REF_FUNC = "REF_FUNC" + const val REF_AS_NOT_NULL = "REF_AS_NOT_NULL" + const val BR_ON_NULL = "BR_ON_NULL" + const val REF_EQ = "REF_EQ" + const val CALL_REF = "CALL_REF" + const val RETURN_CALL_REF = "RETURN_CALL_REF" + const val FUNC_BIND = "FUNC_BIND" + const val LET = "LET" const val STRUCT_NEW_WITH_RTT = "STRUCT_NEW_WITH_RTT" + const val STRUCT_NEW_DEFAULT_WITH_RTT = "STRUCT_NEW_DEFAULT_WITH_RTT" const val STRUCT_GET = "STRUCT_GET" + const val STRUCT_GET_S = "STRUCT_GET_S" + const val STRUCT_GET_U = "STRUCT_GET_U" const val STRUCT_SET = "STRUCT_SET" - const val REF_CAST = "REF_CAST" + const val ARRAY_NEW_WITH_RTT = "ARRAY_NEW_WITH_RTT" + const val ARRAY_NEW_DEFAULT_WITH_RTT = "ARRAY_NEW_DEFAULT_WITH_RTT" + const val ARRAY_GET = "ARRAY_GET" + const val ARRAY_GET_S = "ARRAY_GET_S" + const val ARRAY_GET_U = "ARRAY_GET_U" + const val ARRAY_SET = "ARRAY_SET" + const val ARRAY_LEN = "ARRAY_LEN" + const val I31_NEW = "I31_NEW" + const val I31_GET_S = "I31_GET_S" + const val I31_GET_U = "I31_GET_U" const val RTT_CANON = "RTT_CANON" const val RTT_SUB = "RTT_SUB" + const val REF_TEST = "REF_TEST" + const val REF_CAST = "REF_CAST" + const val BR_ON_CAST = "BR_ON_CAST" } } diff --git a/wasm/wasm.ir/src/org/jetbrains/kotlin/wasm/ir/Operators.kt b/wasm/wasm.ir/src/org/jetbrains/kotlin/wasm/ir/Operators.kt index 7b5f7cff947..bc8478ea310 100644 --- a/wasm/wasm.ir/src/org/jetbrains/kotlin/wasm/ir/Operators.kt +++ b/wasm/wasm.ir/src/org/jetbrains/kotlin/wasm/ir/Operators.kt @@ -16,6 +16,7 @@ enum class WasmImmediateKind { MEM_ARG, BLOCK_TYPE, + LOCAL_DEFS, FUNC_IDX, LOCAL_IDX, @@ -319,18 +320,46 @@ enum class WasmOp( // Reference types REF_NULL("ref.null", 0xD0, HEAP_TYPE), REF_IS_NULL("ref.is_null", 0xD1), - REF_EQ("ref.eq", 0xD5), REF_FUNC("ref.func", 0xD2, FUNC_IDX), + REF_AS_NOT_NULL("ref.as_non_null", 0xD3), + BR_ON_NULL("br_on_null", 0xD4, LABEL_IDX), + REF_EQ("ref.eq", 0xD5), + + CALL_REF("call_ref", 0x14), + RETURN_CALL_REF("return_call_ref", 0x15), + FUNC_BIND("func.bind", 0x16, FUNC_IDX), + LET("let", 0x17, listOf(BLOCK_TYPE, LOCAL_DEFS)), // GC STRUCT_NEW_WITH_RTT("struct.new_with_rtt", 0xFB_01, STRUCT_TYPE_IDX), + STRUCT_NEW_DEFAULT_WITH_RTT("struct.new_default_with_rtt", 0xFB_02, STRUCT_TYPE_IDX), STRUCT_GET("struct.get", 0xFB_03, listOf(STRUCT_TYPE_IDX, STRUCT_FIELD_IDX)), + STRUCT_GET_S("struct.get_s", 0xFB_04, listOf(STRUCT_TYPE_IDX, STRUCT_FIELD_IDX)), + STRUCT_GET_U("struct.get_u", 0xFB_05, listOf(STRUCT_TYPE_IDX, STRUCT_FIELD_IDX)), STRUCT_SET("struct.set", 0xFB_06, listOf(STRUCT_TYPE_IDX, STRUCT_FIELD_IDX)), - REF_CAST("ref.cast", 0xFB_41, listOf(HEAP_TYPE, HEAP_TYPE)), - RTT_CANON("rtt.canon", 0xFB_30, HEAP_TYPE), - RTT_SUB("rtt.sub", 0xFB_31, HEAP_TYPE); + ARRAY_NEW_WITH_RTT("array.new_with_rtt", 0xFB_11, STRUCT_TYPE_IDX), + ARRAY_NEW_DEFAULT_WITH_RTT("array.new_default_with_rtt", 0xFB_12, STRUCT_TYPE_IDX), + ARRAY_GET("array.get", 0xFB_13, listOf(STRUCT_TYPE_IDX)), + ARRAY_GET_S("array.get_s", 0xFB_14, listOf(STRUCT_TYPE_IDX)), + ARRAY_GET_U("array.get_u", 0xFB_15, listOf(STRUCT_TYPE_IDX)), + ARRAY_SET("array.set", 0xFB_16, listOf(STRUCT_TYPE_IDX)), + ARRAY_LEN("array.len", 0xFB_17, listOf(STRUCT_TYPE_IDX)), + I31_NEW("i31.new", 0xFB_20), + I31_GET_S("i31.get_s", 0xFB_21), + I31_GET_U("i31.get_u", 0xFB_22), + + RTT_CANON("rtt.canon", 0xFB_30, HEAP_TYPE), + + // TODO: GC spec also has "depth" and "input heap type" immediates. V8 currently implements without them. + RTT_SUB("rtt.sub", 0xFB_31, HEAP_TYPE), + REF_TEST("ref.test", 0xFB_40, listOf(HEAP_TYPE, HEAP_TYPE)), + REF_CAST("ref.cast", 0xFB_41, listOf(HEAP_TYPE, HEAP_TYPE)), + + // TODO: GC spec also has two heap type immediates. V8 currently implements without them. + BR_ON_CAST("br_on_cast", 0xFB_42, listOf(LABEL_IDX)), + ; constructor(mnemonic: String, opcode: Int, vararg immediates: WasmImmediateKind) : this(mnemonic, opcode, immediates.toList()) } diff --git a/wasm/wasm.ir/src/org/jetbrains/kotlin/wasm/ir/convertors/WasmBinaryToIR.kt b/wasm/wasm.ir/src/org/jetbrains/kotlin/wasm/ir/convertors/WasmBinaryToIR.kt index a9c38336fc4..7490004f8b2 100644 --- a/wasm/wasm.ir/src/org/jetbrains/kotlin/wasm/ir/convertors/WasmBinaryToIR.kt +++ b/wasm/wasm.ir/src/org/jetbrains/kotlin/wasm/ir/convertors/WasmBinaryToIR.kt @@ -411,6 +411,7 @@ class WasmBinaryToIR(val b: MyByteReader) { WasmImmediateKind.STRUCT_FIELD_IDX -> TODO() WasmImmediateKind.TYPE_IMM -> TODO() WasmImmediateKind.HEAP_TYPE -> WasmImmediate.HeapType(readRefType()) + WasmImmediateKind.LOCAL_DEFS -> TODO() } }