Add configuration for ARMv7 softfloat build; update setjmp / longjmp ARMv7 implementation to handle the softfloat-mode properly.

JerryScript-DCO-1.0-Signed-off-by: Ruben Ayrapetyan r.ayrapetyan@samsung.com
This commit is contained in:
Ruben Ayrapetyan
2015-06-16 15:16:19 +03:00
parent b008867d81
commit de7b72d726
6 changed files with 67 additions and 30 deletions
@@ -0,0 +1,21 @@
# Copyright 2015 Samsung Electronics Co., Ltd.
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
set(CMAKE_SYSTEM_NAME Linux)
set(CMAKE_SYSTEM_PROCESSOR armv7l-el)
set(CMAKE_C_COMPILER arm-linux-gnueabi-gcc)
set(CMAKE_CXX_COMPILER arm-linux-gnueabi-g++)
set(FLAGS_COMMON_ARCH -mlittle-endian -mthumb)
@@ -13,7 +13,7 @@
# limitations under the License. # limitations under the License.
set(CMAKE_SYSTEM_NAME Linux) set(CMAKE_SYSTEM_NAME Linux)
set(CMAKE_SYSTEM_PROCESSOR armv7l) set(CMAKE_SYSTEM_PROCESSOR armv7l-hf)
set(CMAKE_C_COMPILER arm-linux-gnueabihf-gcc) set(CMAKE_C_COMPILER arm-linux-gnueabihf-gcc)
set(CMAKE_CXX_COMPILER arm-linux-gnueabihf-g++) set(CMAKE_CXX_COMPILER arm-linux-gnueabihf-g++)
+1 -1
View File
@@ -15,7 +15,7 @@
include(CMakeForceCompiler) include(CMakeForceCompiler)
set(CMAKE_SYSTEM_NAME MCU) set(CMAKE_SYSTEM_NAME MCU)
set(CMAKE_SYSTEM_PROCESSOR armv7l) set(CMAKE_SYSTEM_PROCESSOR armv7l-hf)
set(CMAKE_SYSTEM_VERSION STM32F3) set(CMAKE_SYSTEM_VERSION STM32F3)
set(FLAGS_COMMON_ARCH -mlittle-endian -mthumb -mcpu=cortex-m4 -march=armv7e-m -mfpu=fpv4-sp-d16 -mfloat-abi=hard) set(FLAGS_COMMON_ARCH -mlittle-endian -mthumb -mcpu=cortex-m4 -march=armv7e-m -mfpu=fpv4-sp-d16 -mfloat-abi=hard)
+1 -1
View File
@@ -15,7 +15,7 @@
include(CMakeForceCompiler) include(CMakeForceCompiler)
set(CMAKE_SYSTEM_NAME MCU) set(CMAKE_SYSTEM_NAME MCU)
set(CMAKE_SYSTEM_PROCESSOR armv7l) set(CMAKE_SYSTEM_PROCESSOR armv7l-hf)
set(CMAKE_SYSTEM_VERSION STM32F4) set(CMAKE_SYSTEM_VERSION STM32F4)
set(FLAGS_COMMON_ARCH -mlittle-endian -mthumb -mcpu=cortex-m4 -march=armv7e-m -mfpu=fpv4-sp-d16 -mfloat-abi=hard) set(FLAGS_COMMON_ARCH -mlittle-endian -mthumb -mcpu=cortex-m4 -march=armv7e-m -mfpu=fpv4-sp-d16 -mfloat-abi=hard)
+8 -4
View File
@@ -30,8 +30,10 @@ set(COMPILE_FLAGS_LIBC "${COMPILE_FLAGS_JERRY} ${C_FLAGS_JERRY}")
# Architecture-specific # Architecture-specific
# x86_64 # x86_64
set(DEFINES_LIBC_X86_64 __TARGET_HOST_x64) set(DEFINES_LIBC_X86_64 __TARGET_HOST_x64)
# ARMv7 # ARMv7-hf
set(DEFINES_LIBC_ARMV7 __TARGET_HOST_ARMv7) set(DEFINES_LIBC_ARMV7_HF __TARGET_HOST_ARMv7 __TARGET_HOST_ARMv7_HARD_FLOAT)
# ARMv7-el
set(DEFINES_LIBC_ARMV7_EL __TARGET_HOST_ARMv7 __TARGET_HOST_ARMv7_SOFT_FLOAT)
# x86 # x86
set(DEFINES_LIBC_X86 __TARGET_HOST_x86) set(DEFINES_LIBC_X86 __TARGET_HOST_x86)
@@ -93,8 +95,10 @@ set(COMPILE_FLAGS_LIBC "${COMPILE_FLAGS_JERRY} ${C_FLAGS_JERRY}")
# Architecture-specific configuration # Architecture-specific configuration
if(${CMAKE_SYSTEM_PROCESSOR} STREQUAL "x86_64") if(${CMAKE_SYSTEM_PROCESSOR} STREQUAL "x86_64")
set(DEFINES_LIBC ${DEFINES_LIBC} ${DEFINES_LIBC_X86_64}) set(DEFINES_LIBC ${DEFINES_LIBC} ${DEFINES_LIBC_X86_64})
elseif(${CMAKE_SYSTEM_PROCESSOR} STREQUAL "armv7l") elseif(${CMAKE_SYSTEM_PROCESSOR} STREQUAL "armv7l-hf")
set(DEFINES_LIBC ${DEFINES_LIBC} ${DEFINES_LIBC_ARMV7}) set(DEFINES_LIBC ${DEFINES_LIBC} ${DEFINES_LIBC_ARMV7_HF})
elseif(${CMAKE_SYSTEM_PROCESSOR} STREQUAL "armv7l-el")
set(DEFINES_LIBC ${DEFINES_LIBC} ${DEFINES_LIBC_ARMV7_EL})
elseif(${CMAKE_SYSTEM_PROCESSOR} STREQUAL "x86") elseif(${CMAKE_SYSTEM_PROCESSOR} STREQUAL "x86")
set(DEFINES_LIBC ${DEFINES_LIBC} ${DEFINES_LIBC_X86}) set(DEFINES_LIBC ${DEFINES_LIBC} ${DEFINES_LIBC_X86})
else() else()
+35 -23
View File
@@ -99,6 +99,20 @@
1: \ 1: \
b 1b b 1b
/**
* If hard-float mode:
* store s16-s31 vfp registers to buffer, pointed with r0 register,
* and increase the register on size of stored data.
*/
#ifdef __TARGET_HOST_ARMv7_HARD_FLOAT
# define _STORE_VFP_S16_S31_IF_HARD_FLOAT \
vstm r0!, {s16 - s31};
# define _LOAD_VFP_S16_S31_IF_HARD_FLOAT \
vldm r0!, {s16 - s31};
#else /* !__TARGET_HOST_ARMv7_HARD_FLOAT */
# define _STORE_VFP_S16_S31_IF_HARD_FLOAT
# define _LOAD_VFP_S16_S31_IF_HARD_FLOAT
#endif /* !__TARGET_HOST_ARMv7_HARD_FLOAT */
/* /*
* setjmp * setjmp
@@ -107,28 +121,27 @@
* registers are callee-saved, and so need to be stored in context: * registers are callee-saved, and so need to be stored in context:
* - r4 - r11 * - r4 - r11
* - sp * - sp
* - s16-s31 * - s16 - s31
* *
* Also, we should store: * Also, we should store:
* - lr * - lr
* *
* stmia {r4-r11, sp, lr} -> jmp_buf_0 (r0)! * stmia {r4-r11, sp, lr} -> jmp_buf_0 (r0)!
* *
* FIXME: * If hard-float build
* vstm should not be performed in softfp mode * vstm {s16-s31} -> jmp_buf_32 (r0)!
* vstm {s16-s31} -> jmp_buf_32 (r0)!
* *
* mov r0, #0 * mov r0, #0
* *
* bx lr * bx lr
*/ */
#define _SETJMP \ #define _SETJMP \
stmia r0!, {r4 - r11, sp, lr}; \ stmia r0!, {r4 - r11, sp, lr}; \
\ \
vstm r0!, {s16 - s31}; \ _STORE_VFP_S16_S31_IF_HARD_FLOAT \
\ \
mov r0, #0; \ mov r0, #0; \
\ \
bx lr; bx lr;
/* /*
@@ -139,9 +152,8 @@
* *
* ldmia jmp_buf_0 (r0)! -> {r4-r11, sp, lr} * ldmia jmp_buf_0 (r0)! -> {r4-r11, sp, lr}
* *
* FIXME: * If hard-float build
* vstm should not be performed in softfp mode * vldm jmp_buf_32 (r0)! -> {s16-s31}
* vldm jmp_buf_32 (r0)! -> {s16-s31}
* *
* mov r1 -> r0 * mov r1 -> r0
* cmp r0, #0 * cmp r0, #0
@@ -152,16 +164,16 @@
* bx lr * bx lr
*/ */
#define _LONGJMP \ #define _LONGJMP \
ldmia r0!, {r4 - r11, sp, lr}; \ ldmia r0!, {r4 - r11, sp, lr}; \
\ \
vldm r0!, {s16 - s31}; \ _LOAD_VFP_S16_S31_IF_HARD_FLOAT \
\ \
mov r0, r1; \ mov r0, r1; \
cmp r0, #0; \ cmp r0, #0; \
bne 1f; \ bne 1f; \
mov r0, #1; \ mov r0, #1; \
1: \ 1: \
\ \
bx lr; bx lr;
#endif /* !ASM_ARM_H */ #endif /* !ASM_ARM_H */