xref: /aosp_15_r20/external/pytorch/third_party/sleef.BUILD (revision da0073e96a02ea20f0ac840b70461e3646d07c45)
1load("@rules_cc//cc:defs.bzl", "cc_binary", "cc_library")
2load("@pytorch//third_party:sleef.bzl", "sleef_cc_library")
3
4SLEEF_COPTS = [
5    "-DHAVE_MALLOC_USABLE_SIZE=1",
6    "-DHAVE_MMAP=1",
7    "-DHAVE_SHM_OPEN=1",
8    "-DHAVE_SHM_UNLINK=1",
9    "-DIDEEP_USE_MKL",
10    "-DDNNL_CPU_RUNTIME=TBB",
11    "-DONNX_ML=1",
12    "-DONNX_NAMESPACE=onnx",
13    "-D_FILE_OFFSET_BITS=64",
14    "-ffp-contract=off",
15    "-fno-math-errno",
16    "-fno-trapping-math",
17    "-DCAFFE2_USE_GLOO",
18    "-std=gnu99",
19]
20
21SLEEF_COMMON_TARGET_COPTS = [
22    "-DSLEEF_STATIC_LIBS=1",
23    "-DENABLE_ALIAS=1",
24]
25
26SLEEF_PRIVATE_HEADERS = glob([
27    "build/include/*.h",
28    "src/arch/*.h",
29    "src/common/*.h",
30    "src/libm/*.h",
31    "src/libm/include/*.h",
32])
33
34SLEEF_PUBLIC_HEADERS = [
35    ":sleef_h",
36]
37
38SLEEF_PRIVATE_INCLUDES = [
39    "-Iexternal/sleef/src/arch",
40    "-Iexternal/sleef/src/common",
41    "-Iexternal/sleef/src/libm",
42]
43
44SLEEF_PUBLIC_INCLUDES = [
45    "build/include",
46]
47
48SLEEF_VISIBILITY = [
49    "//visibility:public",
50]
51
52cc_binary(
53    name = "mkalias",
54    srcs = [
55        "src/libm/funcproto.h",
56        "src/libm/mkalias.c",
57    ],
58)
59
60genrule(
61    name = "alias_avx512f_h",
62    outs = ["alias_avx512f.h"],
63    cmd = "{ " + "; ".join([
64        "$(location :mkalias) -16 __m512 __m512i e avx512f",
65        "$(location :mkalias) 8 __m512d __m256i e avx512f",
66    ]) + "; } > $@",
67    tools = [":mkalias"],
68)
69
70cc_binary(
71    name = "mkdisp",
72    srcs = [
73        "src/libm/funcproto.h",
74        "src/libm/mkdisp.c",
75    ],
76    copts = SLEEF_COPTS,
77)
78
79genrule(
80    name = "dispavx_c",
81    srcs = ["src/libm/dispavx.c.org"],
82    outs = ["dispavx.c"],
83    cmd = "{ cat $(location src/libm/dispavx.c.org); $(location :mkdisp) 4 8 __m256d __m256 __m128i avx fma4 avx2; } > $@",
84    tools = [":mkdisp"],
85)
86
87genrule(
88    name = "dispsse_c",
89    srcs = ["src/libm/dispsse.c.org"],
90    outs = ["dispsse.c"],
91    cmd = "{ cat $(location src/libm/dispsse.c.org); $(location :mkdisp) 2 4 __m128d __m128 __m128i sse2 sse4 avx2128; } > $@",
92    tools = [":mkdisp"],
93)
94
95cc_binary(
96    name = "mkrename",
97    srcs = [
98        "src/libm/funcproto.h",
99        "src/libm/mkrename.c",
100    ],
101)
102
103genrule(
104    name = "renameavx_h",
105    outs = ["renameavx.h"],
106    cmd = "$(location :mkrename) cinz_ 4 8 avx > $@",
107    tools = [":mkrename"],
108)
109
110genrule(
111    name = "renameavx2_h",
112    outs = ["renameavx2.h"],
113    cmd = "$(location :mkrename) finz_ 4 8 avx2 > $@",
114    tools = [":mkrename"],
115)
116
117genrule(
118    name = "renameavx2128_h",
119    outs = ["renameavx2128.h"],
120    cmd = "$(location :mkrename) finz_ 2 4 avx2128 > $@",
121    tools = [":mkrename"],
122)
123
124genrule(
125    name = "renameavx512f_h",
126    outs = ["renameavx512f.h"],
127    cmd = "$(location :mkrename) finz_ 8 16 avx512f > $@",
128    tools = [":mkrename"],
129)
130
131genrule(
132    name = "renameavx512fnofma_h",
133    outs = ["renameavx512fnofma.h"],
134    cmd = "$(location :mkrename) cinz_ 8 16 avx512fnofma > $@",
135    tools = [":mkrename"],
136)
137
138genrule(
139    name = "renamefma4_h",
140    outs = ["renamefma4.h"],
141    cmd = "$(location :mkrename) finz_ 4 8 fma4 > $@",
142    tools = [":mkrename"],
143)
144
145genrule(
146    name = "renamepurec_scalar_h",
147    outs = ["renamepurec_scalar.h"],
148    cmd = "$(location :mkrename) cinz_ 1 1 purec > $@",
149    tools = [":mkrename"],
150)
151
152genrule(
153    name = "renamepurecfma_scalar_h",
154    outs = ["renamepurecfma_scalar.h"],
155    cmd = "$(location :mkrename) finz_ 1 1 purecfma > $@",
156    tools = [":mkrename"],
157)
158
159genrule(
160    name = "renamesse2_h",
161    outs = ["renamesse2.h"],
162    cmd = "$(location :mkrename) cinz_ 2 4 sse2 > $@",
163    tools = [":mkrename"],
164)
165
166genrule(
167    name = "renamesse4_h",
168    outs = ["renamesse4.h"],
169    cmd = "$(location :mkrename) cinz_ 2 4 sse4 > $@",
170    tools = [":mkrename"],
171)
172
173genrule(
174    name = "sleef_h",
175    srcs = [
176        "src/libm/sleeflibm_header.h.org.in",
177        "src/libm/sleeflibm_footer.h.org",
178    ],
179    outs = ["build/include/sleef.h"],
180    cmd = "{ " + "; ".join([
181        "cat $(location src/libm/sleeflibm_header.h.org.in)",
182        "$(location :mkrename) cinz_ 2 4 __m128d __m128 __m128i __m128i __SSE2__",
183        "$(location :mkrename) cinz_ 2 4 __m128d __m128 __m128i __m128i __SSE2__ sse2",
184        "$(location :mkrename) cinz_ 2 4 __m128d __m128 __m128i __m128i __SSE2__ sse4",
185        "$(location :mkrename) cinz_ 4 8 __m256d __m256 __m128i \"struct { __m128i x, y; }\" __AVX__",
186        "$(location :mkrename) cinz_ 4 8 __m256d __m256 __m128i \"struct { __m128i x, y; }\" __AVX__ avx",
187        "$(location :mkrename) finz_ 4 8 __m256d __m256 __m128i \"struct { __m128i x, y; }\" __AVX__ fma4",
188        "$(location :mkrename) finz_ 4 8 __m256d __m256 __m128i __m256i __AVX__ avx2",
189        "$(location :mkrename) finz_ 2 4 __m128d __m128 __m128i __m128i __SSE2__ avx2128",
190        "$(location :mkrename) finz_ 8 16 __m512d __m512 __m256i __m512i __AVX512F__",
191        "$(location :mkrename) finz_ 8 16 __m512d __m512 __m256i __m512i __AVX512F__ avx512f",
192        "$(location :mkrename) cinz_ 8 16 __m512d __m512 __m256i __m512i __AVX512F__ avx512fnofma",
193        "$(location :mkrename) cinz_ 1 1 double float int32_t int32_t __STDC__ purec",
194        "$(location :mkrename) finz_ 1 1 double float int32_t int32_t FP_FAST_FMA purecfma",
195        "cat $(location src/libm/sleeflibm_footer.h.org)",
196    ]) + "; } > $@",
197    tools = [":mkrename"],
198)
199
200cc_library(
201    name = "sleef",
202    srcs = [
203        "src/libm/rempitab.c",
204        "src/libm/sleefdp.c",
205        "src/libm/sleefsp.c",
206    ],
207    hdrs = SLEEF_PUBLIC_HEADERS,
208    copts = SLEEF_PRIVATE_INCLUDES + SLEEF_COPTS + SLEEF_COMMON_TARGET_COPTS + [
209        "-DDORENAME=1",
210        "-DENABLEFLOAT128=1",
211        "-Wno-unused-result",
212    ],
213    includes = SLEEF_PUBLIC_INCLUDES,
214    # -lgcc resolves
215    # U __addtf3
216    # U __eqtf2
217    # U __fixtfdi
218    # U __floatditf
219    # U __gttf2
220    # U __lttf2
221    # U __multf3
222    # U __subtf3
223    # in bazel-bin/external/sleef/_objs/sleef/sleefqp.pic.o
224    linkopts = [
225        "-lgcc",
226    ],
227    linkstatic = True,
228    visibility = SLEEF_VISIBILITY,
229    # The purpose of the lists in deps is to keep related pairs of
230    # libraries together. In particular, each pair that contains a *det*
231    # library originates with a sleef_cc_library().
232    deps = [
233        ":common",
234        ":dispavx",
235        ":dispsse",
236    ] + [
237        ":sleefavx",
238        ":sleefdetavx",
239    ] + [
240        ":sleefavx2",
241        ":sleefdetavx2",
242    ] + [
243        ":sleefavx2128",
244        ":sleefdetavx2128",
245    ] + [
246        ":sleefavx512f",
247        ":sleefdetavx512f",
248    ] + [
249        ":sleefavx512fnofma",
250        ":sleefdetavx512fnofma",
251    ] + [
252        ":sleeffma4",
253        ":sleefdetfma4",
254    ] + [
255        ":sleefsse2",
256        ":sleefdetsse2",
257    ] + [
258        ":sleefsse4",
259        ":sleefdetsse4",
260    ] + [
261        ":sleefpurec_scalar",
262        ":sleefdetpurec_scalar",
263    ] + [
264        ":sleefpurecfma_scalar",
265        ":sleefdetpurecfma_scalar",
266    ],
267    alwayslink = True,
268)
269
270cc_library(
271    name = "common",
272    srcs = SLEEF_PRIVATE_HEADERS + [
273        "src/common/common.c",
274    ],
275    copts = SLEEF_PRIVATE_INCLUDES + SLEEF_COPTS + [
276        "-Wno-unused-result",
277    ],
278    linkstatic = True,
279    visibility = SLEEF_VISIBILITY,
280    alwayslink = True,
281)
282
283cc_library(
284    name = "dispavx",
285    srcs = SLEEF_PRIVATE_HEADERS + SLEEF_PUBLIC_HEADERS + [
286        ":dispavx_c",
287    ],
288    copts = SLEEF_PRIVATE_INCLUDES + SLEEF_COPTS + SLEEF_COMMON_TARGET_COPTS + [
289        "-DENABLE_AVX2=1",
290        "-DENABLE_FMA4=1",
291        "-mavx",
292    ],
293    includes = SLEEF_PUBLIC_INCLUDES,
294    linkstatic = True,
295    visibility = SLEEF_VISIBILITY,
296    alwayslink = True,
297)
298
299cc_library(
300    name = "dispsse",
301    srcs = SLEEF_PRIVATE_HEADERS + SLEEF_PUBLIC_HEADERS + [
302        ":dispsse_c",
303    ],
304    copts = SLEEF_PRIVATE_INCLUDES + SLEEF_COPTS + SLEEF_COMMON_TARGET_COPTS + [
305        "-DENABLE_AVX2=1",
306        "-DENABLE_FMA4=1",
307        "-msse2",
308    ],
309    includes = SLEEF_PUBLIC_INCLUDES,
310    linkstatic = True,
311    visibility = SLEEF_VISIBILITY,
312    alwayslink = True,
313)
314
315sleef_cc_library(
316    name = "sleefavx512f",
317    srcs = SLEEF_PRIVATE_HEADERS + [
318        "src/libm/sleefsimddp.c",
319        "src/libm/sleefsimdsp.c",
320        ":alias_avx512f_h",
321        ":renameavx512f_h",
322    ],
323    copts = SLEEF_PRIVATE_INCLUDES + SLEEF_COPTS + SLEEF_COMMON_TARGET_COPTS + [
324        "-DDORENAME=1",
325        "-DALIAS_NO_EXT_SUFFIX=\\\"alias_avx512f.h\\\"",
326        "-DENABLE_AVX512F=1",
327        "-mavx512f",
328    ],
329    linkstatic = True,
330    visibility = SLEEF_VISIBILITY,
331    alwayslink = True,
332)
333
334sleef_cc_library(
335    name = "sleefavx512fnofma",
336    srcs = SLEEF_PRIVATE_HEADERS + [
337        "src/libm/sleefsimddp.c",
338        "src/libm/sleefsimdsp.c",
339        ":renameavx512fnofma_h",
340    ],
341    copts = SLEEF_PRIVATE_INCLUDES + SLEEF_COPTS + SLEEF_COMMON_TARGET_COPTS + [
342        "-DDORENAME=1",
343        "-DENABLE_AVX512FNOFMA=1",
344        "-mavx512f",
345    ],
346    linkstatic = True,
347    visibility = SLEEF_VISIBILITY,
348    alwayslink = True,
349)
350
351sleef_cc_library(
352    name = "sleefavx",
353    srcs = SLEEF_PRIVATE_HEADERS + [
354        "src/libm/sleefsimddp.c",
355        "src/libm/sleefsimdsp.c",
356        ":renameavx_h",
357    ],
358    copts = SLEEF_PRIVATE_INCLUDES + SLEEF_COPTS + SLEEF_COMMON_TARGET_COPTS + [
359        "-DDORENAME=1",
360        "-DENABLE_AVX=1",
361        "-mavx",
362    ],
363    linkstatic = True,
364    visibility = SLEEF_VISIBILITY,
365    alwayslink = True,
366)
367
368sleef_cc_library(
369    name = "sleefavx2",
370    srcs = SLEEF_PRIVATE_HEADERS + [
371        "src/libm/sleefsimddp.c",
372        "src/libm/sleefsimdsp.c",
373        ":renameavx2_h",
374    ],
375    copts = SLEEF_PRIVATE_INCLUDES + SLEEF_COPTS + SLEEF_COMMON_TARGET_COPTS + [
376        "-DDORENAME=1",
377        "-DENABLE_AVX2=1",
378        "-mavx2",
379        "-mfma",
380    ],
381    linkstatic = True,
382    visibility = SLEEF_VISIBILITY,
383    alwayslink = True,
384)
385
386sleef_cc_library(
387    name = "sleefavx2128",
388    srcs = SLEEF_PRIVATE_HEADERS + [
389        "src/libm/sleefsimddp.c",
390        "src/libm/sleefsimdsp.c",
391        ":renameavx2128_h",
392    ],
393    copts = SLEEF_PRIVATE_INCLUDES + SLEEF_COPTS + SLEEF_COMMON_TARGET_COPTS + [
394        "-DDORENAME=1",
395        "-DENABLE_AVX2128=1",
396        "-mavx2",
397        "-mfma",
398    ],
399    linkstatic = True,
400    visibility = SLEEF_VISIBILITY,
401    alwayslink = True,
402)
403
404sleef_cc_library(
405    name = "sleeffma4",
406    srcs = SLEEF_PRIVATE_HEADERS + [
407        "src/libm/sleefsimddp.c",
408        "src/libm/sleefsimdsp.c",
409        ":renamefma4_h",
410    ],
411    copts = SLEEF_PRIVATE_INCLUDES + SLEEF_COPTS + SLEEF_COMMON_TARGET_COPTS + [
412        "-DDORENAME=1",
413        "-DENABLE_FMA4=1",
414        "-mfma4",
415    ],
416    linkstatic = True,
417    visibility = SLEEF_VISIBILITY,
418    alwayslink = True,
419)
420
421sleef_cc_library(
422    name = "sleefsse2",
423    srcs = SLEEF_PRIVATE_HEADERS + [
424        "src/libm/sleefsimddp.c",
425        "src/libm/sleefsimdsp.c",
426        ":renamesse2_h",
427    ],
428    copts = SLEEF_PRIVATE_INCLUDES + SLEEF_COPTS + SLEEF_COMMON_TARGET_COPTS + [
429        "-DDORENAME=1",
430        "-DENABLE_SSE2=1",
431        "-msse2",
432    ],
433    linkstatic = True,
434    visibility = SLEEF_VISIBILITY,
435    alwayslink = True,
436)
437
438sleef_cc_library(
439    name = "sleefsse4",
440    srcs = SLEEF_PRIVATE_HEADERS + [
441        "src/libm/sleefsimddp.c",
442        "src/libm/sleefsimdsp.c",
443        ":renamesse4_h",
444    ],
445    copts = SLEEF_PRIVATE_INCLUDES + SLEEF_COPTS + SLEEF_COMMON_TARGET_COPTS + [
446        "-DDORENAME=1",
447        "-DENABLE_SSE4=1",
448        "-msse4.1",
449    ],
450    linkstatic = True,
451    visibility = SLEEF_VISIBILITY,
452    alwayslink = True,
453)
454
455sleef_cc_library(
456    name = "sleefpurec_scalar",
457    srcs = SLEEF_PRIVATE_HEADERS + [
458        "src/libm/sleefsimddp.c",
459        "src/libm/sleefsimdsp.c",
460        ":renamepurec_scalar_h",
461    ],
462    copts = SLEEF_PRIVATE_INCLUDES + SLEEF_COPTS + SLEEF_COMMON_TARGET_COPTS + [
463        "-DDORENAME=1",
464        "-DENABLE_PUREC_SCALAR=1",
465    ],
466    linkstatic = True,
467    visibility = SLEEF_VISIBILITY,
468    alwayslink = True,
469)
470
471sleef_cc_library(
472    name = "sleefpurecfma_scalar",
473    srcs = SLEEF_PRIVATE_HEADERS + [
474        "src/libm/sleefsimddp.c",
475        "src/libm/sleefsimdsp.c",
476        ":renamepurecfma_scalar_h",
477    ],
478    copts = SLEEF_PRIVATE_INCLUDES + SLEEF_COPTS + SLEEF_COMMON_TARGET_COPTS + [
479        "-DDORENAME=1",
480        "-DENABLE_PURECFMA_SCALAR=1",
481        "-mavx2",
482        "-mfma",
483    ],
484    linkstatic = True,
485    visibility = SLEEF_VISIBILITY,
486    alwayslink = True,
487)
488