1// Copyright (C) 2018 The Android Open Source Project
2//
3// Licensed under the Apache License, Version 2.0 (the "License");
4// you may not use this file except in compliance with the License.
5// You may obtain a copy of the License at
6//
7//      http://www.apache.org/licenses/LICENSE-2.0
8//
9// Unless required by applicable law or agreed to in writing, software
10// distributed under the License is distributed on an "AS IS" BASIS,
11// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12// See the License for the specific language governing permissions and
13// limitations under the License.
14//
15
16package {
17    default_applicable_licenses: ["Android-Apache-2.0"],
18}
19
20python_binary_host {
21    name: "gen_intrinsics",
22    main: "gen_intrinsics.py",
23    srcs: ["gen_intrinsics.py"],
24    libs: ["asm_defs_lib"],
25}
26
27python_library_host {
28    name: "gen_intrinsics_lib",
29    srcs: ["gen_intrinsics.py"],
30}
31
32python_test_host {
33    name: "gen_intrinsics_tests",
34    main: "gen_intrinsics_test.py",
35    srcs: [
36        "gen_intrinsics_test.py",
37        "gen_intrinsics.py",
38    ],
39    libs: ["asm_defs_lib"],
40    test_suites: ["device-tests"],
41    test_options: {
42        unit_test: true,
43    },
44}
45
46filegroup {
47    name: "libberberis_intrinsics_gen_inputs_riscv64_to_all",
48    srcs: ["riscv64_to_all/intrinsic_def.json"],
49}
50
51genrule {
52    name: "libberberis_text_assembler_gen_headers_riscv64",
53    out: [
54        "gen_text_assembler_common_riscv-inl.h",
55        "gen_text_assembler_riscv64-inl.h",
56    ],
57    srcs: [":libberberis_assembler_gen_inputs_riscv64"],
58    tools: ["gen_asm"],
59    cmd: "$(location gen_asm) --text-assembler $(out) $(in)",
60}
61
62genrule {
63    name: "libberberis_text_assembler_gen_headers_x86_32",
64    out: [
65        "gen_text_assembler_common_x86-inl.h",
66        "gen_text_assembler_x86_32-inl.h",
67    ],
68    srcs: [":libberberis_assembler_gen_inputs_x86_32"],
69    tools: ["gen_asm"],
70    cmd: "$(location gen_asm) --text-assembler $(out) $(in)",
71}
72
73genrule {
74    name: "libberberis_text_assembler_gen_headers_x86_64",
75    out: [
76        "gen_text_assembler_common_x86-inl.h",
77        "gen_text_assembler_x86_64-inl.h",
78    ],
79    srcs: [":libberberis_assembler_gen_inputs_x86_64"],
80    tools: ["gen_asm"],
81    cmd: "$(location gen_asm) --text-assembler $(out) $(in)",
82}
83
84filegroup {
85    name: "libberberis_machine_ir_intrinsic_binding_riscv64_to_x86_64",
86    srcs: ["riscv64_to_x86_64/machine_ir_intrinsic_binding.json"],
87}
88
89filegroup {
90    name: "libberberis_macro_assembler_gen_inputs_riscv64_to_x86_64",
91    srcs: ["riscv64_to_x86_64/macro_def.json"],
92}
93
94filegroup {
95    name: "dummy_gen_text_asm_intrinsics_srcs",
96    srcs: ["dummy_gen_text_asm_intrinsics.cc"],
97}
98
99filegroup {
100    name: "gen_text_asm_intrinsics_srcs",
101    srcs: ["gen_text_asm_intrinsics.cc"],
102}
103
104genrule {
105    name: "libberberis_intrinsics_gen_inline_headers_riscv64_to_x86_64",
106    out: ["berberis/intrinsics/intrinsics.h"],
107    srcs: [],
108    tools: ["gen_riscv64_to_x86_64_intrinsics"],
109    cmd: "$(location gen_riscv64_to_x86_64_intrinsics) $(out)",
110}
111
112genrule {
113    name: "libberberis_macro_assembler_gen_intrinsics_headers_riscv64_to_x86_64",
114    out: ["text_asm_intrinsics_process_bindings-inl.h"],
115    srcs: [
116        ":libberberis_intrinsics_gen_inputs_riscv64_to_all",
117        ":libberberis_machine_ir_intrinsic_binding_riscv64_to_x86_64",
118        ":libberberis_macro_assembler_gen_inputs_riscv64_to_x86_64",
119        ":libberberis_assembler_gen_inputs_x86_64",
120    ],
121    tools: ["gen_intrinsics"],
122    cmd: "$(location gen_intrinsics) --text_asm_intrinsics_bindings $(out) $(in)",
123}
124
125genrule {
126    name: "libberberis_intrinsics_gen_public_headers_riscv64_to_x86_64",
127    out: [
128        "berberis/intrinsics/intrinsics-inl.h",
129        "berberis/intrinsics/intrinsics_process_bindings-inl.h",
130        "berberis/intrinsics/interpreter_intrinsics_hooks-inl.h",
131        "berberis/intrinsics/translator_intrinsics_hooks-inl.h",
132        "berberis/intrinsics/mock_semantics_listener_intrinsics_hooks-inl.h",
133    ],
134    srcs: [
135        ":libberberis_intrinsics_gen_inputs_riscv64_to_all",
136        ":libberberis_machine_ir_intrinsic_binding_riscv64_to_x86_64",
137        ":libberberis_macro_assembler_gen_inputs_riscv64_to_x86_64",
138        ":libberberis_assembler_gen_inputs_x86_64",
139    ],
140    tools: ["gen_intrinsics"],
141    cmd: "$(location gen_intrinsics) --public_headers $(out) $(in)",
142}
143
144genrule {
145    name: "libberberis_macro_assembler_gen_headers_riscv64_to_x86_64",
146    out: ["berberis/intrinsics/macro_assembler_interface-inl.h"],
147    srcs: [":libberberis_macro_assembler_gen_inputs_riscv64_to_x86_64"],
148    tools: ["gen_asm"],
149    cmd: "$(location gen_asm) --binary-assembler $(out) $(in)",
150}
151
152genrule {
153    name: "libberberis_intrinsics_gen_public_headers_riscv64_to_arm64",
154    out: [
155        "berberis/intrinsics/intrinsics-inl.h",
156        "berberis/intrinsics/interpreter_intrinsics_hooks-inl.h",
157    ],
158    srcs: [
159        ":libberberis_intrinsics_gen_inputs_riscv64_to_all",
160    ],
161    tools: ["gen_intrinsics"],
162    cmd: "$(location gen_intrinsics) arm64 --public_headers $(out) $(in)",
163}
164
165// Note: the following two genrules and this host binary are working together.
166//
167// gen_riscv64_to_x86_64_intrinsics is C++ program, generated by python script,
168// which does not accept any inputs and produces berberis/intrinsics/intrinsics.h
169//
170// Other modules are not supposed to use gen_riscv64_to_x86_64_intrinsics, they should only
171// depend on libberberis_intrinsics_gen_asm_impl_headers_riscv64_to_x86_64
172//
173// So with 64-bit RISC V headers we have two-step operation:
174//
175//   gen_intrinsics
176//   -> text_asm_intrinsics_process_bindings-inl.h
177//      -> gen_riscv64_to_x86_64_intrinsics
178//         -> libberberis_intrinsics_gen_asm_impl_headers_riscv64_to_x86_64
179//
180// Compare to single-step generation of common headers:
181//
182//   gen_intrinsics
183//   -> libberberis_intrinsics_gen_public_headers_riscv64_to_x86_64
184
185cc_binary_host {
186    name: "gen_riscv64_to_x86_64_intrinsics",
187    defaults: ["gen_text_asm_intrinsics_defaults"],
188    local_include_dirs: ["riscv64_to_x86_64"],
189    target: {
190        linux: {
191            generated_headers: [
192                "libberberis_intrinsics_gen_public_headers_riscv64_to_x86_64",
193                "libberberis_macro_assembler_gen_intrinsics_headers_riscv64_to_x86_64",
194                "libberberis_text_assembler_gen_headers_x86_64",
195            ],
196            header_libs: ["libberberis_macro_assembler_headers_riscv64_to_x86_64"],
197            static_libs: ["libberberis_macro_assembler_riscv64_to_x86_64"],
198        },
199    },
200}
201
202cc_defaults {
203    name: "gen_text_asm_intrinsics_defaults",
204    // Note: build system would pick the build OS variant.
205    // Usually that's 64-bit version thus we can only support 64bit version here.
206    // Currently none of Android builds that we care about used 32bit version of host tools.
207    defaults: ["berberis_defaults_64"],
208    host_supported: true,
209    header_libs: ["libberberis_intrinsics_headers"],
210    // Note: since this tool is used in genrule, it has to be buildable and
211    // available on all platforms unconditionally.
212    //
213    // Since we don't support MacOS build for the rest of berberis we are providing
214    // a "dummy" version on non-linux platform: it would always generate empty header.
215    //
216    // That version does not need any internal headers, libraries or sources,
217    // thus we use conditional dependencies only on linux platform here.
218    target: {
219        darwin: {
220            enabled: true,
221            srcs: [":dummy_gen_text_asm_intrinsics_srcs"],
222        },
223        linux: {
224            // We are only ever executing that binary once, it's faster to build it without
225            // optimizations and spend half-second more running it, than spend tens of seconds
226            // optimizing the code to save that half-second.
227            cflags: ["-O0"],
228            srcs: [":gen_text_asm_intrinsics_srcs"],
229            header_libs: [
230                "libberberis_assembler_headers", // Immediates.
231                "libberberis_base_headers",
232                "libberberis_runtime_primitives_headers",
233            ],
234            shared_libs: ["liblog"],
235        },
236    },
237    // Targets using these defaults must provide the following guest-specific fields on linux:
238    // generated_header: [
239    //     "libberberis_intrinsics_gen_public_headers_<guest>_to_<host>",
240    //     "libberberis_text_assembler_gen_headers_<guest>_to_<host>",
241    // ],
242    // header_libs: [ "libberberis_macro_assembler_headers_<guest>_to_<host>" ],
243    // static_libs: [ "libberberis_macro_assembler_<guest>_to_<host>" ],
244}
245
246cc_library_headers {
247    name: "libberberis_intrinsics_riscv64_headers",
248    defaults: ["berberis_all_hosts_defaults"],
249    host_supported: true,
250    header_libs: [
251        "libberberis_base_headers",
252        "libberberis_intrinsics_headers",
253        "libberberis_runtime_primitives_headers", // for platform.h
254    ],
255    export_header_lib_headers: [
256        "libberberis_base_headers",
257        "libberberis_intrinsics_headers",
258        "libberberis_runtime_primitives_headers", // for platform.h
259    ],
260    export_include_dirs: [
261        "riscv64_to_all/include",
262    ],
263    arch: {
264        arm64: {
265            generated_headers: ["libberberis_intrinsics_gen_public_headers_riscv64_to_arm64"],
266            export_generated_headers: ["libberberis_intrinsics_gen_public_headers_riscv64_to_arm64"],
267            export_include_dirs: [
268                "riscv64_to_arm64/include",
269            ],
270        },
271        x86_64: {
272            generated_headers: [
273                "libberberis_intrinsics_gen_inline_headers_riscv64_to_x86_64",
274                "libberberis_intrinsics_gen_public_headers_riscv64_to_x86_64",
275            ],
276            export_generated_headers: [
277                "libberberis_intrinsics_gen_inline_headers_riscv64_to_x86_64",
278                "libberberis_intrinsics_gen_public_headers_riscv64_to_x86_64",
279            ],
280            export_include_dirs: [
281                "riscv64_to_x86_64/include",
282            ],
283        },
284    },
285}
286
287cc_library_headers {
288    name: "libberberis_intrinsics_headers",
289    defaults: ["berberis_all_hosts_defaults"],
290    host_supported: true,
291    native_bridge_supported: true,
292    export_include_dirs: ["include"],
293    header_libs: ["libberberis_base_headers"],
294    export_header_lib_headers: ["libberberis_base_headers"],
295    arch: {
296        x86: {
297            export_include_dirs: [
298                "all_to_x86_32_or_x86_64/include",
299            ],
300        },
301        x86_64: {
302            export_include_dirs: [
303                "all_to_x86_32_or_x86_64/include",
304            ],
305        },
306        riscv64: {
307            export_include_dirs: [
308                "all_to_riscv64/include",
309            ],
310        },
311    },
312}
313
314cc_library_static {
315    name: "libberberis_intrinsics",
316    defaults: ["berberis_defaults"],
317    host_supported: true,
318    header_libs: ["libberberis_intrinsics_riscv64_headers"],
319    static_libs: ["libberberis_base"],
320    export_header_lib_headers: ["libberberis_intrinsics_riscv64_headers"],
321}
322
323cc_library_headers {
324    name: "libberberis_macro_assembler_headers_all_to_riscv64",
325    defaults: ["berberis_defaults_64"],
326    host_supported: true,
327    export_include_dirs: [
328        "all_to_riscv64/include",
329        "include",
330    ],
331    header_libs: [
332        "libberberis_base_headers",
333        "libberberis_intrinsics_headers",
334    ],
335    export_header_lib_headers: [
336        "libberberis_base_headers",
337        "libberberis_intrinsics_headers",
338    ],
339}
340
341cc_library_headers {
342    name: "libberberis_macro_assembler_headers_all_to_x86_64",
343    defaults: ["berberis_defaults_64"],
344    host_supported: true,
345    export_include_dirs: [
346        "all_to_x86_32_or_x86_64/include",
347        "include",
348    ],
349    header_libs: [
350        "libberberis_base_headers",
351        "libberberis_intrinsics_headers",
352    ],
353    export_header_lib_headers: [
354        "libberberis_base_headers",
355        "libberberis_intrinsics_headers",
356    ],
357}
358
359cc_library_headers {
360    name: "libberberis_macro_assembler_headers_riscv64_to_x86_64",
361    defaults: ["berberis_defaults_64"],
362    host_supported: true,
363    export_include_dirs: [
364        "riscv64_to_all/include",
365        "riscv64_to_x86_64/include",
366        "include",
367    ],
368    header_libs: [
369        "libberberis_base_headers",
370        "libberberis_intrinsics_headers",
371        "libberberis_macro_assembler_headers_all_to_x86_64",
372    ],
373    export_header_lib_headers: [
374        "libberberis_base_headers",
375        "libberberis_intrinsics_headers",
376    ],
377    generated_headers: ["libberberis_macro_assembler_gen_headers_riscv64_to_x86_64"],
378    export_generated_headers: ["libberberis_macro_assembler_gen_headers_riscv64_to_x86_64"],
379}
380
381cc_library_static {
382    name: "libberberis_macro_assembler_riscv64_to_x86_64",
383    defaults: ["berberis_defaults_64"],
384    host_supported: true,
385    srcs: ["riscv64_to_x86_64/macro_assembler.cc"],
386    header_libs: ["libberberis_macro_assembler_headers_riscv64_to_x86_64"],
387}
388
389cc_library_static {
390    name: "libberberis_intrinsics_riscv64",
391    defaults: ["berberis_all_hosts_defaults_64"],
392    host_supported: true,
393    srcs: [
394        "riscv64_to_all/intrinsics.cc",
395        "riscv64_to_all/vector_intrinsics.cc",
396    ],
397    header_libs: [
398        "libberberis_base_headers",
399        "libberberis_intrinsics_riscv64_headers",
400    ],
401    export_header_lib_headers: [
402        "libberberis_base_headers",
403        "libberberis_intrinsics_riscv64_headers",
404    ],
405}
406
407cc_test_library {
408    name: "libberberis_intrinsics_unit_tests",
409    defaults: ["berberis_defaults"],
410    host_supported: true,
411    srcs: ["simd_register_test.cc"],
412    arch: {
413        x86: {
414            srcs: [
415                "all_to_x86_32_or_x86_64/intrinsics_float_test.cc",
416            ],
417        },
418        x86_64: {
419            cflags: ["-mssse3"],
420            srcs: [
421                "all_to_x86_32_or_x86_64/intrinsics_float_test.cc",
422                "all_to_x86_64/tuple_test.cc",
423                // Note that these two tests technically should work on any platform that supports
424                // risv64 to something translation, but currently that's only x86-64.
425                "riscv64_to_all/intrinsics_test.cc",
426                "riscv64_to_all/vector_intrinsics_test.cc",
427            ],
428        },
429    },
430    static_libs: [
431        "libberberis_base",
432        "libberberis_intrinsics",
433    ],
434    shared: {
435        enabled: false,
436    },
437}
438