| load("//bazel:defs.bzl", "compatible_with_rp2", "incompatible_with_config") |
| |
| package(default_visibility = ["//visibility:public"]) |
| |
| _WRAP_FLOAT_AEABI_FLAGS = [ |
| "-Wl,--wrap=__aeabi_fadd", |
| "-Wl,--wrap=__aeabi_fdiv", |
| "-Wl,--wrap=__aeabi_fmul", |
| "-Wl,--wrap=__aeabi_frsub", |
| "-Wl,--wrap=__aeabi_fsub", |
| "-Wl,--wrap=__aeabi_cfcmpeq", |
| "-Wl,--wrap=__aeabi_cfrcmple", |
| "-Wl,--wrap=__aeabi_cfcmple", |
| "-Wl,--wrap=__aeabi_fcmpeq", |
| "-Wl,--wrap=__aeabi_fcmplt", |
| "-Wl,--wrap=__aeabi_fcmple", |
| "-Wl,--wrap=__aeabi_fcmpge", |
| "-Wl,--wrap=__aeabi_fcmpgt", |
| "-Wl,--wrap=__aeabi_fcmpun", |
| "-Wl,--wrap=__aeabi_i2f", |
| "-Wl,--wrap=__aeabi_l2f", |
| "-Wl,--wrap=__aeabi_ui2f", |
| "-Wl,--wrap=__aeabi_ul2f", |
| "-Wl,--wrap=__aeabi_f2iz", |
| "-Wl,--wrap=__aeabi_f2lz", |
| "-Wl,--wrap=__aeabi_f2uiz", |
| "-Wl,--wrap=__aeabi_f2ulz", |
| "-Wl,--wrap=__aeabi_f2d", |
| "-Wl,--wrap=sqrtf", |
| ] |
| |
| _WRAP_FLOAT_SCI_FLAGS = [ |
| "-Wl,--wrap=cosf", |
| "-Wl,--wrap=sinf", |
| "-Wl,--wrap=tanf", |
| "-Wl,--wrap=atan2f", |
| "-Wl,--wrap=expf", |
| "-Wl,--wrap=logf", |
| "-Wl,--wrap=ldexpf", |
| "-Wl,--wrap=copysignf", |
| "-Wl,--wrap=truncf", |
| "-Wl,--wrap=floorf", |
| "-Wl,--wrap=ceilf", |
| "-Wl,--wrap=roundf", |
| "-Wl,--wrap=sincosf", # gnu |
| "-Wl,--wrap=asinf", |
| "-Wl,--wrap=acosf", |
| "-Wl,--wrap=atanf", |
| "-Wl,--wrap=sinhf", |
| "-Wl,--wrap=coshf", |
| "-Wl,--wrap=tanhf", |
| "-Wl,--wrap=asinhf", |
| "-Wl,--wrap=acoshf", |
| "-Wl,--wrap=atanhf", |
| "-Wl,--wrap=exp2f", |
| "-Wl,--wrap=log2f", |
| "-Wl,--wrap=exp10f", |
| "-Wl,--wrap=log10f", |
| "-Wl,--wrap=powf", |
| "-Wl,--wrap=powintf", # gnu |
| "-Wl,--wrap=hypotf", |
| "-Wl,--wrap=cbrtf", |
| "-Wl,--wrap=fmodf", |
| "-Wl,--wrap=dremf", |
| "-Wl,--wrap=remainderf", |
| "-Wl,--wrap=remquof", |
| "-Wl,--wrap=expm1f", |
| "-Wl,--wrap=log1pf", |
| "-Wl,--wrap=fmaf", |
| ] |
| |
| alias( |
| name = "pico_float", |
| actual = select({ |
| "//bazel/constraint:pico_float_auto_enabled": ":pico_float_platform_default", |
| "//bazel/constraint:pico_float_compiler_enabled": ":pico_float_compiler", |
| "//bazel/constraint:pico_float_dcp_enabled": ":pico_float_dcp", |
| "//bazel/constraint:pico_float_rp2040_enabled": ":pico_float_pico", |
| "//bazel/constraint:pico_float_vfp_enabled": ":pico_float_vfp", |
| "//conditions:default": ":pico_float_none", |
| }), |
| ) |
| |
| alias( |
| name = "pico_float_platform_default", |
| actual = select({ |
| "//bazel/constraint:rp2040": ":pico_float_pico", |
| "@platforms//cpu:armv8-m": ":pico_float_vfp", |
| "//conditions:default": ":pico_float_compiler", |
| }), |
| visibility = ["//visibility:private"], |
| ) |
| |
| # An empty stub that just lets the compiler use M33 FPU instructions. |
| cc_library( |
| name = "pico_float_compiler", |
| hdrs = ["include/pico/float.h"], |
| includes = ["include"], |
| target_compatible_with = compatible_with_rp2(), |
| ) |
| |
| # This highlights the differences between the various float implementations. |
| # Most of the cc_library attributes are shared, so this prevents significant |
| # duplication. |
| _PICO_FLOAT_IMPLS = [ |
| { |
| "name": "pico", # RP2040-specific float implementation. |
| "srcs": [ |
| "float_aeabi_rp2040.S", |
| "float_init_rom_rp2040.c", |
| "float_math.c", |
| "float_v1_rom_shim_rp2040.S", |
| ], |
| "compatibility": incompatible_with_config("@platforms//cpu:riscv32") + ["//bazel/constraint:rp2040"], |
| "extra_deps": [], |
| "linkopts": _WRAP_FLOAT_AEABI_FLAGS + _WRAP_FLOAT_SCI_FLAGS, |
| }, |
| { |
| "name": "dcp", |
| "srcs": [ |
| "float_aeabi_dcp.S", |
| "float_conv_m33.S", |
| "float_math.c", |
| "float_sci_m33.S", |
| ], |
| "compatibility": compatible_with_rp2() + incompatible_with_config("@platforms//cpu:riscv32") + incompatible_with_config("//bazel/constraint:rp2040"), |
| "extra_deps": ["//src/rp2_common/hardware_dcp"], |
| "linkopts": _WRAP_FLOAT_SCI_FLAGS, |
| }, |
| { |
| "name": "vfp", |
| "srcs": [ |
| "float_sci_m33_vfp.S", |
| "float_conv_m33.S", |
| "float_math.c", |
| ], |
| "compatibility": compatible_with_rp2() + incompatible_with_config("@platforms//cpu:riscv32") + incompatible_with_config("//bazel/constraint:rp2040"), |
| "extra_deps": ["//src/rp2_common/hardware_dcp"], |
| "linkopts": _WRAP_FLOAT_SCI_FLAGS, |
| }, |
| ] |
| |
| # Creates: |
| # * pico_float_pico |
| # * pico_float_dcp |
| # * pico_float_vfp |
| [ |
| cc_library( |
| name = "pico_float_{}".format(impl["name"]), |
| srcs = impl["srcs"], |
| hdrs = ["include/pico/float.h"], |
| defines = [ |
| "LIB_PICO_FLOAT_PICO=1", |
| "LIB_PICO_FLOAT_PICO_{}=1".format(impl["name"].upper()), |
| ], |
| includes = ["include"], |
| linkopts = impl["linkopts"], |
| target_compatible_with = impl["compatibility"], |
| visibility = ["//visibility:private"], |
| deps = [ |
| "//src/rp2_common:pico_platform", |
| "//src/rp2_common/hardware_divider", |
| "//src/rp2_common/pico_bootrom", |
| ] + impl["extra_deps"], |
| alwayslink = True, # Ensures the wrapped symbols are linked in. |
| ) |
| for impl in _PICO_FLOAT_IMPLS |
| ] |
| |
| cc_library( |
| name = "pico_float_none", |
| srcs = ["float_none.S"], |
| hdrs = ["include/pico/float.h"], |
| defines = ["LIB_PICO_FLOAT_PICO=0"], |
| includes = ["include"], |
| linkopts = _WRAP_FLOAT_AEABI_FLAGS + _WRAP_FLOAT_SCI_FLAGS, |
| target_compatible_with = compatible_with_rp2(), |
| visibility = ["//visibility:private"], |
| deps = [ |
| "//src/rp2_common:pico_platform", |
| "//src/rp2_common/pico_bootrom", |
| ], |
| alwayslink = True, # Ensures the wrapped symbols are linked in. |
| ) |