blob: eac08eb8778b3f66c15b893465e71de30abf7618 [file] [log] [blame]
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.
)