| /* |
| * Copyright 2010-2019 JetBrains s.r.o. and Kotlin Programming Language contributors. |
| * Use of this source code is governed by the Apache 2.0 license that can be found in the license/LICENSE.txt file. |
| */ |
| |
| package kotlin.wasm.internal |
| |
| import kotlin.annotation.AnnotationTarget.* |
| |
| // Exclude declaration or file from lowerings and code generation |
| @Target(FILE, CLASS, FUNCTION, PROPERTY) |
| @Retention(AnnotationRetention.BINARY) |
| internal annotation class ExcludedFromCodegen |
| |
| @ExcludedFromCodegen |
| @Target(FUNCTION, PROPERTY_GETTER, PROPERTY_SETTER) |
| @Retention(AnnotationRetention.BINARY) |
| internal annotation class WasmImport(val module: String, val name: String) |
| |
| /** |
| * Replace calls to this functions with specified Wasm instruction. |
| * |
| * Operands are passed in the following order: |
| * 1. Dispatch receiver (if present) |
| * 2. Extension receiver (if present) |
| * 3. Value arguments |
| * |
| * @mnemonic parameter is an instruction WAT name: "i32.add", "f64.trunc", etc. |
| * |
| * Immediate arguments (label, index, offest, align, etc.) are not supported yet. |
| */ |
| @Target(AnnotationTarget.FUNCTION) |
| @Retention(AnnotationRetention.BINARY) |
| @ExcludedFromCodegen |
| internal annotation class WasmInstruction(val mnemonic: String) { |
| companion object { |
| const val NOP = "nop" |
| const val UNREACHABLE = "unreachable" |
| const val I32_EQZ = "i32.eqz" |
| const val I32_EQ = "i32.eq" |
| const val I32_NE = "i32.ne" |
| const val I32_LT_S = "i32.lt_s" |
| const val I32_LT_U = "i32.lt_u" |
| const val I32_GT_S = "i32.gt_s" |
| const val I32_GT_U = "i32.gt_u" |
| const val I32_LE_S = "i32.le_s" |
| const val I32_LE_U = "i32.le_u" |
| const val I32_GE_S = "i32.ge_s" |
| const val I32_GE_U = "i32.ge_u" |
| const val I64_EQZ = "i64.eqz" |
| const val I64_EQ = "i64.eq" |
| const val I64_NE = "i64.ne" |
| const val I64_LT_S = "i64.lt_s" |
| const val I64_LT_U = "i64.lt_u" |
| const val I64_GT_S = "i64.gt_s" |
| const val I64_GT_U = "i64.gt_u" |
| const val I64_LE_S = "i64.le_s" |
| const val I64_LE_U = "i64.le_u" |
| const val I64_GE_S = "i64.ge_s" |
| const val I64_GE_U = "i64.ge_u" |
| const val F32_EQ = "f32.eq" |
| const val F32_NE = "f32.ne" |
| const val F32_LT = "f32.lt" |
| const val F32_GT = "f32.gt" |
| const val F32_LE = "f32.le" |
| const val F32_GE = "f32.ge" |
| const val F64_EQ = "f64.eq" |
| const val F64_NE = "f64.ne" |
| const val F64_LT = "f64.lt" |
| const val F64_GT = "f64.gt" |
| const val F64_LE = "f64.le" |
| const val F64_GE = "f64.ge" |
| const val I32_CLZ = "i32.clz" |
| const val I32_CTZ = "i32.ctz" |
| const val I32_POPCNT = "i32.popcnt" |
| const val I32_ADD = "i32.add" |
| const val I32_SUB = "i32.sub" |
| const val I32_MUL = "i32.mul" |
| const val I32_DIV_S = "i32.div_s" |
| const val I32_DIV_U = "i32.div_u" |
| const val I32_REM_S = "i32.rem_s" |
| const val I32_REM_U = "i32.rem_u" |
| const val I32_AND = "i32.and" |
| const val I32_OR = "i32.or" |
| const val I32_XOR = "i32.xor" |
| const val I32_SHL = "i32.shl" |
| const val I32_SHR_S = "i32.shr_s" |
| const val I32_SHR_U = "i32.shr_u" |
| const val I32_ROTL = "i32.rotl" |
| const val I32_ROTR = "i32.rotr" |
| const val I64_CLZ = "i64.clz" |
| const val I64_CTZ = "i64.ctz" |
| const val I64_POPCNT = "i64.popcnt" |
| const val I64_ADD = "i64.add" |
| const val I64_SUB = "i64.sub" |
| const val I64_MUL = "i64.mul" |
| const val I64_DIV_S = "i64.div_s" |
| const val I64_DIV_U = "i64.div_u" |
| const val I64_REM_S = "i64.rem_s" |
| const val I64_REM_U = "i64.rem_u" |
| const val I64_AND = "i64.and" |
| const val I64_OR = "i64.or" |
| const val I64_XOR = "i64.xor" |
| const val I64_SHL = "i64.shl" |
| const val I64_SHR_S = "i64.shr_s" |
| const val I64_SHR_U = "i64.shr_u" |
| const val I64_ROTL = "i64.rotl" |
| const val I64_ROTR = "i64.rotr" |
| const val F32_ABS = "f32.abs" |
| const val F32_NEG = "f32.neg" |
| const val F32_CEIL = "f32.ceil" |
| const val F32_FLOOR = "f32.floor" |
| const val F32_TRUNC = "f32.trunc" |
| const val F32_NEAREST = "f32.nearest" |
| const val F32_SQRT = "f32.sqrt" |
| const val F32_ADD = "f32.add" |
| const val F32_SUB = "f32.sub" |
| const val F32_MUL = "f32.mul" |
| const val F32_DIV = "f32.div" |
| const val F32_FMIN = "f32.fmin" |
| const val F32_FMAX = "f32.fmax" |
| const val F32_COPYSIGN = "f32.copysign" |
| const val F64_ABS = "f64.abs" |
| const val F64_NEG = "f64.neg" |
| const val F64_CEIL = "f64.ceil" |
| const val F64_FLOOR = "f64.floor" |
| const val F64_TRUNC = "f64.trunc" |
| const val F64_NEAREST = "f64.nearest" |
| const val F64_SQRT = "f64.sqrt" |
| const val F64_ADD = "f64.add" |
| const val F64_SUB = "f64.sub" |
| const val F64_MUL = "f64.mul" |
| const val F64_DIV = "f64.div" |
| const val F64_FMIN = "f64.fmin" |
| const val F64_FMAX = "f64.fmax" |
| const val F64_COPYSIGN = "f64.copysign" |
| const val I32_WRAP_I64 = "i32.wrap/i64" |
| const val I32_TRUNC_F32_S = "i32.trunc_s/f32" |
| const val I32_TRUNC_F32_U = "i32.trunc_u/f32" |
| const val I32_TRUNC_F64_S = "i32.trunc_s/f64" |
| const val I32_TRUNC_F64_U = "i32.trunc_u/f64" |
| const val I64_EXTEND_I32_S = "i64.extend_s/i32" |
| const val I64_EXTEND_I32_U = "i64.extend_u/i32" |
| const val I64_TRUNC_F32_S = "i64.trunc_s/f32" |
| const val I64_TRUNC_F32_U = "i64.trunc_u/f32" |
| const val I64_TRUNC_F64_S = "i64.trunc_s/f64" |
| const val I64_TRUNC_F64_U = "i64.trunc_u/f64" |
| const val F32_CONVERT_I32_S = "f32.convert_s/i32" |
| const val F32_CONVERT_I32_U = "f32.convert_u/i32" |
| const val F32_CONVERT_I64_S = "f32.convert_s/i64" |
| const val F32_CONVERT_I64_U = "f32.convert_u/i64" |
| const val F64_CONVERT_I32_S = "f64.convert_s/i32" |
| const val F64_CONVERT_I32_U = "f64.convert_u/i32" |
| const val F64_CONVERT_I64_S = "f64.convert_s/i64" |
| const val F64_CONVERT_I64_U = "f64.convert_u/i64" |
| const val F32_DEMOTE_F64 = "f32.demote/f64" |
| const val F64_PROMOTE_F32 = "f64.promote/f32" |
| const val I32_REINTERPRET_F32 = "i32.reinterpret/f32" |
| const val I64_REINTERPRET_F64 = "i64.reinterpret/f64" |
| const val F32_REINTERPRET_I32 = "f32.reinterpret/i32" |
| |
| const val F32_CONST_NAN = "f32.const nan" |
| const val F64_CONST_NAN = "f64.const nan" |
| const val F32_CONST_PLUS_INF = "f32.const +inf" |
| const val F32_CONST_MINUS_INF = "f32.const -inf" |
| const val F64_CONST_PLUS_INF = "f64.const +inf" |
| const val F64_CONST_MINUS_INF = "f64.const -inf" |
| } |
| } |
| |
| @ExcludedFromCodegen |
| internal val implementedAsIntrinsic: Nothing |
| get() = null!! |