implement ARMv7 different architecture profiles, for M profile Cortex-M4 - ARMv7E-M. TODO: Fix profile conflicts with cutil and test targets

This commit is contained in:
mykola2312 2022-05-21 02:58:08 +03:00
parent e13b19ae51
commit 1da681acea
5 changed files with 71 additions and 5 deletions

View file

@ -24,7 +24,17 @@ set(SOURCES
heap.c
)
set(ARCHITECTURE "AArch64" CACHE STRING "cutil target architecture")
set(ARCHITECTURE "ARMv7" CACHE STRING "cutil target architecture")
set(ARM_PROFILE "m" CACHE STRING "cutil ARM architecture profile")
if ("${ARCHITECTURE}" STREQUAL "ARMv7")
if ("${ARM_PROFILE}" STREQUAL "m")
add_compile_options("-mcpu=cortex-m4")
add_compile_options("-mthumb")
else()
add_compile_options("-march=armv7-${ARM_PROFILE}")
endif()
endif()
add_library(cutil STATIC ${SOURCES} ${HEADERS}
"arch/${ARCHITECTURE}.S"
@ -33,7 +43,7 @@ add_library(cutil STATIC ${SOURCES} ${HEADERS}
option(NOSTDLIB "compile cutil without stdlib" ON)
if (NOSTDLIB)
target_compile_definitions(cutil PRIVATE CUTIL_NOSTDLIB)
target_compile_options(cutil PRIVATE -nostdlib)
target_compile_options(cutil PRIVATE "-nostdlib")
endif()
add_executable(test test.c)

46
arch/ARMv7.S Normal file
View file

@ -0,0 +1,46 @@
.globl hw_bswap16
.globl hw_bswap32
.globl hw_bswap64
.globl _cu_memcpy
.globl _cu_memmove
.globl _cu_memcmp
.globl _cu_memset
.globl cu_memzero
.globl cu_memtest
.globl cu_va_start
.globl cu_va_arg
.text
hw_bswap16:
bx lr
hw_bswap32:
bx lr
hw_bswap64:
bx lr
_cu_memcpy:
bx lr
_cu_memmove:
bx lr
_cu_memcmp:
bx lr
_cu_memset:
bx lr
cu_memzero:
bx lr
cu_memtest:
bx lr
cu_va_start:
bx lr
cu_va_arg:
bx lr

View file

@ -86,6 +86,14 @@
# warning "unknown architecture"
#endif
#ifdef CU_ARCH_ARM
# if (CU_ARCH >= ARM6T2 && CU_ARCH <= ARM6)
# define CU_ARCH_ARM6
# elif (CU_ARCH >= ARM7 <= CU_ARCH <= ARM7S)
# define CU_ARCH_ARM7
# endif
#endif
#if (CU_ARCH == x86_64 || CU_ARCH == AARCH64 || CU_ARCH == POWERPC64)
# define CU_64BIT
#else

View file

@ -373,7 +373,7 @@ void cu_sscanf(char* buf, char* fmt, ...)
case 'u':
case 'd':
len = _cu_strchr_delim(buf,10);
u.iptr = (i64*)(cu_va_arg(&ap,idx++));
u.iptr = (iword*)(cu_va_arg(&ap,idx++));
*u.iptr = _cu_atoi(buf,10,len);
buf += len; //we decrement because it will +1
break;
@ -381,7 +381,7 @@ void cu_sscanf(char* buf, char* fmt, ...)
case 'x':
buf += 2; //Skip 0x part
len = _cu_strchr_delim(buf,16);
u.iptr = (i64*)(cu_va_arg(&ap,idx++));
u.iptr = (iword*)(cu_va_arg(&ap,idx++));
*u.iptr = _cu_atoi(buf,16,len);
buf += len; //we decrement because it will +1
break;

View file

@ -7,7 +7,9 @@
# define VA_NUM 6
#elif (CU_ARCH == AARCH64)
# define VA_NUM 8
#elif
#elif (defined(CU_ARCH_ARM7))
# define VA_NUM 4
#else
# define VA_NUM 0
#endif