mirror of
https://github.com/bytecodealliance/wasm-micro-runtime.git
synced 2025-02-06 15:05:19 +00:00
fb4afc7ca4
Apply clang-format for core/iwasm/compilation and core/iwasm/libraries files. Add wasm-c-api empty_imports sample to workflow test. And enable triggering workflow when core/config.h changes.
158 lines
4.1 KiB
C
158 lines
4.1 KiB
C
/*
|
|
* Copyright (C) 2019 Intel Corporation. All rights reserved.
|
|
* SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
|
|
*/
|
|
|
|
#include "simd_common.h"
|
|
|
|
LLVMValueRef
|
|
simd_pop_v128_and_bitcast(const AOTCompContext *comp_ctx,
|
|
const AOTFuncContext *func_ctx, LLVMTypeRef vec_type,
|
|
const char *name)
|
|
{
|
|
LLVMValueRef number;
|
|
|
|
POP_V128(number);
|
|
|
|
if (!(number =
|
|
LLVMBuildBitCast(comp_ctx->builder, number, vec_type, name))) {
|
|
HANDLE_FAILURE("LLVMBuildBitCast");
|
|
goto fail;
|
|
}
|
|
|
|
return number;
|
|
fail:
|
|
return NULL;
|
|
}
|
|
|
|
bool
|
|
simd_bitcast_and_push_v128(const AOTCompContext *comp_ctx,
|
|
const AOTFuncContext *func_ctx, LLVMValueRef vector,
|
|
const char *name)
|
|
{
|
|
if (!(vector = LLVMBuildBitCast(comp_ctx->builder, vector, V128_i64x2_TYPE,
|
|
name))) {
|
|
HANDLE_FAILURE("LLVMBuildBitCast");
|
|
goto fail;
|
|
}
|
|
|
|
/* push result into the stack */
|
|
PUSH_V128(vector);
|
|
|
|
return true;
|
|
fail:
|
|
return false;
|
|
}
|
|
|
|
LLVMValueRef
|
|
simd_lane_id_to_llvm_value(AOTCompContext *comp_ctx, uint8 lane_id)
|
|
{
|
|
LLVMValueRef lane_indexes[] = {
|
|
LLVM_CONST(i32_zero), LLVM_CONST(i32_one),
|
|
LLVM_CONST(i32_two), LLVM_CONST(i32_three),
|
|
LLVM_CONST(i32_four), LLVM_CONST(i32_five),
|
|
LLVM_CONST(i32_six), LLVM_CONST(i32_seven),
|
|
LLVM_CONST(i32_eight), LLVM_CONST(i32_nine),
|
|
LLVM_CONST(i32_ten), LLVM_CONST(i32_eleven),
|
|
LLVM_CONST(i32_twelve), LLVM_CONST(i32_thirteen),
|
|
LLVM_CONST(i32_fourteen), LLVM_CONST(i32_fifteen),
|
|
};
|
|
|
|
return lane_id < 16 ? lane_indexes[lane_id] : NULL;
|
|
}
|
|
|
|
LLVMValueRef
|
|
simd_build_const_integer_vector(const AOTCompContext *comp_ctx,
|
|
const LLVMTypeRef element_type,
|
|
const int *element_value, uint32 length)
|
|
{
|
|
LLVMValueRef vector = NULL;
|
|
LLVMValueRef *elements;
|
|
unsigned i;
|
|
|
|
if (!(elements = wasm_runtime_malloc(sizeof(LLVMValueRef) * length))) {
|
|
return NULL;
|
|
}
|
|
|
|
for (i = 0; i < length; i++) {
|
|
if (!(elements[i] =
|
|
LLVMConstInt(element_type, element_value[i], true))) {
|
|
HANDLE_FAILURE("LLVMConstInst");
|
|
goto fail;
|
|
}
|
|
}
|
|
|
|
if (!(vector = LLVMConstVector(elements, length))) {
|
|
HANDLE_FAILURE("LLVMConstVector");
|
|
goto fail;
|
|
}
|
|
|
|
fail:
|
|
wasm_runtime_free(elements);
|
|
return vector;
|
|
}
|
|
|
|
LLVMValueRef
|
|
simd_build_splat_const_integer_vector(const AOTCompContext *comp_ctx,
|
|
const LLVMTypeRef element_type,
|
|
const int64 element_value, uint32 length)
|
|
{
|
|
LLVMValueRef vector = NULL, element;
|
|
LLVMValueRef *elements;
|
|
unsigned i;
|
|
|
|
if (!(elements = wasm_runtime_malloc(sizeof(LLVMValueRef) * length))) {
|
|
return NULL;
|
|
}
|
|
|
|
if (!(element = LLVMConstInt(element_type, element_value, true))) {
|
|
HANDLE_FAILURE("LLVMConstInt");
|
|
goto fail;
|
|
}
|
|
|
|
for (i = 0; i < length; i++) {
|
|
elements[i] = element;
|
|
}
|
|
|
|
if (!(vector = LLVMConstVector(elements, length))) {
|
|
HANDLE_FAILURE("LLVMConstVector");
|
|
goto fail;
|
|
}
|
|
|
|
fail:
|
|
wasm_runtime_free(elements);
|
|
return vector;
|
|
}
|
|
|
|
LLVMValueRef
|
|
simd_build_splat_const_float_vector(const AOTCompContext *comp_ctx,
|
|
const LLVMTypeRef element_type,
|
|
const float element_value, uint32 length)
|
|
{
|
|
LLVMValueRef vector = NULL, element;
|
|
LLVMValueRef *elements;
|
|
unsigned i;
|
|
|
|
if (!(elements = wasm_runtime_malloc(sizeof(LLVMValueRef) * length))) {
|
|
return NULL;
|
|
}
|
|
|
|
if (!(element = LLVMConstReal(element_type, element_value))) {
|
|
HANDLE_FAILURE("LLVMConstReal");
|
|
goto fail;
|
|
}
|
|
|
|
for (i = 0; i < length; i++) {
|
|
elements[i] = element;
|
|
}
|
|
|
|
if (!(vector = LLVMConstVector(elements, length))) {
|
|
HANDLE_FAILURE("LLVMConstVector");
|
|
goto fail;
|
|
}
|
|
|
|
fail:
|
|
wasm_runtime_free(elements);
|
|
return vector;
|
|
}
|