Skip to content

Commit

Permalink
Refine build script of zephyr product-mini, enable aot soft-float sup…
Browse files Browse the repository at this point in the history
…port (#188)
  • Loading branch information
wenyongh authored Mar 5, 2020
1 parent be69c51 commit cfcaca3
Show file tree
Hide file tree
Showing 10 changed files with 170 additions and 29 deletions.
30 changes: 29 additions & 1 deletion core/iwasm/aot/arch/aot_reloc_arm.c
Original file line number Diff line number Diff line change
Expand Up @@ -44,6 +44,20 @@ void __aeabi_idivmod();
void __aeabi_uidivmod();
void __aeabi_ldivmod();
void __aeabi_uldivmod();
void __aeabi_i2d();
void __aeabi_dadd();
void __aeabi_ddiv();
void __aeabi_dcmplt();
void __aeabi_dcmpun();
void __aeabi_dcmple();
void __aeabi_dcmpge();
void __aeabi_d2iz();
void __aeabi_fcmplt();
void __aeabi_fcmpun();
void __aeabi_fcmple();
void __aeabi_fcmpge();
void __aeabi_f2iz();
void __aeabi_f2d();

static SymbolMap target_sym_map[] = {
REG_COMMON_SYMBOLS,
Expand Down Expand Up @@ -77,7 +91,21 @@ static SymbolMap target_sym_map[] = {
REG_SYM(__aeabi_idivmod),
REG_SYM(__aeabi_uidivmod),
REG_SYM(__aeabi_ldivmod),
REG_SYM(__aeabi_uldivmod)
REG_SYM(__aeabi_uldivmod),
REG_SYM(__aeabi_i2d),
REG_SYM(__aeabi_dadd),
REG_SYM(__aeabi_ddiv),
REG_SYM(__aeabi_dcmplt),
REG_SYM(__aeabi_dcmpun),
REG_SYM(__aeabi_dcmple),
REG_SYM(__aeabi_dcmpge),
REG_SYM(__aeabi_d2iz),
REG_SYM(__aeabi_fcmplt),
REG_SYM(__aeabi_fcmpun),
REG_SYM(__aeabi_fcmple),
REG_SYM(__aeabi_fcmpge),
REG_SYM(__aeabi_f2iz),
REG_SYM(__aeabi_f2d),
};

static void
Expand Down
30 changes: 29 additions & 1 deletion core/iwasm/aot/arch/aot_reloc_thumb.c
Original file line number Diff line number Diff line change
Expand Up @@ -43,6 +43,20 @@ void __aeabi_idivmod();
void __aeabi_uidivmod();
void __aeabi_ldivmod();
void __aeabi_uldivmod();
void __aeabi_i2d();
void __aeabi_dadd();
void __aeabi_ddiv();
void __aeabi_dcmplt();
void __aeabi_dcmpun();
void __aeabi_dcmple();
void __aeabi_dcmpge();
void __aeabi_d2iz();
void __aeabi_fcmplt();
void __aeabi_fcmpun();
void __aeabi_fcmple();
void __aeabi_fcmpge();
void __aeabi_f2iz();
void __aeabi_f2d();

static SymbolMap target_sym_map[] = {
REG_COMMON_SYMBOLS,
Expand Down Expand Up @@ -76,7 +90,21 @@ static SymbolMap target_sym_map[] = {
REG_SYM(__aeabi_idivmod),
REG_SYM(__aeabi_uidivmod),
REG_SYM(__aeabi_ldivmod),
REG_SYM(__aeabi_uldivmod)
REG_SYM(__aeabi_uldivmod),
REG_SYM(__aeabi_i2d),
REG_SYM(__aeabi_dadd),
REG_SYM(__aeabi_ddiv),
REG_SYM(__aeabi_dcmplt),
REG_SYM(__aeabi_dcmpun),
REG_SYM(__aeabi_dcmple),
REG_SYM(__aeabi_dcmpge),
REG_SYM(__aeabi_d2iz),
REG_SYM(__aeabi_fcmplt),
REG_SYM(__aeabi_fcmpun),
REG_SYM(__aeabi_fcmple),
REG_SYM(__aeabi_fcmpge),
REG_SYM(__aeabi_f2iz),
REG_SYM(__aeabi_f2d),
};

static void
Expand Down
61 changes: 51 additions & 10 deletions core/iwasm/compilation/aot_emit_numberic.c
Original file line number Diff line number Diff line change
Expand Up @@ -857,13 +857,34 @@ compile_op_int_shift(AOTCompContext *comp_ctx, AOTFuncContext *func_ctx,
return false;
}

static bool
is_targeting_soft_float(LLVMTargetMachineRef target_machine)
{
bool ret = false;
char *feature_string;

if (!(feature_string =
LLVMGetTargetMachineFeatureString(target_machine))) {
aot_set_last_error("llvm get target machine feature string fail.");
return false;
}

ret = strstr(feature_string, "+soft-float") ? true : false;
LLVMDisposeMessage(feature_string);
return ret;
}

static bool
compile_op_float_arithmetic(AOTCompContext *comp_ctx, AOTFuncContext *func_ctx,
FloatArithmetic arith_op, bool is_f32)
{
switch (arith_op) {
case FLOAT_ADD:
DEF_FP_BINARY_OP(call_llvm_float_expermental_constrained_intrinsic(
if (is_targeting_soft_float(comp_ctx->target_machine))
DEF_FP_BINARY_OP(LLVMBuildFAdd(comp_ctx->builder, left, right, "fadd"),
"llvm build fadd fail.");
else
DEF_FP_BINARY_OP(call_llvm_float_expermental_constrained_intrinsic(
comp_ctx,
(is_f32
? "llvm.experimental.constrained.fadd.f32"
Expand All @@ -873,10 +894,14 @@ compile_op_float_arithmetic(AOTCompContext *comp_ctx, AOTFuncContext *func_ctx,
right,
comp_ctx->fp_rounding_mode,
comp_ctx->fp_exception_behavior),
NULL);
NULL);
return true;
case FLOAT_SUB:
DEF_FP_BINARY_OP(call_llvm_float_expermental_constrained_intrinsic(
if (is_targeting_soft_float(comp_ctx->target_machine))
DEF_FP_BINARY_OP(LLVMBuildFSub(comp_ctx->builder, left, right, "fsub"),
"llvm build fsub fail.");
else
DEF_FP_BINARY_OP(call_llvm_float_expermental_constrained_intrinsic(
comp_ctx,
(is_f32
? "llvm.experimental.constrained.fsub.f32"
Expand All @@ -886,10 +911,14 @@ compile_op_float_arithmetic(AOTCompContext *comp_ctx, AOTFuncContext *func_ctx,
right,
comp_ctx->fp_rounding_mode,
comp_ctx->fp_exception_behavior),
NULL);
NULL);
return true;
case FLOAT_MUL:
DEF_FP_BINARY_OP(call_llvm_float_expermental_constrained_intrinsic(
if (is_targeting_soft_float(comp_ctx->target_machine))
DEF_FP_BINARY_OP(LLVMBuildFMul(comp_ctx->builder, left, right, "fmul"),
"llvm build fmul fail.");
else
DEF_FP_BINARY_OP(call_llvm_float_expermental_constrained_intrinsic(
comp_ctx,
(is_f32
? "llvm.experimental.constrained.fmul.f32"
Expand All @@ -899,10 +928,14 @@ compile_op_float_arithmetic(AOTCompContext *comp_ctx, AOTFuncContext *func_ctx,
right,
comp_ctx->fp_rounding_mode,
comp_ctx->fp_exception_behavior),
NULL);
NULL);
return true;
case FLOAT_DIV:
DEF_FP_BINARY_OP(call_llvm_float_expermental_constrained_intrinsic(
if (is_targeting_soft_float(comp_ctx->target_machine))
DEF_FP_BINARY_OP(LLVMBuildFDiv(comp_ctx->builder, left, right, "fdiv"),
"llvm build fdiv fail.");
else
DEF_FP_BINARY_OP(call_llvm_float_expermental_constrained_intrinsic(
comp_ctx,
(is_f32
? "llvm.experimental.constrained.fdiv.f32"
Expand All @@ -912,7 +945,7 @@ compile_op_float_arithmetic(AOTCompContext *comp_ctx, AOTFuncContext *func_ctx,
right,
comp_ctx->fp_rounding_mode,
comp_ctx->fp_exception_behavior),
NULL);
NULL);
return true;
case FLOAT_MIN:
DEF_FP_BINARY_OP(compile_op_float_min_max(comp_ctx,
Expand Down Expand Up @@ -1017,7 +1050,15 @@ compile_op_float_math(AOTCompContext *comp_ctx, AOTFuncContext *func_ctx,
NULL);
return true;
case FLOAT_SQRT:
DEF_FP_UNARY_OP(call_llvm_libm_expermental_constrained_intrinsic(
if (is_targeting_soft_float(comp_ctx->target_machine))
DEF_FP_UNARY_OP(call_llvm_float_math_intrinsic(comp_ctx,
is_f32 ? "llvm.sqrt.f32" :
"llvm.sqrt.f64",
is_f32,
operand),
NULL);
else
DEF_FP_UNARY_OP(call_llvm_libm_expermental_constrained_intrinsic(
comp_ctx,
(is_f32
? "llvm.experimental.constrained.sqrt.f32"
Expand All @@ -1026,7 +1067,7 @@ compile_op_float_math(AOTCompContext *comp_ctx, AOTFuncContext *func_ctx,
operand,
comp_ctx->fp_rounding_mode,
comp_ctx->fp_exception_behavior),
NULL);
NULL);
return true;
default:
bh_assert(0);
Expand Down
19 changes: 10 additions & 9 deletions doc/build_wamr.md
Original file line number Diff line number Diff line change
Expand Up @@ -155,18 +155,19 @@ cd zephyr/samples/
cp -a <wamr_root_dir>/product-mini/platforms/zephyr/simple .
cd simple
ln -s <wamr_root_dir> wamr
mkdir build && cd build
source ../../../zephyr-env.sh
source ../../zephyr-env.sh
1. build for x86
cmake -GNinja -DBOARD=qemu_x86_nommu ..
ninja
2. build for ARM
modify ../prj.conf, modify the commented line "# CONFIG_ARM_MPU is not set" to "CONFIG_ARM_MPU=y"
cmake -GNinja -DBOARD=nucleo_f767zi -DWAMR_BUILD_TARGET=THUMBV7 ..
ninja
```
1. build for x86 (qemu_x86_nommu)
``` Bash
./build.sh x86
```
2. build for ARM (nucleo_f767zi)
``` Bash
./build.sh stm32
```
Note:
WAMR provides some features which can be easily configured by passing options to cmake, please see [Linux platform](./build_wamr.md#linux) for details. Currently in Zephyr, interpreter, AoT and builtin libc are enabled by default.
Expand Down
4 changes: 2 additions & 2 deletions product-mini/platforms/linux/build_llvm.sh
Original file line number Diff line number Diff line change
@@ -1,14 +1,14 @@
#!/bin/sh

# Copyright (C) 2019 Intel Corporation. All rights reserved.
# Copyright (C) 2020 Intel Corporation. All rights reserved.
# SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception

DEPS_DIR=${PWD}/../../../core/deps

cd ${DEPS_DIR}
if [ ! -d "llvm" ]; then
echo "Clone llvm to core/deps/ .."
git clone https://github.com/llvm-mirror/llvm.git
git clone --depth 1 https://github.com/llvm-mirror/llvm.git
fi

cd llvm
Expand Down
35 changes: 35 additions & 0 deletions product-mini/platforms/zephyr/simple/build.sh
Original file line number Diff line number Diff line change
@@ -0,0 +1,35 @@
#!/bin/bash

# Copyright (C) 2019 Intel Corporation. All rights reserved.
# SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception

X86_TARGET="x86"
STM32_TARGET="stm32"

if [ $# != 1 ] ; then
echo "USAGE:"
echo "$0 $X86_TARGET|$STM32_TARGET"
echo "Example:"
echo " $0 $X86_TARGET"
echo " $0 $STM32_TARGET"
exit 1
fi

TARGET=$1

if [ "$TARGET" = "$X86_TARGET" ] ; then
cp prj_qemu_x86_nommu.conf prj.conf
rm -fr build && mkdir build && cd build
cmake -GNinja -DBOARD=qemu_x86_nommu -DWAMR_BUILD_TARGET=X86_32 ..
ninja
ninja run
elif [ "$TARGET" = "$STM32_TARGET" ] ; then
cp prj_nucleo767zi.conf prj.conf
rm -fr build && mkdir build && cd build
cmake -GNinja -DBOARD=nucleo_f767zi -DWAMR_BUILD_TARGET=THUMBV7 ..
ninja
ninja flash
else
echo "unsupported target: $TARGET"
exit 1
fi
5 changes: 0 additions & 5 deletions product-mini/platforms/zephyr/simple/prj.conf

This file was deleted.

7 changes: 7 additions & 0 deletions product-mini/platforms/zephyr/simple/prj_nucleo767zi.conf
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
# Copyright (C) 2019 Intel Corporation. All rights reserved.
# SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception

CONFIG_ARM_MPU=y
CONFIG_STACK_SENTINEL=y
CONFIG_PRINTK=y
CONFIG_LOG=y
6 changes: 6 additions & 0 deletions product-mini/platforms/zephyr/simple/prj_qemu_x86_nommu.conf
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
# Copyright (C) 2019 Intel Corporation. All rights reserved.
# SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception

CONFIG_STACK_SENTINEL=y
CONFIG_PRINTK=y
CONFIG_LOG=y
2 changes: 1 addition & 1 deletion samples/gui/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -117,4 +117,4 @@ First, connect PC and STM32 with UART. Then install to use host_tool.</br>

The graphic user interface demo photo:

![WAMR samples diagram](../../doc/pics/vgl_demo.png "WAMR samples diagram")
![WAMR samples diagram](../../doc/pics/vgl_demo.png "WAMR samples diagram")

0 comments on commit cfcaca3

Please sign in to comment.