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