| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157 |
- /*
- * 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, (double)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;
- }
|