xref: /aosp_15_r20/external/arm-optimized-routines/pl/math/Dir.mk (revision 412f47f9e737e10ed5cc46ec6a8d7fa2264f8a14)
1*412f47f9SXin Li# Makefile fragment - requires GNU make
2*412f47f9SXin Li#
3*412f47f9SXin Li# Copyright (c) 2019-2024, Arm Limited.
4*412f47f9SXin Li# SPDX-License-Identifier: MIT OR Apache-2.0 WITH LLVM-exception
5*412f47f9SXin Li
6*412f47f9SXin LiPLM := $(srcdir)/pl/math
7*412f47f9SXin LiAOR := $(srcdir)/math
8*412f47f9SXin LiB := build/pl/math
9*412f47f9SXin Li
10*412f47f9SXin Lipl-lib-srcs := $(wildcard $(PLM)/*.[cS])
11*412f47f9SXin Li
12*412f47f9SXin Liifeq ($(WANT_SVE_MATH), 0)
13*412f47f9SXin Lipl-lib-srcs := $(filter-out $(PLM)/sv_%, $(pl-lib-srcs))
14*412f47f9SXin Liendif
15*412f47f9SXin Li
16*412f47f9SXin Limath-test-srcs := \
17*412f47f9SXin Li	$(AOR)/test/mathtest.c \
18*412f47f9SXin Li	$(AOR)/test/mathbench.c \
19*412f47f9SXin Li	$(AOR)/test/ulp.c \
20*412f47f9SXin Li
21*412f47f9SXin Limath-test-host-srcs := $(wildcard $(AOR)/test/rtest/*.[cS])
22*412f47f9SXin Li
23*412f47f9SXin Lipl-includes := $(patsubst $(PLM)/%,build/pl/%,$(wildcard $(PLM)/include/*.h))
24*412f47f9SXin Lipl-test-includes := $(patsubst $(PLM)/%,build/pl/include/%,$(wildcard $(PLM)/test/*.h))
25*412f47f9SXin Li
26*412f47f9SXin Lipl-libs := \
27*412f47f9SXin Li	build/pl/lib/libmathlib.so \
28*412f47f9SXin Li	build/pl/lib/libmathlib.a \
29*412f47f9SXin Li
30*412f47f9SXin Limath-tools := \
31*412f47f9SXin Li	build/pl/bin/mathtest \
32*412f47f9SXin Li	build/pl/bin/mathbench \
33*412f47f9SXin Li	build/pl/bin/mathbench_libc \
34*412f47f9SXin Li	build/pl/bin/runulp.sh \
35*412f47f9SXin Li	build/pl/bin/ulp \
36*412f47f9SXin Li
37*412f47f9SXin Limath-host-tools := \
38*412f47f9SXin Li	build/pl/bin/rtest \
39*412f47f9SXin Li
40*412f47f9SXin Lipl-lib-objs := $(patsubst $(PLM)/%,$(B)/%.o,$(basename $(pl-lib-srcs)))
41*412f47f9SXin Limath-test-objs := $(patsubst $(AOR)/%,$(B)/%.o,$(basename $(math-test-srcs)))
42*412f47f9SXin Limath-host-objs := $(patsubst $(AOR)/%,$(B)/%.o,$(basename $(math-test-host-srcs)))
43*412f47f9SXin Lipl-target-objs := $(pl-lib-objs) $(math-test-objs)
44*412f47f9SXin Lipl-objs := $(pl-target-objs) $(pl-target-objs:%.o=%.os) $(math-host-objs)
45*412f47f9SXin Li
46*412f47f9SXin Lipl/math-files := \
47*412f47f9SXin Li	$(pl-objs) \
48*412f47f9SXin Li	$(pl-libs) \
49*412f47f9SXin Li	$(math-tools) \
50*412f47f9SXin Li	$(math-host-tools) \
51*412f47f9SXin Li	$(pl-includes) \
52*412f47f9SXin Li	$(pl-test-includes) \
53*412f47f9SXin Li
54*412f47f9SXin Liall-pl/math: $(pl-libs) $(math-tools) $(pl-includes) $(pl-test-includes)
55*412f47f9SXin Li
56*412f47f9SXin Li$(pl-objs): $(pl-includes) $(pl-test-includes)
57*412f47f9SXin Li$(pl-objs): CFLAGS_PL += $(math-cflags)
58*412f47f9SXin Li$(B)/test/mathtest.o: CFLAGS_PL += -fmath-errno
59*412f47f9SXin Li$(math-host-objs): CC = $(HOST_CC)
60*412f47f9SXin Li$(math-host-objs): CFLAGS_PL = $(HOST_CFLAGS)
61*412f47f9SXin Li
62*412f47f9SXin Li$(B)/sv_%: CFLAGS_PL += $(math-sve-cflags)
63*412f47f9SXin Li
64*412f47f9SXin Liulp-funcs-dir = build/pl/test/ulp-funcs/
65*412f47f9SXin Liulp-wrappers-dir = build/pl/test/ulp-wrappers/
66*412f47f9SXin Limathbench-funcs-dir = build/pl/test/mathbench-funcs/
67*412f47f9SXin Liplsig-dirs = $(ulp-funcs-dir) $(ulp-wrappers-dir) $(mathbench-funcs-dir)
68*412f47f9SXin Li
69*412f47f9SXin Li$(plsig-dirs):
70*412f47f9SXin Li	mkdir -p $@
71*412f47f9SXin Li
72*412f47f9SXin Liulp-funcs = $(patsubst $(PLM)/%,$(ulp-funcs-dir)%,$(basename $(pl-lib-srcs)))
73*412f47f9SXin Liulp-wrappers = $(patsubst $(PLM)/%,$(ulp-wrappers-dir)%,$(basename $(pl-lib-srcs)))
74*412f47f9SXin Limathbench-funcs = $(patsubst $(PLM)/%,$(mathbench-funcs-dir)%,$(basename $(pl-lib-srcs)))
75*412f47f9SXin Liplsig-autogen-files = $(ulp-funcs) $(ulp-wrappers) $(mathbench-funcs)
76*412f47f9SXin Li
77*412f47f9SXin Li$(ulp-funcs): PLSIG_DIRECTIVE = EMIT_ULP_FUNCS
78*412f47f9SXin Li$(ulp-wrappers): PLSIG_DIRECTIVE = EMIT_ULP_WRAPPERS
79*412f47f9SXin Li$(mathbench-funcs): PLSIG_DIRECTIVE = EMIT_MATHBENCH_FUNCS
80*412f47f9SXin Li
81*412f47f9SXin Li.SECONDEXPANSION:
82*412f47f9SXin Li$(plsig-autogen-files): %: $(PLM)/$$(notdir $$@).c | $$(dir $$@)
83*412f47f9SXin Li	$(CC) $< $(CFLAGS_PL) -D$(PLSIG_DIRECTIVE) -E -o - | { grep PL_SIG || true; } | cut -f 2- -d ' ' > $@
84*412f47f9SXin Li
85*412f47f9SXin Libuild/pl/include/test/ulp_funcs_gen.h: $(ulp-funcs)
86*412f47f9SXin Li	cat $^ | sort -u > $@
87*412f47f9SXin Li
88*412f47f9SXin Libuild/pl/include/test/ulp_wrappers_gen.h: $(ulp-wrappers)
89*412f47f9SXin Li	cat $^ > $@
90*412f47f9SXin Li
91*412f47f9SXin Libuild/pl/include/test/mathbench_funcs_gen.h: $(mathbench-funcs)
92*412f47f9SXin Li	cat $^ | sort -u > $@
93*412f47f9SXin Li
94*412f47f9SXin Li$(B)/test/ulp.o: $(AOR)/test/ulp.h build/pl/include/test/ulp_funcs_gen.h build/pl/include/test/ulp_wrappers_gen.h
95*412f47f9SXin Li$(B)/test/ulp.o: CFLAGS_PL += -I build/pl/include/test
96*412f47f9SXin Li
97*412f47f9SXin Li$(B)/test/mathbench.o: build/pl/include/test/mathbench_funcs_gen.h
98*412f47f9SXin Li$(B)/test/mathbench.o: CFLAGS_PL += -I build/pl/include/test
99*412f47f9SXin Li
100*412f47f9SXin Libuild/pl/lib/libmathlib.so: $(pl-lib-objs:%.o=%.os)
101*412f47f9SXin Li	$(CC) $(CFLAGS_PL) $(LDFLAGS) -shared -o $@ $^
102*412f47f9SXin Li
103*412f47f9SXin Libuild/pl/lib/libmathlib.a: $(pl-lib-objs)
104*412f47f9SXin Li	rm -f $@
105*412f47f9SXin Li	$(AR) rc $@ $^
106*412f47f9SXin Li	$(RANLIB) $@
107*412f47f9SXin Li
108*412f47f9SXin Li$(math-host-tools): HOST_LDLIBS += -lm -lmpfr -lmpc
109*412f47f9SXin Li$(math-tools): LDLIBS += $(math-ldlibs) -lm
110*412f47f9SXin Li# math-sve-cflags should be empty if WANT_SVE_MATH is not enabled
111*412f47f9SXin Li$(math-tools): CFLAGS_PL += $(math-sve-cflags)
112*412f47f9SXin Li
113*412f47f9SXin Li# Some targets to build pl/math/test from math/test sources
114*412f47f9SXin Libuild/pl/math/test/%.o: $(srcdir)/math/test/%.S
115*412f47f9SXin Li	$(CC) $(CFLAGS_PL) -c -o $@ $<
116*412f47f9SXin Li
117*412f47f9SXin Libuild/pl/math/test/%.o: $(srcdir)/math/test/%.c
118*412f47f9SXin Li	$(CC) $(CFLAGS_PL) -c -o $@ $<
119*412f47f9SXin Li
120*412f47f9SXin Libuild/pl/math/test/%.os: $(srcdir)/math/test/%.S
121*412f47f9SXin Li	$(CC) $(CFLAGS_PL) -c -o $@ $<
122*412f47f9SXin Li
123*412f47f9SXin Libuild/pl/math/test/%.os: $(srcdir)/math/test/%.c
124*412f47f9SXin Li	$(CC) $(CFLAGS_PL) -c -o $@ $<
125*412f47f9SXin Li
126*412f47f9SXin Li# Some targets to build pl/ sources using appropriate flags
127*412f47f9SXin Libuild/pl/%.o: $(srcdir)/pl/%.S
128*412f47f9SXin Li	$(CC) $(CFLAGS_PL) -c -o $@ $<
129*412f47f9SXin Li
130*412f47f9SXin Libuild/pl/%.o: $(srcdir)/pl/%.c
131*412f47f9SXin Li	$(CC) $(CFLAGS_PL) -c -o $@ $<
132*412f47f9SXin Li
133*412f47f9SXin Libuild/pl/%.os: $(srcdir)/pl/%.S
134*412f47f9SXin Li	$(CC) $(CFLAGS_PL) -c -o $@ $<
135*412f47f9SXin Li
136*412f47f9SXin Libuild/pl/%.os: $(srcdir)/pl/%.c
137*412f47f9SXin Li	$(CC) $(CFLAGS_PL) -c -o $@ $<
138*412f47f9SXin Li
139*412f47f9SXin Libuild/pl/bin/rtest: $(math-host-objs)
140*412f47f9SXin Li	$(HOST_CC) $(HOST_CFLAGS) $(HOST_LDFLAGS) -o $@ $^ $(HOST_LDLIBS)
141*412f47f9SXin Li
142*412f47f9SXin Libuild/pl/bin/mathtest: $(B)/test/mathtest.o build/pl/lib/libmathlib.a
143*412f47f9SXin Li	$(CC) $(CFLAGS_PL) $(LDFLAGS) -static -o $@ $^ $(LDLIBS)
144*412f47f9SXin Li
145*412f47f9SXin Libuild/pl/bin/mathbench: $(B)/test/mathbench.o build/pl/lib/libmathlib.a
146*412f47f9SXin Li	$(CC) $(CFLAGS_PL) $(LDFLAGS) -static -o $@ $^ $(LDLIBS)
147*412f47f9SXin Li
148*412f47f9SXin Li# This is not ideal, but allows custom symbols in mathbench to get resolved.
149*412f47f9SXin Libuild/pl/bin/mathbench_libc: $(B)/test/mathbench.o build/pl/lib/libmathlib.a
150*412f47f9SXin Li	$(CC) $(CFLAGS_PL) $(LDFLAGS) -static -o $@ $< $(LDLIBS) -lc build/pl/lib/libmathlib.a -lm
151*412f47f9SXin Li
152*412f47f9SXin Libuild/pl/bin/ulp: $(B)/test/ulp.o build/pl/lib/libmathlib.a
153*412f47f9SXin Li	$(CC) $(CFLAGS_PL) $(LDFLAGS) -static -o $@ $^ $(LDLIBS)
154*412f47f9SXin Li
155*412f47f9SXin Libuild/pl/include/%.h: $(PLM)/include/%.h
156*412f47f9SXin Li	cp $< $@
157*412f47f9SXin Li
158*412f47f9SXin Libuild/pl/include/test/%.h: $(PLM)/test/%.h
159*412f47f9SXin Li	cp $< $@
160*412f47f9SXin Li
161*412f47f9SXin Libuild/pl/bin/%.sh: $(PLM)/test/%.sh
162*412f47f9SXin Li	cp $< $@
163*412f47f9SXin Li
164*412f47f9SXin Lipl-math-tests := $(wildcard $(PLM)/test/testcases/directed/*.tst)
165*412f47f9SXin Lipl-math-rtests := $(wildcard $(PLM)/test/testcases/random/*.tst)
166*412f47f9SXin Li
167*412f47f9SXin Licheck-pl/math-test: $(math-tools)
168*412f47f9SXin Li	cat $(pl-math-tests) | $(EMULATOR) build/pl/bin/mathtest $(math-testflags)
169*412f47f9SXin Li
170*412f47f9SXin Licheck-pl/math-rtest: $(math-host-tools) $(math-tools)
171*412f47f9SXin Li	cat $(pl-math-rtests) | build/pl/bin/rtest | $(EMULATOR) build/pl/bin/mathtest $(math-testflags)
172*412f47f9SXin Li
173*412f47f9SXin Liulp-input-dir=$(B)/test/inputs
174*412f47f9SXin Li$(ulp-input-dir):
175*412f47f9SXin Li	mkdir -p $@
176*412f47f9SXin Li
177*412f47f9SXin Limath-lib-lims = $(patsubst $(PLM)/%,$(ulp-input-dir)/%.ulp,$(basename $(pl-lib-srcs)))
178*412f47f9SXin Limath-lib-fenvs = $(patsubst $(PLM)/%,$(ulp-input-dir)/%.fenv,$(basename $(pl-lib-srcs)))
179*412f47f9SXin Limath-lib-itvs = $(patsubst $(PLM)/%,$(ulp-input-dir)/%.itv,$(basename $(pl-lib-srcs)))
180*412f47f9SXin Li
181*412f47f9SXin Liulp-inputs = $(math-lib-lims) $(math-lib-fenvs) $(math-lib-itvs)
182*412f47f9SXin Li
183*412f47f9SXin Li$(ulp-inputs): CFLAGS_PL += -I$(PLM) -I$(PLM)/include $(math-cflags)
184*412f47f9SXin Li
185*412f47f9SXin Li$(ulp-input-dir)/%.ulp: $(PLM)/%.c | $(ulp-input-dir)
186*412f47f9SXin Li	$(CC) -I$(PLM)/test $(CFLAGS_PL) $< -o - -E | { grep -o "PL_TEST_ULP [^ ]* [^ ]*" || true; } > $@
187*412f47f9SXin Li
188*412f47f9SXin Li$(ulp-input-dir)/%.fenv: $(PLM)/%.c | $(ulp-input-dir)
189*412f47f9SXin Li	$(CC) -I$(PLM)/test $(CFLAGS_PL) $< -o - -E | { grep -o "PL_TEST_EXPECT_FENV_ENABLED [^ ]*" || true; } > $@
190*412f47f9SXin Li
191*412f47f9SXin Li$(ulp-input-dir)/%.itv: $(PLM)/%.c | $(ulp-input-dir)
192*412f47f9SXin Li	$(CC) -I$(PLM)/test $(CFLAGS_PL) $< -o - -E | { grep "PL_TEST_INTERVAL " || true; } | sed "s/ PL_TEST_INTERVAL/\nPL_TEST_INTERVAL/g" > $@
193*412f47f9SXin Li
194*412f47f9SXin Liulp-lims := $(ulp-input-dir)/limits
195*412f47f9SXin Li$(ulp-lims): $(math-lib-lims)
196*412f47f9SXin Li	cat $^ | sed "s/PL_TEST_ULP //g;s/^ *//g" > $@
197*412f47f9SXin Li
198*412f47f9SXin Lifenv-exps := $(ulp-input-dir)/fenv
199*412f47f9SXin Li$(fenv-exps): $(math-lib-fenvs)
200*412f47f9SXin Li	cat $^ | sed "s/PL_TEST_EXPECT_FENV_ENABLED //g;s/^ *//g" > $@
201*412f47f9SXin Li
202*412f47f9SXin Liulp-itvs := $(ulp-input-dir)/intervals
203*412f47f9SXin Li$(ulp-itvs): $(math-lib-itvs)
204*412f47f9SXin Li	cat $^ | sort -u | sed "s/PL_TEST_INTERVAL //g" > $@
205*412f47f9SXin Li
206*412f47f9SXin Licheck-pl/math-ulp: $(math-tools) $(ulp-lims) $(fenv-exps) $(ulp-itvs)
207*412f47f9SXin Li	WANT_SVE_MATH=$(WANT_SVE_MATH) \
208*412f47f9SXin Li	ULPFLAGS="$(math-ulpflags)" \
209*412f47f9SXin Li	LIMITS=../../../$(ulp-lims) \
210*412f47f9SXin Li	INTERVALS=../../../$(ulp-itvs) \
211*412f47f9SXin Li	FENV=../../../$(fenv-exps) \
212*412f47f9SXin Li	FUNC=$(func) \
213*412f47f9SXin Li	PRED=$(pred) \
214*412f47f9SXin Li	build/pl/bin/runulp.sh $(EMULATOR)
215*412f47f9SXin Li
216*412f47f9SXin Licheck-pl/math: check-pl/math-test check-pl/math-rtest check-pl/math-ulp
217*412f47f9SXin Li
218*412f47f9SXin Li$(DESTDIR)$(libdir)/pl/%.so: build/pl/lib/%.so
219*412f47f9SXin Li	$(INSTALL) -D $< $@
220*412f47f9SXin Li
221*412f47f9SXin Li$(DESTDIR)$(libdir)/pl/%: build/pl/lib/%
222*412f47f9SXin Li	$(INSTALL) -m 644 -D $< $@
223*412f47f9SXin Li
224*412f47f9SXin Li$(DESTDIR)$(includedir)/pl/%: build/pl/include/%
225*412f47f9SXin Li	$(INSTALL) -m 644 -D $< $@
226*412f47f9SXin Li
227*412f47f9SXin Liinstall-pl/math: \
228*412f47f9SXin Li $(pl-libs:build/pl/lib/%=$(DESTDIR)$(libdir)/pl/%) \
229*412f47f9SXin Li $(pl-includes:build/pl/include/%=$(DESTDIR)$(includedir)/pl/%)
230*412f47f9SXin Li
231*412f47f9SXin Liclean-pl/math:
232*412f47f9SXin Li	rm -f $(pl/math-files)
233*412f47f9SXin Li
234*412f47f9SXin Li.PHONY: all-pl/math check-pl/math-test check-pl/math-rtest check-pl/math-ulp check-pl/math install-pl/math clean-pl/math
235