1if (NOT TARGET pico_divider)
2    # library to be depended on - we make this depend on particular implementations using per target generator expressions
3    pico_add_impl_library(pico_divider)
4
5    # no custom implementation; falls thru to compiler
6    pico_add_library(pico_divider_compiler)
7    target_sources(pico_divider_compiler INTERFACE
8            ${CMAKE_CURRENT_LIST_DIR}/divider_compiler.c
9            )
10    target_link_libraries(pico_divider_compiler_headers INTERFACE pico_divider_headers)
11
12    # add alias "default" which is hardware for RP2040 and compiler for RP2350
13    add_library(pico_divider_default INTERFACE)
14    if (PICO_RP2040)
15        target_link_libraries(pico_divider_default INTERFACE pico_divider_hardware)
16    else()
17        target_link_libraries(pico_divider_default INTERFACE pico_divider_compiler)
18    endif()
19
20    set(PICO_DEFAULT_DIVIDER_IMPL pico_divider_default)
21
22    target_link_libraries(pico_divider INTERFACE
23            $<IF:$<BOOL:$<TARGET_PROPERTY:PICO_TARGET_DIVIDER_IMPL>>,$<TARGET_PROPERTY:PICO_TARGET_DIVIDER_IMPL>,${PICO_DEFAULT_DIVIDER_IMPL}>)
24
25    pico_add_library(pico_divider_hardware_explicit NOFLAG)
26    target_sources(pico_divider_hardware_explicit INTERFACE
27            ${CMAKE_CURRENT_LIST_DIR}/divider_hardware.S
28            )
29
30    target_link_libraries(pico_divider_hardware_explicit_headers INTERFACE
31            pico_divider_headers
32            hardware_divider_headers
33            hardware_regs
34            )
35
36    pico_add_library(pico_divider_hardware)
37
38    target_link_libraries(pico_divider_hardware INTERFACE pico_divider_hardware_explicit)
39
40    pico_wrap_function(pico_divider_hardware __aeabi_idiv)
41    pico_wrap_function(pico_divider_hardware __aeabi_idivmod)
42    pico_wrap_function(pico_divider_hardware __aeabi_ldivmod)
43    pico_wrap_function(pico_divider_hardware __aeabi_uidiv)
44    pico_wrap_function(pico_divider_hardware __aeabi_uidivmod)
45    pico_wrap_function(pico_divider_hardware __aeabi_uldivmod)
46
47    macro(pico_set_divider_implementation TARGET IMPL)
48        get_target_property(target_type ${TARGET} TYPE)
49        if ("EXECUTABLE" STREQUAL "${target_type}")
50            set_target_properties(${TARGET} PROPERTIES PICO_TARGET_DIVIDER_IMPL "pico_divider_${IMPL}")
51        else()
52            message(FATAL_ERROR "divider implementation must be set on executable not library")
53        endif()
54    endmacro()
55endif()
56