1load("//bazel:defs.bzl", "compatible_with_rp2", "incompatible_with_config")
2
3package(default_visibility = ["//visibility:public"])
4
5_WRAP_DOUBLE_FLAGS = [
6    "-Wl,--wrap=__aeabi_dadd",
7    "-Wl,--wrap=__aeabi_ddiv",
8    "-Wl,--wrap=__aeabi_dmul",
9    "-Wl,--wrap=__aeabi_drsub",
10    "-Wl,--wrap=__aeabi_dsub",
11    "-Wl,--wrap=__aeabi_cdcmpeq",
12    "-Wl,--wrap=__aeabi_cdrcmple",
13    "-Wl,--wrap=__aeabi_cdcmple",
14    "-Wl,--wrap=__aeabi_dcmpeq",
15    "-Wl,--wrap=__aeabi_dcmplt",
16    "-Wl,--wrap=__aeabi_dcmple",
17    "-Wl,--wrap=__aeabi_dcmpge",
18    "-Wl,--wrap=__aeabi_dcmpgt",
19    "-Wl,--wrap=__aeabi_dcmpun",
20    "-Wl,--wrap=__aeabi_i2d",
21    "-Wl,--wrap=__aeabi_l2d",
22    "-Wl,--wrap=__aeabi_ui2d",
23    "-Wl,--wrap=__aeabi_ul2d",
24    "-Wl,--wrap=__aeabi_d2iz",
25    "-Wl,--wrap=__aeabi_d2lz",
26    "-Wl,--wrap=__aeabi_d2uiz",
27    "-Wl,--wrap=__aeabi_d2ulz",
28    "-Wl,--wrap=__aeabi_d2f",
29    "-Wl,--wrap=sqrt",
30    "-Wl,--wrap=cos",
31    "-Wl,--wrap=sin",
32    "-Wl,--wrap=tan",
33    "-Wl,--wrap=atan2",
34    "-Wl,--wrap=exp",
35    "-Wl,--wrap=log",
36    "-Wl,--wrap=ldexp",
37    "-Wl,--wrap=copysign",
38    "-Wl,--wrap=trunc",
39    "-Wl,--wrap=floor",
40    "-Wl,--wrap=ceil",
41    "-Wl,--wrap=round",
42    "-Wl,--wrap=sincos",
43    "-Wl,--wrap=asin",
44    "-Wl,--wrap=acos",
45    "-Wl,--wrap=atan",
46    "-Wl,--wrap=sinh",
47    "-Wl,--wrap=cosh",
48    "-Wl,--wrap=tanh",
49    "-Wl,--wrap=asinh",
50    "-Wl,--wrap=acosh",
51    "-Wl,--wrap=atanh",
52    "-Wl,--wrap=exp2",
53    "-Wl,--wrap=log2",
54    "-Wl,--wrap=exp10",
55    "-Wl,--wrap=log10",
56    "-Wl,--wrap=pow",
57    "-Wl,--wrap=powint",
58    "-Wl,--wrap=hypot",
59    "-Wl,--wrap=cbrt",
60    "-Wl,--wrap=fmod",
61    "-Wl,--wrap=drem",
62    "-Wl,--wrap=remainder",
63    "-Wl,--wrap=remquo",
64    "-Wl,--wrap=expm1",
65    "-Wl,--wrap=log1p",
66    "-Wl,--wrap=fma",
67]
68
69alias(
70    name = "pico_double",
71    actual = select({
72        "//bazel/constraint:pico_double_auto_enabled": ":pico_double_auto",
73        "//bazel/constraint:pico_double_compiler_enabled": ":pico_double_auto",
74        "//bazel/constraint:pico_double_dcp_enabled": ":pico_double_pico",
75        "//bazel/constraint:pico_double_rp2040_enabled": ":pico_double_pico",
76        "//conditions:default": ":pico_double_none",
77    }),
78)
79
80alias(
81    name = "pico_double_auto",
82    actual = select({
83        "@platforms//cpu:riscv32": ":pico_double_compiler",
84        "//bazel/constraint:rp2040": ":pico_double_pico",
85        "//conditions:default": ":pico_double_dcp",
86    }),
87)
88
89# An empty stub that just lets the compiler handle the implementation.
90cc_library(
91    name = "pico_double_compiler",
92    hdrs = ["include/pico/double.h"],
93    defines = ["PICO_DOUBLE_COMPILER=1"],
94    includes = ["include"],
95    target_compatible_with = compatible_with_rp2(),
96)
97
98cc_library(
99    name = "pico_double_pico",
100    srcs = [
101        "double_aeabi_rp2040.S",
102        "double_init_rom_rp2040.c",
103        "double_math.c",
104        "double_v1_rom_shim_rp2040.S",
105    ],
106    hdrs = ["include/pico/double.h"],
107    defines = ["LIB_PICO_DOUBLE_PICO=1"],
108    includes = ["include"],
109    linkopts = _WRAP_DOUBLE_FLAGS,
110    target_compatible_with = compatible_with_rp2() + incompatible_with_config("@platforms//cpu:riscv32") + ["//bazel/constraint:rp2040"],
111    visibility = ["//visibility:private"],
112    deps = [
113        "//src/rp2_common:pico_platform",
114        "//src/rp2_common/hardware_divider",
115        "//src/rp2_common/pico_bootrom",
116    ],
117    alwayslink = True,  # Ensures the wrapped symbols are linked in.
118)
119
120cc_library(
121    name = "pico_double_dcp",
122    srcs = [
123        "double_aeabi_dcp.S",
124        "double_conv_m33.S",
125        "double_fma_dcp.S",
126        "double_math.c",
127        "double_sci_m33.S",
128    ],
129    hdrs = ["include/pico/double.h"],
130    defines = ["LIB_PICO_DOUBLE_PICO=1"],
131    includes = ["include"],
132    linkopts = _WRAP_DOUBLE_FLAGS,
133    target_compatible_with = compatible_with_rp2() + incompatible_with_config("@platforms//cpu:riscv32") + incompatible_with_config("//bazel/constraint:rp2040"),
134    visibility = ["//visibility:private"],
135    deps = [
136        "//src/rp2_common:pico_platform",
137        "//src/rp2_common/hardware_dcp",
138        "//src/rp2_common/hardware_divider",
139        "//src/rp2_common/pico_bootrom",
140    ],
141    alwayslink = True,  # Ensures the wrapped symbols are linked in.
142)
143
144cc_library(
145    name = "pico_double_none",
146    srcs = ["double_none.S"],
147    hdrs = ["include/pico/double.h"],
148    defines = [
149        "LIB_PICO_DOUBLE_PICO=0",
150        "PICO_PRINTF_SUPPORT_FLOAT=0",
151    ],
152    includes = ["include"],
153    linkopts = _WRAP_DOUBLE_FLAGS,
154    target_compatible_with = compatible_with_rp2(),
155    visibility = ["//visibility:private"],
156    deps = [
157        "//src/rp2_common:pico_platform",
158        "//src/rp2_common/hardware_divider",
159        "//src/rp2_common/pico_bootrom",
160    ],
161    alwayslink = True,  # Ensures the wrapped symbols are linked in.
162)
163