[WASM] Remove deprecated wasm instructions
This commit is contained in:
+7
-33
@@ -43,56 +43,30 @@ internal class WasmUsefulDeclarationProcessor(
|
||||
}
|
||||
true
|
||||
}
|
||||
|
||||
context.wasmSymbols.wasmClassId,
|
||||
context.wasmSymbols.wasmInterfaceId,
|
||||
context.wasmSymbols.refCast,
|
||||
context.wasmSymbols.refTest -> {
|
||||
call.getTypeArgument(0)?.getClass()?.enqueue(from, "generic intrinsic ${call.symbol.owner.name}")
|
||||
context.wasmSymbols.refTest,
|
||||
context.wasmSymbols.boxIntrinsic -> {
|
||||
call.getTypeArgument(0)?.enqueueRuntimeClassOrAny(from, "intrinsic ${call.symbol.owner.name}")
|
||||
true
|
||||
}
|
||||
|
||||
else -> false
|
||||
}
|
||||
|
||||
private fun tryToProcessWasmOpIntrinsicCall(from: IrDeclaration, call: IrCall, function: IrFunction): Boolean {
|
||||
if (function.hasWasmNoOpCastAnnotation()) {
|
||||
return true
|
||||
}
|
||||
|
||||
val opString = function.getWasmOpAnnotation()
|
||||
if (opString != null) {
|
||||
val op = WasmOp.valueOf(opString)
|
||||
when (op.immediates.size) {
|
||||
0 -> {
|
||||
if (op == WasmOp.REF_TEST || op == WasmOp.REF_TEST_STATIC) {
|
||||
call.getTypeArgument(0)?.enqueueRuntimeClassOrAny(from, "REF_TEST/REF_TEST_STATIC")
|
||||
}
|
||||
}
|
||||
1 -> {
|
||||
if (op.immediates.firstOrNull() == WasmImmediateKind.STRUCT_TYPE_IDX) {
|
||||
function.dispatchReceiverParameter?.type?.classOrNull?.owner?.enqueue(from, "STRUCT_TYPE_IDX")
|
||||
}
|
||||
}
|
||||
}
|
||||
return true
|
||||
}
|
||||
return false
|
||||
}
|
||||
|
||||
override fun visitCall(expression: IrCall, data: IrDeclaration) {
|
||||
super.visitCall(expression, data)
|
||||
|
||||
if (expression.symbol == context.wasmSymbols.boxIntrinsic) {
|
||||
expression.getTypeArgument(0)?.enqueueRuntimeClassOrAny(data, "boxIntrinsic")
|
||||
return
|
||||
}
|
||||
|
||||
val function: IrFunction = expression.symbol.owner.realOverrideTarget
|
||||
if (function.returnType == context.irBuiltIns.unitType) {
|
||||
unitGetInstance.enqueue(data, "function Unit return type")
|
||||
}
|
||||
|
||||
if (tryToProcessIntrinsicCall(data, expression)) return
|
||||
if (tryToProcessWasmOpIntrinsicCall(data, expression, function)) return
|
||||
if (function.hasWasmNoOpCastAnnotation()) return
|
||||
if (function.getWasmOpAnnotation() != null) return
|
||||
|
||||
val isSuperCall = expression.superQualifierSymbol != null
|
||||
if (function is IrSimpleFunction && function.isOverridable && !isSuperCall) {
|
||||
|
||||
+11
-15
@@ -197,9 +197,8 @@ class BodyGenerator(
|
||||
if (klass.getWasmArrayAnnotation() != null) {
|
||||
require(expression.valueArgumentsCount == 1) { "@WasmArrayOf constructs must have exactly one argument" }
|
||||
generateExpression(expression.getValueArgument(0)!!)
|
||||
body.buildRttCanon(wasmGcType)
|
||||
body.buildInstr(
|
||||
WasmOp.ARRAY_NEW_DEFAULT_WITH_RTT,
|
||||
WasmOp.ARRAY_NEW_DEFAULT,
|
||||
WasmImmediate.GcType(wasmGcType)
|
||||
)
|
||||
return
|
||||
@@ -383,7 +382,7 @@ class BodyGenerator(
|
||||
call: IrFunctionAccessExpression,
|
||||
function: IrFunction
|
||||
): Boolean {
|
||||
if (tryToGenerateWasmOpIntrinsicCall(call, function)) {
|
||||
if (tryToGenerateWasmOpIntrinsicCall(function)) {
|
||||
return true
|
||||
}
|
||||
|
||||
@@ -436,6 +435,13 @@ class BodyGenerator(
|
||||
)
|
||||
}
|
||||
|
||||
wasmSymbols.refTest -> {
|
||||
generateRefTest(
|
||||
fromType = call.getValueArgument(0)!!.type,
|
||||
toType = call.getTypeArgument(0)!!
|
||||
)
|
||||
}
|
||||
|
||||
wasmSymbols.unboxIntrinsic -> {
|
||||
val fromType = call.getTypeArgument(0)!!
|
||||
|
||||
@@ -625,7 +631,7 @@ class BodyGenerator(
|
||||
}
|
||||
|
||||
// Return true if function is recognized as intrinsic.
|
||||
private fun tryToGenerateWasmOpIntrinsicCall(call: IrFunctionAccessExpression, function: IrFunction): Boolean {
|
||||
private fun tryToGenerateWasmOpIntrinsicCall(function: IrFunction): Boolean {
|
||||
if (function.hasWasmNoOpCastAnnotation()) {
|
||||
return true
|
||||
}
|
||||
@@ -635,17 +641,7 @@ class BodyGenerator(
|
||||
val op = WasmOp.valueOf(opString)
|
||||
when (op.immediates.size) {
|
||||
0 -> {
|
||||
when (op) {
|
||||
WasmOp.REF_TEST, WasmOp.REF_TEST_STATIC -> {
|
||||
generateRefTest(
|
||||
fromType = call.getValueArgument(0)!!.type,
|
||||
toType = call.getTypeArgument(0)!!
|
||||
)
|
||||
}
|
||||
else -> {
|
||||
body.buildInstr(op)
|
||||
}
|
||||
}
|
||||
body.buildInstr(op)
|
||||
}
|
||||
1 -> {
|
||||
val immediates = arrayOf(
|
||||
|
||||
@@ -21,6 +21,9 @@ internal fun wasm_unreachable(): Nothing =
|
||||
internal fun <To> wasm_ref_cast(a: Any?): To =
|
||||
implementedAsIntrinsic
|
||||
|
||||
internal fun <To> wasm_ref_test(a: Any?): Boolean =
|
||||
implementedAsIntrinsic
|
||||
|
||||
@WasmOp(WasmOp.I32_EQ)
|
||||
public external fun wasm_i32_eq(a: Int, b: Int): Boolean
|
||||
|
||||
@@ -285,9 +288,6 @@ public external fun wasm_ref_is_null(a: Any?): Boolean
|
||||
@WasmOp(WasmOp.REF_EQ)
|
||||
public external fun wasm_ref_eq(a: Any?, b: Any?): Boolean
|
||||
|
||||
@WasmOp(WasmOp.REF_TEST)
|
||||
public external fun <T> wasm_ref_test(a: Any?): Boolean
|
||||
|
||||
// ---
|
||||
|
||||
@WasmOp(WasmOp.F32_NEAREST)
|
||||
|
||||
@@ -239,15 +239,14 @@ internal annotation class WasmOp(val name: String) {
|
||||
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_NEW = "STRUCT_NEW"
|
||||
const val STRUCT_NEW_DEFAULT = "STRUCT_NEW_DEFAULT"
|
||||
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 ARRAY_NEW_WITH_RTT = "ARRAY_NEW_WITH_RTT"
|
||||
const val ARRAY_NEW_DEFAULT_WITH_RTT = "ARRAY_NEW_DEFAULT_WITH_RTT"
|
||||
const val ARRAY_NEW = "ARRAY_NEW"
|
||||
const val ARRAY_NEW_DEFAULT = "ARRAY_NEW_DEFAULT"
|
||||
const val ARRAY_GET = "ARRAY_GET"
|
||||
const val ARRAY_GET_S = "ARRAY_GET_S"
|
||||
const val ARRAY_GET_U = "ARRAY_GET_U"
|
||||
@@ -256,12 +255,9 @@ internal annotation class WasmOp(val name: String) {
|
||||
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"
|
||||
const val BR_ON_CAST_FAIL = "BR_ON_CAST_FAIL"
|
||||
const val REF_TEST_STATIC = "REF_TEST_STATIC"
|
||||
const val REF_CAST_STATIC = "REF_CAST_STATIC"
|
||||
const val BR_ON_CAST_STATIC_FAIL = "BR_ON_CAST_STATIC_FAIL"
|
||||
const val REF_IS_FUNC = "REF_IS_FUNC"
|
||||
const val REF_IS_DATA = "REF_IS_DATA"
|
||||
const val REF_IS_I31 = "REF_IS_I31"
|
||||
|
||||
@@ -338,11 +338,8 @@ enum class WasmOp(
|
||||
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_NEW("struct.new", 0xFB_07, STRUCT_TYPE_IDX),
|
||||
STRUCT_NEW_DEFAULT("struct.new_default", 0xFB_08, STRUCT_TYPE_IDX),
|
||||
STRUCT_GET("struct.get", 0xFB_03, listOf(STRUCT_TYPE_IDX, STRUCT_FIELD_IDX)),
|
||||
@@ -350,8 +347,6 @@ enum class WasmOp(
|
||||
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)),
|
||||
|
||||
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_NEW("array.new", 0xFB_1B, STRUCT_TYPE_IDX),
|
||||
ARRAY_NEW_DEFAULT("array.new_default", 0xFB_1C, STRUCT_TYPE_IDX),
|
||||
ARRAY_GET("array.get", 0xFB_13, listOf(STRUCT_TYPE_IDX)),
|
||||
@@ -364,16 +359,9 @@ enum class WasmOp(
|
||||
I31_GET_S("i31.get_s", 0xFB_21),
|
||||
I31_GET_U("i31.get_u", 0xFB_22),
|
||||
|
||||
RTT_CANON("rtt.canon", 0xFB_30, TYPE_IDX),
|
||||
|
||||
REF_TEST("ref.test", 0xFB_40),
|
||||
REF_TEST_STATIC("ref.test_static", 0xFB_44, STRUCT_TYPE_IDX),
|
||||
REF_CAST("ref.cast", 0xFB_41),
|
||||
REF_CAST_STATIC("ref.cast_static", 0xFB_45, STRUCT_TYPE_IDX),
|
||||
|
||||
BR_ON_CAST("br_on_cast", 0xFB_42, listOf(LABEL_IDX)),
|
||||
|
||||
BR_ON_CAST_FAIL("br_on_cast_fail", 0xfb43, listOf(LABEL_IDX)),
|
||||
BR_ON_CAST_STATIC_FAIL("br_on_cast_static_fail", 0xfb47, listOf(LABEL_IDX, STRUCT_TYPE_IDX)),
|
||||
|
||||
REF_IS_FUNC("ref.is_func", 0xfb50),
|
||||
|
||||
@@ -162,10 +162,6 @@ abstract class WasmExpressionBuilder {
|
||||
buildInstr(WasmOp.REF_NULL, WasmImmediate.HeapType(WasmRefType(type)))
|
||||
}
|
||||
|
||||
fun buildRttCanon(decl: WasmSymbol<WasmTypeDeclaration>) {
|
||||
buildInstr(WasmOp.RTT_CANON, WasmImmediate.TypeIdx(decl))
|
||||
}
|
||||
|
||||
fun buildDrop() {
|
||||
buildInstr(WasmOp.DROP)
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user