blob: a66a441f628d15372b087c42ce89791d54465fd8 [file] [log] [blame]
if (NOT TARGET pico_bit_ops)
#shims for ROM functions for -lgcc functions (listed below)
pico_add_impl_library(pico_bit_ops)
# no custom implementation; falls thru to compiler
pico_add_library(pico_bit_ops_compiler)
# add alias "default" which is just pico.
add_library(pico_bit_ops_default INTERFACE)
target_link_libraries(pico_bit_ops_default INTERFACE pico_bit_ops_pico)
set(PICO_DEFAULT_BIT_OPS_IMPL pico_bit_ops_default)
pico_add_library(pico_bit_ops_pico)
target_link_libraries(pico_bit_ops INTERFACE
$<IF:$<BOOL:$<TARGET_PROPERTY:PICO_TARGET_BIT_OPS_IMPL>>,$<TARGET_PROPERTY:PICO_TARGET_BIT_OPS_IMPL>,${PICO_DEFAULT_BIT_OPS_IMPL}>)
target_sources(pico_bit_ops_pico INTERFACE
${CMAKE_CURRENT_LIST_DIR}/bit_ops_aeabi.S
)
target_link_libraries(pico_bit_ops_pico INTERFACE pico_bootrom pico_bit_ops_headers)
if (NOT PICO_RP2350)
# gcc
pico_wrap_function(pico_bit_ops_pico __clzsi2)
pico_wrap_function(pico_bit_ops_pico __clzsi2)
pico_wrap_function(pico_bit_ops_pico __clzdi2)
pico_wrap_function(pico_bit_ops_pico __ctzsi2)
pico_wrap_function(pico_bit_ops_pico __popcountsi2)
pico_wrap_function(pico_bit_ops_pico __popcountdi2)
# armclang
pico_wrap_function(pico_bit_ops_pico __clz)
pico_wrap_function(pico_bit_ops_pico __clzl)
pico_wrap_function(pico_bit_ops_pico __clzsi2)
pico_wrap_function(pico_bit_ops_pico __clzll)
endif()
# this is overridden for RP2350 since GCCs impl is bad for both ARM and RISC-V
pico_wrap_function(pico_bit_ops_pico __ctzdi2)
macro(pico_set_bit_ops_implementation TARGET IMPL)
get_target_property(target_type ${TARGET} TYPE)
if ("EXECUTABLE" STREQUAL "${target_type}")
set_target_properties(${TARGET} PROPERTIES PICO_TARGET_BIT_OPS_IMPL "pico_bit_ops_${IMPL}")
else()
message(FATAL_ERROR "bit_ops implementation must be set on executable not library")
endif()
endmacro()
endif()