1 if (NOT TARGET pico_float)
2    # library to be depended on - we make this depend on particular implementations using per target generator expressions
3    pico_add_library(pico_float)
4
5    # no custom implementation; falls thru to compiler
6    pico_add_library(pico_float_compiler)
7
8    target_include_directories(pico_float_headers SYSTEM INTERFACE ${CMAKE_CURRENT_LIST_DIR}/include)
9
10
11    # add alias "default" which is just pico.
12    add_library(pico_float_default INTERFACE)
13    target_link_libraries(pico_float_default INTERFACE pico_float_pico)
14
15    set(PICO_DEFAULT_FLOAT_IMPL pico_float_default)
16
17    target_link_libraries(pico_float INTERFACE
18            $<IF:$<BOOL:$<TARGET_PROPERTY:PICO_TARGET_FLOAT_IMPL>>,$<TARGET_PROPERTY:PICO_TARGET_FLOAT_IMPL>,${PICO_DEFAULT_FLOAT_IMPL}>)
19
20    function(wrap_float_functions TARGET)
21        cmake_parse_arguments(WRAP_FLOAT "NO_WRAP_AEABI;NO_WRAP_SCI" "" "" ${ARGN} )
22        if (NOT WRAP_FLOAT_NO_WRAP_AEABI)
23            pico_wrap_function(${TARGET} __aeabi_fadd)
24            pico_wrap_function(${TARGET} __aeabi_fdiv)
25            pico_wrap_function(${TARGET} __aeabi_fmul)
26            pico_wrap_function(${TARGET} __aeabi_frsub)
27            pico_wrap_function(${TARGET} __aeabi_fsub)
28            pico_wrap_function(${TARGET} __aeabi_cfcmpeq)
29            pico_wrap_function(${TARGET} __aeabi_cfrcmple)
30            pico_wrap_function(${TARGET} __aeabi_cfcmple)
31            pico_wrap_function(${TARGET} __aeabi_fcmpeq)
32            pico_wrap_function(${TARGET} __aeabi_fcmplt)
33            pico_wrap_function(${TARGET} __aeabi_fcmple)
34            pico_wrap_function(${TARGET} __aeabi_fcmpge)
35            pico_wrap_function(${TARGET} __aeabi_fcmpgt)
36            pico_wrap_function(${TARGET} __aeabi_fcmpun)
37            pico_wrap_function(${TARGET} __aeabi_i2f)
38            pico_wrap_function(${TARGET} __aeabi_l2f)
39            pico_wrap_function(${TARGET} __aeabi_ui2f)
40            pico_wrap_function(${TARGET} __aeabi_ul2f)
41            pico_wrap_function(${TARGET} __aeabi_f2iz)
42            pico_wrap_function(${TARGET} __aeabi_f2lz)
43            pico_wrap_function(${TARGET} __aeabi_f2uiz)
44            pico_wrap_function(${TARGET} __aeabi_f2ulz)
45            pico_wrap_function(${TARGET} __aeabi_f2d)
46            pico_wrap_function(${TARGET} sqrtf)
47        endif()
48        if (NOT WRAP_FLOAT_NO_WRAP_SCI)
49            pico_wrap_function(${TARGET} cosf)
50            pico_wrap_function(${TARGET} sinf)
51            pico_wrap_function(${TARGET} tanf)
52            pico_wrap_function(${TARGET} atan2f)
53            pico_wrap_function(${TARGET} expf)
54            pico_wrap_function(${TARGET} logf)
55
56            pico_wrap_function(${TARGET} ldexpf)
57            pico_wrap_function(${TARGET} copysignf)
58            pico_wrap_function(${TARGET} truncf)
59            pico_wrap_function(${TARGET} floorf)
60            pico_wrap_function(${TARGET} ceilf)
61            pico_wrap_function(${TARGET} roundf)
62            pico_wrap_function(${TARGET} sincosf) # gnu
63            pico_wrap_function(${TARGET} asinf)
64            pico_wrap_function(${TARGET} acosf)
65            pico_wrap_function(${TARGET} atanf)
66            pico_wrap_function(${TARGET} sinhf)
67            pico_wrap_function(${TARGET} coshf)
68            pico_wrap_function(${TARGET} tanhf)
69            pico_wrap_function(${TARGET} asinhf)
70            pico_wrap_function(${TARGET} acoshf)
71            pico_wrap_function(${TARGET} atanhf)
72            pico_wrap_function(${TARGET} exp2f)
73            pico_wrap_function(${TARGET} log2f)
74            pico_wrap_function(${TARGET} exp10f)
75            pico_wrap_function(${TARGET} log10f)
76            pico_wrap_function(${TARGET} powf)
77            pico_wrap_function(${TARGET} powintf) #gnu
78            pico_wrap_function(${TARGET} hypotf)
79            pico_wrap_function(${TARGET} cbrtf)
80            pico_wrap_function(${TARGET} fmodf)
81            pico_wrap_function(${TARGET} dremf)
82            pico_wrap_function(${TARGET} remainderf)
83            pico_wrap_function(${TARGET} remquof)
84            pico_wrap_function(${TARGET} expm1f)
85            pico_wrap_function(${TARGET} log1pf)
86            pico_wrap_function(${TARGET} fmaf)
87        endif()
88    endfunction()
89
90    pico_add_library(pico_float_none)
91    target_sources(pico_float_none INTERFACE
92            ${CMAKE_CURRENT_LIST_DIR}/float_none.S
93    )
94
95    target_link_libraries(pico_float_none INTERFACE pico_float_headers)
96    wrap_float_functions(pico_float_none)
97
98    pico_add_library(pico_float_pico)
99    if (PICO_RP2040)
100        target_sources(pico_float_pico INTERFACE
101                ${CMAKE_CURRENT_LIST_DIR}/float_aeabi_rp2040.S
102                ${CMAKE_CURRENT_LIST_DIR}/float_init_rom_rp2040.c
103                ${CMAKE_CURRENT_LIST_DIR}/float_math.c
104                ${CMAKE_CURRENT_LIST_DIR}/float_v1_rom_shim_rp2040.S
105        )
106        wrap_float_functions(pico_float_pico)
107        target_link_libraries(pico_float_pico INTERFACE pico_bootrom pico_float_headers hardware_divider)
108    elseif(NOT PICO_RISCV)
109        pico_add_library(pico_float_pico_dcp)
110        target_sources(pico_float_pico_dcp INTERFACE
111                ${CMAKE_CURRENT_LIST_DIR}/float_math.c
112                ${CMAKE_CURRENT_LIST_DIR}/float_aeabi_dcp.S
113                ${CMAKE_CURRENT_LIST_DIR}/float_sci_m33.S
114                ${CMAKE_CURRENT_LIST_DIR}/float_conv_m33.S
115                )
116
117        wrap_float_functions(pico_float_pico_dcp NO_WRAP_AEABI)
118        pico_add_library(pico_float_pico_vfp)
119        target_sources(pico_float_pico_vfp INTERFACE
120                ${CMAKE_CURRENT_LIST_DIR}/float_math.c
121                ${CMAKE_CURRENT_LIST_DIR}/float_sci_m33_vfp.S
122                ${CMAKE_CURRENT_LIST_DIR}/float_conv_m33.S
123        )
124        wrap_float_functions(pico_float_pico_vfp NO_WRAP_AEABI)
125        target_link_libraries(pico_float_pico INTERFACE
126                pico_float_pico_vfp)
127    else()
128        target_sources(pico_float_pico INTERFACE
129            ${CMAKE_CURRENT_LIST_DIR}/float_single_hazard3.S
130            )
131    endif()
132
133
134    macro(pico_set_float_implementation TARGET IMPL)
135        get_target_property(target_type ${TARGET} TYPE)
136        if ("EXECUTABLE" STREQUAL "${target_type}")
137            set_target_properties(${TARGET} PROPERTIES PICO_TARGET_FLOAT_IMPL "pico_float_${IMPL}")
138        else()
139            message(FATAL_ERROR "float implementation must be set on executable not library")
140        endif()
141    endmacro()
142endif()
143