mirror of
https://github.com/bytecodealliance/wasm-micro-runtime.git
synced 2025-05-07 12:16:24 +00:00

* Implement the first few SIMD opcodes for fast interpreter (v128.const, v128.any_true) (#3818) Tested on the following code: ``` (module (import "wasi_snapshot_preview1" "proc_exit" (func $proc_exit (param i32))) (memory (export "memory") 1) ;; WASI entry point (func $main (export "_start") v128.const i8x16 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 v128.any_true if unreachable end v128.const i8x16 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 v128.any_true i32.const 0 i32.eq if unreachable end i32.const 0 call $proc_exit ) ) ``` * implement POP_V128() This is to simplify the simd implementation for fast interpreter * Add all SIMD operations into wasm_interp_fast switch * Add V128 comparison operations Tested using ``` (module (import "wasi_snapshot_preview1" "proc_exit" (func $proc_exit (param i32))) (memory (export "memory") 1) (func $assert_true (param v128) local.get 0 v128.any_true i32.eqz if unreachable end ) (func $main (export "_start") ;; Test v128.not v128.const i8x16 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 v128.not v128.const i8x16 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 i8x16.eq call $assert_true ;; Test v128.and v128.const i8x16 255 255 255 255 0 0 0 0 255 255 255 255 0 0 0 0 v128.const i8x16 255 255 0 0 255 255 0 0 255 255 0 0 255 255 0 0 v128.and v128.const i8x16 255 255 0 0 0 0 0 0 255 255 0 0 0 0 0 0 i8x16.eq call $assert_true ;; Test v128.andnot v128.const i8x16 255 255 255 255 0 0 0 0 255 255 255 255 0 0 0 0 v128.const i8x16 255 255 0 0 255 255 0 0 255 255 0 0 255 255 0 0 v128.andnot v128.const i8x16 0 0 255 255 0 0 0 0 0 0 255 255 0 0 0 0 i8x16.eq call $assert_true ;; Test v128.or v128.const i8x16 255 255 0 0 0 0 255 255 255 255 0 0 0 0 255 0 v128.const i8x16 0 0 255 255 255 255 0 0 0 0 255 255 255 255 0 0 v128.or v128.const i8x16 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 0 i8x16.eq call $assert_true ;; Test v128.xor v128.const i8x16 255 255 0 0 255 255 0 0 255 255 0 0 255 255 0 0 v128.const i8x16 255 255 255 255 0 0 0 0 255 255 255 255 0 0 0 0 v128.xor v128.const i8x16 0 0 255 255 255 255 0 0 0 0 255 255 255 255 0 0 i8x16.eq call $assert_true i32.const 0 call $proc_exit ) ) ``` * Add first NEON SIMD opcode implementations to fast interpreter (#3859) Add some implementations of SIMD opcodes using NEON instructions. Tested using: ```wast (module (import "wasi_snapshot_preview1" "proc_exit" (func $proc_exit (param i32))) (memory (export "memory") 1) (func $assert_true (param v128) local.get 0 v128.any_true i32.eqz if unreachable end ) (func $main (export "_start") i32.const 0 i32.const 32 memory.grow drop i32.const 0 v128.const i8x16 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 v128.store i32.const 0 v128.load v128.const i8x16 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 i8x16.eq call $assert_true i32.const 16 v128.const i8x16 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 v128.store i32.const 16 v128.load v128.const i8x16 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 i8x16.eq call $assert_true i32.const 0 v128.load v128.const i8x16 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 i8x16.eq call $assert_true drop i32.const 0 i32.const 1 memory.grow drop i32.const 0 i64.const 0x7F80FF017E02FE80 i64.store i32.const 0 v128.load8x8_s v128.const i16x8 127 -128 -1 1 126 2 -2 -128 i16x8.eq call $assert_true i32.const 0 i64.const 0x80FE027E01FF807F i64.store i32.const 0 v128.load8x8_u v128.const i16x8 128 254 2 126 1 255 128 127 i16x8.eq call $assert_true i32.const 0 i64.const 0x8000FFFE7FFF0001 i64.store i32.const 0 v128.load16x4_s v128.const i32x4 -32768 -2 32767 1 i32x4.eq call $assert_true i32.const 0 i64.const 0x8000FFFE7FFF0001 i64.store i32.const 0 v128.load16x4_u v128.const i32x4 32768 65534 32767 1 i32x4.eq call $assert_true i32.const 0 i64.const 0x8000000000000001 i64.store i32.const 0 v128.load32x2_s v128.const i64x2 -2147483648 1 i64x2.eq call $assert_true i32.const 0 i64.const 0x8000000000000001 i64.store i32.const 0 v128.load32x2_u v128.const i64x2 2147483648 1 i64x2.eq call $assert_true call $proc_exit ) ) ``` * Emit imm for lane extract and replace (#3906) * Fix replacement value not being correct (#3919) * Implement load lanes opcodes for wasm (#3942) * Implement final SIMD opcodes: store lane (#4001) * Fix load/store (#4054) * Correctly use unsigned functions (#4055) * implement local and function calls for v128 in the fast interpreter * Fix splat opcodes, add V128 handling in preserve_referenced_local and reserve_block_ret * Fix incorrect memory overflow values + SIMD ifdefs * Fix load/load_splat macros * correct endif wasm loader * Update core/iwasm/interpreter/wasm_opcode.h * Fix spec tests when WASM_CPU_SUPPORTS_UNALIGNED_ADDR_ACCESS is 0 * Resolve merge conflicts arising from main -> dev/simd_for_interp and implement fast interpreter const offset loader support for V128 * Enable SIMDe tests on CI * Document WAMR_BUILD_LIB_SIMDE --------- Co-authored-by: James Marsh <mrshnja@amazon.co.uk> Co-authored-by: jammar1 <108334558+jammar1@users.noreply.github.com> Co-authored-by: Maks Litskevich <makslit@amazon.com> Co-authored-by: Marcin Kolny <marcin.kolny@gmail.com> Co-authored-by: Wenyong Huang <wenyong.huang@intel.com>
223 lines
6.8 KiB
CMake
223 lines
6.8 KiB
CMake
# Copyright (C) 2019 Intel Corporation. All rights reserved.
|
|
# SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
|
|
|
|
if (NOT DEFINED WAMR_ROOT_DIR)
|
|
set (WAMR_ROOT_DIR ${CMAKE_CURRENT_LIST_DIR}/../)
|
|
endif ()
|
|
if (NOT DEFINED SHARED_DIR)
|
|
set (SHARED_DIR ${WAMR_ROOT_DIR}/core/shared)
|
|
endif ()
|
|
if (NOT DEFINED IWASM_DIR)
|
|
set (IWASM_DIR ${WAMR_ROOT_DIR}/core/iwasm)
|
|
endif ()
|
|
if (NOT DEFINED DEPS_DIR)
|
|
set (DEPS_DIR ${WAMR_ROOT_DIR}/core/deps)
|
|
endif ()
|
|
if (NOT DEFINED SHARED_PLATFORM_CONFIG)
|
|
# CMake file for platform configuration. The PLATFORM_SHARED_SOURCE variable
|
|
# should point to a list of platform-specfic source files to compile.
|
|
set (SHARED_PLATFORM_CONFIG ${SHARED_DIR}/platform/${WAMR_BUILD_PLATFORM}/shared_platform.cmake)
|
|
endif ()
|
|
|
|
if (DEFINED EXTRA_SDK_INCLUDE_PATH)
|
|
message(STATUS, "EXTRA_SDK_INCLUDE_PATH = ${EXTRA_SDK_INCLUDE_PATH} ")
|
|
include_directories (
|
|
${EXTRA_SDK_INCLUDE_PATH}
|
|
)
|
|
endif ()
|
|
|
|
# Set default options
|
|
|
|
# Set WAMR_BUILD_TARGET, currently values supported:
|
|
# "X86_64", "AMD_64", "X86_32", "AARCH64[sub]", "ARM[sub]", "THUMB[sub]",
|
|
# "MIPS", "XTENSA", "RISCV64[sub]", "RISCV32[sub]"
|
|
if (NOT DEFINED WAMR_BUILD_TARGET)
|
|
if (CMAKE_SYSTEM_PROCESSOR MATCHES "^(arm64|aarch64)")
|
|
set (WAMR_BUILD_TARGET "AARCH64")
|
|
elseif (CMAKE_SYSTEM_PROCESSOR STREQUAL "riscv64")
|
|
set (WAMR_BUILD_TARGET "RISCV64")
|
|
elseif (CMAKE_SIZEOF_VOID_P EQUAL 8)
|
|
# Build as X86_64 by default in 64-bit platform
|
|
set (WAMR_BUILD_TARGET "X86_64")
|
|
elseif (CMAKE_SIZEOF_VOID_P EQUAL 4)
|
|
# Build as X86_32 by default in 32-bit platform
|
|
set (WAMR_BUILD_TARGET "X86_32")
|
|
else ()
|
|
message(SEND_ERROR "Unsupported build target platform!")
|
|
endif ()
|
|
endif ()
|
|
|
|
################ optional according to settings ################
|
|
if (WAMR_BUILD_FAST_JIT EQUAL 1 OR WAMR_BUILD_JIT EQUAL 1)
|
|
# Enable classic interpreter if Fast JIT or LLVM JIT is enabled
|
|
set (WAMR_BUILD_INTERP 1)
|
|
set (WAMR_BUILD_FAST_INTERP 0)
|
|
endif ()
|
|
|
|
if (WAMR_BUILD_INTERP EQUAL 1)
|
|
include (${IWASM_DIR}/interpreter/iwasm_interp.cmake)
|
|
endif ()
|
|
|
|
if (WAMR_BUILD_FAST_JIT EQUAL 1)
|
|
if (WAMR_BUILD_PLATFORM STREQUAL "windows")
|
|
message ("Fast JIT currently not supported on Windows")
|
|
set (WAMR_BUILD_FAST_JIT 0)
|
|
else ()
|
|
include (${IWASM_DIR}/fast-jit/iwasm_fast_jit.cmake)
|
|
endif ()
|
|
endif ()
|
|
|
|
if (WAMR_BUILD_JIT EQUAL 1)
|
|
# Enable AOT if LLVM JIT is enabled
|
|
set (WAMR_BUILD_AOT 1)
|
|
include (${IWASM_DIR}/compilation/iwasm_compl.cmake)
|
|
endif ()
|
|
|
|
if (WAMR_BUILD_AOT EQUAL 1)
|
|
include (${IWASM_DIR}/aot/iwasm_aot.cmake)
|
|
endif ()
|
|
|
|
if (WAMR_BUILD_STRINGREF EQUAL 1)
|
|
set (WAMR_BUILD_GC 1)
|
|
endif ()
|
|
|
|
if (WAMR_BUILD_GC EQUAL 1)
|
|
include (${IWASM_DIR}/common/gc/iwasm_gc.cmake)
|
|
# Enable the dependent feature if GC is enabled
|
|
set (WAMR_BUILD_REF_TYPES 1)
|
|
endif ()
|
|
|
|
if (WAMR_BUILD_LIBC_BUILTIN EQUAL 1)
|
|
include (${IWASM_DIR}/libraries/libc-builtin/libc_builtin.cmake)
|
|
endif ()
|
|
|
|
if (WAMR_BUILD_LIBC_UVWASI EQUAL 1)
|
|
include (${IWASM_DIR}/libraries/libc-uvwasi/libc_uvwasi.cmake)
|
|
set (WAMR_BUILD_MODULE_INST_CONTEXT 1)
|
|
elseif (WAMR_BUILD_LIBC_WASI EQUAL 1)
|
|
include (${IWASM_DIR}/libraries/libc-wasi/libc_wasi.cmake)
|
|
set (WAMR_BUILD_MODULE_INST_CONTEXT 1)
|
|
endif ()
|
|
|
|
if (WAMR_BUILD_LIB_PTHREAD_SEMAPHORE EQUAL 1)
|
|
# Enable the dependent feature if lib pthread semaphore is enabled
|
|
set (WAMR_BUILD_LIB_PTHREAD 1)
|
|
endif ()
|
|
|
|
if (WAMR_BUILD_WASI_NN EQUAL 1)
|
|
include (${IWASM_DIR}/libraries/wasi-nn/cmake/wasi_nn.cmake)
|
|
endif ()
|
|
|
|
if (WAMR_BUILD_LIB_PTHREAD EQUAL 1)
|
|
if (WAMR_BUILD_PLATFORM STREQUAL "windows")
|
|
set (WAMR_BUILD_LIB_PTHREAD_SEMAPHORE 0)
|
|
message ("Lib pthread semaphore currently not supported on Windows")
|
|
endif ()
|
|
include (${IWASM_DIR}/libraries/lib-pthread/lib_pthread.cmake)
|
|
# Enable the dependent feature if lib pthread is enabled
|
|
set (WAMR_BUILD_THREAD_MGR 1)
|
|
set (WAMR_BUILD_BULK_MEMORY 1)
|
|
set (WAMR_BUILD_SHARED_MEMORY 1)
|
|
endif ()
|
|
|
|
if (WAMR_BUILD_LIB_WASI_THREADS EQUAL 1)
|
|
include (${IWASM_DIR}/libraries/lib-wasi-threads/lib_wasi_threads.cmake)
|
|
# Enable the dependent feature if lib wasi threads is enabled
|
|
set (WAMR_BUILD_THREAD_MGR 1)
|
|
set (WAMR_BUILD_BULK_MEMORY 1)
|
|
set (WAMR_BUILD_SHARED_MEMORY 1)
|
|
endif ()
|
|
|
|
if (WAMR_BUILD_SHARED_HEAP EQUAL 1)
|
|
include (${IWASM_DIR}/libraries/shared-heap/shared_heap.cmake)
|
|
endif ()
|
|
|
|
if (WAMR_BUILD_DEBUG_INTERP EQUAL 1)
|
|
set (WAMR_BUILD_THREAD_MGR 1)
|
|
include (${IWASM_DIR}/libraries/debug-engine/debug_engine.cmake)
|
|
|
|
if (WAMR_BUILD_FAST_INTERP EQUAL 1)
|
|
set (WAMR_BUILD_FAST_INTERP 0)
|
|
message(STATUS
|
|
"Debugger doesn't work with fast interpreter, switch to classic interpreter")
|
|
endif ()
|
|
endif ()
|
|
|
|
if (WAMR_BUILD_THREAD_MGR EQUAL 1)
|
|
include (${IWASM_DIR}/libraries/thread-mgr/thread_mgr.cmake)
|
|
endif ()
|
|
|
|
if (WAMR_BUILD_LIBC_EMCC EQUAL 1)
|
|
include (${IWASM_DIR}/libraries/libc-emcc/libc_emcc.cmake)
|
|
endif ()
|
|
|
|
if (WAMR_BUILD_LIB_RATS EQUAL 1)
|
|
include (${IWASM_DIR}/libraries/lib-rats/lib_rats.cmake)
|
|
endif ()
|
|
|
|
if (WAMR_BUILD_SIMD EQUAL 1 AND WAMR_BUILD_FAST_INTERP EQUAL 1)
|
|
if (WAMR_BUILD_PLATFORM STREQUAL "windows")
|
|
message(STATUS "SIMDe doesnt support platform " ${WAMR_BUILD_PLATFORM})
|
|
set(WAMR_BUILD_SIMDE 0)
|
|
else()
|
|
include (${IWASM_DIR}/libraries/simde/simde.cmake)
|
|
set (WAMR_BUILD_SIMDE 1)
|
|
endif()
|
|
endif ()
|
|
|
|
if (WAMR_BUILD_WASM_CACHE EQUAL 1)
|
|
include (${WAMR_ROOT_DIR}/build-scripts/involve_boringssl.cmake)
|
|
endif ()
|
|
|
|
####################### Common sources #######################
|
|
if (NOT MSVC)
|
|
set (CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -std=gnu99 -ffunction-sections -fdata-sections \
|
|
-Wall -Wno-unused-parameter -Wno-pedantic")
|
|
endif ()
|
|
|
|
# include the build config template file
|
|
include (${CMAKE_CURRENT_LIST_DIR}/config_common.cmake)
|
|
|
|
include_directories (${IWASM_DIR}/include)
|
|
|
|
file (GLOB header
|
|
${IWASM_DIR}/include/*.h
|
|
)
|
|
LIST (APPEND RUNTIME_LIB_HEADER_LIST ${header})
|
|
|
|
if (WAMR_BUILD_PLATFORM STREQUAL "windows")
|
|
enable_language (ASM_MASM)
|
|
else()
|
|
enable_language (ASM)
|
|
endif()
|
|
|
|
include (${SHARED_PLATFORM_CONFIG})
|
|
include (${SHARED_DIR}/mem-alloc/mem_alloc.cmake)
|
|
include (${IWASM_DIR}/common/iwasm_common.cmake)
|
|
include (${SHARED_DIR}/utils/shared_utils.cmake)
|
|
|
|
|
|
set (source_all
|
|
${PLATFORM_SHARED_SOURCE}
|
|
${MEM_ALLOC_SHARED_SOURCE}
|
|
${UTILS_SHARED_SOURCE}
|
|
${LIBC_BUILTIN_SOURCE}
|
|
${LIBC_WASI_SOURCE}
|
|
${WASI_NN_SOURCES}
|
|
${IWASM_COMMON_SOURCE}
|
|
${IWASM_INTERP_SOURCE}
|
|
${IWASM_AOT_SOURCE}
|
|
${IWASM_COMPL_SOURCE}
|
|
${IWASM_FAST_JIT_SOURCE}
|
|
${IWASM_GC_SOURCE}
|
|
${LIB_WASI_THREADS_SOURCE}
|
|
${LIB_PTHREAD_SOURCE}
|
|
${THREAD_MGR_SOURCE}
|
|
${LIBC_EMCC_SOURCE}
|
|
${LIB_RATS_SOURCE}
|
|
${DEBUG_ENGINE_SOURCE}
|
|
${LIB_SHARED_HEAP_SOURCE}
|
|
)
|
|
|
|
set (WAMR_RUNTIME_LIB_SOURCE ${source_all})
|