Revert "[Wasm] Don't use the new br_on_cast* instructions since they are not supported in Node.js yet"
This reverts commit 2d728727
#KT-60828 Fixed
This commit is contained in:
committed by
Space Team
parent
eecfc2c6d3
commit
86e854a980
+22
-20
@@ -542,24 +542,26 @@ class BodyGenerator(
|
|||||||
val parameterLocal = functionContext.referenceLocal(SyntheticLocalType.IS_INTERFACE_PARAMETER)
|
val parameterLocal = functionContext.referenceLocal(SyntheticLocalType.IS_INTERFACE_PARAMETER)
|
||||||
body.buildSetLocal(parameterLocal, location)
|
body.buildSetLocal(parameterLocal, location)
|
||||||
body.buildBlock("isInterface", WasmI32) { outerLabel ->
|
body.buildBlock("isInterface", WasmI32) { outerLabel ->
|
||||||
body.buildBlock("isInterface") { innerLabel ->
|
body.buildBlock("isInterface", WasmRefNullType(WasmHeapType.Simple.Struct)) { innerLabel ->
|
||||||
body.buildGetLocal(parameterLocal, location)
|
body.buildGetLocal(parameterLocal, location)
|
||||||
body.buildStructGet(context.referenceGcType(irBuiltIns.anyClass), WasmSymbol(1), location)
|
body.buildStructGet(context.referenceGcType(irBuiltIns.anyClass), WasmSymbol(1), location)
|
||||||
|
|
||||||
val tmpLocal = functionContext.referenceLocal(SyntheticLocalType.TMP_FOR_BR_ON_CAST_EMULATION)
|
body.buildBrOnCastInstr(
|
||||||
body.buildInstr(WasmOp.LOCAL_TEE, location, WasmImmediate.LocalIdx(tmpLocal))
|
WasmOp.BR_ON_CAST_FAIL,
|
||||||
body.buildRefTestStatic(classITable, location)
|
innerLabel,
|
||||||
body.buildInstr(WasmOp.I32_EQZ, location)
|
fromIsNullable = true,
|
||||||
body.buildBrIf(innerLabel, location)
|
toIsNullable = false,
|
||||||
|
from = WasmHeapType.Simple.Struct,
|
||||||
body.buildGetLocal(tmpLocal, location)
|
to = WasmHeapType.Type(classITable),
|
||||||
body.buildRefCastStatic(classITable, location)
|
location,
|
||||||
|
)
|
||||||
|
|
||||||
body.buildStructGet(classITable, context.referenceClassITableInterfaceSlot(irInterface.symbol), location)
|
body.buildStructGet(classITable, context.referenceClassITableInterfaceSlot(irInterface.symbol), location)
|
||||||
body.buildInstr(WasmOp.REF_IS_NULL, location)
|
body.buildInstr(WasmOp.REF_IS_NULL, location)
|
||||||
body.buildInstr(WasmOp.I32_EQZ, location)
|
body.buildInstr(WasmOp.I32_EQZ, location)
|
||||||
body.buildBr(outerLabel, location)
|
body.buildBr(outerLabel, location)
|
||||||
}
|
}
|
||||||
|
body.buildDrop(location)
|
||||||
body.buildConstI32(0, location)
|
body.buildConstI32(0, location)
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
@@ -606,23 +608,23 @@ class BodyGenerator(
|
|||||||
}
|
}
|
||||||
|
|
||||||
wasmSymbols.returnArgumentIfItIsKotlinAny -> {
|
wasmSymbols.returnArgumentIfItIsKotlinAny -> {
|
||||||
body.buildBlock("returnIfAny") { innerLabel ->
|
body.buildBlock("returnIfAny", WasmAnyRef) { innerLabel ->
|
||||||
body.buildGetLocal(functionContext.referenceLocal(0), location)
|
body.buildGetLocal(functionContext.referenceLocal(0), location)
|
||||||
body.buildInstr(WasmOp.EXTERN_INTERNALIZE, location)
|
body.buildInstr(WasmOp.EXTERN_INTERNALIZE, location)
|
||||||
|
|
||||||
val tmpLocal = functionContext.referenceLocal(SyntheticLocalType.TMP_FOR_BR_ON_CAST_EMULATION)
|
body.buildBrOnCastInstr(
|
||||||
body.buildInstr(WasmOp.LOCAL_TEE, location, WasmImmediate.LocalIdx(tmpLocal))
|
WasmOp.BR_ON_CAST_FAIL,
|
||||||
|
innerLabel,
|
||||||
val toType = context.referenceGcType(backendContext.irBuiltIns.anyClass)
|
fromIsNullable = true,
|
||||||
body.buildRefTestStatic(toType, location)
|
toIsNullable = true,
|
||||||
body.buildInstr(WasmOp.I32_EQZ, location)
|
from = WasmHeapType.Simple.Any,
|
||||||
body.buildBrIf(innerLabel, location)
|
to = WasmHeapType.Type(context.referenceGcType(backendContext.irBuiltIns.anyClass)),
|
||||||
|
location,
|
||||||
body.buildGetLocal(tmpLocal, location)
|
)
|
||||||
body.buildRefCastStatic(toType, location)
|
|
||||||
|
|
||||||
body.buildInstr(WasmOp.RETURN, location)
|
body.buildInstr(WasmOp.RETURN, location)
|
||||||
}
|
}
|
||||||
|
body.buildDrop(location)
|
||||||
}
|
}
|
||||||
|
|
||||||
wasmSymbols.wasmArrayCopy -> {
|
wasmSymbols.wasmArrayCopy -> {
|
||||||
|
|||||||
+1
-3
@@ -15,7 +15,7 @@ import org.jetbrains.kotlin.ir.symbols.IrValueSymbol
|
|||||||
import org.jetbrains.kotlin.wasm.ir.*
|
import org.jetbrains.kotlin.wasm.ir.*
|
||||||
|
|
||||||
enum class LoopLabelType { BREAK, CONTINUE }
|
enum class LoopLabelType { BREAK, CONTINUE }
|
||||||
enum class SyntheticLocalType { IS_INTERFACE_PARAMETER, TABLE_SWITCH_SELECTOR, TMP_FOR_BR_ON_CAST_EMULATION }
|
enum class SyntheticLocalType { IS_INTERFACE_PARAMETER, TABLE_SWITCH_SELECTOR }
|
||||||
|
|
||||||
class WasmFunctionCodegenContext(
|
class WasmFunctionCodegenContext(
|
||||||
val irFunction: IrFunction,
|
val irFunction: IrFunction,
|
||||||
@@ -61,8 +61,6 @@ class WasmFunctionCodegenContext(
|
|||||||
get() = when (this) {
|
get() = when (this) {
|
||||||
SyntheticLocalType.IS_INTERFACE_PARAMETER ->
|
SyntheticLocalType.IS_INTERFACE_PARAMETER ->
|
||||||
WasmRefNullType(WasmHeapType.Type(context.referenceGcType(backendContext.irBuiltIns.anyClass)))
|
WasmRefNullType(WasmHeapType.Type(context.referenceGcType(backendContext.irBuiltIns.anyClass)))
|
||||||
SyntheticLocalType.TMP_FOR_BR_ON_CAST_EMULATION ->
|
|
||||||
WasmRefNullType(WasmHeapType.Simple.Any)
|
|
||||||
SyntheticLocalType.TABLE_SWITCH_SELECTOR -> WasmI32
|
SyntheticLocalType.TABLE_SWITCH_SELECTOR -> WasmI32
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -251,6 +251,8 @@ internal annotation class WasmOp(val name: String) {
|
|||||||
const val REF_TEST_NULL = "REF_TEST_NULL"
|
const val REF_TEST_NULL = "REF_TEST_NULL"
|
||||||
const val REF_CAST = "REF_CAST"
|
const val REF_CAST = "REF_CAST"
|
||||||
const val REF_CAST_NULL = "REF_CAST_NULL"
|
const val REF_CAST_NULL = "REF_CAST_NULL"
|
||||||
|
const val BR_ON_CAST = "BR_ON_CAST"
|
||||||
|
const val BR_ON_CAST_FAIL = "BR_ON_CAST_FAIL"
|
||||||
const val EXTERN_INTERNALIZE = "EXTERN_INTERNALIZE"
|
const val EXTERN_INTERNALIZE = "EXTERN_INTERNALIZE"
|
||||||
const val EXTERN_EXTERNALIZE = "EXTERN_EXTERNALIZE"
|
const val EXTERN_EXTERNALIZE = "EXTERN_EXTERNALIZE"
|
||||||
const val PSEUDO_COMMENT_PREVIOUS_INSTR = "PSEUDO_COMMENT_PREVIOUS_INSTR"
|
const val PSEUDO_COMMENT_PREVIOUS_INSTR = "PSEUDO_COMMENT_PREVIOUS_INSTR"
|
||||||
|
|||||||
@@ -381,9 +381,8 @@ enum class WasmOp(
|
|||||||
REF_CAST("ref.cast", 0xFB_16, HEAP_TYPE),
|
REF_CAST("ref.cast", 0xFB_16, HEAP_TYPE),
|
||||||
REF_CAST_NULL("ref.cast null", 0xFB_17, HEAP_TYPE),
|
REF_CAST_NULL("ref.cast null", 0xFB_17, HEAP_TYPE),
|
||||||
|
|
||||||
// TODO: KT-60828 Return br_on_cast_fail usages when it's possible
|
BR_ON_CAST("br_on_cast", 0xFB_18, listOf(CONST_U8, LABEL_IDX, HEAP_TYPE, HEAP_TYPE)),
|
||||||
// BR_ON_CAST("br_on_cast", 0xFB_18, listOf(CONST_U8, LABEL_IDX, HEAP_TYPE, HEAP_TYPE)),
|
BR_ON_CAST_FAIL("br_on_cast_fail", 0xFB_19, listOf(CONST_U8, LABEL_IDX, HEAP_TYPE, HEAP_TYPE)),
|
||||||
// BR_ON_CAST_FAIL("br_on_cast_fail", 0xFB_19, listOf(CONST_U8, LABEL_IDX, HEAP_TYPE, HEAP_TYPE)),
|
|
||||||
|
|
||||||
EXTERN_INTERNALIZE("extern.internalize", 0xFB_1A), // externref -> anyref
|
EXTERN_INTERNALIZE("extern.internalize", 0xFB_1A), // externref -> anyref
|
||||||
EXTERN_EXTERNALIZE("extern.externalize", 0xFB_1B), // anyref -> externref
|
EXTERN_EXTERNALIZE("extern.externalize", 0xFB_1B), // anyref -> externref
|
||||||
|
|||||||
Reference in New Issue
Block a user