[Wasm IR] Add missing GC and function reference instructions

This commit is contained in:
Svyatoslav Kuzmich
2020-12-05 17:23:40 +03:00
parent 6063353b64
commit 4bb163fd1f
3 changed files with 57 additions and 6 deletions
+23 -2
View File
@@ -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"
}
}
@@ -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())
}
@@ -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()
}
}