[Wasm IR] Add missing GC and function reference instructions
This commit is contained in:
@@ -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()
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user