[WASM] Remove deprecated wasm instructions

This commit is contained in:
Igor Yakovlev
2022-06-29 14:43:14 +02:00
committed by teamcity
parent 3b84284743
commit 8306b1bd71
6 changed files with 28 additions and 78 deletions
@@ -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) {
@@ -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)
+7 -11
View File
@@ -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)
}